Autolinking fails if android/app folder or Xcode project are missing #1054

Description

@tido64

Environment

System:
OS: macOS Mojave 10.14.6
CPU: (8) x64 Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
Memory: 938.13 MB / 16.00 GB
Shell: 3.2.57 - /bin/bash
Binaries:
Node: 12.16.1 - /usr/local/opt/node@12/bin/node
Yarn: 1.22.4 - /usr/local/bin/yarn
npm: 6.13.4 - /usr/local/opt/node@12/bin/npm
Watchman: 4.9.0 - /usr/local/bin/watchman
SDKs:
iOS SDK:
Platforms: iOS 13.2, DriverKit 19.0, macOS 10.15, tvOS 13.2, watchOS 6.1
Android SDK:
API Levels: 26, 27, 28, 29
Build Tools: 27.0.3, 28.0.3, 29.0.2, 29.0.3
System Images: android-28 | Google APIs Intel x86 Atom
Android NDK: 20.0.5594570
IDEs:
Android Studio: 3.5 AI-191.8026.42.35.5900203
Xcode: 11.3.1/11C504 - /usr/bin/xcodebuild
npmPackages:
react: 16.9.0 => 16.9.0
react-native: 0.61.5 => 0.61.5
npmGlobalPackages:
react-native-cli: 2.0.1

Description

In monorepos where packages are split by platform, react-native config is not able to populate projects because it makes assumptions on the folder structure of the package. For example, given a project like below:

my-component
└── packages
├── my-component-core
│ ├── package.json
│ └── src
├── my-component-android
│ ├── build.gradle
│ ├── package.json
│ └── src
└── my-component-ios
├── TestApp.xcworkspace
├── package.json
└── src

The output of react-native config in my-component-android/-ios is currently:

{
"...""project": {
"ios": null,
"android": null
}
}

This had no consequences up until 3.0, when autolinking started using it in #768. Autolinking is currently broken for repos with a different folder structure.

It is possible to work around this issue by adding a react-native.config.js with the following content:

module.exports={project: {ios: {project: "ReactTestApp-Dummy.xcodeproj"}}};

Reproducible Demo

Checkout this repo and branch: https://github.com/microsoft/react-native-test-app/tree/tido/autolink-fail-repro.

Then run the following:

cd example
yarn
pod install --project-directory=ios

Output:

% pod install --project-directory=ios
[!] Invalid `Podfile` file: undefined method `[]' for nil:NilClass. # from /~/react-native-test-app/example/ios/Podfile:5 # ------------------------------------------- # > use_test_app! __dir__ do |target| # case target # -------------------------------------------

cc @arazabishov in case you need more Android details.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      Autolinking fails if android/app folder or Xcode project are missing #1054

      Description

      @tido64

      Environment

      System:
      OS: macOS Mojave 10.14.6
      CPU: (8) x64 Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
      Memory: 938.13 MB / 16.00 GB
      Shell: 3.2.57 - /bin/bash
      Binaries:
      Node: 12.16.1 - /usr/local/opt/node@12/bin/node
      Yarn: 1.22.4 - /usr/local/bin/yarn
      npm: 6.13.4 - /usr/local/opt/node@12/bin/npm
      Watchman: 4.9.0 - /usr/local/bin/watchman
      SDKs:
      iOS SDK:
      Platforms: iOS 13.2, DriverKit 19.0, macOS 10.15, tvOS 13.2, watchOS 6.1
      Android SDK:
      API Levels: 26, 27, 28, 29
      Build Tools: 27.0.3, 28.0.3, 29.0.2, 29.0.3
      System Images: android-28 | Google APIs Intel x86 Atom
      Android NDK: 20.0.5594570
      IDEs:
      Android Studio: 3.5 AI-191.8026.42.35.5900203
      Xcode: 11.3.1/11C504 - /usr/bin/xcodebuild
      npmPackages:
      react: 16.9.0 => 16.9.0
      react-native: 0.61.5 => 0.61.5
      npmGlobalPackages:
      react-native-cli: 2.0.1
      

      Description

      In monorepos where packages are split by platform, react-native config is not able to populate projects because it makes assumptions on the folder structure of the package. For example, given a project like below:

      my-component
      └── packages
      ├── my-component-core
      │ ├── package.json
      │ └── src
      ├── my-component-android
      │ ├── build.gradle
      │ ├── package.json
      │ └── src
      └── my-component-ios
      ├── TestApp.xcworkspace
      ├── package.json
      └── src
      

      The output of react-native config in my-component-android/-ios is currently:

      {
      "...""project": {
      "ios": null,
      "android": null
      }
      }

      This had no consequences up until 3.0, when autolinking started using it in #768. Autolinking is currently broken for repos with a different folder structure.

      It is possible to work around this issue by adding a react-native.config.js with the following content:

      module.exports={project: {ios: {project: "ReactTestApp-Dummy.xcodeproj"}}};

      Reproducible Demo

      Checkout this repo and branch: https://github.com/microsoft/react-native-test-app/tree/tido/autolink-fail-repro.

      Then run the following:

      cd example
      yarn
      pod install --project-directory=ios

      Output:

      % pod install --project-directory=ios
      [!] Invalid `Podfile` file: undefined method `[]' for nil:NilClass. # from /~/react-native-test-app/example/ios/Podfile:5 # ------------------------------------------- # > use_test_app! __dir__ do |target| # case target # -------------------------------------------

      cc @arazabishov in case you need more Android details.

      Metadata

      Metadata

      Assignees

      No one assigned

        Type

        No type

        Projects

        No projects

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          Autolinking fails if android/app folder or Xcode project are missing #1054

          Description

          @tido64

          Environment

          System:
          OS: macOS Mojave 10.14.6
          CPU: (8) x64 Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
          Memory: 938.13 MB / 16.00 GB
          Shell: 3.2.57 - /bin/bash
          Binaries:
          Node: 12.16.1 - /usr/local/opt/node@12/bin/node
          Yarn: 1.22.4 - /usr/local/bin/yarn
          npm: 6.13.4 - /usr/local/opt/node@12/bin/npm
          Watchman: 4.9.0 - /usr/local/bin/watchman
          SDKs:
          iOS SDK:
          Platforms: iOS 13.2, DriverKit 19.0, macOS 10.15, tvOS 13.2, watchOS 6.1
          Android SDK:
          API Levels: 26, 27, 28, 29
          Build Tools: 27.0.3, 28.0.3, 29.0.2, 29.0.3
          System Images: android-28 | Google APIs Intel x86 Atom
          Android NDK: 20.0.5594570
          IDEs:
          Android Studio: 3.5 AI-191.8026.42.35.5900203
          Xcode: 11.3.1/11C504 - /usr/bin/xcodebuild
          npmPackages:
          react: 16.9.0 => 16.9.0
          react-native: 0.61.5 => 0.61.5
          npmGlobalPackages:
          react-native-cli: 2.0.1
          

          Description

          In monorepos where packages are split by platform, react-native config is not able to populate projects because it makes assumptions on the folder structure of the package. For example, given a project like below:

          my-component
          └── packages
          ├── my-component-core
          │ ├── package.json
          │ └── src
          ├── my-component-android
          │ ├── build.gradle
          │ ├── package.json
          │ └── src
          └── my-component-ios
          ├── TestApp.xcworkspace
          ├── package.json
          └── src
          

          The output of react-native config in my-component-android/-ios is currently:

          {
          "...""project": {
          "ios": null,
          "android": null
          }
          }

          This had no consequences up until 3.0, when autolinking started using it in #768. Autolinking is currently broken for repos with a different folder structure.

          It is possible to work around this issue by adding a react-native.config.js with the following content:

          module.exports={project: {ios: {project: "ReactTestApp-Dummy.xcodeproj"}}};

          Reproducible Demo

          Checkout this repo and branch: https://github.com/microsoft/react-native-test-app/tree/tido/autolink-fail-repro.

          Then run the following:

          cd example
          yarn
          pod install --project-directory=ios

          Output:

          % pod install --project-directory=ios
          [!] Invalid `Podfile` file: undefined method `[]' for nil:NilClass. # from /~/react-native-test-app/example/ios/Podfile:5 # ------------------------------------------- # > use_test_app! __dir__ do |target| # case target # -------------------------------------------

          cc @arazabishov in case you need more Android details.

          Metadata

          Metadata

          Assignees

          No one assigned

            Type

            No type

            Projects

            No projects

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Autolinking fails if android/app folder or Xcode project are missing #1054

              Description

              @tido64

              Environment

              System:
              OS: macOS Mojave 10.14.6
              CPU: (8) x64 Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
              Memory: 938.13 MB / 16.00 GB
              Shell: 3.2.57 - /bin/bash
              Binaries:
              Node: 12.16.1 - /usr/local/opt/node@12/bin/node
              Yarn: 1.22.4 - /usr/local/bin/yarn
              npm: 6.13.4 - /usr/local/opt/node@12/bin/npm
              Watchman: 4.9.0 - /usr/local/bin/watchman
              SDKs:
              iOS SDK:
              Platforms: iOS 13.2, DriverKit 19.0, macOS 10.15, tvOS 13.2, watchOS 6.1
              Android SDK:
              API Levels: 26, 27, 28, 29
              Build Tools: 27.0.3, 28.0.3, 29.0.2, 29.0.3
              System Images: android-28 | Google APIs Intel x86 Atom
              Android NDK: 20.0.5594570
              IDEs:
              Android Studio: 3.5 AI-191.8026.42.35.5900203
              Xcode: 11.3.1/11C504 - /usr/bin/xcodebuild
              npmPackages:
              react: 16.9.0 => 16.9.0
              react-native: 0.61.5 => 0.61.5
              npmGlobalPackages:
              react-native-cli: 2.0.1
              

              Description

              In monorepos where packages are split by platform, react-native config is not able to populate projects because it makes assumptions on the folder structure of the package. For example, given a project like below:

              my-component
              └── packages
              ├── my-component-core
              │ ├── package.json
              │ └── src
              ├── my-component-android
              │ ├── build.gradle
              │ ├── package.json
              │ └── src
              └── my-component-ios
              ├── TestApp.xcworkspace
              ├── package.json
              └── src
              

              The output of react-native config in my-component-android/-ios is currently:

              {
              "...""project": {
              "ios": null,
              "android": null
              }
              }

              This had no consequences up until 3.0, when autolinking started using it in #768. Autolinking is currently broken for repos with a different folder structure.

              It is possible to work around this issue by adding a react-native.config.js with the following content:

              module.exports={project: {ios: {project: "ReactTestApp-Dummy.xcodeproj"}}};

              Reproducible Demo

              Checkout this repo and branch: https://github.com/microsoft/react-native-test-app/tree/tido/autolink-fail-repro.

              Then run the following:

              cd example
              yarn
              pod install --project-directory=ios

              Output:

              % pod install --project-directory=ios
              [!] Invalid `Podfile` file: undefined method `[]' for nil:NilClass. # from /~/react-native-test-app/example/ios/Podfile:5 # ------------------------------------------- # > use_test_app! __dir__ do |target| # case target # -------------------------------------------

              cc @arazabishov in case you need more Android details.

              Metadata

              Metadata

              Assignees

              No one assigned

                Type

                No type

                Projects

                No projects

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  Autolinking fails if android/app folder or Xcode project are missing #1054

                  Description

                  @tido64

                  Environment

                  System:
                  OS: macOS Mojave 10.14.6
                  CPU: (8) x64 Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
                  Memory: 938.13 MB / 16.00 GB
                  Shell: 3.2.57 - /bin/bash
                  Binaries:
                  Node: 12.16.1 - /usr/local/opt/node@12/bin/node
                  Yarn: 1.22.4 - /usr/local/bin/yarn
                  npm: 6.13.4 - /usr/local/opt/node@12/bin/npm
                  Watchman: 4.9.0 - /usr/local/bin/watchman
                  SDKs:
                  iOS SDK:
                  Platforms: iOS 13.2, DriverKit 19.0, macOS 10.15, tvOS 13.2, watchOS 6.1
                  Android SDK:
                  API Levels: 26, 27, 28, 29
                  Build Tools: 27.0.3, 28.0.3, 29.0.2, 29.0.3
                  System Images: android-28 | Google APIs Intel x86 Atom
                  Android NDK: 20.0.5594570
                  IDEs:
                  Android Studio: 3.5 AI-191.8026.42.35.5900203
                  Xcode: 11.3.1/11C504 - /usr/bin/xcodebuild
                  npmPackages:
                  react: 16.9.0 => 16.9.0
                  react-native: 0.61.5 => 0.61.5
                  npmGlobalPackages:
                  react-native-cli: 2.0.1
                  

                  Description

                  In monorepos where packages are split by platform, react-native config is not able to populate projects because it makes assumptions on the folder structure of the package. For example, given a project like below:

                  my-component
                  └── packages
                  ├── my-component-core
                  │ ├── package.json
                  │ └── src
                  ├── my-component-android
                  │ ├── build.gradle
                  │ ├── package.json
                  │ └── src
                  └── my-component-ios
                  ├── TestApp.xcworkspace
                  ├── package.json
                  └── src
                  

                  The output of react-native config in my-component-android/-ios is currently:

                  {
                  "...""project": {
                  "ios": null,
                  "android": null
                  }
                  }

                  This had no consequences up until 3.0, when autolinking started using it in #768. Autolinking is currently broken for repos with a different folder structure.

                  It is possible to work around this issue by adding a react-native.config.js with the following content:

                  module.exports={project: {ios: {project: "ReactTestApp-Dummy.xcodeproj"}}};

                  Reproducible Demo

                  Checkout this repo and branch: https://github.com/microsoft/react-native-test-app/tree/tido/autolink-fail-repro.

                  Then run the following:

                  cd example
                  yarn
                  pod install --project-directory=ios

                  Output:

                  % pod install --project-directory=ios
                  [!] Invalid `Podfile` file: undefined method `[]' for nil:NilClass. # from /~/react-native-test-app/example/ios/Podfile:5 # ------------------------------------------- # > use_test_app! __dir__ do |target| # case target # -------------------------------------------

                  cc @arazabishov in case you need more Android details.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Type

                    No type

                    Projects

                    No projects

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      Autolinking fails if android/app folder or Xcode project are missing #1054

                      Description

                      @tido64

                      Environment

                      System:
                      OS: macOS Mojave 10.14.6
                      CPU: (8) x64 Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
                      Memory: 938.13 MB / 16.00 GB
                      Shell: 3.2.57 - /bin/bash
                      Binaries:
                      Node: 12.16.1 - /usr/local/opt/node@12/bin/node
                      Yarn: 1.22.4 - /usr/local/bin/yarn
                      npm: 6.13.4 - /usr/local/opt/node@12/bin/npm
                      Watchman: 4.9.0 - /usr/local/bin/watchman
                      SDKs:
                      iOS SDK:
                      Platforms: iOS 13.2, DriverKit 19.0, macOS 10.15, tvOS 13.2, watchOS 6.1
                      Android SDK:
                      API Levels: 26, 27, 28, 29
                      Build Tools: 27.0.3, 28.0.3, 29.0.2, 29.0.3
                      System Images: android-28 | Google APIs Intel x86 Atom
                      Android NDK: 20.0.5594570
                      IDEs:
                      Android Studio: 3.5 AI-191.8026.42.35.5900203
                      Xcode: 11.3.1/11C504 - /usr/bin/xcodebuild
                      npmPackages:
                      react: 16.9.0 => 16.9.0
                      react-native: 0.61.5 => 0.61.5
                      npmGlobalPackages:
                      react-native-cli: 2.0.1
                      

                      Description

                      In monorepos where packages are split by platform, react-native config is not able to populate projects because it makes assumptions on the folder structure of the package. For example, given a project like below:

                      my-component
                      └── packages
                      ├── my-component-core
                      │ ├── package.json
                      │ └── src
                      ├── my-component-android
                      │ ├── build.gradle
                      │ ├── package.json
                      │ └── src
                      └── my-component-ios
                      ├── TestApp.xcworkspace
                      ├── package.json
                      └── src
                      

                      The output of react-native config in my-component-android/-ios is currently:

                      {
                      "...""project": {
                      "ios": null,
                      "android": null
                      }
                      }

                      This had no consequences up until 3.0, when autolinking started using it in #768. Autolinking is currently broken for repos with a different folder structure.

                      It is possible to work around this issue by adding a react-native.config.js with the following content:

                      module.exports={project: {ios: {project: "ReactTestApp-Dummy.xcodeproj"}}};

                      Reproducible Demo

                      Checkout this repo and branch: https://github.com/microsoft/react-native-test-app/tree/tido/autolink-fail-repro.

                      Then run the following:

                      cd example
                      yarn
                      pod install --project-directory=ios

                      Output:

                      % pod install --project-directory=ios
                      [!] Invalid `Podfile` file: undefined method `[]' for nil:NilClass. # from /~/react-native-test-app/example/ios/Podfile:5 # ------------------------------------------- # > use_test_app! __dir__ do |target| # case target # -------------------------------------------

                      cc @arazabishov in case you need more Android details.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Type

                        No type

                        Projects

                        No projects

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          Autolinking fails if android/app folder or Xcode project are missing #1054

                          Description

                          @tido64

                          Environment

                          System:
                          OS: macOS Mojave 10.14.6
                          CPU: (8) x64 Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
                          Memory: 938.13 MB / 16.00 GB
                          Shell: 3.2.57 - /bin/bash
                          Binaries:
                          Node: 12.16.1 - /usr/local/opt/node@12/bin/node
                          Yarn: 1.22.4 - /usr/local/bin/yarn
                          npm: 6.13.4 - /usr/local/opt/node@12/bin/npm
                          Watchman: 4.9.0 - /usr/local/bin/watchman
                          SDKs:
                          iOS SDK:
                          Platforms: iOS 13.2, DriverKit 19.0, macOS 10.15, tvOS 13.2, watchOS 6.1
                          Android SDK:
                          API Levels: 26, 27, 28, 29
                          Build Tools: 27.0.3, 28.0.3, 29.0.2, 29.0.3
                          System Images: android-28 | Google APIs Intel x86 Atom
                          Android NDK: 20.0.5594570
                          IDEs:
                          Android Studio: 3.5 AI-191.8026.42.35.5900203
                          Xcode: 11.3.1/11C504 - /usr/bin/xcodebuild
                          npmPackages:
                          react: 16.9.0 => 16.9.0
                          react-native: 0.61.5 => 0.61.5
                          npmGlobalPackages:
                          react-native-cli: 2.0.1
                          

                          Description

                          In monorepos where packages are split by platform, react-native config is not able to populate projects because it makes assumptions on the folder structure of the package. For example, given a project like below:

                          my-component
                          └── packages
                          ├── my-component-core
                          │ ├── package.json
                          │ └── src
                          ├── my-component-android
                          │ ├── build.gradle
                          │ ├── package.json
                          │ └── src
                          └── my-component-ios
                          ├── TestApp.xcworkspace
                          ├── package.json
                          └── src
                          

                          The output of react-native config in my-component-android/-ios is currently:

                          {
                          "...""project": {
                          "ios": null,
                          "android": null
                          }
                          }

                          This had no consequences up until 3.0, when autolinking started using it in #768. Autolinking is currently broken for repos with a different folder structure.

                          It is possible to work around this issue by adding a react-native.config.js with the following content:

                          module.exports={project: {ios: {project: "ReactTestApp-Dummy.xcodeproj"}}};

                          Reproducible Demo

                          Checkout this repo and branch: https://github.com/microsoft/react-native-test-app/tree/tido/autolink-fail-repro.

                          Then run the following:

                          cd example
                          yarn
                          pod install --project-directory=ios

                          Output:

                          % pod install --project-directory=ios
                          [!] Invalid `Podfile` file: undefined method `[]' for nil:NilClass. # from /~/react-native-test-app/example/ios/Podfile:5 # ------------------------------------------- # > use_test_app! __dir__ do |target| # case target # -------------------------------------------

                          cc @arazabishov in case you need more Android details.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Type

                            No type

                            Projects

                            No projects

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              Autolinking fails if android/app folder or Xcode project are missing #1054

                              Description

                              @tido64

                              Environment

                              System:
                              OS: macOS Mojave 10.14.6
                              CPU: (8) x64 Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
                              Memory: 938.13 MB / 16.00 GB
                              Shell: 3.2.57 - /bin/bash
                              Binaries:
                              Node: 12.16.1 - /usr/local/opt/node@12/bin/node
                              Yarn: 1.22.4 - /usr/local/bin/yarn
                              npm: 6.13.4 - /usr/local/opt/node@12/bin/npm
                              Watchman: 4.9.0 - /usr/local/bin/watchman
                              SDKs:
                              iOS SDK:
                              Platforms: iOS 13.2, DriverKit 19.0, macOS 10.15, tvOS 13.2, watchOS 6.1
                              Android SDK:
                              API Levels: 26, 27, 28, 29
                              Build Tools: 27.0.3, 28.0.3, 29.0.2, 29.0.3
                              System Images: android-28 | Google APIs Intel x86 Atom
                              Android NDK: 20.0.5594570
                              IDEs:
                              Android Studio: 3.5 AI-191.8026.42.35.5900203
                              Xcode: 11.3.1/11C504 - /usr/bin/xcodebuild
                              npmPackages:
                              react: 16.9.0 => 16.9.0
                              react-native: 0.61.5 => 0.61.5
                              npmGlobalPackages:
                              react-native-cli: 2.0.1
                              

                              Description

                              In monorepos where packages are split by platform, react-native config is not able to populate projects because it makes assumptions on the folder structure of the package. For example, given a project like below:

                              my-component
                              └── packages
                              ├── my-component-core
                              │ ├── package.json
                              │ └── src
                              ├── my-component-android
                              │ ├── build.gradle
                              │ ├── package.json
                              │ └── src
                              └── my-component-ios
                              ├── TestApp.xcworkspace
                              ├── package.json
                              └── src
                              

                              The output of react-native config in my-component-android/-ios is currently:

                              {
                              "...""project": {
                              "ios": null,
                              "android": null
                              }
                              }

                              This had no consequences up until 3.0, when autolinking started using it in #768. Autolinking is currently broken for repos with a different folder structure.

                              It is possible to work around this issue by adding a react-native.config.js with the following content:

                              module.exports={project: {ios: {project: "ReactTestApp-Dummy.xcodeproj"}}};

                              Reproducible Demo

                              Checkout this repo and branch: https://github.com/microsoft/react-native-test-app/tree/tido/autolink-fail-repro.

                              Then run the following:

                              cd example
                              yarn
                              pod install --project-directory=ios

                              Output:

                              % pod install --project-directory=ios
                              [!] Invalid `Podfile` file: undefined method `[]' for nil:NilClass. # from /~/react-native-test-app/example/ios/Podfile:5 # ------------------------------------------- # > use_test_app! __dir__ do |target| # case target # -------------------------------------------

                              cc @arazabishov in case you need more Android details.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Type

                                No type

                                Projects

                                No projects

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions