diff --git a/src/doc.ts b/src/doc.ts new file mode 100644 index 0000000..3f1978f --- /dev/null +++ b/src/doc.ts @@ -0,0 +1,40 @@ +import * as yup from 'yup' + +type DocElement = { + name: string + required: boolean + default_value?: unknown +} + +export function doc>( + scheme: yup.ObjectSchema, + base_name: string = '' +): DocElement[] { + if (base_name.length !== 0) base_name = base_name + '_' + + let elements: DocElement[] = [] + + for (const key in scheme.fields) { + const sub_key = base_name + key.toUpperCase() + const sub_scheme = scheme.fields[key] as yup.AnySchema + const type = sub_scheme.describe().type + + if (type === 'object') { + const sub_elements = doc(sub_scheme as yup.ObjectSchema, sub_key) + elements = [...elements, ...sub_elements] + } else { + elements.push(generic(sub_scheme, sub_key)) + } + } + + return elements +} + +function generic(scheme: yup.AnySchema, name: string): DocElement { + const default_value = scheme.getDefault() + return { + name, + required: !scheme.spec.optional, + default_value + } +} diff --git a/src/index.ts b/src/index.ts index 91c9a20..5ddeeab 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,3 @@ export * as yup from 'yup' export {parse} from './parsing' +export {doc} from './doc'