diff --git a/src/openApi/v2/parser/constants.ts b/src/openApi/v2/parser/constants.ts index 04041dd7..6336efda 100644 --- a/src/openApi/v2/parser/constants.ts +++ b/src/openApi/v2/parser/constants.ts @@ -1,6 +1,7 @@ export enum PrimaryType { FILE = 'File', OBJECT = 'any', + ARRAY = 'any[]', BOOLEAN = 'boolean', NUMBER = 'number', STRING = 'string', @@ -10,9 +11,9 @@ export enum PrimaryType { export const TYPE_MAPPINGS = new Map([ ['file', PrimaryType.FILE], - ['binary', PrimaryType.FILE], ['any', PrimaryType.OBJECT], ['object', PrimaryType.OBJECT], + ['array', PrimaryType.ARRAY], ['boolean', PrimaryType.BOOLEAN], ['byte', PrimaryType.NUMBER], ['int', PrimaryType.NUMBER], diff --git a/src/openApi/v2/parser/getOperationParameter.ts b/src/openApi/v2/parser/getOperationParameter.ts index d48e6eb8..a59c8ba9 100644 --- a/src/openApi/v2/parser/getOperationParameter.ts +++ b/src/openApi/v2/parser/getOperationParameter.ts @@ -40,6 +40,7 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame operationParameter.template = definitionRef.template; operationParameter.imports.push(...definitionRef.imports); operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + operationParameter.isRequired = operationParameter.default || operationParameter.isRequired; return operationParameter; } @@ -51,6 +52,7 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame operationParameter.base = PrimaryType.STRING; operationParameter.enum.push(...enumerators); operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + operationParameter.isRequired = operationParameter.default || operationParameter.isRequired; return operationParameter; } } @@ -63,6 +65,7 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame operationParameter.base = PrimaryType.NUMBER; operationParameter.enum.push(...enumerators); operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + operationParameter.isRequired = operationParameter.default || operationParameter.isRequired; return operationParameter; } } @@ -75,6 +78,7 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame operationParameter.template = items.template; operationParameter.imports.push(...items.imports); operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + operationParameter.isRequired = operationParameter.default || operationParameter.isRequired; return operationParameter; } @@ -87,6 +91,7 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame operationParameter.imports.push(...items.imports); operationParameter.imports.push('Dictionary'); operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + operationParameter.isRequired = operationParameter.default || operationParameter.isRequired; return operationParameter; } @@ -99,6 +104,7 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame operationParameter.template = model.template; operationParameter.imports.push(...model.imports); operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + operationParameter.isRequired = operationParameter.default || operationParameter.isRequired; return operationParameter; } else { const model = getModel(openApi, parameter.schema); @@ -113,6 +119,7 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame operationParameter.enums.push(...model.enums); operationParameter.properties.push(...model.properties); operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + operationParameter.isRequired = operationParameter.default || operationParameter.isRequired; return operationParameter; } } @@ -126,6 +133,7 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame operationParameter.template = definitionType.template; operationParameter.imports.push(...definitionType.imports); operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + operationParameter.isRequired = operationParameter.default || operationParameter.isRequired; return operationParameter; } diff --git a/src/openApi/v3/parser/constants.ts b/src/openApi/v3/parser/constants.ts index 3258692a..6403f728 100644 --- a/src/openApi/v3/parser/constants.ts +++ b/src/openApi/v3/parser/constants.ts @@ -1,6 +1,7 @@ export enum PrimaryType { FILE = 'File', OBJECT = 'any', + ARRAY = 'any[]', BOOLEAN = 'boolean', NUMBER = 'number', STRING = 'string', @@ -10,9 +11,9 @@ export enum PrimaryType { export const TYPE_MAPPINGS = new Map([ ['file', PrimaryType.FILE], - ['binary', PrimaryType.FILE], ['any', PrimaryType.OBJECT], ['object', PrimaryType.OBJECT], + ['array', PrimaryType.ARRAY], ['boolean', PrimaryType.BOOLEAN], ['byte', PrimaryType.NUMBER], ['int', PrimaryType.NUMBER], diff --git a/src/templates/javascript/model.hbs b/src/templates/javascript/model.hbs index 8085526a..9d4cfe3d 100644 --- a/src/templates/javascript/model.hbs +++ b/src/templates/javascript/model.hbs @@ -9,16 +9,10 @@ {{/if}} import * as yup from 'yup'; -{{#equals export 'reference'}} -{{>exportReference}} -{{else equals export 'generic'}} -{{>exportGeneric}} +{{#equals export 'interface'}} +{{>exportInterface}} {{else equals export 'enum'}} {{>exportEnum}} -{{else equals export 'array'}} -{{>exportArray}} -{{else equals export 'dictionary'}} -{{>exportDictionary}} -{{else equals export 'interface'}} -{{>exportInterface}} +{{else}} +{{>exportGeneric}} {{/equals}} diff --git a/src/templates/javascript/partials/comma.hbs b/src/templates/javascript/partials/comma.hbs new file mode 100644 index 00000000..c0347f64 --- /dev/null +++ b/src/templates/javascript/partials/comma.hbs @@ -0,0 +1 @@ +{{#unless @last}},{{/unless}} diff --git a/src/templates/javascript/partials/defaultValue.hbs b/src/templates/javascript/partials/defaultValue.hbs new file mode 100644 index 00000000..202b75b2 --- /dev/null +++ b/src/templates/javascript/partials/defaultValue.hbs @@ -0,0 +1 @@ +{{#if default}} = {{{default}}}{{/if}} diff --git a/src/templates/javascript/partials/exportArray.hbs b/src/templates/javascript/partials/exportArray.hbs deleted file mode 100644 index f2159556..00000000 --- a/src/templates/javascript/partials/exportArray.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export let {{{name}}}; -(function ({{{name}}}) { - - {{{name}}}.schema = {{>validation}}; - - {{{name}}}.validate = async function(value) { - return {{{name}}}.schema.validate(value, { strict: true }); - }; - - {{{name}}}.validateSync = function(value) { - return {{{name}}}.schema.validateSync(value, { strict: true }); - }; - -})({{{name}}} || ({{{name}}} = {})); diff --git a/src/templates/javascript/partials/exportDictionary.hbs b/src/templates/javascript/partials/exportDictionary.hbs deleted file mode 100644 index f2159556..00000000 --- a/src/templates/javascript/partials/exportDictionary.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export let {{{name}}}; -(function ({{{name}}}) { - - {{{name}}}.schema = {{>validation}}; - - {{{name}}}.validate = async function(value) { - return {{{name}}}.schema.validate(value, { strict: true }); - }; - - {{{name}}}.validateSync = function(value) { - return {{{name}}}.schema.validateSync(value, { strict: true }); - }; - -})({{{name}}} || ({{{name}}} = {})); diff --git a/src/templates/javascript/partials/exportInterface.hbs b/src/templates/javascript/partials/exportInterface.hbs index b6a25e6c..5403ff29 100644 --- a/src/templates/javascript/partials/exportInterface.hbs +++ b/src/templates/javascript/partials/exportInterface.hbs @@ -14,12 +14,12 @@ export let {{{name}}}; {{/if}} {{{../name}}}.{{{name}}} = { {{#each enum}} - {{{name}}}: {{{value}}}{{#unless @last}},{{/unless}} + {{{name}}}: {{{value}}}{{>comma}} {{/each}} }; {{/each}} - {{{name}}}.schema = {{>validation}}; + {{{name}}}.schema = {{>validation parent=name}}; {{{name}}}.validate = async function(value) { return {{{name}}}.schema.validate(value, { strict: true }); diff --git a/src/templates/javascript/partials/exportReference.hbs b/src/templates/javascript/partials/exportReference.hbs deleted file mode 100644 index f2159556..00000000 --- a/src/templates/javascript/partials/exportReference.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export let {{{name}}}; -(function ({{{name}}}) { - - {{{name}}}.schema = {{>validation}}; - - {{{name}}}.validate = async function(value) { - return {{{name}}}.schema.validate(value, { strict: true }); - }; - - {{{name}}}.validateSync = function(value) { - return {{{name}}}.schema.validateSync(value, { strict: true }); - }; - -})({{{name}}} || ({{{name}}} = {})); diff --git a/src/templates/javascript/partials/validation.hbs b/src/templates/javascript/partials/validation.hbs index e07d81be..99ffa165 100644 --- a/src/templates/javascript/partials/validation.hbs +++ b/src/templates/javascript/partials/validation.hbs @@ -1,13 +1,13 @@ -{{#equals export 'reference'}} +{{#equals export 'interface'}} +{{>validationInterface}} +{{else equals export 'reference'}} {{>validationReference}} -{{else equals export 'generic'}} -{{>validationGeneric}} {{else equals export 'enum'}} {{>validationEnum}} {{else equals export 'array'}} {{>validationArray}} {{else equals export 'dictionary'}} {{>validationDictionary}} -{{else equals export 'interface'}} -{{>validationInterface}} +{{else}} +{{>validationGeneric}} {{/equals}} diff --git a/src/templates/javascript/partials/validationArray.hbs b/src/templates/javascript/partials/validationArray.hbs index f530ecc8..13abd35d 100644 --- a/src/templates/javascript/partials/validationArray.hbs +++ b/src/templates/javascript/partials/validationArray.hbs @@ -1,5 +1,5 @@ {{~#if link~}} -yup.array().of({{>validation link}}) +yup.array().of({{>validation link}}){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~else~}} -yup.array().of({{{base}}}.schema) +yup.array().of({{{base}}}.schema){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~/if~}} diff --git a/src/templates/javascript/partials/validationDictionary.hbs b/src/templates/javascript/partials/validationDictionary.hbs index 9031c3d4..a96a5516 100644 --- a/src/templates/javascript/partials/validationDictionary.hbs +++ b/src/templates/javascript/partials/validationDictionary.hbs @@ -1,19 +1,19 @@ {{~#if link~}} yup.lazy(value => { return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: {{>validation link}} + Object.keys(value).reduce((object, key) => ({ + ...object, + [key]: {{>validation link}} }), {}) - ); + ).noUnknown(); }) {{~else~}} yup.lazy(value => { return yup.object().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: {{{base}}}.schema + Object.keys(value).reduce((key, item) => ({ + ...object, + [key]: {{{base}}}.schema }), {}) - ); + ).noUnknown(); }) {{~/if~}} diff --git a/src/templates/javascript/partials/validationEnum.hbs b/src/templates/javascript/partials/validationEnum.hbs index f6f9c50f..bbfc99ed 100644 --- a/src/templates/javascript/partials/validationEnum.hbs +++ b/src/templates/javascript/partials/validationEnum.hbs @@ -1,13 +1,13 @@ {{~#equals parent name~}} yup.mixed().oneOf([ {{#each enum}} - {{{../parent}}}.{{{name}}}{{#unless @last}},{{/unless}} + {{{../parent}}}.{{{name}}}{{>comma}} {{/each}} -]) +]){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~else~}} yup.mixed().oneOf([ {{#each enum}} - {{{value}}}{{#unless @last}},{{/unless}} + {{{value}}}{{>comma}} {{/each}} -]) +]){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~/equals~}} diff --git a/src/templates/javascript/partials/validationGeneric.hbs b/src/templates/javascript/partials/validationGeneric.hbs index 25b52dbd..142aed6d 100644 --- a/src/templates/javascript/partials/validationGeneric.hbs +++ b/src/templates/javascript/partials/validationGeneric.hbs @@ -1,9 +1,9 @@ {{~#equals type 'boolean'~}} -yup.boolean() +yup.boolean(){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~else equals type 'number'~}} -yup.number() +yup.number(){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~else equals type 'string'~}} -yup.string() +yup.string(){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~else~}} -yup.mixed() +yup.mixed(){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~/equals~}} diff --git a/src/templates/javascript/partials/validationInterface.hbs b/src/templates/javascript/partials/validationInterface.hbs index b3108028..b2fe8356 100644 --- a/src/templates/javascript/partials/validationInterface.hbs +++ b/src/templates/javascript/partials/validationInterface.hbs @@ -1,4 +1,3 @@ -( {{#if extends}} {{#each extends}} {{{this}}}.schema.concat( @@ -7,7 +6,11 @@ {{#if properties}} yup.object().shape({ {{#each properties}} - {{{name}}}: yup.lazy(() => {{>validation parent=name}}.default(undefined){{#if isNullable}}.isNullable(){{/if}}){{#if isRequired}}.isRequired(){{/if}}{{#unless @last}},{{/unless}} + {{#equals ../parent name}} + {{{name}}}: {{>validation parent=name}}{{>comma}} + {{else}} + {{{name}}}: {{>validation}}{{>comma}} + {{/equals}} {{/each}} }).noUnknown() {{else}} @@ -18,4 +21,4 @@ yup.object() ) {{/each}} {{/if}} -) +{{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} diff --git a/src/templates/javascript/partials/validationReference.hbs b/src/templates/javascript/partials/validationReference.hbs index bb7edfd1..4d3124c7 100644 --- a/src/templates/javascript/partials/validationReference.hbs +++ b/src/templates/javascript/partials/validationReference.hbs @@ -1 +1 @@ -{{{base}}}.schema +{{{base}}}.schema{{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} diff --git a/src/templates/javascript/service.hbs b/src/templates/javascript/service.hbs index b08fcc4f..c4c5cf05 100644 --- a/src/templates/javascript/service.hbs +++ b/src/templates/javascript/service.hbs @@ -31,7 +31,7 @@ export class {{{name}}} { */ static async {{{name}}}({{#if parameters}} {{#each parameters}} - {{{name}}}{{#if default}} = {{{default}}}{{/if}}{{#unless @last}},{{/unless}} + {{{name}}}{{>defaultValue}}{{>comma}} {{/each}} {{/if}}) { @@ -40,22 +40,22 @@ export class {{{name}}} { path: `{{{path}}}`{{#if parametersCookie}}, cookies: { {{#each parametersCookie}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} + '{{{prop}}}': {{{name}}}{{>comma}} {{/each}} }{{/if}}{{#if parametersCookie}}, headers: { {{#each parametersHeader}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} + '{{{prop}}}': {{{name}}}{{>comma}} {{/each}} }{{/if}}{{#if parametersQuery}}, query: { {{#each parametersQuery}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} + '{{{prop}}}': {{{name}}}{{>comma}} {{/each}} }{{/if}}{{#if parametersForm}}, formData: { {{#each parametersForm}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} + '{{{prop}}}': {{{name}}}{{>comma}} {{/each}} }{{/if}}{{#if parametersBody}}, body: {{{parametersBody.name}}}{{/if}} diff --git a/src/templates/typescript/model.hbs b/src/templates/typescript/model.hbs index 7d3fbb33..253d6b52 100644 --- a/src/templates/typescript/model.hbs +++ b/src/templates/typescript/model.hbs @@ -10,16 +10,10 @@ import { {{{this}}} } from '../models/{{{this}}}'; {{/if}} import * as yup from 'yup'; -{{#equals export 'reference'}} -{{>exportReference}} -{{else equals export 'generic'}} -{{>exportGeneric}} +{{#equals export 'interface'}} +{{>exportInterface}} {{else equals export 'enum'}} {{>exportEnum}} -{{else equals export 'array'}} -{{>exportArray}} -{{else equals export 'dictionary'}} -{{>exportDictionary}} -{{else equals export 'interface'}} -{{>exportInterface}} +{{else}} +{{>exportGeneric}} {{/equals}} diff --git a/src/templates/typescript/partials/comma.hbs b/src/templates/typescript/partials/comma.hbs new file mode 100644 index 00000000..c0347f64 --- /dev/null +++ b/src/templates/typescript/partials/comma.hbs @@ -0,0 +1 @@ +{{#unless @last}},{{/unless}} diff --git a/src/templates/typescript/partials/defaultValue.hbs b/src/templates/typescript/partials/defaultValue.hbs new file mode 100644 index 00000000..202b75b2 --- /dev/null +++ b/src/templates/typescript/partials/defaultValue.hbs @@ -0,0 +1 @@ +{{#if default}} = {{{default}}}{{/if}} diff --git a/src/templates/typescript/partials/exportArray.hbs b/src/templates/typescript/partials/exportArray.hbs deleted file mode 100644 index 1e7a09bd..00000000 --- a/src/templates/typescript/partials/exportArray.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export type {{{name}}} = {{>type}}{{#if isNullable}} | null{{/if}}; - -export namespace {{{name}}} { - - export const schema = {{>validation}}; - - export async function validate(value: any): Promise<{{{name}}}{{#if isNullable}} | null{{/if}}> { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): {{{name}}}{{#if isNullable}} | null{{/if}} { - return schema.validateSync(value, { strict: true }); - } -} diff --git a/src/templates/typescript/partials/exportDictionary.hbs b/src/templates/typescript/partials/exportDictionary.hbs deleted file mode 100644 index 1e7a09bd..00000000 --- a/src/templates/typescript/partials/exportDictionary.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export type {{{name}}} = {{>type}}{{#if isNullable}} | null{{/if}}; - -export namespace {{{name}}} { - - export const schema = {{>validation}}; - - export async function validate(value: any): Promise<{{{name}}}{{#if isNullable}} | null{{/if}}> { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): {{{name}}}{{#if isNullable}} | null{{/if}} { - return schema.validateSync(value, { strict: true }); - } -} diff --git a/src/templates/typescript/partials/exportEnum.hbs b/src/templates/typescript/partials/exportEnum.hbs index 55754f9c..8b8b7079 100644 --- a/src/templates/typescript/partials/exportEnum.hbs +++ b/src/templates/typescript/partials/exportEnum.hbs @@ -5,7 +5,7 @@ {{/if}} export enum {{{name}}} { {{#each enum}} - {{{name}}} = {{{value}}}{{#unless @last}},{{/unless}} + {{{name}}} = {{{value}}}{{>comma}} {{/each}} } diff --git a/src/templates/typescript/partials/exportGeneric.hbs b/src/templates/typescript/partials/exportGeneric.hbs index 1e7a09bd..3db13fe8 100644 --- a/src/templates/typescript/partials/exportGeneric.hbs +++ b/src/templates/typescript/partials/exportGeneric.hbs @@ -3,17 +3,17 @@ * {{{description}}} */ {{/if}} -export type {{{name}}} = {{>type}}{{#if isNullable}} | null{{/if}}; +export type {{{name}}} = {{>type}}; export namespace {{{name}}} { export const schema = {{>validation}}; - export async function validate(value: any): Promise<{{{name}}}{{#if isNullable}} | null{{/if}}> { + export async function validate(value: any): Promise<{{#>isNullable}}{{{name}}}{{/isNullable}}> { return schema.validate(value, { strict: true }); } - export function validateSync(value: any): {{{name}}}{{#if isNullable}} | null{{/if}} { + export function validateSync(value: any): {{#>isNullable}}{{{name}}}{{/isNullable}} { return schema.validateSync(value, { strict: true }); } } diff --git a/src/templates/typescript/partials/exportInterface.hbs b/src/templates/typescript/partials/exportInterface.hbs index f5192ccc..d8e32f2a 100644 --- a/src/templates/typescript/partials/exportInterface.hbs +++ b/src/templates/typescript/partials/exportInterface.hbs @@ -3,14 +3,14 @@ * {{{description}}} */ {{/if}} -export interface {{{name}}}{{#if extends}} extends {{#each extends}}{{{this}}}{{#unless @last}}, {{/unless}}{{/each}}{{/if}} { +export interface {{{name}}}{{>extends}} { {{#each properties}} {{#if description}} /** * {{{description}}} */ {{/if}} - {{#if isReadOnly}}readonly {{/if}}{{{name}}}{{#unless isRequired}}?{{/unless}}: {{>type parent=../name}}{{#if isNullable}} | null{{/if}}; + {{>isReadOnly}}{{{name}}}{{>isRequired}}: {{>type parent=../name}}; {{/each}} } @@ -24,12 +24,12 @@ export namespace {{{name}}} { {{/if}} export enum {{{name}}} { {{#each enum}} - {{{name}}} = {{{value}}}{{#unless @last}},{{/unless}} + {{{name}}} = {{{value}}}{{>comma}} {{/each}} } {{/each}} - export const schema: yup.ObjectSchema<{{{name}}}> = {{>validation}}; + export const schema: yup.ObjectSchema<{{{name}}}> = {{>validation parent=name}}; export async function validate(value: any): Promise<{{{name}}}> { return schema.validate(value, { strict: true }); diff --git a/src/templates/typescript/partials/exportReference.hbs b/src/templates/typescript/partials/exportReference.hbs deleted file mode 100644 index 1e7a09bd..00000000 --- a/src/templates/typescript/partials/exportReference.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if description}} -/** - * {{{description}}} - */ -{{/if}} -export type {{{name}}} = {{>type}}{{#if isNullable}} | null{{/if}}; - -export namespace {{{name}}} { - - export const schema = {{>validation}}; - - export async function validate(value: any): Promise<{{{name}}}{{#if isNullable}} | null{{/if}}> { - return schema.validate(value, { strict: true }); - } - - export function validateSync(value: any): {{{name}}}{{#if isNullable}} | null{{/if}} { - return schema.validateSync(value, { strict: true }); - } -} diff --git a/src/templates/typescript/partials/extends.hbs b/src/templates/typescript/partials/extends.hbs new file mode 100644 index 00000000..5e083972 --- /dev/null +++ b/src/templates/typescript/partials/extends.hbs @@ -0,0 +1 @@ +{{#if extends}} extends {{#each extends}}{{{this}}}{{#unless @last}}, {{/unless}}{{/each}}{{/if}} diff --git a/src/templates/typescript/partials/isNullable.hbs b/src/templates/typescript/partials/isNullable.hbs new file mode 100644 index 00000000..d646a78d --- /dev/null +++ b/src/templates/typescript/partials/isNullable.hbs @@ -0,0 +1 @@ +{{>@partial-block}}{{#if isNullable}} | null{{/if}} diff --git a/src/templates/typescript/partials/isReadOnly.hbs b/src/templates/typescript/partials/isReadOnly.hbs new file mode 100644 index 00000000..7ab3bdbf --- /dev/null +++ b/src/templates/typescript/partials/isReadOnly.hbs @@ -0,0 +1 @@ +{{#if isReadOnly}}readonly {{/if}} diff --git a/src/templates/typescript/partials/isRequired.hbs b/src/templates/typescript/partials/isRequired.hbs new file mode 100644 index 00000000..50deb796 --- /dev/null +++ b/src/templates/typescript/partials/isRequired.hbs @@ -0,0 +1 @@ +{{#unless isRequired}}?{{/unless}} diff --git a/src/templates/typescript/partials/type.hbs b/src/templates/typescript/partials/type.hbs index d01ee230..fb17c467 100644 --- a/src/templates/typescript/partials/type.hbs +++ b/src/templates/typescript/partials/type.hbs @@ -1,13 +1,13 @@ -{{#equals export 'reference'}} +{{#equals export 'interface'}} +{{>typeInterface}} +{{else equals export 'reference'}} {{>typeReference}} -{{else equals export 'generic'}} -{{>typeGeneric}} {{else equals export 'enum'}} {{>typeEnum}} {{else equals export 'array'}} {{>typeArray}} {{else equals export 'dictionary'}} {{>typeDictionary}} -{{else equals export 'interface'}} -{{>typeInterface}} +{{else}} +{{>typeGeneric}} {{/equals}} diff --git a/src/templates/typescript/partials/typeArray.hbs b/src/templates/typescript/partials/typeArray.hbs index 0fd14c91..9ce12ac3 100644 --- a/src/templates/typescript/partials/typeArray.hbs +++ b/src/templates/typescript/partials/typeArray.hbs @@ -1,5 +1,7 @@ +{{~#>isNullable~}} {{~#if link~}} Array<{{>type link}}> {{~else~}} Array<{{{type}}}> {{~/if~}} +{{~/isNullable~}} diff --git a/src/templates/typescript/partials/typeDictionary.hbs b/src/templates/typescript/partials/typeDictionary.hbs index 413903ee..d834cb86 100644 --- a/src/templates/typescript/partials/typeDictionary.hbs +++ b/src/templates/typescript/partials/typeDictionary.hbs @@ -1,5 +1,7 @@ +{{~#>isNullable~}} {{~#if link~}} Dictionary<{{>type link}}> {{~else~}} Dictionary<{{{type}}}> {{~/if~}} +{{~/isNullable~}} diff --git a/src/templates/typescript/partials/typeEnum.hbs b/src/templates/typescript/partials/typeEnum.hbs index 65428fbc..14831619 100644 --- a/src/templates/typescript/partials/typeEnum.hbs +++ b/src/templates/typescript/partials/typeEnum.hbs @@ -1,3 +1,4 @@ +{{~#>isNullable~}} {{~#if parent~}} {{{parent}}}.{{{name}}} {{~else~}} @@ -7,3 +8,4 @@ {{~/each~}} ) {{~/if~}} +{{~/isNullable~}} diff --git a/src/templates/typescript/partials/typeGeneric.hbs b/src/templates/typescript/partials/typeGeneric.hbs index 1a5d1239..cadc8ddf 100644 --- a/src/templates/typescript/partials/typeGeneric.hbs +++ b/src/templates/typescript/partials/typeGeneric.hbs @@ -1 +1,3 @@ +{{~#>isNullable~}} {{{base}}} +{{~/isNullable~}} diff --git a/src/templates/typescript/partials/typeInterface.hbs b/src/templates/typescript/partials/typeInterface.hbs index 1b0823b6..e3d49b66 100644 --- a/src/templates/typescript/partials/typeInterface.hbs +++ b/src/templates/typescript/partials/typeInterface.hbs @@ -1,3 +1,4 @@ +{{~#>isNullable~}} {{~#if properties~}} { {{#each properties}} @@ -6,9 +7,10 @@ * {{{description}}} */ {{/if}} -{{#if isReadOnly}}readonly {{/if}}{{{name}}}{{#unless isRequired}}?{{/unless}}: {{>type}}{{#if isNullable}} | null{{/if}}{{#unless @last}},{{/unless}} +{{>isReadOnly}}{{{name}}}{{>isRequired}}: {{>type}}{{>comma}} {{/each}} } {{~else~}} any {{~/if~}} +{{~/isNullable~}} diff --git a/src/templates/typescript/partials/typeReference.hbs b/src/templates/typescript/partials/typeReference.hbs index 1a5d1239..cadc8ddf 100644 --- a/src/templates/typescript/partials/typeReference.hbs +++ b/src/templates/typescript/partials/typeReference.hbs @@ -1 +1,3 @@ +{{~#>isNullable~}} {{{base}}} +{{~/isNullable~}} diff --git a/src/templates/typescript/partials/validation.hbs b/src/templates/typescript/partials/validation.hbs index e07d81be..99ffa165 100644 --- a/src/templates/typescript/partials/validation.hbs +++ b/src/templates/typescript/partials/validation.hbs @@ -1,13 +1,13 @@ -{{#equals export 'reference'}} +{{#equals export 'interface'}} +{{>validationInterface}} +{{else equals export 'reference'}} {{>validationReference}} -{{else equals export 'generic'}} -{{>validationGeneric}} {{else equals export 'enum'}} {{>validationEnum}} {{else equals export 'array'}} {{>validationArray}} {{else equals export 'dictionary'}} {{>validationDictionary}} -{{else equals export 'interface'}} -{{>validationInterface}} +{{else}} +{{>validationGeneric}} {{/equals}} diff --git a/src/templates/typescript/partials/validationArray.hbs b/src/templates/typescript/partials/validationArray.hbs index a51849a9..3b30e605 100644 --- a/src/templates/typescript/partials/validationArray.hbs +++ b/src/templates/typescript/partials/validationArray.hbs @@ -1,5 +1,5 @@ {{~#if link~}} -yup.array<{{>type link}}>().of({{>validation link}}) +yup.array<{{>type link}}>().of({{>validation link}}){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~else~}} -yup.array<{{{type}}}>().of({{{base}}}.schema) +yup.array<{{#>isNullable}}{{{type}}}{{/isNullable}}>().of({{{base}}}.schema){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~/if~}} diff --git a/src/templates/typescript/partials/validationDictionary.hbs b/src/templates/typescript/partials/validationDictionary.hbs index d0a2a4bf..99762bb4 100644 --- a/src/templates/typescript/partials/validationDictionary.hbs +++ b/src/templates/typescript/partials/validationDictionary.hbs @@ -1,19 +1,19 @@ {{~#if link~}} yup.lazytype link}}>>(value => { return yup.objecttype link}}>>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: {{>validation link}} + Object.keys(value).reduce((object, key) => ({ + ...object, + [key]: {{>validation link}} }), {}) - ); + ).noUnknown(); }) {{~else~}} -yup.lazy>(value => { - return yup.object>().shape( - Object.entries(value).reduce((obj, item) => ({ - ...obj, - [item[0]]: {{{base}}}.schema +yup.lazyisNullable}}{{{type}}}{{/isNullable}}>>(value => { + return yup.objectisNullable}}{{{type}}}{{/isNullable}}>>().shape( + Object.keys(value).reduce((object, key) => ({ + ...object, + [key]: {{{base}}}.schema }), {}) - ); + ).noUnknown(); }) {{~/if~}} diff --git a/src/templates/typescript/partials/validationEnum.hbs b/src/templates/typescript/partials/validationEnum.hbs index 30889350..4a0b91ce 100644 --- a/src/templates/typescript/partials/validationEnum.hbs +++ b/src/templates/typescript/partials/validationEnum.hbs @@ -1,13 +1,13 @@ {{~#equals parent name~}} yup.mixed<{{{name}}}>().oneOf([ {{#each enum}} - {{{../parent}}}.{{{name}}}{{#unless @last}},{{/unless}} + {{{../parent}}}.{{{name}}}{{>comma}} {{/each}} -]) +]){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~else~}} -yup.mixed<{{{type}}}>().oneOf([ +yup.mixed<{{#>isNullable}}{{{type}}}{{/isNullable}}>().oneOf([ {{#each enum}} - {{{value}}}{{#unless @last}},{{/unless}} + {{{value}}}{{>comma}} {{/each}} -]) +]){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~/equals~}} diff --git a/src/templates/typescript/partials/validationGeneric.hbs b/src/templates/typescript/partials/validationGeneric.hbs index 430a4f34..bef4c31b 100644 --- a/src/templates/typescript/partials/validationGeneric.hbs +++ b/src/templates/typescript/partials/validationGeneric.hbs @@ -1,9 +1,9 @@ {{~#equals type 'boolean'~}} -yup.boolean() +yup.boolean(){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~else equals type 'number'~}} -yup.number() +yup.number(){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~else equals type 'string'~}} -yup.string() +yup.string(){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~else~}} -yup.mixed<{{{type}}}>() +yup.mixed<{{#>isNullable}}{{{type}}}{{/isNullable}}>(){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} {{~/equals~}} diff --git a/src/templates/typescript/partials/validationInterface.hbs b/src/templates/typescript/partials/validationInterface.hbs index 0ba1b4ff..6ff84040 100644 --- a/src/templates/typescript/partials/validationInterface.hbs +++ b/src/templates/typescript/partials/validationInterface.hbs @@ -1,4 +1,3 @@ -( {{#if extends}} {{#each extends}} {{{this}}}.schema.concat( @@ -7,7 +6,11 @@ {{#if properties}} yup.object{{#unless isProperty}}{{#if name}}<{{{name}}}>{{/if}}{{/unless}}().shape({ {{#each properties}} - {{{name}}}: yup.lazy(() => {{>validation parent=name}}.default(undefined){{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}}){{#unless @last}},{{/unless}} + {{#equals ../parent name}} + {{{name}}}: {{>validation parent=name}}{{>comma}} + {{else}} + {{{name}}}: {{>validation}}{{>comma}} + {{/equals}} {{/each}} }).noUnknown() {{else}} @@ -18,4 +21,4 @@ yup.object() ) {{/each}} {{/if}} -) +{{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} diff --git a/src/templates/typescript/partials/validationReference.hbs b/src/templates/typescript/partials/validationReference.hbs index bb7edfd1..4d3124c7 100644 --- a/src/templates/typescript/partials/validationReference.hbs +++ b/src/templates/typescript/partials/validationReference.hbs @@ -1 +1 @@ -{{{base}}}.schema +{{{base}}}.schema{{#if isNullable}}.nullable(){{/if}}{{#if isRequired}}.required(){{/if}} diff --git a/src/templates/typescript/service.hbs b/src/templates/typescript/service.hbs index 27d91a2f..f51be531 100644 --- a/src/templates/typescript/service.hbs +++ b/src/templates/typescript/service.hbs @@ -37,7 +37,7 @@ export class {{{name}}} { */ public static async {{{name}}}({{#if parameters}} {{#each parameters}} - {{{name}}}{{#unless isRequired}}{{#unless default}}?{{/unless}}{{/unless}}: {{>type}}{{#if isNullable}} | null{{/if}}{{#if default}} = {{{default}}}{{/if}}{{#unless @last}},{{/unless}} + {{{name}}}{{>isRequired}}: {{>type}}{{>defaultValue}}{{>comma}} {{/each}} {{/if}}): Promise<{{>result}}> { @@ -46,22 +46,22 @@ export class {{{name}}} { path: `{{{path}}}`{{#if parametersCookie}}, cookies: { {{#each parametersCookie}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} + '{{{prop}}}': {{{name}}}{{>comma}} {{/each}} }{{/if}}{{#if parametersCookie}}, headers: { {{#each parametersHeader}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} + '{{{prop}}}': {{{name}}}{{>comma}} {{/each}} }{{/if}}{{#if parametersQuery}}, query: { {{#each parametersQuery}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} + '{{{prop}}}': {{{name}}}{{>comma}} {{/each}} }{{/if}}{{#if parametersForm}}, formData: { {{#each parametersForm}} - '{{{prop}}}': {{{name}}}{{#unless @last}},{{/unless}} + '{{{prop}}}': {{{name}}}{{>comma}} {{/each}} }{{/if}}{{#if parametersBody}}, body: {{{parametersBody.name}}}{{/if}} diff --git a/src/utils/writeClientIndex.ts b/src/utils/writeClientIndex.ts index 8c25e60b..32cd6ac7 100644 --- a/src/utils/writeClientIndex.ts +++ b/src/utils/writeClientIndex.ts @@ -18,17 +18,18 @@ import { getServiceNames } from './getServiceNames'; */ export function writeClientIndex(client: Client, language: Language, templates: Templates, outputPath: string): void { const fileName = getFileName('index', language); - try { - fs.writeFileSync( - path.resolve(outputPath, fileName), - templates.index({ - server: client.server, - version: client.version, - models: getModelNames(client.models), - services: getServiceNames(client.services), - }) - ); - } catch (e) { - throw new Error(`Could not write index: "${fileName}"`); - } + // try { + console.log(fileName); + fs.writeFileSync( + path.resolve(outputPath, fileName), + templates.index({ + server: client.server, + version: client.version, + models: getModelNames(client.models), + services: getServiceNames(client.services), + }) + ); + // } catch (e) { + // throw new Error(`Could not write index: "${fileName}"`); + // } } diff --git a/src/utils/writeClientModels.ts b/src/utils/writeClientModels.ts index 440ba3a2..370bf662 100644 --- a/src/utils/writeClientModels.ts +++ b/src/utils/writeClientModels.ts @@ -17,12 +17,13 @@ import { getFileName } from './getFileName'; export function writeClientModels(models: Map, language: Language, templates: Templates, outputPath: string): void { models.forEach(model => { const fileName = getFileName(model.name, language); - try { - const templateData = exportModel(model); - const templateResult = templates.model(templateData); - fs.writeFileSync(path.resolve(outputPath, fileName), format(templateResult)); - } catch (e) { - throw new Error(`Could not write model: "${fileName}"`); - } + // try { + console.log(fileName); + const templateData = exportModel(model); + const templateResult = templates.model(templateData); + fs.writeFileSync(path.resolve(outputPath, fileName), format(templateResult)); + // } catch (e) { + // throw new Error(`Could not write model: "${fileName}"`); + // } }); } diff --git a/src/utils/writeClientServices.ts b/src/utils/writeClientServices.ts index 88aea452..7693da87 100644 --- a/src/utils/writeClientServices.ts +++ b/src/utils/writeClientServices.ts @@ -17,12 +17,13 @@ import { getFileName } from './getFileName'; export function writeClientServices(services: Map, language: Language, templates: Templates, outputPath: string): void { services.forEach(service => { const fileName = getFileName(service.name, language); - try { - const templateData = exportService(service); - const templateResult = templates.service(templateData); - fs.writeFileSync(path.resolve(outputPath, fileName), format(templateResult)); - } catch (e) { - throw new Error(`Could not write service: "${fileName}"`); - } + // try { + console.log(fileName); + const templateData = exportService(service); + const templateResult = templates.service(templateData); + fs.writeFileSync(path.resolve(outputPath, fileName), format(templateResult)); + // } catch (e) { + // throw new Error(`Could not write service: "${fileName}"`); + // } }); } diff --git a/test/mock/spec-v2.json b/test/mock/spec-v2.json index 97ca5f59..1506e7b6 100644 --- a/test/mock/spec-v2.json +++ b/test/mock/spec-v2.json @@ -649,7 +649,7 @@ }, "arrayWithEnum": { "type": "array", - "additionalProperties": { + "items": { "enum": [ "Success", "Warning", @@ -659,7 +659,7 @@ }, "arrayWithDescription": { "type": "array", - "additionalProperties": { + "items": { "type": "integer", "description": "Success=1,Warning=2,Error=3" } @@ -743,13 +743,13 @@ "type": "object", "required": [ "required", - "requiredAndreadOnly" + "requiredAndReadOnly" ], "properties": { "required": { "type": "string" }, - "requiredAndreadOnly": { + "requiredAndReadOnly": { "type": "string", "readOnly": true }, diff --git a/test/mock/spec-v3.json b/test/mock/spec-v3.json index 8f6ad801..3ee2bcfb 100644 --- a/test/mock/spec-v3.json +++ b/test/mock/spec-v3.json @@ -775,7 +775,7 @@ }, "arrayWithEnum": { "type": "array", - "additionalProperties": { + "items": { "enum": [ "Success", "Warning", @@ -785,7 +785,7 @@ }, "arrayWithDescription": { "type": "array", - "additionalProperties": { + "items": { "type": "integer", "description": "Success=1,Warning=2,Error=3" } @@ -801,6 +801,42 @@ } } }, + "ProblemDetails": { + "type": "object", + "properties": { + "type": { + "type": "string", + "nullable": true + }, + "title": { + "type": "string", + "nullable": true + }, + "status": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "detail": { + "type": "string", + "nullable": true + }, + "instance": { + "type": "string", + "nullable": true + }, + "extensions": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false + }, + "nullable": true, + "readOnly": true + } + }, + "additionalProperties": false + }, "ModelWithArray": { "description": "This is a model with one property containing an array", "type": "object",