Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: upgrade to RN 0.73.6 #1439

Open
wants to merge 35 commits into
base: main
Choose a base branch
from

Conversation

MosCD3
Copy link
Contributor

@MosCD3 MosCD3 commented Feb 12, 2025

Summary of Changes

iOS part done so far
All changes re-reviewed and re-done by @MaSMas0

New version supports experimental and chrome debugger (RN Debugger)
Added menu to start chrome debugger

Simulator Screenshot - iPhone 16 - 2025-02-18 at 18 00 27

Screenshot 2025-02-18 at 5 54 54 PM

Replace this text with a high-level summary of the changes included in this PR.

Screenshots, videos, or gifs

Replace this text with embedded media for UI changes if they are included in this PR. If there are none, simply enter N/A

Breaking change guide

Replace this text with any breaking changes included in this PR along with how to address them in downstream projects. If there are none, simply enter N/A

Related Issues

Replace this text with issue #'s that are relevant to this PR. If there are none, simply enter N/A

Pull Request Checklist

Tick all boxes below to demonstrate that you have completed the respective task. If the item does not apply to your this PR check it anyway to make it apparent that there's nothing to do.

  • All commits contain a DCO Signed-off-by line (we use the DCO GitHub app to enforce this)
  • If applicable, screenshots, gifs, or video are included for UI changes
  • If applicable, breaking changes are described above along with how to address them
  • Updated documentation as needed for changed code and new or modified features
  • Added sufficient tests so that overall code coverage is not reduced

If you have any questions to any of the points above, just submit and ask! This checklist is here to help you, not to deter you from contributing!

Pro Tip 🤓

  • Read our contribution guide at least once; it will save you a few review cycles!
  • Your PR will likely not be reviewed until all the above boxes are checked and all automated checks have passed

@jleach jleach changed the title Upgrade to RN 0.73.5 feat: upgrade to RN 0.73.5 Feb 12, 2025
@MosCD3 MosCD3 marked this pull request as ready for review February 13, 2025 03:55
@MosCD3 MosCD3 requested a review from a team as a code owner February 13, 2025 03:55
@MosCD3 MosCD3 marked this pull request as draft February 13, 2025 04:11
@MaSMas0 MaSMas0 force-pushed the refactor/moscd3/upgrade-rn-73-5 branch from bac8e18 to bb4e828 Compare February 17, 2025 20:45
@MosCD3 MosCD3 marked this pull request as ready for review February 17, 2025 20:47
MosCD3 and others added 12 commits February 17, 2025 22:05
Signed-off-by: Mostafa Gamal <[email protected]>
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
…ndation#1427)

Signed-off-by: fc-santos <[email protected]>
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
…tion#1438)

Signed-off-by: ClaudeArs <[email protected]>
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
Signed-off-by: Mostafa Gamal <[email protected]>
Signed-off-by: Mostafa Gamal <[email protected]>
Co-authored-by: Bryce McMath <[email protected]>
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
Signed-off-by: Bryce McMath <[email protected]>
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
@MaSMas0 MaSMas0 force-pushed the refactor/moscd3/upgrade-rn-73-5 branch from 8b9707e to 67219c4 Compare February 17, 2025 21:06
@MaSMas0 MaSMas0 force-pushed the refactor/moscd3/upgrade-rn-73-5 branch 3 times, most recently from cb500bb to 634439e Compare February 17, 2025 22:54
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
@MaSMas0 MaSMas0 force-pushed the refactor/moscd3/upgrade-rn-73-5 branch from 634439e to 2c420df Compare February 17, 2025 23:25
@codecov-commenter
Copy link

codecov-commenter commented Feb 17, 2025

Codecov Report

Attention: Patch coverage is 20.00000% with 52 lines in your changes missing coverage. Please review.

Project coverage is 55.60%. Comparing base (aff8281) to head (8110492).
Report is 27 commits behind head on main.

Files with missing lines Patch % Lines
packages/legacy/core/App/contexts/auth.tsx 4.16% 46 Missing ⚠️
packages/legacy/core/App/DebugCode.ts 60.00% 6 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1439      +/-   ##
==========================================
+ Coverage   55.52%   55.60%   +0.07%     
==========================================
  Files         223      228       +5     
  Lines        7985     8176     +191     
  Branches     2241     2334      +93     
==========================================
+ Hits         4434     4546     +112     
- Misses       3528     3607      +79     
  Partials       23       23              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@jleach jleach marked this pull request as draft February 18, 2025 17:16
Signed-off-by: Mostafa Gamal <[email protected]>
@MaSMas0 MaSMas0 force-pushed the refactor/moscd3/upgrade-rn-73-5 branch 2 times, most recently from d7770d7 to 743c7dc Compare March 13, 2025 04:43
Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
@MaSMas0 MaSMas0 force-pushed the refactor/moscd3/upgrade-rn-73-5 branch from 743c7dc to c28f2d9 Compare March 13, 2025 19:10
…d-wallet into refactor/moscd3/upgrade-rn-73-5

Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
@MaSMas0 MaSMas0 force-pushed the refactor/moscd3/upgrade-rn-73-5 branch from 817e44d to 1809cd8 Compare March 13, 2025 21:18
@MaSMas0
Copy link

MaSMas0 commented Mar 13, 2025

PR Summary: React Native Upgrade from v0.72.17 to v0.73.6

Based on the file structure you've shared, I can see this PR implements a significant upgrade of the Bifold Wallet from React Native v0.72.17 to v0.73.6. Here's a summary of the changes:

Core Changes

  • JavaScript/TypeScript Migration:

    • Upgraded React Native core dependencies in package.json
    • Updated various app context and screen files
    • Fixed OnboardingStyleSheet typing to use ViewStyle instead of Record<string, any> for type safety
  • Android Updates:

    • Migrated Java files to Kotlin (MainActivity.javaMainActivity.kt, MainApplication.javaMainApplication.kt)
    • Updated build.gradle and gradle.lockfile configurations
    • Modified AndroidManifest.xml for compatibility with newer RN version
    • Updated Gradle version to be compatible with RN 0.73.6
  • iOS Updates:

    • Updated Podfile and Podfile.lock with new dependency versions
    • Modified XCode project settings for compatibility
    • Changed AppDelegate from Objective-C to Objective-C++ for compatibility
    • Updated the Gemfile to be compatible with the new RN version
    • Fixed yarn ios script to explicitly choose the valid iOS schema

Build & Configuration Updates

  • Updated GitHub workflow files (main.yaml) for iOS and Android builds
  • Added .nvmrc to standardize Node.js version across development environments
  • Modified various babel configurations across packages
  • Added react-native-reanimated to babel.config.js as recommended by official documentation
  • Added the experimental debugger for the yarn start script (recommended for Hermes)
  • Ensured Hermes is properly configured in Podfile

Testing Infrastructure

  • Updated test snapshots to accommodate UI changes from the new React Native version
  • Revised Jest configuration to work with the upgraded environment
  • Refactored unit tests to address issues with time-based tests:
    • Fixed error-prone code using waitFor with time travel
    • Implemented FakeTimers for long-waited timeouts
    • Improved handling of components affected by upgrade (RNCSafeAreaView, RNSVGRect, VirtualizedList)

Developer Experience

  • Added .nvmrc for consistent Node.js version management
  • For zsh users, this script can be added to automatically use the correct Node version:
# Add this to your .zshrc
autoload -U add-zsh-hook
load-nvmrc() {
  local node_version="$(nvm version)"
  local nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$node_version" ]; then
      nvm use
    fi
  elif [ "$node_version" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

For more information and support for other platforms, refer to https://github.com/nvm-sh/nvm#zsh

This upgrade provides the benefits of React Native 0.73.6, including improved performance, bug fixes, and support for newer platform features, while maintaining the core functionality of the Bifold Wallet.

Copy link
Contributor

@bryce-mcmath bryce-mcmath left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some small comments. If it's easier I can make these changes if you invite me to collab on this branch

Comment on lines 21 to 23
env:
# Explicitly tell React Native where to find Node
REACT_NATIVE_NODE_BINARY: /Users/runner/hostedtoolcache/node/18.18.2/arm64/bin/node
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this still needed with the $(which node) below? Using which seems like the less brittle approach to me

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think $(which node) is sufficient and yes it is less brittle but i was trying to find out why the GHA was failing so i was ruling this out

@@ -1,12 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just wondering, why was this removed?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bryce-mcmath you can read this facebook/react-native#5886 (comment) about
Removing unused permissions added at build time and this common unused permission you usually use it in debugging mode

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah nice, good catch 👍

# Enables Flipper.
#
# shall we Enable Flipper?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think anyone uses Flipper on this project or that it was ever fully enabled. Safe to remove completely I think

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that is just a comment and it is removed

"ios": "react-native run-ios",
"start": "react-native start",
"ios": "react-native run-ios --scheme AriesBifold",
"start": "react-native start --experimental-debugger",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the debugging code will be added in a future PR, should we remove this flag?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bryce-mcmath i dont think we should as it is anyway working what i removed is the workaround for the remote debugging but the experimental is the default for hermes so no i think we shouldnt but if you want we can add a new script like start:debug

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be fine then 👍

Comment on lines 79 to 85
// no need for the waitFor it might cause infinte loop and cause the test to fail
// await waitFor(() => {
// timeTravel(1000)
// })

// use this instead since anyway u r waiting the promise to resolve to set setBiometryAvailable in the useEffect
// this is cleaner approach than advanceTimersByTime
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree, can remove this comment and use the findBy approach

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done!

Comment on lines 101 to 106
// await waitFor(() => {
// timeTravel(1000)
// })
// await act(async () => {
// await new Promise((resolve) => setTimeout(resolve, 0))
// })
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can remove this as well

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done!


expect(tree).toMatchSnapshot()
})

test('Toggles use biometrics ok', async () => {
authContext.isBiometricsActive = jest.fn().mockResolvedValueOnce(true)
// authContext.isBiometricsActive = jest.fn().mockResolvedValueOnce(true)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can remove

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done!

Comment on lines 131 to 133
// await waitFor(() => {
// timeTravel(1000)
// })
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can remove

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done!

Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What was the reason for this change? Going from .m to .mm I mean

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bryce-mcmath i mentioned this in the PR Summary #1439 (comment)

Changed AppDelegate from Objective-C to Objective-C++ for compatibility

please check the summary to know more

@bryce-mcmath bryce-mcmath self-requested a review March 14, 2025 20:37
Copy link
Contributor

@bryce-mcmath bryce-mcmath left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couple more small things related to the GHA that the summary comment didn't clear up for me, sorry to be a bother

Comment on lines +72 to +76
- name: Create .xcode.env.local file
working-directory: ./packages/legacy/app/ios
run: |
echo "export NODE_BINARY=$(which node)" > .xcode.env.local
cat .xcode.env.local
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this needed or was it just added for troubleshooting?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link

@MaSMas0 MaSMas0 Mar 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes it is needed and cant be removed

Comment on lines 81 to 83
env:
REACT_NATIVE_NODE_BINARY: $(which node)
NODE_BINARY: $(which node)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are these needed here as well as on line 21? It should still work if they were both set up top only, no?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done and removed

Comment on lines 93 to 95
env:
REACT_NATIVE_NODE_BINARY: $(which node)
NODE_BINARY: $(which node)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment as above

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed

@bryce-mcmath
Copy link
Contributor

@MaSMas0 @MosCD3 the only thing (other than the GHA stuff) that I think should be changed before this PR is good to go, is react-native-reanimated should be pegged to version 3.6.3 rather than ^3.6.0 because I found that other packages that use it will sometimes resolve it to be a higher minor version that RN 0.73.6 doesn't work with (eg. https://github.com/software-mansion/react-native-reanimated/blob/bd4752b55935d3057d21d8141f98c2e6e2dae9c7/packages/react-native-reanimated/scripts/reanimated_utils.rb#L56-L57)

Might even be worth adding to the resolutions block as well

@MaSMas0
Copy link

MaSMas0 commented Mar 17, 2025

@bryce-mcmath for the react-native-reanimated i dont see the issue and how it is related to carret as all minor versions of react-native-reanimated is supported by RN 0.73.6 as mentioned here in this link : https://docs.swmansion.com/react-native-reanimated/docs/guides/compatibility

image

as for this https://github.com/software-mansion/react-native-reanimated/blob/bd4752b55935d3057d21d8141f98c2e6e2dae9c7/packages/react-native-reanimated/scripts/reanimated_utils.rb#L56-L57)
this is related to this PR software-mansion/react-native-reanimated#6995
which states that it is related to Reanimated v4 & v3.17 which is way higher than v3.6.0

image

P.S: react-native-reanimated isnt really used in the project at all maybe it is planned to be but right now it exist as additional dependency but has no real usage in the app so maybe it should be removed till you decide to use it instead of react native built in animation

@MaSMas0 MaSMas0 force-pushed the refactor/moscd3/upgrade-rn-73-5 branch from 4c1b60f to 619e0f5 Compare March 17, 2025 14:38
@MosCD3
Copy link
Contributor Author

MosCD3 commented Mar 17, 2025

@bryce-mcmath I think we should remove the re-animated package if its not directly used

@MaSMas0 MaSMas0 force-pushed the refactor/moscd3/upgrade-rn-73-5 branch from 619e0f5 to 13ccfce Compare March 17, 2025 15:14
@bryce-mcmath
Copy link
Contributor

@MaSMas0

it is related to Reanimated v4 & v3.17 which is way higher than v3.6.0

In semantic versioning, a package with version x.y.z means x is the major version, y is the minor, and z is the patch. A tilde (~) will allow packages to upgrade the patch version automatically, and a caret (^) will allow packages to upgrade the minor and patch versions automatically. In this example, it means ^3.6.0 can get bumped to 3.17.0. Which is not supported by RN versions lower than 0.75. Adding it in the resolutions block is also helpful as it enforces that version even when it is used as a transient dependency

P.S: react-native-reanimated isnt really used in the project at all maybe it is planned to be but right now it exist as additional dependency but has no real usage in the app so maybe it should be removed till you decide to use it instead of react native built in animation

I'm fairly sure even if it is not used directly it is required to support other packages we use

@MaSMas0
Copy link

MaSMas0 commented Mar 17, 2025

@bryce-mcmath

In semantic versioning, a package with version x.y.z means x is the major version, y is the minor, and z is the patch. A tilde (~) will allow packages to upgrade the patch version automatically, and a caret (^) will allow packages to upgrade the minor and patch versions automatically. In this example, it means ^3.6.0 can get bumped to 3.17.0. Which is not supported by RN versions lower than 0.75. Adding it in the resolutions block is also helpful as it enforces that version even when it is used as a transient dependency

you are right i confused the patch with minor :D and tilde with caret ok no problem

@MaSMas0
Copy link

MaSMas0 commented Mar 17, 2025

@bryce-mcmath

I'm fairly sure even if it is not used directly it is required to support other packages we use

i am not sure that this is the case can you please check as from my side i dont see which package is depending on react-native-reanimated

more clarification would be of a help as this is too big of package to be existing without a usage

Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
@MaSMas0 MaSMas0 force-pushed the refactor/moscd3/upgrade-rn-73-5 branch from 13ccfce to 16ce4b9 Compare March 17, 2025 17:36
@bryce-mcmath
Copy link
Contributor

bryce-mcmath commented Mar 17, 2025

@MaSMas0

i am not sure that this is the case can you please check as from my side i dont see which package is depending on react-native-reanimated

It's a dependency and peer dependency of react-native-vision-camera which is core to the app, so it's required and would be installed anyway even if we didn't list it explicitly, only the version would be whatever that react-native-vision-camera package prefers (3.17.x) which would break the app due to the reason mentioned above

@MaSMas0
Copy link

MaSMas0 commented Mar 17, 2025

@bryce-mcmath

It's a dependency and peer dependency of react-native-vision-camera which is core to the app, so it's required and would be installed anyway even if we didn't list it explicitly, only the version would be whatever that react-native-vision-camera package prefers (3.17.x) which would break the app due to the reason mentioned above

i think that this is not the case as you can see the peerDependenciesMeta showing that it is optional that the package wont break the app for example you can see @shopify/react-native-skia and you dont have it in project and yet the app works coz it is optional so i still think that you dont need it also if u check the docs of react-native-vision-camera it doesnt state that you need react-native-reanimated as peer dependencies in order for the package to work correctly so i suggest to remove it from the project as long as it is not needed

"react-native-vision-camera@npm:4.3.1": version: 4.3.1 resolution: "react-native-vision-camera@npm:4.3.1" peerDependencies: "@shopify/react-native-skia": "*" react: "*" react-native: "*" react-native-reanimated: "*" react-native-worklets-core: "*" peerDependenciesMeta: "@shopify/react-native-skia": optional: true react-native-reanimated: optional: true react-native-worklets-core: optional: true checksum: e97ad8503cfd848cc794f95252b5f6385b28cf16c3606c3852654c9ee623288d7e820e3dc95f75e332d31b9a8d01090de281f3bf124d97da8dc786253b1c1283 languageName: node linkType: hard

@bryce-mcmath
Copy link
Contributor

@MaSMas0

`"react-native-vision-camera@npm:4.3.1": version: 4.3.1 resolution: "react-native-vision-camera@npm:4.3.1" peerDependencies: "@shopify/react-native-skia": "" react: "" react-native: "" react-native-reanimated: "" react-native-worklets-core: "*" peerDependenciesMeta: "@shopify/react-native-skia": optional: true react-native-reanimated: optional: true

ohhh nice catch! ok let's remove it but if, after we remove it, it still gets installed as a transient dependency by another one of our deps, can we add an entry to the root package.json like this?

"resolutions": {
  ...
  "react-native-reanimated": "3.6.3"
  ...
}

Signed-off-by: Mohamed Abd El-Samie Ahmad Mansour <[email protected]>
@MaSMas0
Copy link

MaSMas0 commented Mar 17, 2025

@bryce-mcmath

ohhh nice catch! ok let's remove it but if, after we remove it, it still gets installed as a transient dependency by another one of our deps, can we add an entry to the root package.json like this?

"resolutions": {
  ...
  "react-native-reanimated": "3.6.3"
  ...
}

Yes, that's exactly the right approach. If react-native-reanimated is being installed as a transitive dependency from another package. we can surely use the resolutions field in root package.json to control its version

but lets make this when we have that case i guess right now it is ok to move on with PR as we removed react-native-reanimated

@bryce-mcmath bryce-mcmath self-requested a review March 18, 2025 05:55
Copy link
Contributor

@bryce-mcmath bryce-mcmath left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will approve again after conflicts are fixed but really great work! Thanks for your patience with all the staggered feedback

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants