import fs from 'fs' import * as TJS from 'typescript-json-schema' import * as inflection from 'inflection' import glob from 'glob' // optionally pass argument to schema generator const settings: TJS.PartialArgs = { required: true, ignoreErrors: true, uniqueNames: false, noExtraProps: true } const paths = glob.sync('./src/models/**/*.ts') export function reverseKebabCase(str: string) { const REVERSE_KEBAB_REGEX = /-[a-z\u00E0-\u00F6\u00F8-\u00FE]/g return str.replace(REVERSE_KEBAB_REGEX, function (match) { return match.slice(1).toUpperCase() }) } const interfaces = paths.map((fileName) => { return inflection.singularize( inflection.camelize(inflection.underscore(reverseKebabCase(fileName.split('/').pop().replace('.ts', ''))), false) ) }) const program = TJS.getProgramFromFiles(paths) interfaces.map((Type) => { // skip external components if (Type === 'ExternalComponent') return const schema = TJS.generateSchema(program, Type, settings) // reverse values in nullable arrays so fasitfy json serialized uses null for (var property in schema.properties) { const value = schema.properties[property] as any if (value.anyOf?.[0]?.type == 'array') { schema.properties[property] = { anyOf: value.anyOf.reverse() } } } fs.writeFileSync(`./src/schemas/${inflection.underscore(Type)}.json`, JSON.stringify(schema, null, 2)) console.log(`./src/schemas/${inflection.underscore(Type)}.json`) })