@nuxt/content
Version:
Write your content inside your Nuxt app
108 lines (104 loc) • 1.79 kB
JavaScript
;
const defu = require('defu');
const supportedFields = {
/**
* Raw types
*/
default: {
type: "string",
tags: [
"@previewInput string"
]
},
string: {
type: "string",
tags: [
"@previewInput string"
]
},
number: {
type: "number",
tags: [
"@previewInput number"
]
},
boolean: {
type: "boolean",
tags: [
"@previewInput boolean"
]
},
array: {
type: "array",
tags: [
"@previewInput array"
]
},
object: {
type: "object",
tags: [
"@previewInput object"
]
},
file: {
type: "string",
tags: [
"@previewInput file"
]
},
media: {
type: "string",
tags: [
"@previewInput media"
]
},
component: {
type: "string",
tags: [
"@previewInput component"
]
},
icon: {
type: "string",
tags: [
"@previewInput icon"
]
}
};
function field(schema) {
if (!schema.type) {
throw new Error(`Missing type in schema ${JSON.stringify(schema)}`);
}
const base = JSON.parse(JSON.stringify(supportedFields[schema.type]));
const result = defu.defu(base, schema);
if (!result.tags) {
result.tags = [];
}
if (result.icon) {
result.tags.push(`@previewIcon ${result.icon}`);
delete result.icon;
}
return {
$schema: result
};
}
function group(schema) {
const result = { ...schema };
if (result.icon) {
result.tags = [`@previewIcon ${result.icon}`];
delete result.icon;
}
const fields = {};
if (result.fields) {
for (const key of Object.keys(result.fields)) {
fields[key] = result.fields[key];
}
delete result.fields;
}
return {
$schema: result,
...fields
};
}
exports.field = field;
exports.group = group;