# pydantic-to-typescript
[![PyPI version](https://badge.fury.io/py/pydantic-to-typescript.svg)](https://badge.fury.io/py/pydantic-to-typescript)
[![CI/CD](https://github.com/phillipdupuis/pydantic-to-typescript/actions/workflows/cicd.yml/badge.svg)](https://github.com/phillipdupuis/pydantic-to-typescript/actions/workflows/cicd.yml)
[![Coverage Status](https://coveralls.io/repos/github/phillipdupuis/pydantic-to-typescript/badge.svg?branch=master)](https://coveralls.io/github/phillipdupuis/pydantic-to-typescript?branch=master)
A simple CLI tool for converting pydantic models into typescript interfaces. Useful for any scenario in which python and javascript applications are interacting, since it allows you to have a single source of truth for type definitions.
This tool requires that you have the lovely json2ts CLI utility installed. Instructions can be found here: https://www.npmjs.com/package/json-schema-to-typescript
### Installation
```bash
$ pip install pydantic-to-typescript
```
---
### CLI
| Prop | Description |
| :------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ‑‑module | name or filepath of the python module you would like to convert. All the pydantic models within it will be converted to typescript interfaces. Discoverable submodules will also be checked. |
| ‑‑output | name of the file the typescript definitions should be written to. Ex: './frontend/apiTypes.ts' |
| ‑‑exclude | name of a pydantic model which should be omitted from the resulting typescript definitions. This option can be defined multiple times, ex: `--exclude Foo --exclude Bar` to exclude both the Foo and Bar models from the output. |
| ‑‑json2ts‑cmd | optional, the command used to invoke json2ts. The default is 'json2ts'. Specify this if you have it installed locally (ex: 'yarn json2ts') or if the exact path to the executable is required (ex: /myproject/node_modules/bin/json2ts) |
---
### Usage
Define your pydantic models (ex: /backend/api.py):
```python
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List, Optional
api = FastAPI()
class LoginCredentials(BaseModel):
username: str
password: str
class Profile(BaseModel):
username: str
age: Optional[int]
hobbies: List[str]
class LoginResponseData(BaseModel):
token: str
profile: Profile
@api.post('/login/', response_model=LoginResponseData)
def login(body: LoginCredentials):
profile = Profile(**body.dict(), age=72, hobbies=['cats'])
return LoginResponseData(token='very-secure', profile=profile)
```
Execute the command for converting these models into typescript definitions, via:
```bash
$ pydantic2ts --module backend.api --output ./frontend/apiTypes.ts
```
or:
```bash
$ pydantic2ts --module ./backend/api.py --output ./frontend/apiTypes.ts
```
or:
```python
from pydantic2ts import generate_typescript_defs
generate_typescript_defs("backend.api", "./frontend/apiTypes.ts")
```
The models are now defined in typescript...
```ts
/* tslint:disable */
/**
/* This file was automatically generated from pydantic models by running pydantic2ts.
/* Do not modify it by hand - just update the pydantic models and then re-run the script
*/
export interface LoginCredentials {
username: string;
password: string;
}
export interface LoginResponseData {
token: string;
profile: Profile;
}
export interface Profile {
username: string;
age?: number;
hobbies: string[];
}
```
...and can be used in your typescript code with complete confidence.
```ts
import { LoginCredentials, LoginResponseData } from "./apiTypes.ts";
async function login(
credentials: LoginCredentials,
resolve: (data: LoginResponseData) => void,
reject: (error: string) => void
) {
try {
const response: Response = await fetch("/login/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(credentials),
});
const data: LoginResponseData = await response.json();
resolve(data);
} catch (error) {
reject(error.message);
}
}
```
Raw data
{
"_id": null,
"home_page": null,
"name": "pydantic-to-typescript",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "annotations, interface, pydantic, typescript, validation",
"author": null,
"author_email": "Phillip Dupuis <phillip_dupuis@alumni.brown.edu>",
"download_url": "https://files.pythonhosted.org/packages/59/ac/8dc13be6720267b5edffb3b0d8c1abdcccc5743d7bda4257ab0a5dccc7b9/pydantic_to_typescript-2.0.0.tar.gz",
"platform": null,
"description": "# pydantic-to-typescript\n\n[![PyPI version](https://badge.fury.io/py/pydantic-to-typescript.svg)](https://badge.fury.io/py/pydantic-to-typescript)\n[![CI/CD](https://github.com/phillipdupuis/pydantic-to-typescript/actions/workflows/cicd.yml/badge.svg)](https://github.com/phillipdupuis/pydantic-to-typescript/actions/workflows/cicd.yml)\n[![Coverage Status](https://coveralls.io/repos/github/phillipdupuis/pydantic-to-typescript/badge.svg?branch=master)](https://coveralls.io/github/phillipdupuis/pydantic-to-typescript?branch=master)\n\nA simple CLI tool for converting pydantic models into typescript interfaces. Useful for any scenario in which python and javascript applications are interacting, since it allows you to have a single source of truth for type definitions.\n\nThis tool requires that you have the lovely json2ts CLI utility installed. Instructions can be found here: https://www.npmjs.com/package/json-schema-to-typescript\n\n### Installation\n\n```bash\n$ pip install pydantic-to-typescript\n```\n\n---\n\n### CLI\n\n| Prop | Description |\n| :------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| ‑‑module | name or filepath of the python module you would like to convert. All the pydantic models within it will be converted to typescript interfaces. Discoverable submodules will also be checked. |\n| ‑‑output | name of the file the typescript definitions should be written to. Ex: './frontend/apiTypes.ts' |\n| ‑‑exclude | name of a pydantic model which should be omitted from the resulting typescript definitions. This option can be defined multiple times, ex: `--exclude Foo --exclude Bar` to exclude both the Foo and Bar models from the output. |\n| ‑‑json2ts‑cmd | optional, the command used to invoke json2ts. The default is 'json2ts'. Specify this if you have it installed locally (ex: 'yarn json2ts') or if the exact path to the executable is required (ex: /myproject/node_modules/bin/json2ts) |\n\n---\n\n### Usage\n\nDefine your pydantic models (ex: /backend/api.py):\n\n```python\nfrom fastapi import FastAPI\nfrom pydantic import BaseModel\nfrom typing import List, Optional\n\napi = FastAPI()\n\nclass LoginCredentials(BaseModel):\n username: str\n password: str\n\nclass Profile(BaseModel):\n username: str\n age: Optional[int]\n hobbies: List[str]\n\nclass LoginResponseData(BaseModel):\n token: str\n profile: Profile\n\n@api.post('/login/', response_model=LoginResponseData)\ndef login(body: LoginCredentials):\n profile = Profile(**body.dict(), age=72, hobbies=['cats'])\n return LoginResponseData(token='very-secure', profile=profile)\n```\n\nExecute the command for converting these models into typescript definitions, via:\n\n```bash\n$ pydantic2ts --module backend.api --output ./frontend/apiTypes.ts\n```\n\nor:\n\n```bash\n$ pydantic2ts --module ./backend/api.py --output ./frontend/apiTypes.ts\n```\n\nor:\n\n```python\nfrom pydantic2ts import generate_typescript_defs\n\ngenerate_typescript_defs(\"backend.api\", \"./frontend/apiTypes.ts\")\n```\n\nThe models are now defined in typescript...\n\n```ts\n/* tslint:disable */\n/**\n/* This file was automatically generated from pydantic models by running pydantic2ts.\n/* Do not modify it by hand - just update the pydantic models and then re-run the script\n*/\n\nexport interface LoginCredentials {\n username: string;\n password: string;\n}\nexport interface LoginResponseData {\n token: string;\n profile: Profile;\n}\nexport interface Profile {\n username: string;\n age?: number;\n hobbies: string[];\n}\n```\n\n...and can be used in your typescript code with complete confidence.\n\n```ts\nimport { LoginCredentials, LoginResponseData } from \"./apiTypes.ts\";\n\nasync function login(\n credentials: LoginCredentials,\n resolve: (data: LoginResponseData) => void,\n reject: (error: string) => void\n) {\n try {\n const response: Response = await fetch(\"/login/\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(credentials),\n });\n const data: LoginResponseData = await response.json();\n resolve(data);\n } catch (error) {\n reject(error.message);\n }\n}\n```\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Convert pydantic models to typescript interfaces",
"version": "2.0.0",
"project_urls": {
"Homepage": "https://github.com/phillipdupuis/pydantic-to-typescript",
"Repository": "https://github.com/phillipdupuis/pydantic-to-typescript"
},
"split_keywords": [
"annotations",
" interface",
" pydantic",
" typescript",
" validation"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "c39cf51312f3063a8b6e1e09e6527a81d3b1828ad5fc8a65c14376f85cf65502",
"md5": "a6eff61a33bd20326f513477b816bf59",
"sha256": "5bc5e1a940c1a39e4e3a6124bd3bda1b0fc6df85c673a4781b94a1f4150cae15"
},
"downloads": -1,
"filename": "pydantic_to_typescript-2.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a6eff61a33bd20326f513477b816bf59",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 9693,
"upload_time": "2024-11-22T03:33:57",
"upload_time_iso_8601": "2024-11-22T03:33:57.199550Z",
"url": "https://files.pythonhosted.org/packages/c3/9c/f51312f3063a8b6e1e09e6527a81d3b1828ad5fc8a65c14376f85cf65502/pydantic_to_typescript-2.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "59ac8dc13be6720267b5edffb3b0d8c1abdcccc5743d7bda4257ab0a5dccc7b9",
"md5": "e97a0d4107fcf81d9279e997ed2fa367",
"sha256": "06e92e8d10759ffebe3abdd4de14015bbf80809fa9960273be6041d8509662be"
},
"downloads": -1,
"filename": "pydantic_to_typescript-2.0.0.tar.gz",
"has_sig": false,
"md5_digest": "e97a0d4107fcf81d9279e997ed2fa367",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 35484,
"upload_time": "2024-11-22T03:33:59",
"upload_time_iso_8601": "2024-11-22T03:33:59.026885Z",
"url": "https://files.pythonhosted.org/packages/59/ac/8dc13be6720267b5edffb3b0d8c1abdcccc5743d7bda4257ab0a5dccc7b9/pydantic_to_typescript-2.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-22 03:33:59",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "phillipdupuis",
"github_project": "pydantic-to-typescript",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "pydantic-to-typescript"
}