joi-to-typescript
Version:
Convert Joi Schemas to TypeScript interfaces
62 lines (61 loc) • 2.3 kB
JavaScript
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;
}