1
0
Fork 0
mirror of https://github.com/codex-team/codex.docs.git synced 2025-07-24 15:49:42 +02:00

Move testing to 3001 port (#8)

Create separate database for testing
Add runtime configuration file support
This commit is contained in:
George Berezhnoy 2018-10-07 19:15:10 +03:00 committed by GitHub
parent 073772c047
commit 452d0ae816
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 547 additions and 36 deletions

View file

@ -3,10 +3,14 @@ const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const rcParser = require('./utils/rcparser');
const routes = require('./routes');
const app = express();
const config = rcParser.getConfiguration();
app.locals.config = config;
// view engine setup
app.set('views', path.join(__dirname, 'views'));

View file

@ -1,5 +1,6 @@
const Datastore = require('nedb');
const config = require('../../../config');
const db = new Datastore({filename: './.db/pages.db', autoload: true});
const db = new Datastore({filename: `./${config.database}/pages.db`, autoload: true});
module.exports = db;

102
src/utils/rcparser.js Normal file
View file

@ -0,0 +1,102 @@
const fs = require('fs');
const path = require('path');
const config = require('../../config');
const rcPath = path.resolve(__dirname, '../../', config.rcFile || './.codexdocsrc');
/**
* @typedef {Object} RCData
* @property {string} title - website title
* @property {object[]} menu - options for website menu
* @property {string} menu[].title - menu option title
* @property {string} menu[].uri - menu option href
*/
/**
* @class RCParser
* @classdesc Class to parse runtime configuration file for CodeX Docs engine
*/
module.exports = class RCParser {
/**
* Default CodeX Docs configuration
*
* @static
* @return {{title: string, menu: Array}}
*/
static get DEFAULTS() {
return {
title: 'CodeX Docs',
menu: []
};
}
/**
* Find and parse runtime configuration file
*
* @static
* @return {{title: string, menu: []}}
*/
static getConfiguration() {
if (!fs.existsSync(rcPath)) {
return RCParser.DEFAULTS;
}
const file = fs.readFileSync(rcPath, {encoding: 'UTF-8'});
const rConfig = {};
let userConfig;
try {
userConfig = JSON.parse(file);
} catch (e) {
console.log('CodeX Docs rc file should be in JSON format.');
return RCParser.DEFAULTS;
}
rConfig.title = userConfig.title || RCParser.DEFAULTS.title;
rConfig.menu = userConfig.menu || RCParser.DEFAULTS.menu;
if (!(rConfig.menu instanceof Array)) {
console.log('Menu section in the rc file must be an array.');
rConfig.menu = RCParser.DEFAULTS.menu;
}
rConfig.menu = rConfig.menu.filter((option, i) => {
i = i + 1;
if (typeof option === 'string') {
return true;
}
if (!option || option instanceof Array || typeof option !== 'object') {
console.log(`Menu option #${i} in rc file must be a string or an object`);
return false;
}
const {title, uri} = option;
if (!title || typeof title !== 'string') {
console.log(`Menu option #${i} title must be a string.`);
return false;
}
if (!uri || typeof uri !== 'string') {
console.log(`Menu option #${i} uri must be a string.`);
return false;
}
return true;
});
rConfig.menu = rConfig.menu.map(option => {
if (typeof option === 'string') {
return {
title: option,
/* Replace all non alpha- and numeric-symbols with '-' */
uri: '/' + option.toLowerCase().replace(/[ -/:-@[-`{-~]+/, '-')
};
}
return option;
});
return rConfig;
}
};

View file

@ -1,6 +1,6 @@
<header class="docs-header">
<a href="/" class="docs-header__logo">
CodeX Editor &nbsp; 🤩🧦🤨
{{ config.title }}
</a>
<ul class="docs-header__menu">
<li>
@ -9,25 +9,12 @@
Add Page
</a>
</li>
<li>
<a href="">
Guides
</a>
</li>
<li>
<a href="">
API
</a>
</li>
<li>
<a href="">
Plugins
</a>
</li>
<li>
<a href="">
Support Project
</a>
</li>
{% for option in config.menu %}
<li>
<a href="{{option.uri}}">
{{ option.title }}
</a>
</li>
{% endfor %}
</ul>
</header>