Converted schema from JavaScript into JSON
This commit is contained in:
@@ -1,217 +0,0 @@
|
||||
/**
|
||||
* 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',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
230
src/utils/ConfigSchema.json
Normal file
230
src/utils/ConfigSchema.json
Normal file
@@ -0,0 +1,230 @@
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"sections"
|
||||
],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"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
|
||||
},
|
||||
"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": {
|
||||
"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"
|
||||
},
|
||||
"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": {
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ const Ajv = require('ajv');
|
||||
const yaml = require('js-yaml');
|
||||
const fs = require('fs');
|
||||
|
||||
const schema = require('./ConfigSchema');
|
||||
const schema = require('./ConfigSchema.json');
|
||||
|
||||
const validatorOptions = {
|
||||
strict: true,
|
||||
|
||||
Reference in New Issue
Block a user