Skip to main content

No project description provided

Project description

Prescrypt

A Python to JavaScript transpiler for a well-defined subset of Python.

Status: Alpha. Use at your own risks.

Overview

Prescrypt converts Python 3.9+ code to ES6+ JavaScript. It prioritizes correctness over completeness, targeting common use cases rather than full Python compatibility.

Features

  • Modern Python support - Python 3.10+ with pattern matching
  • Modern JavaScript output - Targets ES6+ with const/let, arrow functions, classes
  • Comprehensive test suite - 2400+ tests covering expressions, statements, and full programs
  • Optimized output - Tree-shaking, constant folding, function inlining
  • Source locations in errors - Clear error messages with file:line:column

Installation

pip install prescrypt
# or
uv add prescrypt

Quick Start

As a library

from prescrypt import py2js

code = """
def greet(name: str) -> str:
    return f"Hello, {name}!"

print(greet("World"))
"""

js = py2js(code)
print(js)

Output (stdlib helpers omitted):

function greet(name) {
    return ('Hello, ' + name + '!');
}
console.log(greet('World'));

Note: Type annotations (name: str) enable optimized output. Without them, the compiler uses runtime helpers for Python-compatible behavior.

From the command line

py2js input.py           # Creates input.js
py2js input.py output.js # Explicit output path

Supported Python Features

Fully Supported

  • Data types: int, float, bool, str, None, list, dict, tuple
  • Control flow: if/elif/else, for, while, break, continue
  • Exception handling: try/except/finally, raise
  • Functions: def, lambda, *args, default arguments, closures
  • Classes: class, __init__, inheritance, super(), @property
  • Decorators: @staticmethod, @classmethod, @property
  • Comprehensions: list, dict, set, generator expressions
  • Generators: yield, yield from, send(), throw(), close()
  • Operators: arithmetic, comparison, logical, membership (in)
  • Builtins: print, len, range, enumerate, zip, min, max, sorted, etc.

Partially Supported

  • **kwargs - in function calls only (not in function definitions)
  • with statement - single context manager only
  • async def - generates async functions (await not yet implemented)

Not Supported

  • Metaclasses
  • Multiple inheritance
  • exec(), eval()
  • Most of the standard library

Architecture

Python Source → Parse → Desugar → Bind → Optimize → CodeGen → JavaScript
  • Parse: Python's ast module with custom extensions
  • Desugar: Simplifies syntax (e.g., a += ba = a + b)
  • Bind: Scope analysis, determines const vs let
  • Optimize: Constant folding, dead code elimination
  • CodeGen: Produces JavaScript output

Development

# Install dependencies
uv sync

# Run tests
make test

# Run linter
make lint

# Format code
make format

License

BSD 2-Clause License. See LICENSE for details.

Acknowledgments

Prescrypt was inspired by PScript, originally developed as part of Flexx. While the codebase has been largely rewritten, we acknowledge PScript's pioneering work in Python-to-JavaScript transpilation.

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

prescrypt-0.9.2.tar.gz (131.8 kB view details)

Uploaded Source

Built Distribution

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

prescrypt-0.9.2-py3-none-any.whl (159.1 kB view details)

Uploaded Python 3

File details

Details for the file prescrypt-0.9.2.tar.gz.

File metadata

  • Download URL: prescrypt-0.9.2.tar.gz
  • Upload date:
  • Size: 131.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for prescrypt-0.9.2.tar.gz
Algorithm Hash digest
SHA256 8cd81865ea89f2ff66ff8c5ffd659d26891d38e6c895a56395e7e06ba4bfdd7f
MD5 8d2267f155f34dd312b1788e294665f4
BLAKE2b-256 76d344c3934a0d8566f697d5d46b60177f7bbbe5508c16a685a83b19a7a13861

See more details on using hashes here.

File details

Details for the file prescrypt-0.9.2-py3-none-any.whl.

File metadata

  • Download URL: prescrypt-0.9.2-py3-none-any.whl
  • Upload date:
  • Size: 159.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for prescrypt-0.9.2-py3-none-any.whl
Algorithm Hash digest
SHA256 28ebf1f5448179ac9871ce02ee0513c3fc02345761f349080e7581925508eba1
MD5 a5c8b2bd73e54d5df44632ecc616b56e
BLAKE2b-256 7f12284efdb22244336912b589a3c44edab01090e20da96ff57da739b7ad0596

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