ManiaJS/ManiaJS

View on GitHub
src/Util/Configuration.ts

Summary

Maintainability
A
2 hrs
Test Coverage
import * as Joi from 'joi';
import * as directory from './Directory'

import * as fs from 'fs';
import * as yaml from 'js-yaml';
import * as Package from 'pjson';

/**
 * Configuration Class. Access by using the instance export.
 */
export class Configuration {
  private raw: any;
  private location: string;
  private pkg: any;

  public  config: ConfigSchema;
  public  version: string;

  constructor() {
    this.pkg = Package;
    this.version = this.pkg.version;
  }

  public load (location?: string) {
    this.location = location || directory.rootPath() + 'config.yaml';
    this.config = yaml.safeLoad(fs.readFileSync(this.location, 'utf8'));
  }

  public validate(): boolean {
    var res = Joi.validate(this.config, schema);
    if (res.error) {
      throw res.error;
    }
    return true;
  }
}


let schema = {
  config: {
    debug: Joi.boolean(),
    server: {
      game: Joi.string().required(),
      address: Joi.string().required(),
      port: Joi.number().required(),
      authentication: {
        username: Joi.string().required(),
        password: Joi.string()
      }
    },
    masteradmins: Joi.array().items(Joi.string()),
    db: {
      debug: Joi.any().optional(),
      dialect: Joi.string().valid('mysql', 'mssql', 'sqlite', 'postgres'),
      database: Joi.string(),
      authentication: {
        username: Joi.any().optional(),
        password: Joi.any().optional()
      }, pool: {
        max: Joi.number().required(),
        min: Joi.number().required(),
        idle: Joi.number().required()
      },
      mysql: {
        host: Joi.string().required(),
        port: Joi.number().required()
      },
      mssql: {
        host: Joi.string().required(),
        port: Joi.number().optional(),
        instance: Joi.string().optional()
      },
      postgres: {
        host: Joi.string().required(),
        port: Joi.number().required()
      },
      sqlite: {
        storage: Joi.string().required()
      }
    }
  },
  plugins: Joi.any()
};

export interface ConfigSchema {
  config: AppConfig,
  plugins:{
    [s: string]: PluginConfig
  }
}

export interface AppConfig {
  debug: boolean,
  server: {
    address: string,
    port: number,
    authentication: {
      username: string,
      password: string
    },
    game: string,
  },
  masteradmins?: string[],
  db: {
    dialect: string,
    database: string,
    authentication: {
      username: string,
      password: string
    },
    pool: {
      min: number,
      max: number,
      idle: number
    },
    mysql: {
      host: number,
      port: number
    },
    mariadb: {
      host: number,
      port: number
    },
    sqlite: {
      storage: string
    },
    debug?: boolean
  }
}

export interface PluginConfig {

}