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
버전의 PR을 stable
으로 엽니다.next
에서 stable
로 병합할 때는 create a merge commit
전략을 사용하세요.