diff --git a/README.md b/README.md index 3112dcf..88802aa 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,11 @@ entry: + `@entry request-protocol.json`: the entry file name +common: + ++ `@title foo`: set `title = 'foo'` ++ `@description bar`: set `description = 'bar'` + number: + `@multipleOf 10`: set `multipleOf = 10` diff --git a/demo/cases.gql b/demo/cases.gql index a8adc51..90233a4 100644 --- a/demo/cases.gql +++ b/demo/cases.gql @@ -118,6 +118,7 @@ type NumberType { sfixed64Member: Int! floatMember: Float! doubleMember: Float! + titleMember: Float! } type StringType { diff --git a/demo/cases.json b/demo/cases.json index 2b7a1ee..7a8f69b 100644 --- a/demo/cases.json +++ b/demo/cases.json @@ -179,6 +179,11 @@ }, "doubleMember": { "type": "number" + }, + "titleMember": { + "type": "number", + "title": "foo", + "description": "bar" } }, "required": [ @@ -195,7 +200,8 @@ "fixed64Member", "sfixed64Member", "floatMember", - "doubleMember" + "doubleMember", + "titleMember" ], "additionalProperties": false }, diff --git a/demo/cases.ml b/demo/cases.ml index 9983b93..1506e42 100644 --- a/demo/cases.ml +++ b/demo/cases.ml @@ -115,6 +115,7 @@ type numberType = { sfixed64Member: int; floatMember: float; doubleMember: float; + titleMember: float; } type stringType = { diff --git a/demo/cases.proto b/demo/cases.proto index 23fb08c..55896c6 100644 --- a/demo/cases.proto +++ b/demo/cases.proto @@ -119,6 +119,7 @@ message NumberType { sfixed64 sfixed64Member = 12; float floatMember = 13; double doubleMember = 14; + double titleMember = 15; } message StringType { diff --git a/demo/cases.re b/demo/cases.re index 19c7768..88c9927 100644 --- a/demo/cases.re +++ b/demo/cases.re @@ -130,6 +130,7 @@ type numberType = { sfixed64Member: int, floatMember: float, doubleMember: float, + titleMember: float, }; type stringType = { diff --git a/demo/cases.ts b/demo/cases.ts index 83fafef..fbd4c6e 100644 --- a/demo/cases.ts +++ b/demo/cases.ts @@ -160,6 +160,12 @@ type NumberType = { floatMember: float; doubleMember: double; + + /** + * @title foo + * @description bar + */ + titleMember: number; } type StringType = { diff --git a/demo/debug.json b/demo/debug.json index 9d1e510..79e2f74 100644 --- a/demo/debug.json +++ b/demo/debug.json @@ -665,10 +665,19 @@ "kind": "number", "type": "double" } + }, + { + "name": "titleMember", + "type": { + "kind": "number", + "type": "number", + "title": "foo", + "description": "bar" + } } ], - "minProperties": 14, - "maxProperties": 14 + "minProperties": 15, + "maxProperties": 15 }, { "kind": "object", diff --git a/online/variables.ts b/online/variables.ts index a2606af..82f3fb5 100644 --- a/online/variables.ts +++ b/online/variables.ts @@ -167,6 +167,12 @@ type NumberType = { floatMember: float; doubleMember: double; + + /** + * @title foo + * @description bar + */ + titleMember: number; } type StringType = { diff --git a/src/json-schema-generator.ts b/src/json-schema-generator.ts index d14f7cc..fa85e55 100644 --- a/src/json-schema-generator.ts +++ b/src/json-schema-generator.ts @@ -41,7 +41,9 @@ function getJsonSchemaProperty(memberType: Type | ObjectModel | ArrayModel | Uni } else if (memberType.kind === 'boolean') { return { type: 'boolean', - default: memberType.default + default: memberType.default, + title: memberType.title, + description: memberType.description } } else if (memberType.kind === 'map') { return { @@ -55,7 +57,9 @@ function getJsonSchemaProperty(memberType: Type | ObjectModel | ArrayModel | Uni uniqueItems: memberType.uniqueItems, minItems: memberType.minItems, maxItems: memberType.maxItems, - default: memberType.default + default: memberType.default, + title: memberType.title, + description: memberType.description } } else if (memberType.kind === 'enum') { if (memberType.enums.length === 1) { @@ -112,7 +116,9 @@ function getJsonSchemaPropertyOfString(memberType: StringType) { minLength: memberType.minLength, maxLength: memberType.maxLength, pattern: memberType.pattern, - default: memberType.default + default: memberType.default, + title: memberType.title, + description: memberType.description } } @@ -140,7 +146,9 @@ function getJsonSchemaPropertyOfObject(memberType: ObjectModel | ObjectType): De additionalProperties, minProperties: memberType.minProperties > memberType.members.filter(m => !m.optional).length ? memberType.minProperties : undefined, maxProperties: memberType.maxProperties && memberType.maxProperties < memberType.members.length ? memberType.maxProperties : undefined, - default: memberType.default + default: memberType.default, + title: memberType.title, + description: memberType.description } } @@ -217,7 +225,9 @@ function getNumberType(numberType: NumberType): Definition { multipleOf: numberType.multipleOf, exclusiveMinimum: numberType.exclusiveMinimum, exclusiveMaximum: numberType.exclusiveMaximum, - default: numberType.default + default: numberType.default, + title: numberType.title, + description: numberType.description }) return definition } @@ -277,6 +287,8 @@ export type NumberDefinition = { exclusiveMaximum?: number; multipleOf?: number; default?: number; + title?: string; + description?: string; } /** @@ -285,6 +297,8 @@ export type NumberDefinition = { export type BooleanDefinition = { type: 'boolean'; default?: boolean; + title?: string; + description?: string; } export type ObjectDefinition = { @@ -296,6 +310,8 @@ export type ObjectDefinition = { maxProperties?: number, anyOf?: Definition[], default?: any + title?: string; + description?: string; } export type ArrayDefinition = { @@ -305,6 +321,8 @@ export type ArrayDefinition = { minItems?: number, maxItems?: number, default?: any[] + title?: string; + description?: string; } export type UndefinedDefinition = { @@ -325,6 +343,8 @@ export type StringDefinition = { maxLength?: number; pattern?: string; default?: string; + title?: string; + description?: string; } /** diff --git a/src/parser.ts b/src/parser.ts index f47c88a..5064933 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -737,6 +737,10 @@ export class Parser { if (propertyJsDoc.comment) { if (propertyJsDoc.name === 'default') { type.default = this.getJsDocComment(propertyJsDoc.comment).toLowerCase() === 'true' + } else if (propertyJsDoc.name === 'title') { + type.title = propertyJsDoc.comment + } else if (propertyJsDoc.name === 'description') { + type.description = propertyJsDoc.comment } } } @@ -762,6 +766,10 @@ export class Parser { type.pattern = propertyJsDoc.comment } else if (propertyJsDoc.name === 'default') { type.default = this.getJsDocComment(propertyJsDoc.comment) + } else if (propertyJsDoc.name === 'title') { + type.title = propertyJsDoc.comment + } else if (propertyJsDoc.name === 'description') { + type.description = propertyJsDoc.comment } } } @@ -780,6 +788,10 @@ export class Parser { type.exclusiveMinimum = +propertyJsDoc.comment } else if (propertyJsDoc.name === 'default') { type.default = +this.getJsDocComment(propertyJsDoc.comment) + } else if (propertyJsDoc.name === 'title') { + type.title = propertyJsDoc.comment + } else if (propertyJsDoc.name === 'description') { + type.description = propertyJsDoc.comment } } } @@ -820,6 +832,10 @@ export class Parser { } } else if (jsDoc.name === 'uniqueItems') { type.uniqueItems = true + } else if (jsDoc.name === 'title') { + type.title = jsDoc.comment + } else if (jsDoc.name === 'description') { + type.description = jsDoc.comment } } @@ -863,6 +879,10 @@ export class Parser { type.maxProperties = +jsDoc.comment } else if (jsDoc.name === 'default') { type.default = JSON.parse(this.getJsDocComment(jsDoc.comment)) + } else if (jsDoc.name === 'title') { + type.title = jsDoc.comment + } else if (jsDoc.name === 'description') { + type.description = jsDoc.comment } } else { if (jsDoc.name === 'additionalProperties') { diff --git a/src/utils.ts b/src/utils.ts index b59e7bd..b0972d7 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -101,6 +101,8 @@ export type NumberType = { multipleOf?: number; default?: number; enums?: string[]; + title?: string; + description?: string; } /** @@ -113,6 +115,8 @@ export type StringType = { pattern?: string; default?: string; enums?: string[]; + title?: string; + description?: string; } /** @@ -121,6 +125,8 @@ export type StringType = { export type BooleanType = { kind: 'boolean'; default?: boolean; + title?: string; + description?: string; } /** @@ -137,6 +143,8 @@ export type ObjectType = { maxProperties?: number; additionalProperties?: boolean | Type; default?: any; + title?: string; + description?: string; } export type ArrayType = { @@ -146,6 +154,8 @@ export type ArrayType = { minItems?: number; maxItems?: number; default?: any[] + title?: string; + description?: string; } /**