Skip to content

Genetate json schema, protobuf file, graphQL schema and reasonml/ocaml/rust types from typescript types.

License

Notifications You must be signed in to change notification settings

plantain-00/types-as-schema

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

types-as-schema

Dependency Status devDependency Status Build Status: Windows Github CI npm version Downloads type-coverage

Genetate json schema, protobuf file and swagger doc from typescript types.

install

yarn global add types-as-schema

usage

types-as-schema -p ./types-as-schema.config.ts

types-as-schema.config.ts

import type { Configuration } from "types-as-schema"

const config: Configuration = {
  files: ['demo/types.ts'],
  jsonSchemaOutputDirectory: 'demo/',
  debugOutputPath: 'demo/debug.json',
  protobufOutputPath: 'demo/cases.proto',
  plugins: [
    (typeDeclarations) => {
      const content = `export const typeNames = [
${typeDeclarations.map(d => `'${d.name}',`).join('\n')}
]
    `
      return [
        {
          path: 'demo/custom.ts',
          content,
        },
      ]
    },
  ],
}

export default config

demo/types.ts

/**
 * @entry a.json
 **/
interface A extends B {
  a: string
}

interface B {
  b: number
}

demo/a.json

{
  "$ref": "#/definitions/A",
  "definitions": {
    "A": {
      "type": "object",
      "properties": {
        "a": {
          "type": "string"
        },
        "b": {
          "type": "number"
        }
      },
      "required": [
        "a",
        "b"
      ],
      "additionalProperties": false
    }
  }
}

demo/types.proto

syntax = "proto3";

message B {
    double b = 1;
}

message A {
    string a = 1;
    double b = 2;
}

demo/debug.json

[
  {
    "kind": "object",
    "name": "B",
    "members": [
      {
        "name": "b",
        "type": {
          "kind": "number",
          "type": "number",
          "position": {
            "file": "",
            "line": 8,
            "character": 5
          }
        }
      }
    ],
    "minProperties": 1,
    "maxProperties": 1,
    "position": {
      "file": "",
      "line": 7,
      "character": 0
    }
  },
  {
    "kind": "object",
    "name": "A",
    "members": [
      {
        "name": "a",
        "type": {
          "kind": "string",
          "position": {
            "file": "",
            "line": 4,
            "character": 5
          }
        }
      },
      {
        "name": "b",
        "type": {
          "kind": "number",
          "type": "number",
          "position": {
            "file": "",
            "line": 8,
            "character": 5
          }
        }
      }
    ],
    "minProperties": 2,
    "maxProperties": 2,
    "entry": "a.json",
    "position": {
      "file": "",
      "line": 3,
      "character": 0
    },
    "comments": [
      "/**\n * @entry a.json\n **/"
    ],
    "jsDocs": [
      {
        "name": "entry",
        "comment": "a.json"
      }
    ]
  }
]

demo/custom.ts

export const typeNames = [
  'B',
  'A',
]

options

parameters description
-p configuration file
--json directory for generated json files
--protobuf generated protobuf file
--swagger generated swagger json file
--swagger-base swagger json file that generation based on
--typescript generated typescript file
--debug generated file with debug information in it
--watch or -w watch mode
--loose do not force additionalProperties
--config generate file by the config file, can be multiple
--markdown generated markdown file
-h or --help Print this message.
-v or --version Print the version

API

import { generate } from 'types-as-schema'

await generate({
  files: ['demo/types.ts'],
})

About

Genetate json schema, protobuf file, graphQL schema and reasonml/ocaml/rust types from typescript types.

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published