Skip to main content

A Python package for parsing JSDoc comment blocks into structured BaseModel objects

Project description

JSDoc Parser

A professional Python package for parsing JavaScript documentation comments (JSDoc) into structured Pydantic BaseModel objects.

Features

  • Comprehensive JSDoc Support: Parses all major JSDoc tags including @param, @returns, @typedef, @property, @example, and @throws
  • Type-Safe: Built with Pydantic BaseModel for robust data validation and type safety
  • Union Types: Full support for union types like string|number|null
  • Optional Parameters: Handles optional parameters with bracket syntax [param]
  • Code Extraction: Optionally extracts JavaScript code that follows JSDoc comments
  • Professional API: Simple parse() function interface with detailed structured output

Installation

pip install jsdoc

Quick Start

from jsdoc import parse

# Parse a JSDoc comment
jsdoc_string = '''/**
 * Adds two numbers together.
 * @param {number} a - The first number
 * @param {number} b - The second number
 * @returns {number} The sum of a and b
 * @example
 * add(1, 2); // returns 3
 */
function add(a, b) {
    return a + b;
}'''

result = parse(jsdoc_string)

# Access structured data
print(result.description.summary)  # "Adds two numbers together."
print(result.params[0].name)       # "a"
print(result.params[0].types)      # ["number"]
print(result.returns[0].types)     # ["number"]
print(result.examples[0].code)     # "add(1, 2); // returns 3"
print(result.code)                 # "function add(a, b) {\\n    return a + b;\\n}"

Supported JSDoc Tags

Tag Description Example
@param Function parameter @param {string} name - User's name
@returns/@return Return value @returns {number} Sum of a and b
@typedef Custom type definition @typedef {Object} User
@property Object property @property {number} age - User's age
@example Usage example @example doSomething(123);
@throws Possible exceptions @throws {Error} If input is invalid

Output Structure

The parse() function returns a JSDocComment object with the following structure:

{
    "description": {
        "full": "Complete description text...",
        "summary": "Brief summary sentence."
    },
    "params": [
        {
            "types": ["string"],
            "name": "param_name", 
            "description": "Parameter description",
            "optional": False
        }
    ],
    "returns": [
        {
            "types": ["number"],
            "description": "Return value description"
        }
    ],
    "examples": [
        {
            "code": "example_code();",
            "description": None
        }
    ],
    "throws": [
        {
            "types": ["Error"],
            "description": "Exception description"
        }
    ],
    "typedef": {
        "types": ["Object"],
        "name": "CustomType",
        "description": "Type description",
        "properties": [...]
    },
    "properties": [...],
    "code": "function code() { ... }",
    "raw_comment": "/** original comment */"
}

Advanced Usage

Parsing Without Code Extraction

result = parse(jsdoc_string, include_code=False)
# result.code will be None

Handling TypeDefs with Properties

jsdoc = '''/**
 * @typedef {object} User
 * @property {string} name - User's name
 * @property {number} age - User's age
 * @property {string|null} email - User's email (optional)
 */'''

result = parse(jsdoc, include_code=False)
print(result.typedef.name)           # "User"
print(result.properties[0].name)     # "name"
print(result.properties[0].types)    # ["string"]
print(result.properties[2].types)    # ["string", "null"]

Optional Parameters

jsdoc = '''/**
 * @param {string} name - Required parameter
 * @param {number} [age] - Optional parameter
 * @param {string} [email=user@example.com] - Optional with default
 */'''

result = parse(jsdoc, include_code=False)
print(result.params[0].optional)  # False
print(result.params[1].optional)  # True
print(result.params[2].optional)  # True

Union Types

jsdoc = '''/**
 * @param {string|number|boolean} value - Multi-type parameter
 * @returns {User|null} User object or null
 */'''

result = parse(jsdoc, include_code=False)
print(result.params[0].types)    # ["string", "number", "boolean"]
print(result.returns[0].types)   # ["User", "null"]  

API Reference

parse(jsdoc_string: str, include_code: bool = True) -> JSDocComment

Parse a JSDoc comment string into a structured object.

Parameters:

  • jsdoc_string (str): JSDoc comment string, typically wrapped in /** */
  • include_code (bool): Whether to extract JavaScript code following the comment

Returns:

  • JSDocComment: Structured representation of the parsed JSDoc

Raises:

  • ValueError: If the input is not a valid JSDoc comment format

Data Models

All returned objects are Pydantic BaseModel instances with full type validation:

  • JSDocComment: Main container for all parsed data
  • Description: Comment description with full text and summary
  • Parameter: Function parameter information
  • ReturnValue: Return value information
  • TypeDef: Custom type definition
  • Property: Object property definition
  • Example: Usage example
  • Throws: Exception information

Error Handling

The parser will raise ValueError for invalid input:

try:
    result = parse("invalid comment")
except ValueError as e:
    print(f"Parse error: {e}")

Development

Setup Development Environment

git clone https://github.com/yunfanye/jsdoc
cd jsdoc
pip install -e ".[dev]"

Running Tests

pytest
pytest -v  # verbose output
pytest --cov=jsdoc_parser  # with coverage

Code Formatting

black jsdoc_parser/
isort jsdoc_parser/
flake8 jsdoc_parser/

License

MIT License - see LICENSE file for details.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create a feature branch
  3. Add tests for your changes
  4. Ensure all tests pass
  5. Submit a pull request

Changelog

v1.0.0

  • Initial release
  • Support for all major JSDoc tags
  • Pydantic BaseModel integration
  • Comprehensive test suite
  • Professional documentation

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

jsdoc-1.0.1.tar.gz (14.8 kB view details)

Uploaded Source

Built Distribution

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

jsdoc-1.0.1-py3-none-any.whl (9.2 kB view details)

Uploaded Python 3

File details

Details for the file jsdoc-1.0.1.tar.gz.

File metadata

  • Download URL: jsdoc-1.0.1.tar.gz
  • Upload date:
  • Size: 14.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.7

File hashes

Hashes for jsdoc-1.0.1.tar.gz
Algorithm Hash digest
SHA256 a02ee6ff9b4fa31d4b55a45a2516a4a648031268bb00bdd43e0d3444dd9e3a5f
MD5 21f8871bbb4eebc7d2011dc44643af1d
BLAKE2b-256 030228e6a31b7780a075531dd8e4461547810c082a0ea17c615d405b71989fde

See more details on using hashes here.

File details

Details for the file jsdoc-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: jsdoc-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 9.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.7

File hashes

Hashes for jsdoc-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9f34106ee6f82436610db9c49cd9454d6ae8f5c4a79afab2dc1b3c74fcd1ad6f
MD5 3cd45970f3b621c9bd7e09e9bc8302e0
BLAKE2b-256 7d9280e42f71a23c2f55e7fa4d2f411986e3bb6b6df8ba5013a5233a02992c0b

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