import { promises } from 'fs'; const { readdir, writeFile } = promises; import {createGenerator} from 'ts-json-schema-generator'; import {dirname,join} from 'path'; async function genSchema(path:string,typename:string){ const gen = createGenerator({ path:path, type:typename, tsconfig:"tsconfig.json" }); const schema = gen.createSchema(typename); if(schema.definitions != undefined){ const definitions = schema.definitions; const definition = definitions[typename]; if(typeof definition == "object" ){ let property = definition.properties; if(property){ property['$schema'] = { type:"string" }; } } } const text = JSON.stringify(schema); await writeFile(join(dirname(path),`${typename}.schema.json`),text); } function capitalize(s:string){ return s.charAt(0).toUpperCase() + s.slice(1); } async function setToALL(path:string) { console.log(`scan ${path}`) const direntry = await readdir(path,{withFileTypes:true}); const works = direntry.filter(x=>x.isFile()&&x.name.endsWith("Config.ts")).map(x=>{ const name = x.name; const m = /(.+)\.ts/.exec(name); if(m !== null){ const typename = m[1]; return genSchema(join(path,typename),capitalize(typename)); } }) await Promise.all(works); const subdir = direntry.filter(x=>x.isDirectory()).map(x=>x.name); for(const x of subdir){ await setToALL(join(path,x)); } } setToALL("src")