A setuptools extension for building Node.js frontend projects and packaging them with Python code, specifically designed for full-stack applications with Python backend frameworks like Flask and FastAPI.
Design Inspiration: This project draws inspiration from setuptools-rust and setuptools-scm, adopting similar extension patterns and configuration approaches for seamless integration with the Python packaging ecosystem.
setuptools-nodejs extends setuptools to automatically build Node.js frontend projects and include the built artifacts in your Python packages. It's perfect for full-stack Python applications that include frontend components built with frameworks like React, Vue, Angular, etc.
setuptools_nodejs.setuptools_ext.pyprojecttoml_config- Configuration parsing entry pointsetuptools_nodejs.build.build_nodejs- Build command implementationsetuptools_nodejs.extension.NodeJSExtension- Frontend project configuration class
setuptools-nodejs/
├── src/setuptools_nodejs/
│ ├── setuptools_ext.py # setuptools integration and configuration parsing
│ ├── extension.py # NodeJSExtension class definition
│ ├── build.py # Build command implementation
│ ├── command.py # Command base class
│ ├── clean.py # Clean command
│ └── _utils.py # Utility functions
├── examples/vue-helloworld/ # Working example project
│ ├── browser/ # Vue frontend project
│ │ ├── package.json # Frontend dependency configuration
│ │ ├── vite.config.ts # Vite build configuration
│ │ └── src/ # Frontend source code
│ ├── python/ # Python package
│ └── pyproject.toml # Project configuration
└── tests/ # Test files
Add the following to your pyproject.toml:
[build-system]
requires = ["setuptools", "setuptools-nodejs"]
build-backend = "setuptools.build_meta"
[project]
name = "my-fullstack-app"
version = "0.1.0"
[tool.setuptools-nodejs]
frontend-projects = [
{target = "my-frontend", source_dir = "frontend", artifacts_dir = "dist"}
]python -m buildThis will automatically:
- Build your frontend project using npm (
npm installandnpm run build) - Copy the build artifacts to the package directory
- Package everything into a Python wheel or sdist
[build-system]
requires = ["setuptools", "setuptools-nodejs"]
build-backend = "setuptools.build_meta"
[project]
name = "vue-helloworld"
version = "0.1.0"
description = "Test project for setuptools-nodejs integration"
[tool.setuptools-nodejs]
frontend-projects = [
{target = "vue-helloworld", source_dir = "browser", artifacts_dir = "dist"}
]
[tool.setuptools.packages.find]
where = ["python"][tool.setuptools-nodejs]
frontend-projects = [
{target = "admin-panel", source_dir = "admin", artifacts_dir = "dist", output_dir = "my_package/admin"},
{target = "client-app", source_dir = "client", artifacts_dir = "build", output_dir = "my_package/client"}
][tool.setuptools-nodejs]
frontend-projects = [
{
target = "my-app",
source_dir = "frontend",
artifacts_dir = "dist",
args = ["--production"], # Additional npm arguments
quiet = false, # Show npm output
optional = false # Fail build if frontend build fails
}
]- Automatic Frontend Building: Automatically runs
npm installandnpm run build - Build Artifact Copying: Automatically copies frontend build artifacts to Python package
- Multiple Project Support: Supports configuring multiple frontend projects
- Configuration Parsing: Correctly parses configuration from
pyproject.toml - Vue Project Support: vue-helloworld example verified to work correctly
- Basic Error Handling: Basic build error handling
# Build frontend using configuration from pyproject.toml
python -m setuptools_nodejs build
# Build without installing dependencies
python -m setuptools_nodejs build --no-install
# Clean output directory before build
python -m setuptools_nodejs build --clean
# Verbose logging
python -m setuptools_nodejs build --verbose-
Framework Auto-detection Feature
_detect_artifacts_dirmethod exists but not thoroughly tested- Vue detection: Only checks config file existence, doesn't parse actual configuration
- Angular detection: Attempts to parse
angular.jsonbut error handling is simple - React detection: Only checks for "build" script, doesn't parse output directory
- Need to add test cases to verify detection logic
-
Version Check Feature
get_node_version()andget_npm_version()methods exist but never called- No actual validation of Node.js and npm versions during build process
- Need to implement version check logic and add calls
-
Dependency Declaration
- Version check requires
semantic_versionpackage but not declared in dependencies - Need to add dependency declaration in pyproject.toml
- Version check requires
- Add test cases for framework auto-detection feature
- Implement Node.js and npm version check functionality
- Actually call version check methods during build process
- Add
semantic_versiondependency declaration - Improve error handling and user feedback for framework detection
- npm Version Validation: Add proper npm version checking before build
- Framework-Specific Artifacts Detection:
- Vue.js: Properly parse
vite.config.*andvue.config.jsfor output directory - Angular: Complete
angular.jsonparsing with proper error handling - React: Parse
package.jsonbuild scripts and configuration files for output paths
- Vue.js: Properly parse
- Enhanced Configuration Validation: Validate all configuration parameters before build
- Better Error Messages: Provide more informative error messages for common issues
# Clone the repository
git clone https://github.com/TuvokYang/setuptools-nodejs
cd setuptools-nodejs
# Install in editable mode
pip install -e .
# Run tests
pytestThis project is licensed under the MIT License - see the LICENSE file for details.
If you encounter any problems or have questions, please:
- Check the documentation
- Search existing issues
- Create a new issue