Skip to main content

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.

中文文档 | English Documentation

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 point
  • setuptools_nodejs.build.build_nodejs - Build command implementation
  • setuptools_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:

  1. Build your frontend project using npm (npm install and npm run build)
  2. Copy the build artifacts to the package directory
  3. 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 install and npm 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

  1. Framework Auto-detection Feature

    • _detect_artifacts_dir method exists but not thoroughly tested
    • Vue detection: Only checks config file existence, doesn't parse actual configuration
    • Angular detection: Attempts to parse angular.json but 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
  2. Version Check Feature

    • get_node_version() and get_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
  3. Dependency Declaration

    • Version check requires semantic_version package but not declared in dependencies
    • Need to add dependency declaration in pyproject.toml

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_version dependency 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.* and vue.config.js for output directory
    • Angular: Complete angular.json parsing with proper error handling
    • React: Parse package.json build scripts and configuration files for output paths
  • 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:

  1. Check the documentation
  2. Search existing issues
  3. Create a new issue

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

setuptools_nodejs-0.1.2.tar.gz (40.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

setuptools_nodejs-0.1.2-py3-none-any.whl (18.6 kB view details)

Uploaded Python 3

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

Hashes for setuptools_nodejs-0.1.2.tar.gz
Algorithm Hash digest
SHA256 840458ee31f16e0c1b24243c8e65af390c207af62b7862f24b7294ad5032ccf3
MD5 87df7304a053bef366d5766bc97240bb
BLAKE2b-256 11c48f7b98be6fd9c14d3451345f3258dec1a4d98108cfb49d9e4c3b916150fe

See more details on using hashes here.

File details

Details for the file setuptools_nodejs-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for setuptools_nodejs-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 9bde5c1ed460121bb90f74cc9a5df958ba4184e3d7877a891f4a855d629aeafe
MD5 f7f0831459db202ed7e31e1bbd82b54c
BLAKE2b-256 54e0cbca7c60686734a2744eb29f844d6b393cb01b77a0a136fb80bb1368355b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page