Skip to content

[🐛] Eas build failure with UnsupportedModulePropertyParserError (workaround: use react-native 0.76+ / expo 52+) #678

Open
@ChristopherBanas

Description

@ChristopherBanas

What happened?

I was going through the setup instructions outlined here for my expo app and once I got to rebuilding my app using eas, I was met with the following error

[INSTALL_PODS] [Codegen] Processing RNGoogleMobileAdsSpec
[INSTALL_PODS] [Codegen] Searching for podspec in the project dependencies.
[INSTALL_PODS] [Codegen] Supported Apple platforms: ios for RNGoogleMobileAdsSpec
[INSTALL_PODS] [Codegen] Done.
[INSTALL_PODS] UnsupportedModulePropertyParserError: Module NativeGoogleMobileAdsNativeModule: TypeScript interfaces extending TurboModule must only contain 'FunctionTypeAnnotation's. Property 'onAdEvent' refers to a 'TSTypeReference'.
[INSTALL_PODS]     at throwIfModuleTypeIsUnsupported (/private/var/folders/z2/kwhjzy4s6nv00tkb0w1vrq3w0000gn/T/eas-build-local-nodejs/2064bb07-3579-428a-92b4-ba539487f1bf/build/app/node_modules/@react-native/codegen/lib/parsers/error-utils.js:163:11)
[INSTALL_PODS]     at buildPropertySchema (/private/var/folders/z2/kwhjzy4s6nv00tkb0w1vrq3w0000gn/T/eas-build-local-nodejs/2064bb07-3579-428a-92b4-ba539487f1bf/build/app/node_modules/@react-native/codegen/lib/parsers/parsers-commons.js:472:3)
[INSTALL_PODS]     at /private/var/folders/z2/kwhjzy4s6nv00tkb0w1vrq3w0000gn/T/eas-build-local-nodejs/2064bb07-3579-428a-92b4-ba539487f1bf/build/app/node_modules/@react-native/codegen/lib/parsers/parsers-commons.js:705:24
[INSTALL_PODS]     at guard (/private/var/folders/z2/kwhjzy4s6nv00tkb0w1vrq3w0000gn/T/eas-build-local-nodejs/2064bb07-3579-428a-92b4-ba539487f1bf/build/app/node_modules/@react-native/codegen/lib/parsers/utils.js:26:14)
[INSTALL_PODS]     at /private/var/folders/z2/kwhjzy4s6nv00tkb0w1vrq3w0000gn/T/eas-build-local-nodejs/2064bb07-3579-428a-92b4-ba539487f1bf/build/app/node_modules/@react-native/codegen/lib/parsers/parsers-commons.js:702:14
[INSTALL_PODS]     at Array.map (<anonymous>)
[INSTALL_PODS]     at buildModuleSchema (/private/var/folders/z2/kwhjzy4s6nv00tkb0w1vrq3w0000gn/T/eas-build-local-nodejs/2064bb07-3579-428a-92b4-ba539487f1bf/build/app/node_modules/@react-native/codegen/lib/parsers/parsers-commons.js:699:6)
[INSTALL_PODS]     at /private/var/folders/z2/kwhjzy4s6nv00tkb0w1vrq3w0000gn/T/eas-build-local-nodejs/2064bb07-3579-428a-92b4-ba539487f1bf/build/app/node_modules/@react-native/codegen/lib/parsers/parsers-commons.js:522:9
[INSTALL_PODS]     at guard (/private/var/folders/z2/kwhjzy4s6nv00tkb0w1vrq3w0000gn/T/eas-build-local-nodejs/2064bb07-3579-428a-92b4-ba539487f1bf/build/app/node_modules/@react-native/codegen/lib/parsers/utils.js:26:14)
[INSTALL_PODS]     at buildSchemaFromConfigType (/private/var/folders/z2/kwhjzy4s6nv00tkb0w1vrq3w0000gn/T/eas-build-local-nodejs/2064bb07-3579-428a-92b4-ba539487f1bf/build/app/node_modules/@react-native/codegen/lib/parsers/parsers-commons.js:521:22) {
[INSTALL_PODS]   nodes: [ undefined ]
[INSTALL_PODS] }
[INSTALL_PODS] .
[INSTALL_PODS]  #  from /private/var/folders/z2/kwhjzy4s6nv00tkb0w1vrq3w0000gn/T/eas-build-local-nodejs/2064bb07-3579-428a-92b4-ba539487f1bf/build/app/ios/Podfile:44
[INSTALL_PODS]  #  -------------------------------------------
[INSTALL_PODS]  #  
[INSTALL_PODS]  >    use_react_native!(
[INSTALL_PODS]  #      :path => config[:reactNativePath],
[INSTALL_PODS]  #  -------------------------------------------
[INSTALL_PODS] [!] [Codegen] warn: using experimental new codegen integration
[INSTALL_PODS] 
Error: pod install exited with non-zero code: 1
    at ChildProcess.completionListener (/Users/chrisbanas/.npm/_npx/203b5a3d3de594cf/node_modules/@expo/spawn-async/build/spawnAsync.js:42:23)
    at Object.onceWrapper (node:events:633:26)
    at ChildProcess.emit (node:events:518:28)
    at maybeClose (node:internal/child_process:1105:16)
    at Socket.<anonymous> (node:internal/child_process:457:11)
    at Socket.emit (node:events:518:28)
    at Pipe.<anonymous> (node:net:337:12)

The steps I did to get to here were

  1. npx expo install react-native-google-mobile-ads
  2. Added necessary config plugins (shown below)
  3. Run eas build --profile development-simulator --platform ios --local to generate a new build

Platforms

iOS, but have not tested behavior on Android

React Native Info

System:
  OS: macOS 15.0.1
  CPU: (8) x64 Intel(R) Core(TM) i7-8569U CPU @ 2.80GHz
  Memory: 707.65 MB / 16.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 20.11.0
    path: ~/.nvm/versions/node/v20.11.0/bin/node
  Yarn:
    version: 1.22.21
    path: /usr/local/bin/yarn
  npm:
    version: 10.2.4
    path: ~/.nvm/versions/node/v20.11.0/bin/npm
  Watchman: Not Found
Managers:
  CocoaPods:
    version: 1.15.2
    path: /usr/local/lib/ruby/gems/3.3.0/bin/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 24.0
      - iOS 18.0
      - macOS 15.0
      - tvOS 18.0
      - visionOS 2.0
      - watchOS 11.0
  Android SDK: Not Found
IDEs:
  Android Studio: Not Found
  Xcode:
    version: 16.0/16A242d
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 21.0.2
    path: /usr/bin/javac
  Ruby:
    version: 3.3.0
    path: /usr/local/opt/ruby/bin/ruby
npmPackages:
  "@react-native-community/cli": Not Found
  react:
    installed: 18.2.0
    wanted: ^18.2.0
  react-native:
    installed: 0.74.5
    wanted: 0.74.5
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: Not found
  newArchEnabled: Not found
iOS:
  hermesEnabled: Not found
  newArchEnabled: Not found

Are your using Typescript?

  • My project is using Typescript

package.json

{
  "name": "app",
  "version": "1.0.0",
  "scripts": {
    "start": "APP_VARIANT=development npx expo start",
    "start-clear-cache": "APP_VARIANT=development npx expo -c",
    "tsc": "tsc --noEmit",
    "test": "jest --maxWorkers=50%",
    "prepare": "cd .. && husky install",
    "lint": "eslint \"**/*.{ts,tsx,js,jsx}\" --fix",
    "lint-check": "eslint \"**/*.{ts,tsx,js,jsx}\"",
    "prettier": "prettier \"**/*.{ts,tsx,js,jsx,json}\" --write",
    "prettier-check": "prettier \"**/*.{ts,tsx,js,jsx,json}\" --check",
    "ios": "expo run:ios",
    "android": "expo run:android"
  },
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ],
    "*.json": "prettier --write"
  },
  "dependencies": {
    "@config-plugins/react-native-branch": "^8.0.0",
    "@giphy/react-native-sdk": "^3.3.1",
    "@gorhom/bottom-sheet": "^4.6.4",
    "@react-native-async-storage/async-storage": "1.23.1",
    "@react-native-masked-view/masked-view": "^0.3.1",
    "@react-navigation/bottom-tabs": "^6.6.1",
    "@react-navigation/native": "^6.1.18",
    "@react-navigation/native-stack": "^6.11.0",
    "@react-navigation/stack": "^6.4.1",
    "@reduxjs/toolkit": "^2.2.7",
    "@sentry/react-native": "~5.24.3",
    "@tamagui/animations-react-native": "^1.112.22",
    "@tamagui/babel-plugin": "^1.112.22",
    "@tamagui/config": "^1.112.22",
    "@tamagui/font-inter": "^1.112.22",
    "@tamagui/theme-base": "^1.112.22",
    "@types/jest": "^29.5.13",
    "@types/lodash": "^4.17.10",
    "babel-plugin-transform-inline-environment-variables": "^0.4.4",
    "expo": "~51.0.39",
    "expo-application": "~5.9.1",
    "expo-av": "~14.0.7",
    "expo-background-fetch": "~12.0.1",
    "expo-build-properties": "~0.12.5",
    "expo-constants": "~16.0.2",
    "expo-contacts": "~13.0.5",
    "expo-dev-client": "~4.0.29",
    "expo-device": "~6.0.2",
    "expo-file-system": "~17.0.1",
    "expo-firebase-recaptcha": "^2.3.1",
    "expo-font": "~12.0.10",
    "expo-haptics": "~13.0.1",
    "expo-image": "~1.13.0",
    "expo-image-picker": "~15.0.7",
    "expo-linear-gradient": "~13.0.2",
    "expo-linking": "~6.3.1",
    "expo-localization": "~15.0.3",
    "expo-network": "~6.0.1",
    "expo-notifications": "~0.28.19",
    "expo-screen-capture": "~6.0.1",
    "expo-splash-screen": "~0.27.7",
    "expo-status-bar": "~1.12.1",
    "expo-store-review": "~7.0.2",
    "expo-system-ui": "~3.0.7",
    "expo-tracking-transparency": "~4.0.2",
    "expo-updates": "~0.25.27",
    "expo-web-browser": "~13.0.3",
    "firebase-sdk": "npm:firebase@^10.14.0",
    "gifted-charts-core": "^0.1.43",
    "jest": "^29.7.0",
    "jest-expo": "~51.0.4",
    "libphonenumber-js": "^1.11.10",
    "lodash": "^4.17.21",
    "lottie-react-native": "6.7.0",
    "metro": "~0.80.12",
    "moize": "^6.1.6",
    "obscenity": "^0.4.0",
    "posthog-react-native": "^3.3.1",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-native": "0.74.5",
    "react-native-branch": "^6.4.0",
    "react-native-circular-progress": "^1.4.0",
    "react-native-gesture-handler": "~2.16.1",
    "react-native-get-random-values": "~1.11.0",
    "react-native-gifted-charts": "^1.4.43",
    "react-native-google-mobile-ads": "^14.8.0",
    "react-native-international-phone-number": "^0.7.6",
    "react-native-notifier": "^2.0.0",
    "react-native-popover-view": "^5.1.9",
    "react-native-purchases": "^8.2.3",
    "react-native-reanimated": "~3.10.1",
    "react-native-safe-area-context": "4.10.5",
    "react-native-screens": "3.31.1",
    "react-native-svg": "15.2.0",
    "react-native-svg-transformer": "^1.5.0",
    "react-native-view-shot": "^3.8.0",
    "react-native-web": "^0.19.12",
    "react-native-webview": "13.8.6",
    "react-redux": "^9.1.2",
    "redux-persist": "^6.0.0",
    "tabler-icons-react-native": "^3.1.0",
    "tamagui": "^1.112.22",
    "uuid": "^10.0.0"
  },
  "devDependencies": {
    "@babel/core": "^7.25.7",
    "@types/react": "~18.2.79",
    "@types/uuid": "^10.0.0",
    "@typescript-eslint/eslint-plugin": "^7.13.0",
    "@typescript-eslint/parser": "^7.13.0",
    "babel-plugin-module-resolver": "^5.0.2",
    "eslint": "^8.56.0",
    "eslint-plugin-react": "^7.34.2",
    "eslint-plugin-unused-imports": "^3.2.0",
    "husky": "^9.1.6",
    "lint-staged": "^15.2.10",
    "prettier": "3.3.3",
    "typescript": "~5.3.3"
  },
  "private": true
}

app.json

import "dotenv/config";

const IS_DEV = process.env.APP_VARIANT === "development";

const BRANCH_KEY = process.env.BRANCH_IO_KEY || "key_for_android";

const getIcon = () => {
  if (IS_DEV) return "./assets/logos/appIconDev.png";
  return "./assets/logos/appIcon.png";
};

const getSplashScreen = () => {
  if (IS_DEV) return "./assets/logos/splashScreenDev.png";

  return "./assets/logos/splashScreen.png";
};

const getBundleIdentifier = () => {
  if (IS_DEV) return "-";
  return "-";
};

const getName = () => {
  if (IS_DEV) return "-";
  return "-";
};

export default {
  name: getName(),
  slug: "-",
  owner: "-",
  version: "1.2.4",
  scheme: "-",
  orientation: "portrait",
  icon: getIcon(),
  userInterfaceStyle: "automatic",
  assetBundlePatterns: ["**/*"],
  ios: {
    supportsTablet: false,
    config: {
      usesNonExemptEncryption: false,
    },
    associatedDomains: [
      "-",
    ],
    bundleIdentifier: getBundleIdentifier(),
    infoPlist: {
      NSContactsUsageDescription:
        "Allow $(PRODUCT_NAME) to access your contacts to help you find and connect with your friends within the app",
      NSPhotoLibraryUsageDescription:
        "Allow $(PRODUCT_NAME) to access your photos to let you choose and set a profile picture",
    },
    splash: {
      image: getSplashScreen(),
      resizeMode: "contain",
      backgroundColor: "#EFEFEF",
      dark: {
        image: getSplashScreen(),
        resizeMode: "contain",
        backgroundColor: "#3E3E49",
      },
    },
    privacyManifests: {
      NSPrivacyAccessedAPITypes: [
        {
          NSPrivacyAccessedAPIType: "NSPrivacyAccessedAPICategoryDiskSpace",
          NSPrivacyAccessedAPITypeReasons: ["E174.1", "85F4.1"],
        },
        {
          NSPrivacyAccessedAPIType: "NSPrivacyAccessedAPICategoryFileTimestamp",
          NSPrivacyAccessedAPITypeReasons: ["C617.1", "0A2A.1", "3B52.1"],
        },
        {
          NSPrivacyAccessedAPIType: "NSPrivacyAccessedAPICategorySystemBootTime",
          NSPrivacyAccessedAPITypeReasons: ["35F9.1"],
        },
        {
          NSPrivacyAccessedAPIType: "NSPrivacyAccessedAPICategoryUserDefaults",
          NSPrivacyAccessedAPITypeReasons: ["CA92.1"],
        },
      ],
    },
  },
  plugins: [
    "@giphy/react-native-sdk",
    [
      "expo-build-properties",
      {
        ios: {
          useFrameworks: "static",
        },
      },
    ],
    [
      "expo-contacts",
      {
        contactsPermission:
          "Allow $(PRODUCT_NAME) to access your contacts to help you find and connect with your friends within the app",
      },
    ],
    [
      "expo-image-picker",
      {
        photosPermission:
          "Allow $(PRODUCT_NAME) to access your photos to let you choose and set a profile picture",
      },
    ],
    "expo-localization",
    [
      "expo-font",
      {
        fonts: ["./assets/fonts/Montserrat-ExtraBold.ttf", "./assets/fonts/Montserrat-Black.ttf"],
      },
    ],
    [
      "@sentry/react-native/expo",
      {
        url: "https://sentry.io/",
        project: "-",
        organization: "-",
      },
    ],
    [
      "expo-dev-client",
      {
        addGeneratedScheme: !IS_DEV,
      },
    ],
    [
      "@config-plugins/react-native-branch",
      {
        apiKey: BRANCH_KEY,
        iosAppDomain: "-",
      },
    ],
    [
      "react-native-google-mobile-ads",
      {
        iosAppId: "-",
        skAdNetworkItems: [
          "cstr6suwn9.skadnetwork",
          "4fzdc2evr5.skadnetwork",
          "2fnua5tdw4.skadnetwork",
          "ydx93a7ass.skadnetwork",
          "p78axxw29g.skadnetwork",
          "v72qych5uu.skadnetwork",
          "ludvb6z3bs.skadnetwork",
          "cp8zw746q7.skadnetwork",
          "3sh42y64q3.skadnetwork",
          "c6k4g5qg8m.skadnetwork",
          "s39g8k73mm.skadnetwork",
          "3qy4746246.skadnetwork",
          "hs6bdukanm.skadnetwork",
          "mlmmfzh3r3.skadnetwork",
          "v4nxqhlyqp.skadnetwork",
          "wzmmz9fp6w.skadnetwork",
          "su67r6k2v3.skadnetwork",
          "yclnxrl5pm.skadnetwork",
          "7ug5zh24hu.skadnetwork",
          "gta9lk7p23.skadnetwork",
          "vutu7akeur.skadnetwork",
          "y5ghdn5j9k.skadnetwork",
          "v9wttpbfk9.skadnetwork",
          "n38lu8286q.skadnetwork",
          "47vhws6wlr.skadnetwork",
          "kbd757ywx3.skadnetwork",
          "9t245vhmpl.skadnetwork",
          "a2p9lx4jpn.skadnetwork",
          "22mmun2rn5.skadnetwork",
          "4468km3ulz.skadnetwork",
          "2u9pt9hc89.skadnetwork",
          "8s468mfl3y.skadnetwork",
          "ppxm28t8ap.skadnetwork",
          "uw77j35x4d.skadnetwork",
          "pwa73g5rt2.skadnetwork",
          "578prtvx9j.skadnetwork",
          "4dzt52r2t5.skadnetwork",
          "tl55sbb4fm.skadnetwork",
          "e5fvkxwrpn.skadnetwork",
          "8c4e2ghe7u.skadnetwork",
          "3rd42ekr43.skadnetwork",
          "3qcr597p9d.skadnetwork",
        ],
        userTrackingUsageDescription:
          "Allow $(PRODUCT_NAME) to use your data to provide a better ad experience.",
      },
    ],
    [
      "expo-tracking-transparency",
      {
        userTrackingPermission:
          "Allow $(PRODUCT_NAME) to use your data to provide a better ad experience.",
      },
    ],
  ],
  extra: {
    eas: {
      projectId: "-",
    },
  },
  updates: {
    enabled: true,
    checkAutomatically: "ON_LOAD",
    fallbackToCacheTimeout: 0,
    url: "-",
  },
  runtimeVersion: {
    policy: "appVersion",
  },
  android: {
    config: {
      branch: { apiKey: BRANCH_KEY },
    },
  },
};

ios/Podfile

No response

android/build.gradle

No response

android/app/build.gradle

No response

android/settings.gradle

No response

AndroidManifest.xml

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    help wantedExtra attention is needed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions