diff --git a/reflex/utils/prerequisites.py b/reflex/utils/prerequisites.py index 13ec3b600..7ad105896 100644 --- a/reflex/utils/prerequisites.py +++ b/reflex/utils/prerequisites.py @@ -5,6 +5,7 @@ from __future__ import annotations import glob import json import os +import platform import re import stat import sys @@ -326,14 +327,22 @@ def install_node(): # Add execute permissions to fnm executable. os.chmod(constants.FNM_EXE, stat.S_IXUSR) # Install node. + # Specify arm64 arch explicitly for M1s and M2s. + architecture_arg = ( + ["--arch=arm64"] + if platform.system() == "Darwin" and platform.machine() == "arm64" + else [] + ) + process = processes.new_process( [ constants.FNM_EXE, "install", + *architecture_arg, constants.NODE_VERSION, "--fnm-dir", constants.FNM_DIR, - ] + ], ) processes.show_status("Installing node", process) diff --git a/tests/test_utils.py b/tests/test_utils.py index 33b5332d3..c93b7f1b8 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -549,13 +549,32 @@ def test_node_install_windows(tmp_path, mocker): download.assert_called_once() -def test_node_install_unix(tmp_path, mocker): +@pytest.mark.parametrize( + "machine, system", + [ + ("x64", "Darwin"), + ("arm64", "Darwin"), + ("x64", "Windows"), + ("arm64", "Windows"), + ("armv7", "Linux"), + ("armv8-a", "Linux"), + ("armv8.1-a", "Linux"), + ("armv8.2-a", "Linux"), + ("armv8.3-a", "Linux"), + ("armv8.4-a", "Linux"), + ("aarch64", "Linux"), + ("aarch32", "Linux"), + ], +) +def test_node_install_unix(tmp_path, mocker, machine, system): fnm_root_path = tmp_path / "reflex" / "fnm" fnm_exe = fnm_root_path / "fnm" mocker.patch("reflex.utils.prerequisites.constants.FNM_DIR", fnm_root_path) mocker.patch("reflex.utils.prerequisites.constants.FNM_EXE", fnm_exe) mocker.patch("reflex.utils.prerequisites.constants.IS_WINDOWS", False) + mocker.patch("reflex.utils.prerequisites.platform.machine", return_value=machine) + mocker.patch("reflex.utils.prerequisites.platform.system", return_value=system) class Resp(Base): status_code = 200 @@ -571,9 +590,21 @@ def test_node_install_unix(tmp_path, mocker): assert fnm_root_path.exists() download.assert_called_once() - process.assert_called_with( - [fnm_exe, "install", constants.NODE_VERSION, "--fnm-dir", fnm_root_path] - ) + if system == "Darwin" and machine == "arm64": + process.assert_called_with( + [ + fnm_exe, + "install", + "--arch=arm64", + constants.NODE_VERSION, + "--fnm-dir", + fnm_root_path, + ] + ) + else: + process.assert_called_with( + [fnm_exe, "install", constants.NODE_VERSION, "--fnm-dir", fnm_root_path] + ) chmod.assert_called_once()