json schema
This commit is contained in:
@@ -18,4 +18,14 @@ export const extractJSON = (str?: string) => {
|
||||
} while (firstClose > firstOpen);
|
||||
firstOpen = str.indexOf('{', firstOpen + 1);
|
||||
} while (firstOpen != -1);
|
||||
}
|
||||
|
||||
export const parseJSON = (str?: string | null): any | undefined => {
|
||||
if (!str) return undefined
|
||||
try {
|
||||
const parsed = JSON.parse(str);
|
||||
return typeof parsed === "object" ? parsed : undefined;
|
||||
} catch (error) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
39
utils/schema.ts
Normal file
39
utils/schema.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
export const extractSchemaProps = <O extends object>(obj: O) =>
|
||||
Object.entries(obj).reduce((prev, [key, val]) => {
|
||||
const typeOf = <T>(arg: T) =>
|
||||
arg instanceof Array
|
||||
? "array"
|
||||
: arg === null
|
||||
? "undefined"
|
||||
: typeof arg;
|
||||
|
||||
const value = (typeOf(val) === "object" && '$type' in val && '$value' in val) ? val?.$value : val;
|
||||
const type = typeOf(value);
|
||||
|
||||
let schema: any = {
|
||||
title: key,
|
||||
type,
|
||||
default: value,
|
||||
}
|
||||
|
||||
if (typeOf(value) === 'array') {
|
||||
const item = value[0] // TODO merge other item schema's into one
|
||||
if (typeOf(item) !== 'object') {
|
||||
schema.items = {
|
||||
type: 'object',
|
||||
properties: extractSchemaProps(item),
|
||||
default: item
|
||||
}
|
||||
}
|
||||
// TODO support primitive-value arrays
|
||||
}
|
||||
|
||||
if (typeOf(value) === "object") {
|
||||
schema.properties = extractSchemaProps(value)
|
||||
}
|
||||
return {
|
||||
...prev,
|
||||
[key]: schema,
|
||||
};
|
||||
}, {} as any);
|
||||
|
||||
Reference in New Issue
Block a user