https://github.com/xiag-ag/typescript-to-json-schema の拡張バージョン。
YousefED/typescript-json-schema
からインスピレーションを受けています。相違点のリストは次のとおりです。
typeChecker.getTypeAtLocation()
の使用を回避しています (そのため、おそらく正しい型の別名が保持されます)definitions
セクションで公開されません。 このプロジェクトは、貢献者のコミュニティによって可能になりました。あらゆる種類の貢献 (問題、コード、ドキュメント、例、テストなど) を歓迎します。当社の行動規範をお読みください。
npx を使用してスキーマ ジェネレーターを実行します。
npx ts-json-schema-generator --path ' my/project/**/*.ts ' --type ' My.Type.Name '
または、パッケージをインストールして実行します
npm install --save ts-json-schema-generator
./node_modules/.bin/ts-json-schema-generator --path ' my/project/**/*.ts ' --type ' My.Type.Name '
異なるプラットフォーム (Windows など) では異なるパス区切り文字が使用される場合があるため、上記のコマンドを調整する必要がある場合があることに注意してください。
また、パスを*
で引用する必要があることにも注意してください。そうしないと、シェルがパスを展開し、最初のパスのみをジェネレーターに渡します。
デフォルトでは、コマンド ライン ジェネレーターは、現在の作業ディレクトリ、またはファイル システムのルートまでのtsconfig.json
ファイルを含む最初の親ディレクトリにあるtsconfig.json
ファイルを使用します。別のtsconfig.json
ファイルを使用する場合は、 --tsconfig
オプションを使用できます。特に、型に対して異なるコンパイル オプションを使用する必要がある場合は、スキーマ生成専用の別のtsconfig.json
ファイルを作成することをお勧めします。
-p, --path <path> Source file path
-t, --type <name> Type name
-i, --id <name> $id for generated schema
-f, --tsconfig <path> Custom tsconfig.json path
-e, --expose <expose> Type exposing (choices: "all", "none", "export", default: "export")
-j, --jsDoc <extended> Read JsDoc annotations (choices: "none", "basic", "extended", default: "extended")
--markdown-description Generate `markdownDescription` in addition to `description`.
--functions <functions> How to handle functions. `fail` will throw an error. `comment` will add a comment. `hide` will treat the function like a NeverType or HiddenType.
(choices: "fail", "comment", "hide", default: "comment")
--minify Minify generated schema (default: false)
--unstable Do not sort properties
--strict-tuples Do not allow additional items on tuples
--no-top-ref Do not create a top-level $ref definition
--no-type-check Skip type checks to improve performance
--no-ref-encode Do not encode references
-o, --out <file> Set the output file (default: stdout)
--validation-keywords [value] Provide additional validation keywords to include (default: [])
--additional-properties Allow additional properties for objects with no index signature (default: false)
-V, --version output the version number
-h, --help display help for command
// main.js
const tsj = require ( "ts-json-schema-generator" ) ;
const fs = require ( "fs" ) ;
/** @type {import('ts-json-schema-generator/dist/src/Config').Config} */
const config = {
path : "path/to/source/file" ,
tsconfig : "path/to/tsconfig.json" ,
type : "*" , // Or <type-name> if you want to generate schema for that one type only
} ;
const outputPath = "path/to/output/file" ;
const schema = tsj . createGenerator ( config ) . createSchema ( config . type ) ;
const schemaString = JSON . stringify ( schema , null , 2 ) ;
fs . writeFile ( outputPath , schemaString , ( err ) => {
if ( err ) throw err ;
} ) ;
node main.js
を介してスキーマ ジェネレーターを実行します。
組み込みの書式設定を拡張するには、カスタム フォーマッタを作成し、それをメイン フォーマッタに追加します。
// my-function-formatter.ts
import { BaseType , Definition , FunctionType , SubTypeFormatter } from "ts-json-schema-generator" ;
import ts from "typescript" ;
export class MyFunctionTypeFormatter implements SubTypeFormatter {
// You can skip this line if you don't need childTypeFormatter
public constructor ( private childTypeFormatter : TypeFormatter ) { }
public supportsType ( type : BaseType ) : boolean {
return type instanceof FunctionType ;
}
public getDefinition ( type : FunctionType ) : Definition {
// Return a custom schema for the function property.
return {
type : "object" ,
properties : {
isFunction : {
type : "boolean" ,
const : true ,
} ,
} ,
} ;
}
// If this type does NOT HAVE children, generally all you need is:
public getChildren ( type : FunctionType ) : BaseType [ ] {
return [ ] ;
}
// However, if children ARE supported, you'll need something similar to
// this (see src/TypeFormatter/{Array,Definition,etc}.ts for some examples):
public getChildren ( type : FunctionType ) : BaseType [ ] {
return this . childTypeFormatter . getChildren ( type . getType ( ) ) ;
}
}
import { createProgram , createParser , SchemaGenerator , createFormatter } from "ts-json-schema-generator" ;
import { MyFunctionTypeFormatter } from "./my-function-formatter.ts" ;
import fs from "fs" ;
const config = {
path : "path/to/source/file" ,
tsconfig : "path/to/tsconfig.json" ,
type : "*" , // Or <type-name> if you want to generate schema for that one type only
} ;
// We configure the formatter an add our custom formatter to it.
const formatter = createFormatter ( config , ( fmt , circularReferenceTypeFormatter ) => {
// If your formatter DOES NOT support children, e.g. getChildren() { return [] }:
fmt . addTypeFormatter ( new MyFunctionTypeFormatter ( ) ) ;
// If your formatter DOES support children, you'll need this reference too:
fmt . addTypeFormatter ( new MyFunctionTypeFormatter ( circularReferenceTypeFormatter ) ) ;
} ) ;
const program = createProgram ( config ) ;
const parser = createParser ( program , config ) ;
const generator = new SchemaGenerator ( program , parser , formatter , config ) ;
const schema = generator . createSchema ( config . type ) ;
const outputPath = "path/to/output/file" ;
const schemaString = JSON . stringify ( schema , null , 2 ) ;
fs . writeFile ( outputPath , schemaString , ( err ) => {
if ( err ) throw err ;
} ) ;
カスタム書式設定と同様に、組み込み解析の拡張も実質的に同じように機能します。
// my-constructor-parser.ts
import { Context , StringType , ReferenceType , BaseType , SubNodeParser } from "ts-json-schema-generator" ;
// use typescript exported by TJS to avoid version conflict
import ts from "ts-json-schema-generator" ;
export class MyConstructorParser implements SubNodeParser {
supportsNode ( node : ts . Node ) : boolean {
return node . kind === ts . SyntaxKind . ConstructorType ;
}
createType ( node : ts . Node , context : Context , reference ?: ReferenceType ) : BaseType | undefined {
return new StringType ( ) ; // Treat constructors as strings in this example
}
}
import { createProgram , createParser , SchemaGenerator , createFormatter } from "ts-json-schema-generator" ;
import { MyConstructorParser } from "./my-constructor-parser.ts" ;
import fs from "fs" ;
const config = {
path : "path/to/source/file" ,
tsconfig : "path/to/tsconfig.json" ,
type : "*" , // Or <type-name> if you want to generate schema for that one type only
} ;
const program = createProgram ( config ) ;
// We configure the parser an add our custom parser to it.
const parser = createParser ( program , config , ( prs ) => {
prs . addNodeParser ( new MyConstructorParser ( ) ) ;
} ) ;
const formatter = createFormatter ( config ) ;
const generator = new SchemaGenerator ( program , parser , formatter , config ) ;
const schema = generator . createSchema ( config . type ) ;
const outputPath = "path/to/output/file" ;
const schemaString = JSON . stringify ( schema , null , 2 ) ;
fs . writeFile ( outputPath , schemaString , ( err ) => {
if ( err ) throw err ;
} ) ;
interface
種類enum
型union
、 tuple
、 type[]
型Date
、 RegExp
、 URL
タイプstring
、 boolean
、 number
型"value"
、 123
、 true
、 false
、 null
、 undefined
リテラルtypeof
keyof
Promise<T>
T
にアンラップされます@format
など) yarn --silent run run --path 'test/valid-data/type-mapped-array/*.ts' --type 'MyObject'
yarn --silent run debug --path 'test/valid-data/type-mapped-array/*.ts' --type 'MyObject'
そしてデバッガープロトコル経由で接続します。
AST Explorer は、このツールの開発者にとって素晴らしい機能です。
パブリッシュは、 publish-auto.yml
で構成された 2 ブランチのリリース前プロセスによって処理されます。すべての変更はデフォルトのnext
ブランチに基づく必要があり、自動的に公開されます。
next
プレリリース タグに自動デプロイされます。結果はnpm install ts-json-schema-generator@next
でインストールできます。next
にマージする場合は、 squash and merge
戦略を使用してください。next
からstable
への PR を開きます。next
からstable
にマージする場合は、 create a merge commit
を使用してください。