Setuptools Node.js extension plugin
Project description
setuptools-nodejs
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.
Overview
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.
Project Implementation Entry Points
Main Entry Files
setuptools_nodejs.setuptools_ext.pyprojecttoml_config- Configuration parsing entry pointsetuptools_nodejs.build.build_nodejs- Build command implementationsetuptools_nodejs.extension.NodeJSExtension- Frontend project configuration class
Project Structure
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
Quick Start
1. Configure Your Project
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"}
]
2. Build Your Package
python -m build
This 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
Configuration Examples
Basic Configuration (Based on vue-helloworld example)
[build-system]
requires = ["setuptools", "setuptools-nodejs"]
build-backend = "setuptools.build_meta"
[project]
name = "vue-helloword"
version = "0.1.0"
description = "Test project for setuptools-nodejs integration"
[tool.setuptools-nodejs]
frontend-projects = [
{target = "vue-helloword", source_dir = "browser", artifacts_dir = "dist"}
]
[tool.setuptools.packages.find]
where = ["python"]
Multiple Frontend Projects with Output Directories
[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"}
]
Advanced Configuration
[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
}
]
Currently Implemented Features
✅ Implemented and Working
- 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
Command Line Interface
# 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
Unimplemented Features and TODO List
❌ Code Exists but Untested/Incomplete
-
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
Priority TODO
- 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
Development
Setup Development Environment
# Clone the repository
git clone https://github.com/TuvokYang/setuptools-nodejs
cd setuptools-nodejs
# Install in development mode
pip install -e ".[dev]"
# Run tests
pytest
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
If you encounter any problems or have questions, please:
- Check the documentation
- Search existing issues
- Create a new issue
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file setuptools_nodejs-0.1.2.tar.gz.
File metadata
- Download URL: setuptools_nodejs-0.1.2.tar.gz
- Upload date:
- Size: 40.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
840458ee31f16e0c1b24243c8e65af390c207af62b7862f24b7294ad5032ccf3
|
|
| MD5 |
87df7304a053bef366d5766bc97240bb
|
|
| BLAKE2b-256 |
11c48f7b98be6fd9c14d3451345f3258dec1a4d98108cfb49d9e4c3b916150fe
|
File details
Details for the file setuptools_nodejs-0.1.2-py3-none-any.whl.
File metadata
- Download URL: setuptools_nodejs-0.1.2-py3-none-any.whl
- Upload date:
- Size: 18.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9bde5c1ed460121bb90f74cc9a5df958ba4184e3d7877a891f4a855d629aeafe
|
|
| MD5 |
f7f0831459db202ed7e31e1bbd82b54c
|
|
| BLAKE2b-256 |
54e0cbca7c60686734a2744eb29f844d6b393cb01b77a0a136fb80bb1368355b
|