UNPKG

joi-to-typescript

Version:

Convert Joi Schemas to TypeScript interfaces

62 lines (61 loc) 2.3 kB
import Path from 'path'; import { InputFileFilter } from './types'; import { convertFilesInDirectory } from './convertFilesInDirectory'; import { writeInterfaceFile } from './writeInterfaceFile'; import { convertSchemaInternal } from './analyseSchemaFile'; import { writeIndexFile } from './write'; /** * Apply defaults to the Partial Settings parameter * * @param settings Partial Setting object * @returns Complete Settings object */ function defaultSettings(settings) { const appSettings = Object.assign({ useLabelAsInterfaceName: false, defaultToRequired: false, schemaFileSuffix: 'Schema', interfaceFileSuffix: '', debug: false, fileHeader: `/** * This file was automatically generated by joi-to-typescript * Do not modify this file manually */`, sortPropertiesByName: true, commentEverything: false, ignoreFiles: [], indentationChacters: ' ', honorCastTo: [], treatDefaultedOptionalAsRequired: false, supplyDefaultsInType: false, inputFileFilter: InputFileFilter.Default, omitIndexFiles: false, }, settings); return appSettings; } export function convertSchema(settings, joi, exportedName, root) { const appSettings = defaultSettings(settings); return convertSchemaInternal(appSettings, joi, exportedName, root); } /** * Create types from schemas from a directory * * @param settings - Configuration settings * @returns The success or failure of this operation */ export async function convertFromDirectory(settings) { const appSettings = defaultSettings(settings); const filesInDirectory = await convertFilesInDirectory(appSettings, Path.resolve(appSettings.typeOutputDirectory)); if (!filesInDirectory.types || filesInDirectory.types.length === 0) { throw new Error('No schemas found, cannot generate interfaces'); } // TODO: remove fields from derived interfaces here for (const exportType of filesInDirectory.types) { writeInterfaceFile(appSettings, exportType.typeFileName, filesInDirectory.types); } if (appSettings.indexAllToRoot || appSettings.flattenTree) { // Write index.ts writeIndexFile(appSettings, filesInDirectory.typeFileNames); } return true; }