jsdoc


Namejsdoc JSON
Version 1.0.3 PyPI version JSON
download
home_pageNone
SummaryA Python package for parsing JSDoc comment blocks into structured BaseModel objects
upload_time2025-07-27 02:22:42
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords jsdoc documentation parser javascript
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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`
- **Multiple TypeDef Support**: Parse multiple `@typedef` definitions from single or separate comment blocks
- **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
- **Function Name Parsing**: Automatically extracts function names from various JavaScript function definitions
- **Professional API**: Simple `parse()` function interface with detailed structured output

## Installation

```bash
pip install jsdoc
```

## Quick Start

```python
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}"
print(result.function_name)        # "add"
```

## 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:

```python
{
    "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"
        }
    ],
    "typedefs": [
        {
            "types": ["Object"],
            "name": "CustomType",
            "description": "Type description",
            "properties": [...]
        }
    ],
    "properties": [...],
    "code": "function code() { ... }",
    "function_name": "functionName",
    "raw_comment": "/** original comment */"
}
```

## Advanced Usage

### Parsing Without Code Extraction

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

### Handling TypeDefs with Properties

```python
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.typedefs[0].name)           # "User"
print(result.typedefs[0].properties[0].name)     # "name"
print(result.typedefs[0].properties[0].types)    # ["string"]
print(result.typedefs[0].properties[2].types)    # ["string", "null"]
```

### Multiple TypeDef Definitions

Parse multiple typedef definitions from a single comment block:

```python
jsdoc = '''/**
 * @typedef {object} User
 * @property {string} name - User's name
 * 
 * @typedef {object} Role
 * @property {string} name - Role name
 * @property {string[]} permissions - Role permissions
 * 
 * @typedef {string} Status - User status
 */'''

result = parse(jsdoc, include_code=False)
print(len(result.typedefs))          # 3
print(result.typedefs[0].name)       # "User"
print(result.typedefs[1].name)       # "Role"
print(result.typedefs[2].name)       # "Status"
```

Or from separate comment blocks:

```python
jsdoc = '''/**
 * @typedef {object} Product
 * @property {string} id - Product identifier
 * @property {number} price - Product price
 */

/**
 * @typedef {object} Category
 * @property {string} name - Category name
 * @property {Product[]} products - Products in category
 */

function getProducts() {
    return products;
}'''

result = parse(jsdoc)
print(len(result.typedefs))          # 2
print(result.typedefs[0].name)       # "Product"
print(result.typedefs[1].name)       # "Category"
print(result.code)                   # "function getProducts() { ... }"
```

### Optional Parameters

```python
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

```python
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"]  
```

### Function Name Extraction

The parser automatically extracts function names from various JavaScript function definition patterns:

```python
# Standard function declaration
jsdoc = '''/**
 * A standard function.
 */
function myFunction() {
    return true;
}'''
result = parse(jsdoc)
print(result.function_name)  # "myFunction"

# Arrow function
jsdoc = '''/**
 * An arrow function.
 */
const arrowFunc = () => {
    return "hello";
}'''
result = parse(jsdoc)
print(result.function_name)  # "arrowFunc"

# Async function
jsdoc = '''/**
 * An async function.
 */
async function fetchData() {
    return await api.getData();
}'''
result = parse(jsdoc)
print(result.function_name)  # "fetchData"

# Class method
jsdoc = '''/**
 * A class method.
 */
methodName() {
    return this.value;
}'''
result = parse(jsdoc)
print(result.function_name)  # "methodName"
```

Supported function definition patterns:
- `function name() {}` - Standard function declarations
- `async function name() {}` - Async function declarations  
- `export function name() {}` - Exported functions
- `const name = () => {}` - Arrow functions
- `const name = function() {}` - Function expressions
- `name: function() {}` - Object methods
- `name() {}` - Object method shorthand
- `static name() {}` - Static class methods

## 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:

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

## Development

### Setup Development Environment

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

### Running Tests

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

### Code Formatting

```bash
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.3
- **NEW FEATURE**: Added `function_name` field to automatically extract function names from JavaScript code
- Support for robust function name extraction from various JS function definition patterns:
  - Standard function declarations (`function name() {}`)
  - Arrow functions (`const name = () => {}`)
  - Async functions (`async function name() {}`)
  - Exported functions (`export function name() {}`)
  - Function expressions (`const name = function() {}`)
  - Object methods (`name: function() {}`, `name() {}`)
  - Static class methods (`static name() {}`)
- Added comprehensive tests for function name extraction (23 tests total)
- Updated documentation with function name extraction examples

### v1.0.2
- **BREAKING CHANGE**: Changed `typedef` field to `typedefs` (List[TypeDef]) in JSDocComment model
- Added support for multiple typedef definitions in single comment block
- Added support for parsing separate typedef comment blocks
- Improved comment block selection logic for mixed typedef and function documentation
- Enhanced code extraction to work correctly with multiple comment blocks
- Added comprehensive tests for multiple typedef scenarios
- Updated documentation with multiple typedef examples

### v1.0.1
- Bug fixes and improvements

### v1.0.0
- Initial release
- Support for all major JSDoc tags
- Pydantic BaseModel integration
- Comprehensive test suite
- Professional documentation

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "jsdoc",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "jsdoc, documentation, parser, javascript",
    "author": null,
    "author_email": "JSDoc Authors <authors@jsdoc.com>",
    "download_url": "https://files.pythonhosted.org/packages/01/5b/302ed58cc04ebef273b531bac1fd3e938ed2cf44148a4e8b89bc6d086398/jsdoc-1.0.3.tar.gz",
    "platform": null,
    "description": "# JSDoc Parser\n\nA professional Python package for parsing JavaScript documentation comments (JSDoc) into structured Pydantic BaseModel objects.\n\n## Features\n\n- **Comprehensive JSDoc Support**: Parses all major JSDoc tags including `@param`, `@returns`, `@typedef`, `@property`, `@example`, and `@throws`\n- **Multiple TypeDef Support**: Parse multiple `@typedef` definitions from single or separate comment blocks\n- **Type-Safe**: Built with Pydantic BaseModel for robust data validation and type safety\n- **Union Types**: Full support for union types like `string|number|null`\n- **Optional Parameters**: Handles optional parameters with bracket syntax `[param]`\n- **Code Extraction**: Optionally extracts JavaScript code that follows JSDoc comments\n- **Function Name Parsing**: Automatically extracts function names from various JavaScript function definitions\n- **Professional API**: Simple `parse()` function interface with detailed structured output\n\n## Installation\n\n```bash\npip install jsdoc\n```\n\n## Quick Start\n\n```python\nfrom jsdoc import parse\n\n# Parse a JSDoc comment\njsdoc_string = '''/**\n * Adds two numbers together.\n * @param {number} a - The first number\n * @param {number} b - The second number\n * @returns {number} The sum of a and b\n * @example\n * add(1, 2); // returns 3\n */\nfunction add(a, b) {\n    return a + b;\n}'''\n\nresult = parse(jsdoc_string)\n\n# Access structured data\nprint(result.description.summary)  # \"Adds two numbers together.\"\nprint(result.params[0].name)       # \"a\"\nprint(result.params[0].types)      # [\"number\"]\nprint(result.returns[0].types)     # [\"number\"]\nprint(result.examples[0].code)     # \"add(1, 2); // returns 3\"\nprint(result.code)                 # \"function add(a, b) {\\\\n    return a + b;\\\\n}\"\nprint(result.function_name)        # \"add\"\n```\n\n## Supported JSDoc Tags\n\n| Tag | Description | Example |\n|-----|-------------|---------|\n| `@param` | Function parameter | `@param {string} name - User's name` |\n| `@returns/@return` | Return value | `@returns {number} Sum of a and b` |\n| `@typedef` | Custom type definition | `@typedef {Object} User` |\n| `@property` | Object property | `@property {number} age - User's age` |\n| `@example` | Usage example | `@example doSomething(123);` |\n| `@throws` | Possible exceptions | `@throws {Error} If input is invalid` |\n\n## Output Structure\n\nThe `parse()` function returns a `JSDocComment` object with the following structure:\n\n```python\n{\n    \"description\": {\n        \"full\": \"Complete description text...\",\n        \"summary\": \"Brief summary sentence.\"\n    },\n    \"params\": [\n        {\n            \"types\": [\"string\"],\n            \"name\": \"param_name\", \n            \"description\": \"Parameter description\",\n            \"optional\": False\n        }\n    ],\n    \"returns\": [\n        {\n            \"types\": [\"number\"],\n            \"description\": \"Return value description\"\n        }\n    ],\n    \"examples\": [\n        {\n            \"code\": \"example_code();\",\n            \"description\": None\n        }\n    ],\n    \"throws\": [\n        {\n            \"types\": [\"Error\"],\n            \"description\": \"Exception description\"\n        }\n    ],\n    \"typedefs\": [\n        {\n            \"types\": [\"Object\"],\n            \"name\": \"CustomType\",\n            \"description\": \"Type description\",\n            \"properties\": [...]\n        }\n    ],\n    \"properties\": [...],\n    \"code\": \"function code() { ... }\",\n    \"function_name\": \"functionName\",\n    \"raw_comment\": \"/** original comment */\"\n}\n```\n\n## Advanced Usage\n\n### Parsing Without Code Extraction\n\n```python\nresult = parse(jsdoc_string, include_code=False)\n# result.code will be None\n```\n\n### Handling TypeDefs with Properties\n\n```python\njsdoc = '''/**\n * @typedef {object} User\n * @property {string} name - User's name\n * @property {number} age - User's age\n * @property {string|null} email - User's email (optional)\n */'''\n\nresult = parse(jsdoc, include_code=False)\nprint(result.typedefs[0].name)           # \"User\"\nprint(result.typedefs[0].properties[0].name)     # \"name\"\nprint(result.typedefs[0].properties[0].types)    # [\"string\"]\nprint(result.typedefs[0].properties[2].types)    # [\"string\", \"null\"]\n```\n\n### Multiple TypeDef Definitions\n\nParse multiple typedef definitions from a single comment block:\n\n```python\njsdoc = '''/**\n * @typedef {object} User\n * @property {string} name - User's name\n * \n * @typedef {object} Role\n * @property {string} name - Role name\n * @property {string[]} permissions - Role permissions\n * \n * @typedef {string} Status - User status\n */'''\n\nresult = parse(jsdoc, include_code=False)\nprint(len(result.typedefs))          # 3\nprint(result.typedefs[0].name)       # \"User\"\nprint(result.typedefs[1].name)       # \"Role\"\nprint(result.typedefs[2].name)       # \"Status\"\n```\n\nOr from separate comment blocks:\n\n```python\njsdoc = '''/**\n * @typedef {object} Product\n * @property {string} id - Product identifier\n * @property {number} price - Product price\n */\n\n/**\n * @typedef {object} Category\n * @property {string} name - Category name\n * @property {Product[]} products - Products in category\n */\n\nfunction getProducts() {\n    return products;\n}'''\n\nresult = parse(jsdoc)\nprint(len(result.typedefs))          # 2\nprint(result.typedefs[0].name)       # \"Product\"\nprint(result.typedefs[1].name)       # \"Category\"\nprint(result.code)                   # \"function getProducts() { ... }\"\n```\n\n### Optional Parameters\n\n```python\njsdoc = '''/**\n * @param {string} name - Required parameter\n * @param {number} [age] - Optional parameter\n * @param {string} [email=user@example.com] - Optional with default\n */'''\n\nresult = parse(jsdoc, include_code=False)\nprint(result.params[0].optional)  # False\nprint(result.params[1].optional)  # True\nprint(result.params[2].optional)  # True\n```\n\n### Union Types\n\n```python\njsdoc = '''/**\n * @param {string|number|boolean} value - Multi-type parameter\n * @returns {User|null} User object or null\n */'''\n\nresult = parse(jsdoc, include_code=False)\nprint(result.params[0].types)    # [\"string\", \"number\", \"boolean\"]\nprint(result.returns[0].types)   # [\"User\", \"null\"]  \n```\n\n### Function Name Extraction\n\nThe parser automatically extracts function names from various JavaScript function definition patterns:\n\n```python\n# Standard function declaration\njsdoc = '''/**\n * A standard function.\n */\nfunction myFunction() {\n    return true;\n}'''\nresult = parse(jsdoc)\nprint(result.function_name)  # \"myFunction\"\n\n# Arrow function\njsdoc = '''/**\n * An arrow function.\n */\nconst arrowFunc = () => {\n    return \"hello\";\n}'''\nresult = parse(jsdoc)\nprint(result.function_name)  # \"arrowFunc\"\n\n# Async function\njsdoc = '''/**\n * An async function.\n */\nasync function fetchData() {\n    return await api.getData();\n}'''\nresult = parse(jsdoc)\nprint(result.function_name)  # \"fetchData\"\n\n# Class method\njsdoc = '''/**\n * A class method.\n */\nmethodName() {\n    return this.value;\n}'''\nresult = parse(jsdoc)\nprint(result.function_name)  # \"methodName\"\n```\n\nSupported function definition patterns:\n- `function name() {}` - Standard function declarations\n- `async function name() {}` - Async function declarations  \n- `export function name() {}` - Exported functions\n- `const name = () => {}` - Arrow functions\n- `const name = function() {}` - Function expressions\n- `name: function() {}` - Object methods\n- `name() {}` - Object method shorthand\n- `static name() {}` - Static class methods\n\n## API Reference\n\n### `parse(jsdoc_string: str, include_code: bool = True) -> JSDocComment`\n\nParse a JSDoc comment string into a structured object.\n\n**Parameters:**\n- `jsdoc_string` (str): JSDoc comment string, typically wrapped in `/** */`\n- `include_code` (bool): Whether to extract JavaScript code following the comment\n\n**Returns:**\n- `JSDocComment`: Structured representation of the parsed JSDoc\n\n**Raises:**\n- `ValueError`: If the input is not a valid JSDoc comment format\n\n### Data Models\n\nAll returned objects are Pydantic BaseModel instances with full type validation:\n\n- `JSDocComment`: Main container for all parsed data\n- `Description`: Comment description with full text and summary\n- `Parameter`: Function parameter information\n- `ReturnValue`: Return value information  \n- `TypeDef`: Custom type definition\n- `Property`: Object property definition\n- `Example`: Usage example\n- `Throws`: Exception information\n\n## Error Handling\n\nThe parser will raise `ValueError` for invalid input:\n\n```python\ntry:\n    result = parse(\"invalid comment\")\nexcept ValueError as e:\n    print(f\"Parse error: {e}\")\n```\n\n## Development\n\n### Setup Development Environment\n\n```bash\ngit clone https://github.com/yunfanye/jsdoc\ncd jsdoc\npip install -e \".[dev]\"\n```\n\n### Running Tests\n\n```bash\npytest\npytest -v  # verbose output\npytest --cov=jsdoc_parser  # with coverage\n```\n\n### Code Formatting\n\n```bash\nblack jsdoc_parser/\nisort jsdoc_parser/\nflake8 jsdoc_parser/\n```\n\n## License\n\nMIT License - see LICENSE file for details.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n1. Fork the repository\n2. Create a feature branch\n3. Add tests for your changes\n4. Ensure all tests pass\n5. Submit a pull request\n\n## Changelog\n\n### v1.0.3\n- **NEW FEATURE**: Added `function_name` field to automatically extract function names from JavaScript code\n- Support for robust function name extraction from various JS function definition patterns:\n  - Standard function declarations (`function name() {}`)\n  - Arrow functions (`const name = () => {}`)\n  - Async functions (`async function name() {}`)\n  - Exported functions (`export function name() {}`)\n  - Function expressions (`const name = function() {}`)\n  - Object methods (`name: function() {}`, `name() {}`)\n  - Static class methods (`static name() {}`)\n- Added comprehensive tests for function name extraction (23 tests total)\n- Updated documentation with function name extraction examples\n\n### v1.0.2\n- **BREAKING CHANGE**: Changed `typedef` field to `typedefs` (List[TypeDef]) in JSDocComment model\n- Added support for multiple typedef definitions in single comment block\n- Added support for parsing separate typedef comment blocks\n- Improved comment block selection logic for mixed typedef and function documentation\n- Enhanced code extraction to work correctly with multiple comment blocks\n- Added comprehensive tests for multiple typedef scenarios\n- Updated documentation with multiple typedef examples\n\n### v1.0.1\n- Bug fixes and improvements\n\n### v1.0.0\n- Initial release\n- Support for all major JSDoc tags\n- Pydantic BaseModel integration\n- Comprehensive test suite\n- Professional documentation\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A Python package for parsing JSDoc comment blocks into structured BaseModel objects",
    "version": "1.0.3",
    "project_urls": {
        "Bug Tracker": "https://github.com/yunfanye/jsdoc/issues",
        "Documentation": "https://github.com/yunfanye/jsdoc",
        "Homepage": "https://github.com/yunfanye/jsdoc",
        "Repository": "https://github.com/yunfanye/jsdoc.git"
    },
    "split_keywords": [
        "jsdoc",
        " documentation",
        " parser",
        " javascript"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d4c49b0fa82c52c796954de52492e3cf9c1f46b3f176db477520b325201c8042",
                "md5": "1b479dab10a9e3ad99fefcc2aabfade3",
                "sha256": "77c1fcc277951ebe1c28da1445f0d436aa0f4d9a86807356fce0e5c531e76e06"
            },
            "downloads": -1,
            "filename": "jsdoc-1.0.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "1b479dab10a9e3ad99fefcc2aabfade3",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 11403,
            "upload_time": "2025-07-27T02:22:42",
            "upload_time_iso_8601": "2025-07-27T02:22:42.098681Z",
            "url": "https://files.pythonhosted.org/packages/d4/c4/9b0fa82c52c796954de52492e3cf9c1f46b3f176db477520b325201c8042/jsdoc-1.0.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "015b302ed58cc04ebef273b531bac1fd3e938ed2cf44148a4e8b89bc6d086398",
                "md5": "73a34449b64a9e3f8d8bc4148272677e",
                "sha256": "2e75af4fcb8095922e0443ca2033088cb6e4316f0d468f032202964ac555513d"
            },
            "downloads": -1,
            "filename": "jsdoc-1.0.3.tar.gz",
            "has_sig": false,
            "md5_digest": "73a34449b64a9e3f8d8bc4148272677e",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 20378,
            "upload_time": "2025-07-27T02:22:42",
            "upload_time_iso_8601": "2025-07-27T02:22:42.863571Z",
            "url": "https://files.pythonhosted.org/packages/01/5b/302ed58cc04ebef273b531bac1fd3e938ed2cf44148a4e8b89bc6d086398/jsdoc-1.0.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-27 02:22:42",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "yunfanye",
    "github_project": "jsdoc",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "jsdoc"
}
        
Elapsed time: 0.61728s