Wrote a schema, to help users validate their app config

This commit is contained in:
Alicia Sykes 2021-06-05 16:09:07 +01:00
parent bd3dd6b964
commit ea35f3a846
1 changed files with 217 additions and 0 deletions

217
src/utils/ConfigSchema.js Normal file
View File

@ -0,0 +1,217 @@
/**
* This is the schema for the main app configuration (usually ./public/conf.yml)
* It enables the users data to be validated when making changes,
* and detailed warnings shown, to avoid any unexpected errors or issues
*/
module.exports = {
type: 'object',
required: ['sections'],
additionalProperties: false,
properties: {
/* Page Info */
pageInfo: {
type: 'object',
properties: {
title: {
type: 'string',
description: 'Title and heading for the app',
},
description: {
type: 'string',
description: 'Sub-title, displayed in header',
},
navLinks: {
type: 'array',
maxItems: 6,
description: 'Quick access links, displayed in header',
items: {
type: 'object',
additionalProperties: false,
required: ['title', 'path'],
properties: {
title: {
type: 'string',
},
path: {
type: 'string',
},
},
},
},
footerText: { type: 'string' },
},
required: ['title'],
additionalProperties: false,
},
/* App Config */
appConfig: {
type: 'object',
description: 'Application configuration',
properties: {
backgroundImg: {
type: 'string',
description: 'A URL to an image asset to be displayed as background',
},
theme: {
type: 'string',
default: 'Callisto',
description: 'A theme to be applied by default on first load',
},
enableFontAwesome: {
type: 'boolean',
default: true,
description: 'Should load font-awesome assets',
},
fontAwesomeKey: {
type: 'string',
pattern: '^[a-z0-9]{10}$',
description: 'API key for font-awesome',
},
cssThemes: {
type: 'array',
description: 'Theme names to be added to the dropdown',
items: {
type: 'string',
}
},
externalStyleSheet: {
description: 'URL or URLs of external stylesheets to add to dropdown/ load',
type: [
'string', 'array'
],
items: {
type: 'string',
}
},
customCss: {
type: 'string',
description: 'Any custom CSS overides, must be minified',
},
},
additionalProperties: false,
},
/* Sections */
sections: {
type: 'array',
description: 'Array of sections, containing items',
items: {
type: 'object',
required: ['name', 'items'],
additionalProperties: false,
properties: {
name: {
type: 'string',
description: 'Title/ heading for a section',
},
icon: {
type: 'string',
description: 'Icon will be displayed next to title',
},
/* Section Display Data */
displayData: {
type: 'object',
additionalProperties: false,
description: 'Optional meta data for customizing a section',
properties: {
collapsed: {
type: 'boolean',
default: false,
description: 'If true, section needs to be clicked to open',
},
color: {
type: 'string',
description: 'Hex code, or HTML color for section fill',
},
customStyles: {
type: 'string',
description: 'CSS overides for section container',
},
itemSize: {
enum: ['small', 'medium', 'large'],
default: 'medium',
description: 'Size of items within the section',
},
rows: {
type: 'number',
minimum: 1,
maximum: 5,
default: 1,
description: 'The amount of space that the section spans vertically',
},
cols: {
type: 'number',
minimum: 1,
maximum: 5,
default: 1,
description: 'The amount of space that the section spans horizontally',
},
layout: {
enum: ['grid', 'auto'],
default: 'auto',
description: 'If set to grid, items have uniform width, and itemCount can be set',
},
itemCountX: {
type: 'number',
minimum: 1,
maximum: 12,
description: 'Number of items per column',
},
itemCountY: {
type: 'number',
minimum: 1,
maximum: 12,
description: 'Number of items per row',
},
},
},
/* Items within a section */
items: {
type: 'array',
description: 'Array of items to display with a section',
items: {
type: 'object',
additionalProperties: false,
required: ['title'],
properties: {
title: {
type: 'string',
description: 'Text shown on the item',
},
description: {
type: 'string',
nullable: true,
description: 'Short description, shown on hover or in a tooltip',
},
icon: {
type: 'string',
nullable: true,
description: 'An icon, either as a font-awesome identifier, local or remote URL, or auto-fetched favicon',
},
url: {
type: 'string',
description: 'The destination to navigate to when item is clicked',
},
target: {
enum: ['newtab', 'sametab', 'iframe'],
default: 'newtab',
description: 'Opening method, when item is clicked',
},
color: {
type: 'string',
description: 'A custom fill color of the item',
},
provider: {
type: 'string',
description: 'Provider name, e.g. Microsoft',
},
},
},
},
},
}
},
},
};