From 138297d9bdf59b71530837e928071c3f5d48b344 Mon Sep 17 00:00:00 2001 From: Antony Milne <49395058+antonymilne@users.noreply.github.com> Date: Mon, 23 Feb 2026 17:37:28 +0000 Subject: [PATCH 1/2] Double quote `extract_path` --- dash/development/component_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash/development/component_generator.py b/dash/development/component_generator.py index 18929fe248..ee833af2db 100644 --- a/dash/development/component_generator.py +++ b/dash/development/component_generator.py @@ -84,7 +84,7 @@ def generate_components( env["MODULES_PATH"] = os.path.abspath("./node_modules") cmd = shlex.split( - f'node {extract_path} "{ignore}" "{reserved_patterns}" {components_source}', + f'node "{extract_path}" "{ignore}" "{reserved_patterns}" {components_source}', posix=not is_windows, ) From 2f90b0e0365b56ecc8d9ca74378243405c3ad344 Mon Sep 17 00:00:00 2001 From: Antony Milne Date: Tue, 24 Feb 2026 15:48:46 +0000 Subject: [PATCH 2/2] Fix cross-platform subprocess call for Windows compatibility Replace shlex.split with direct list arguments and remove shell=True to avoid quoting issues on Windows. --- dash/development/component_generator.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/dash/development/component_generator.py b/dash/development/component_generator.py index ee833af2db..660d9986ab 100644 --- a/dash/development/component_generator.py +++ b/dash/development/component_generator.py @@ -3,7 +3,6 @@ import json import sys import subprocess -import shlex import os import argparse import shutil @@ -56,8 +55,6 @@ def generate_components( project_shortname = project_shortname.replace("-", "_").rstrip("/\\") - is_windows = sys.platform == "win32" - # Get path to extract-meta.js using importlib.resources try: # Python 3.9+ @@ -83,16 +80,12 @@ def generate_components( # Ensure local node modules is used when the script is packaged. env["MODULES_PATH"] = os.path.abspath("./node_modules") - cmd = shlex.split( - f'node "{extract_path}" "{ignore}" "{reserved_patterns}" {components_source}', - posix=not is_windows, - ) + cmd = ["node", extract_path, ignore, reserved_patterns, components_source] proc = subprocess.Popen( # pylint: disable=consider-using-with cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, - shell=is_windows, env=env, ) out, err = proc.communicate()