Merge branch 'release/v0.2.0'
This commit is contained in:
commit
9365d82bef
Binary file not shown.
Before Width: | Height: | Size: 458 KiB |
File diff suppressed because one or more lines are too long
170
app.js
170
app.js
|
@ -1,11 +1,13 @@
|
||||||
const express = require('express'),
|
const express = require('express'),
|
||||||
cors = require("cors"),
|
cors = require("cors"),
|
||||||
app = express(),
|
app = express(),
|
||||||
log = require("color-logs")(true, true, "Dryusdan.fr"),
|
session = require('express-session'),
|
||||||
fs = require("fs"),
|
bodyParser = require('body-parser'),
|
||||||
path = require('path'),
|
cookieParser = require('cookie-parser'),
|
||||||
promise = require('promise'),
|
helmet = require('helmet'),
|
||||||
hbs = require('hbs');
|
log = require("color-logs")(true, true, "Nodezzarella app"),
|
||||||
|
fs = require("fs"),
|
||||||
|
promise = require('promise');
|
||||||
|
|
||||||
log.info("Application started and now preparing");
|
log.info("Application started and now preparing");
|
||||||
|
|
||||||
|
@ -15,105 +17,69 @@ var corsOptions = {
|
||||||
"methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
|
"methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
|
||||||
"preflightContinue": false
|
"preflightContinue": false
|
||||||
};
|
};
|
||||||
/**
|
|
||||||
* Create menu html
|
|
||||||
*/
|
|
||||||
const config = require("./ressources/config.json");
|
|
||||||
var Template = require("./classes/Template.class");
|
|
||||||
var Categories = require("./classes/Categories.class");
|
|
||||||
var Articles = require("./classes/Articles.class");
|
|
||||||
|
|
||||||
class App {
|
global.config = require("./config.json");
|
||||||
constructor(rootPath, port){
|
|
||||||
|
class Nodezzarella {
|
||||||
|
constructor(rootPath){
|
||||||
|
this.getDBType().then((configDB) => {
|
||||||
|
if(!configDB.flatFile){
|
||||||
|
var db = require('./lib/db/'+config.db+'/db');
|
||||||
|
new db().connectDB(configDB).then((connexion) => {
|
||||||
|
global.dbConnexion = connexion;
|
||||||
|
global.dbConf = configDB;
|
||||||
|
this.run();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
this.run();
|
||||||
|
}
|
||||||
|
}).catch((err) => {
|
||||||
|
new Error("Nodezzarella can't initialize");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getDBType(){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fs.access("./lib/db/"+config.db+"/config.json", fs.constants.F_OK || fs.constants.R_OK, (error) => {
|
||||||
|
if(error){
|
||||||
|
reject(new Error("File not exist"));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
resolve(require("./lib/db/"+config.db+"/config.json"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
run(){
|
||||||
|
var routes = require("./lib/router");
|
||||||
|
log.info("HTTP server listening on port", config.appPort);
|
||||||
|
log.info("Application ready");
|
||||||
|
app.set('trust proxy', 1);
|
||||||
|
app.use(cookieParser());
|
||||||
|
app.use(bodyParser.urlencoded({ extended: true }));
|
||||||
|
app.use(bodyParser.json());
|
||||||
|
app.use(session({
|
||||||
|
secret: 'Nodezzarella',
|
||||||
|
resave: true,
|
||||||
|
saveUninitialized: true,
|
||||||
|
cookie: { secure: false, maxAge: 3600*24*31 }
|
||||||
|
}))
|
||||||
|
app.use(config.webroot || "/", routes);
|
||||||
|
app.use(function(req, res, next) {
|
||||||
|
res.status(404);
|
||||||
|
res.send("404 not found");
|
||||||
|
return;
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listen to http://0.0.0.0:port
|
* Listen to http://0.0.0.0:port
|
||||||
*/
|
*/
|
||||||
app.listen(port);
|
app.disable('x-powered-by');
|
||||||
log.info("HTTP server listening on port", port);
|
app.listen(config.appPort || 8888);
|
||||||
log.info("Application ready");
|
|
||||||
var template = new Template();
|
|
||||||
|
|
||||||
app.get("/", function(req, res){
|
|
||||||
var categories = new Categories();
|
|
||||||
Promise.all([
|
|
||||||
template.getNav(),
|
|
||||||
categories.getHome(),
|
|
||||||
categories.getDisclaimer()
|
|
||||||
]).then(data => {
|
|
||||||
var nav = data[0];
|
|
||||||
var content = data[1];
|
|
||||||
var disclaimer = data[2];
|
|
||||||
res.setHeader("Content-type", "text/html");
|
|
||||||
var tplData = {
|
|
||||||
"blogName": config.blogName,
|
|
||||||
"title": config.homeTitle,
|
|
||||||
"nav": nav,
|
|
||||||
"content": content,
|
|
||||||
"disclaimer": disclaimer
|
|
||||||
};
|
|
||||||
res.render('template.hbs', tplData);
|
|
||||||
}).catch(err => {
|
|
||||||
res.setHeader("Content-type", "text/plain");
|
|
||||||
|
|
||||||
res.end("erreur");
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
app.get("/:slug", function(req, res){
|
|
||||||
var categories = new Categories();
|
|
||||||
Promise.all([
|
|
||||||
template.getNav(),
|
|
||||||
categories.getListArticles(req.params.slug),
|
|
||||||
categories.getCategorie(req.params.slug)
|
|
||||||
]).then(data => {
|
|
||||||
var nav = data[0];
|
|
||||||
var content = data[1];
|
|
||||||
var dataCategories = data[2];
|
|
||||||
res.setHeader("Content-type", "text/html");
|
|
||||||
var tplData = {
|
|
||||||
"blogName": config.blogName,
|
|
||||||
"title": dataCategories.title+" - "+ config.blogName,
|
|
||||||
"nav": nav,
|
|
||||||
"content": content,
|
|
||||||
"disclaimer": ''
|
|
||||||
};
|
|
||||||
res.render('template.hbs', tplData);
|
|
||||||
}).catch(err => {
|
|
||||||
res.setHeader("Content-type", "text/plain");
|
|
||||||
|
|
||||||
res.end("erreur");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
app.get("/:categories/:slug", function(req, res){
|
|
||||||
var categories = new Categories();
|
|
||||||
var articles = new Articles();
|
|
||||||
Promise.all([
|
|
||||||
template.getNav(),
|
|
||||||
categories.getCategorie(req.params.categories),
|
|
||||||
articles.getArticle(req.params.categories, req.params.slug)
|
|
||||||
]).then(data => {
|
|
||||||
var nav = data[0];
|
|
||||||
var dataCategories = data[1];
|
|
||||||
var content = data[2];
|
|
||||||
res.setHeader("Content-type", "text/html");
|
|
||||||
var tplData = {
|
|
||||||
"blogName": config.blogName,
|
|
||||||
"title": articles.title+" - "+dataCategories.title+" - "+ config.blogName,
|
|
||||||
"nav": nav,
|
|
||||||
"content": content,
|
|
||||||
"disclaimer": ''
|
|
||||||
};
|
|
||||||
res.render('template.hbs', tplData);
|
|
||||||
}).catch(err => {
|
|
||||||
res.setHeader("Content-type", "text/plain");
|
|
||||||
res.end("erreur");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
app.use(express.static("./public"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
new App("/", config.appPort);
|
new Nodezzarella("/");
|
|
@ -0,0 +1,7 @@
|
||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
const log = require('color-logs')(true, true, "Article.class.js"),
|
||||||
|
markdown = require('markdown').markdown,
|
||||||
|
promise = require('promise');
|
||||||
|
|
||||||
|
var id,
|
||||||
|
title,
|
||||||
|
author,
|
||||||
|
content,
|
||||||
|
date,
|
||||||
|
img,
|
||||||
|
categorieName,
|
||||||
|
categorieID,
|
||||||
|
slug;
|
||||||
|
|
||||||
|
class Article {
|
||||||
|
constructor(id, title, author, date, img, slug, categorieID, content = null){
|
||||||
|
this.setId(id);
|
||||||
|
this.setTitle(title);
|
||||||
|
this.setAuthor(author);
|
||||||
|
this.setDate(date);
|
||||||
|
this.setImg(img);
|
||||||
|
this.setSlug(slug);
|
||||||
|
this.setCategorieID(categorieID);
|
||||||
|
(content !== null)?this.setContent(content):'';
|
||||||
|
}
|
||||||
|
|
||||||
|
setId(id){
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
setTitle(title){
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
setAuthor(author){
|
||||||
|
this.author = author;
|
||||||
|
}
|
||||||
|
|
||||||
|
setContent(content){
|
||||||
|
this.content = markdown.toHTML(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
setImg(img){
|
||||||
|
this.img = img;
|
||||||
|
}
|
||||||
|
|
||||||
|
setDate(date){
|
||||||
|
this.date = date;
|
||||||
|
}
|
||||||
|
|
||||||
|
setSlug(slug){
|
||||||
|
this.slug = slug;
|
||||||
|
}
|
||||||
|
|
||||||
|
setCategorieID(categorieID){
|
||||||
|
this.categorieID = categorieID;
|
||||||
|
}
|
||||||
|
|
||||||
|
setCategorieName(name){
|
||||||
|
this.categorieName = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
getId(){
|
||||||
|
return this.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
getTitle(){
|
||||||
|
return this.title;
|
||||||
|
}
|
||||||
|
|
||||||
|
getAuthor(){
|
||||||
|
return this.author;
|
||||||
|
}
|
||||||
|
|
||||||
|
getContent(){
|
||||||
|
return this.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
getDate(){
|
||||||
|
return this.date;
|
||||||
|
}
|
||||||
|
|
||||||
|
getImg(){
|
||||||
|
return this.img;
|
||||||
|
}
|
||||||
|
|
||||||
|
getSlug(){
|
||||||
|
return this.slug;
|
||||||
|
}
|
||||||
|
|
||||||
|
getcategorieID(){
|
||||||
|
return this.categorieID;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Article;
|
|
@ -0,0 +1,86 @@
|
||||||
|
const log = require('color-logs')(true, true, "Categorie.class.js");
|
||||||
|
|
||||||
|
var id,
|
||||||
|
title,
|
||||||
|
uri,
|
||||||
|
articles,
|
||||||
|
description;
|
||||||
|
|
||||||
|
class Categorie {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {string} title : title of categorie
|
||||||
|
* @param {string} uri : uri of categorie
|
||||||
|
* @param {string} description : description of categorie
|
||||||
|
*/
|
||||||
|
constructor(id, title, uri, description){
|
||||||
|
this.setId(id);
|
||||||
|
this.setTitle(title);
|
||||||
|
this.setUri(uri);
|
||||||
|
this.setDescription(description);
|
||||||
|
this.articles = new Array();
|
||||||
|
}
|
||||||
|
|
||||||
|
setId(id){
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
setTitle(title){
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
setUri(uri){
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
setDescription(description){
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {object <Article>} article : array of article object owned by this categorie
|
||||||
|
*/
|
||||||
|
setArticle(article){
|
||||||
|
this.articles.push(article);
|
||||||
|
}
|
||||||
|
|
||||||
|
getId(){
|
||||||
|
return this.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {string} title of categorie
|
||||||
|
*/
|
||||||
|
getTitle(){
|
||||||
|
return this.title;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {string} uri of categorie
|
||||||
|
*/
|
||||||
|
getUri(){
|
||||||
|
return this.uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {string} description of categories
|
||||||
|
*/
|
||||||
|
getDescription(){
|
||||||
|
return this.description;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {array} article array of categories
|
||||||
|
*/
|
||||||
|
getArticles(){
|
||||||
|
return this.articles;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Categorie;
|
|
@ -1,131 +0,0 @@
|
||||||
const log = require('color-logs')(true, true, "Categories.class.js"),
|
|
||||||
path = require('path'),
|
|
||||||
hbs = require('handlebars'),
|
|
||||||
promise = require('promise'),
|
|
||||||
fs = require("fs");
|
|
||||||
|
|
||||||
hbs.registerHelper('listArticle', function(tabs, options) {
|
|
||||||
var i = 1;
|
|
||||||
var out = '';
|
|
||||||
for(var x in options['data']['root']){
|
|
||||||
|
|
||||||
out = out + "" + options.fn(options['data']['root'][x]) + "";
|
|
||||||
if(i == 3){
|
|
||||||
i= 1;
|
|
||||||
out = out + "</div><div class=\"row\">";
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
});
|
|
||||||
|
|
||||||
class Categories {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* hydrate global var
|
|
||||||
* @param {type} slug : url of categorie
|
|
||||||
* @returns {Promise} data of categories
|
|
||||||
*/
|
|
||||||
getCategorie(slug){
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
var path = "./ressources/"+slug+"/params.json";
|
|
||||||
fs.access(path, fs.constants.F_OK || fs.constants.R_OK, (error) => {
|
|
||||||
if(error)
|
|
||||||
resolve(new Error("File not exist"));
|
|
||||||
else
|
|
||||||
resolve(require("."+path));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @returns {Promise} the list of article
|
|
||||||
*/
|
|
||||||
getHome(){
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
fs.readFile('./views/articles/list.hbs', 'utf-8', (error, source) => {
|
|
||||||
var data = require('../ressources/lastArticles.json');
|
|
||||||
hbs.registerHelper('articles', (articles) =>{
|
|
||||||
return articles;
|
|
||||||
});
|
|
||||||
var template = hbs.compile(source);
|
|
||||||
var html = template(data);
|
|
||||||
resolve(html);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
getDisclaimer(){
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
fs.readFile('./views/articles/disclaimer.hbs', 'utf-8', (error, source) => {
|
|
||||||
var data = require('../ressources/disclaimer.json');
|
|
||||||
hbs.registerHelper('articles', (articles) =>{
|
|
||||||
return articles;
|
|
||||||
});
|
|
||||||
var template = hbs.compile(source);
|
|
||||||
var html = template(data);
|
|
||||||
resolve(html);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {type} slug : url of categorie
|
|
||||||
* @returns {Promise} the list of article in this categorie
|
|
||||||
*/
|
|
||||||
getListArticles(slug){
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
fs.readFile('./views/articles/list.hbs', 'utf-8', (error, source) => {
|
|
||||||
var pathOfArticles = "./ressources/"+slug+"";
|
|
||||||
var dataObj = {};
|
|
||||||
fs.readdir(pathOfArticles, (err, files)=> {
|
|
||||||
if(err){
|
|
||||||
resolve(new Error("File not exist"));
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
var i = 0;
|
|
||||||
files.forEach((file) => {
|
|
||||||
if(file != "params.json"){
|
|
||||||
if(path.extname(file) == ".json"){
|
|
||||||
dataObj[i] = require('.'+pathOfArticles+"/"+file);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
var objectSize = Object.keys(dataObj).length;
|
|
||||||
var data = "{";
|
|
||||||
for(var x in dataObj){
|
|
||||||
if(x < objectSize-1){
|
|
||||||
data += "\""+x+"\""+":"+JSON.stringify(dataObj[x])+',';
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
data += "\""+x+"\""+":"+JSON.stringify(dataObj[x])+'';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
data += "}";
|
|
||||||
data = JSON.parse(data);
|
|
||||||
|
|
||||||
hbs.registerHelper('articles', (articles) =>{
|
|
||||||
return articles;
|
|
||||||
});
|
|
||||||
|
|
||||||
var template = hbs.compile(source);
|
|
||||||
var html = template(data);
|
|
||||||
resolve(html);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Categories;
|
|
|
@ -4,12 +4,6 @@ const log = require('color-logs')(true, true, "Articles.class.js"),
|
||||||
markdown = require('markdown').markdown,
|
markdown = require('markdown').markdown,
|
||||||
fs = require("fs");
|
fs = require("fs");
|
||||||
|
|
||||||
var title,
|
|
||||||
author,
|
|
||||||
content,
|
|
||||||
date,
|
|
||||||
slug;
|
|
||||||
|
|
||||||
class Articles {
|
class Articles {
|
||||||
|
|
||||||
getArticle(categorie, article){
|
getArticle(categorie, article){
|
|
@ -0,0 +1,264 @@
|
||||||
|
const log = require('color-logs')(true, true, "Categories.class.js"),
|
||||||
|
path = require('path'),
|
||||||
|
hbs = require('handlebars'),
|
||||||
|
promise = require('promise'),
|
||||||
|
dbConnector = require('../../lib/db/'+config.db+"/db.js");
|
||||||
|
fs = require("fs"),
|
||||||
|
Categorie = require('../Categorie.class.js');
|
||||||
|
Article = require('../Article.class.js');
|
||||||
|
|
||||||
|
hbs.registerHelper('listArticle', function(tabs, options) {
|
||||||
|
var i = 1;
|
||||||
|
var out = '';
|
||||||
|
log.debug();
|
||||||
|
var articles = options['data']['root'].getArticles();
|
||||||
|
articles.shift();
|
||||||
|
log.debug(articles);
|
||||||
|
for(var x in articles){
|
||||||
|
out = out + "" + options.fn(articles[x]) + "";
|
||||||
|
if(i == 3){
|
||||||
|
i= 1;
|
||||||
|
out = out + "</div><div class=\"row\">";
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
});
|
||||||
|
|
||||||
|
hbs.registerHelper('disclamer', function(tabs, options) {
|
||||||
|
return options.fn(options['data']['root'].getArticles()[0]) + "";
|
||||||
|
});
|
||||||
|
|
||||||
|
hbs.registerHelper('listNav', function(tabs, options) {
|
||||||
|
var out = '';
|
||||||
|
for(var x in options['data']['root']){
|
||||||
|
out = out + "" + options.fn(options['data']['root'][x]) + "";
|
||||||
|
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
});
|
||||||
|
|
||||||
|
hbs.registerHelper('article', function(tabs, options) {
|
||||||
|
var out = '';
|
||||||
|
for(var x in options['data']['root']){
|
||||||
|
out = out + "" + options.fn(options['data']['root'][x]) + "";
|
||||||
|
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
});
|
||||||
|
|
||||||
|
class Categories {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {<Promise>} html : the html code of navbar
|
||||||
|
*/
|
||||||
|
getNav(){
|
||||||
|
var db = new dbConnector();
|
||||||
|
return db.get({
|
||||||
|
"select" : {
|
||||||
|
"categories" : [
|
||||||
|
"title",
|
||||||
|
"uri",
|
||||||
|
"description"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"condition" : "",
|
||||||
|
"join": ""
|
||||||
|
}).then((result) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fs.readFile('./views/_nav.hbs', 'utf-8', (error, source) => {
|
||||||
|
hbs.registerHelper('nav', (nav) =>{
|
||||||
|
return nav;
|
||||||
|
});
|
||||||
|
var template = hbs.compile(source);
|
||||||
|
var html = template(JSON.parse(result));
|
||||||
|
resolve(html);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}).catch((err) => {
|
||||||
|
throw err;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hydrate global var
|
||||||
|
* @param {type} select : object of select {id = id}
|
||||||
|
* @returns {Promise} data of categories
|
||||||
|
*/
|
||||||
|
getCategorie(select){
|
||||||
|
var db = new dbConnector();
|
||||||
|
return db.get({
|
||||||
|
"select" : {
|
||||||
|
"categories" : [
|
||||||
|
"id",
|
||||||
|
"title",
|
||||||
|
"uri",
|
||||||
|
"description"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"condition" : select,
|
||||||
|
"join" : ""
|
||||||
|
}).then((result) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
var data = JSON.parse(result);
|
||||||
|
result = null;
|
||||||
|
var categorie = new Categorie(data[0].id, data[0].title, data[0].uri, data[0].description);
|
||||||
|
resolve(categorie);
|
||||||
|
});
|
||||||
|
}).catch((err) => {
|
||||||
|
throw err;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {<Categorie>} categorie : object categorie
|
||||||
|
* @param {string} returnFormat : format of return [object, json, html]
|
||||||
|
* @returns {<Promise> listArticleToHTML} a list of article in HTML format
|
||||||
|
*/
|
||||||
|
getListArticles(categorie, returnFormat){
|
||||||
|
var db = new dbConnector();
|
||||||
|
return db.get({
|
||||||
|
"select" : {
|
||||||
|
"articles" : [
|
||||||
|
"id",
|
||||||
|
"title",
|
||||||
|
"slug",
|
||||||
|
"author",
|
||||||
|
"date",
|
||||||
|
"img",
|
||||||
|
"categorie_id"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"condition" : {
|
||||||
|
"categorie_id" : categorie.getId()
|
||||||
|
},
|
||||||
|
"join" : ""
|
||||||
|
}).then((result) => {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
var data = JSON.parse(result);
|
||||||
|
for(var i in data){
|
||||||
|
categorie.setArticle(new Article(data[i].id,data[i].title, data[i].author, data[i].date, data[i].img, data[i].slug, data[i].categorie_id));
|
||||||
|
categorie.getArticles()[i].setCategorieName(categorie.getTitle());
|
||||||
|
}
|
||||||
|
switch(returnFormat){
|
||||||
|
case 'html':
|
||||||
|
resolve(this.listArticlesToHTML(categorie));
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
break;
|
||||||
|
case 'object':
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getHomeListArticles(returnFormat){
|
||||||
|
var db = new dbConnector();
|
||||||
|
return db.get({
|
||||||
|
"select" : {
|
||||||
|
"articles" : []
|
||||||
|
},
|
||||||
|
"condition" : "",
|
||||||
|
"join" : {
|
||||||
|
"left" : "categorie_id",
|
||||||
|
"right" : {
|
||||||
|
"db" : "categories",
|
||||||
|
"index" : "id"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).then((result) => {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
var data = JSON.parse(result);
|
||||||
|
//log.debug(data);
|
||||||
|
var categorie = new Categorie(0, "home", "/", "home");
|
||||||
|
for(var i in data){
|
||||||
|
categorie.setArticle(new Article(data[i].left.id,data[i].left.title, data[i].left.author, data[i].left.date, data[i].left.img, "/"+data[i].right.uri+"/"+data[i].left.slug, data[i].left.categorie_id));
|
||||||
|
categorie.getArticles()[i].setCategorieName(data[i].right.title);
|
||||||
|
}
|
||||||
|
switch(returnFormat){
|
||||||
|
case 'html':
|
||||||
|
resolve(this.listArticlesToHTML(categorie));
|
||||||
|
break;
|
||||||
|
case 'json':
|
||||||
|
break;
|
||||||
|
case 'object':
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {<Categorie>} categorie : object categorie
|
||||||
|
* @returns {<Promise>} a list of article in HTML format
|
||||||
|
*/
|
||||||
|
listArticlesToHTML(categorie){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fs.readFile('./views/articles/list.hbs', 'utf-8', (error, source) => {
|
||||||
|
hbs.registerHelper('articles', (articles) =>{
|
||||||
|
return articles;
|
||||||
|
});
|
||||||
|
var template = hbs.compile(source);
|
||||||
|
var html = template(categorie);
|
||||||
|
resolve(html);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {<Categorie>} categorie : object categorie
|
||||||
|
* @param {string} uri the uri of article
|
||||||
|
* @returns {<Promise>} a compiled article in HTML
|
||||||
|
*/
|
||||||
|
getArticle(categorie, uri){
|
||||||
|
var db = new dbConnector();
|
||||||
|
return db.get({
|
||||||
|
"select" : {
|
||||||
|
"articles" : [
|
||||||
|
"id",
|
||||||
|
"title",
|
||||||
|
"slug",
|
||||||
|
"author",
|
||||||
|
"date",
|
||||||
|
"img",
|
||||||
|
"categorie_id",
|
||||||
|
"content"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"condition" : {
|
||||||
|
"categorie_id" : categorie.getId(),
|
||||||
|
"slug" : uri
|
||||||
|
},
|
||||||
|
"join" : ""
|
||||||
|
}).then((result) => {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
var data = JSON.parse(result);
|
||||||
|
categorie.setArticle(new Article(data[0].id,data[0].title, data[0].author, data[0].date, data[0].img, data[0].slug, data[0].categorie_id, data[0].content));
|
||||||
|
fs.readFile('./views/articles/article.hbs', 'utf-8', (error, source) => {
|
||||||
|
if(error){
|
||||||
|
log.error(error);
|
||||||
|
}
|
||||||
|
hbs.registerHelper('displayArticle', (article) =>{
|
||||||
|
return article;
|
||||||
|
});
|
||||||
|
var template = hbs.compile(source);
|
||||||
|
var html = template(categorie.getArticles());
|
||||||
|
resolve(html);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Categories;
|
|
@ -0,0 +1,61 @@
|
||||||
|
const crypto = require('crypto'),
|
||||||
|
moment = require("moment"),
|
||||||
|
jwt = require('jsonwebtoken'),
|
||||||
|
log = require('color-logs')(true, true, "JWTHandler.class.js");
|
||||||
|
moment.locale("fr");
|
||||||
|
|
||||||
|
class JWTHandler {
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.secret = crypto.createHash('sha256').update("La vie sans gâteau c'est possible, mais c'est sans intérêt", "UTF-8").digest("base64");
|
||||||
|
log.debug(this.secret);
|
||||||
|
}
|
||||||
|
|
||||||
|
verify(token, secret, cb){
|
||||||
|
jwt.verify(token, secret, {
|
||||||
|
issuer: "Nodezzarella",
|
||||||
|
clockTolerance: 3
|
||||||
|
}, function(err, decoded) {
|
||||||
|
if (err) {
|
||||||
|
cb(err, null);
|
||||||
|
} else {
|
||||||
|
cb(false, decoded);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
sign(payload, cb){
|
||||||
|
let baseObject = {
|
||||||
|
iat: moment().unix(),
|
||||||
|
exp: moment().add(1, "day").unix(),
|
||||||
|
iss: "Orbital-Blaze"
|
||||||
|
};
|
||||||
|
jwt.sign(Object.assign(baseObject, payload), this.secret, {
|
||||||
|
algorithm: 'HS256'
|
||||||
|
}, function(err, token) {
|
||||||
|
if (err) throw err;
|
||||||
|
cb(token);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protect(req, res, next){
|
||||||
|
var that = this;
|
||||||
|
return function (req, res, next){
|
||||||
|
that.verify(req.header("Authorization"), that.secret, function(err, decoded){
|
||||||
|
if (err) {
|
||||||
|
res.status(403).json({
|
||||||
|
status: 403,
|
||||||
|
message: "Token expired",
|
||||||
|
expDate: moment(err.expiredAt).unix()
|
||||||
|
});
|
||||||
|
}else{
|
||||||
|
req.token = decoded;
|
||||||
|
next();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = JWTHandler;
|
|
@ -20,7 +20,9 @@ class Template {
|
||||||
* @returns {Promise} the navbar in html compiled
|
* @returns {Promise} the navbar in html compiled
|
||||||
*/
|
*/
|
||||||
|
|
||||||
getNav(){
|
|
||||||
|
|
||||||
|
/*getNav(){
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
fs.readFile('./views/_nav.hbs', 'utf-8', (error, source) => {
|
fs.readFile('./views/_nav.hbs', 'utf-8', (error, source) => {
|
||||||
const articles = require("../ressources/categories.json");
|
const articles = require("../ressources/categories.json");
|
||||||
|
@ -34,9 +36,10 @@ class Template {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
getToot(){
|
getToot(){
|
||||||
|
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
{
|
{
|
||||||
"appPort": "8888",
|
"appPort": "8888",
|
||||||
"blogName": "Dryusdan",
|
"siteTitle": "Dryusdan",
|
||||||
"homeTitle": "Dryusdan.fr, blog d'un passionné d'informatique"
|
"siteHomeTitle": "Dryusdan.fr, blog d'un passionné d'informatique",
|
||||||
|
"db": "rethinkdb",
|
||||||
|
"webroot" : "/",
|
||||||
|
"login": "root",
|
||||||
|
"password": "root"
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"select": {
|
||||||
|
"table" : [
|
||||||
|
"field1",
|
||||||
|
"field2"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"join" : {
|
||||||
|
"left" : "field_to_index",
|
||||||
|
"right" : {
|
||||||
|
"db" : "tableName",
|
||||||
|
"index" : "field_to_index"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"condition" : {
|
||||||
|
"field1" : "equal",
|
||||||
|
"field2" : "equal"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"flatFile": true
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
class jsonFileDB{
|
||||||
|
|
||||||
|
get(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
post(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
update(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
remove(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = jsonFileDB;
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"flatFile": false,
|
||||||
|
"host":"172.20.1.2",
|
||||||
|
"port":"28015",
|
||||||
|
"username":"",
|
||||||
|
"password":"",
|
||||||
|
"dbName":"nodezzarella"
|
||||||
|
}
|
|
@ -0,0 +1,113 @@
|
||||||
|
const r = require("rethinkdb"),
|
||||||
|
promise = require('promise'),
|
||||||
|
fs = require('fs'),
|
||||||
|
log = require("color-logs")(true, true, "RethinDB connector");
|
||||||
|
|
||||||
|
class rethinkdb{
|
||||||
|
|
||||||
|
static constructor(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
get(query){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* select table
|
||||||
|
*/
|
||||||
|
var formatedQuery = r.table(Object.keys(query.select)[0]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* create join
|
||||||
|
*/
|
||||||
|
if(typeof query.join === "object"){
|
||||||
|
formatedQuery = formatedQuery.eqJoin(query.join.left, r.db(dbConf.dbName).table(query.join.right.db))
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* form filter / condition of qyert
|
||||||
|
*/
|
||||||
|
if(query.condition !== ""){
|
||||||
|
formatedQuery = formatedQuery.filter(query.condition);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* select collumn of table
|
||||||
|
*/
|
||||||
|
for (var collumn in query.select){
|
||||||
|
if(query.select.hasOwnProperty(collumn)){
|
||||||
|
var selectCollumn = query.select[collumn];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// r.db("nodezzarella").table("articles").eqJoin("categorie_id", r.db("nodezzarella").table("categories")).pluck({"left":["id"]})
|
||||||
|
|
||||||
|
if(selectCollumn.length > 0){
|
||||||
|
formatedQuery = formatedQuery.pluck(selectCollumn);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* run query
|
||||||
|
*/
|
||||||
|
//log.debug(formatedQuery);
|
||||||
|
|
||||||
|
formatedQuery.run(dbConnexion).then((cursor) => {
|
||||||
|
return cursor.toArray();
|
||||||
|
}).then((result) => {
|
||||||
|
resolve(JSON.stringify(result));
|
||||||
|
}).catch((err)=>{
|
||||||
|
throw err;
|
||||||
|
log.error(err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
post(){
|
||||||
|
/*r.db("nodezzarella").table("categories").insert([{
|
||||||
|
"title": "global test",
|
||||||
|
"uri":"global-test",
|
||||||
|
"description":"desc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "test",
|
||||||
|
"uri":"test",
|
||||||
|
"description":"desc2"
|
||||||
|
}])*/
|
||||||
|
//https://www.rethinkdb.com/api/javascript/insert/
|
||||||
|
}
|
||||||
|
|
||||||
|
update(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
remove(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
getDBConfig(){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fs.access("./config.json", fs.constants.F_OK || fs.constants.R_OK, (error) => {
|
||||||
|
if(error){
|
||||||
|
reject(new Error("File not exist"));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
resolve(require("./config.json"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
connectDB(config){
|
||||||
|
this.host = config.host;
|
||||||
|
this.port = config.port;
|
||||||
|
this.dbName = config.dbName;
|
||||||
|
log.info("Application connecting to database...");
|
||||||
|
return r.connect({
|
||||||
|
host: config.host,
|
||||||
|
port: config.port,
|
||||||
|
db: config.dbName
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = rethinkdb;
|
|
@ -0,0 +1,89 @@
|
||||||
|
const express = require("express"),
|
||||||
|
router = express.Router(),
|
||||||
|
promise = require('promise'),
|
||||||
|
hbs = require('hbs'),
|
||||||
|
path = require('path'),
|
||||||
|
log = require("color-logs")(true, true, "Router"),
|
||||||
|
session = require('express-session'),
|
||||||
|
Template = require('../classes/Template.class.js'),
|
||||||
|
Article = require('../classes/Article.class.js'),
|
||||||
|
Categorie = require('../classes/Categorie.class.js'),
|
||||||
|
Articles = require('../classes/Controllers/Articles.class.js'),
|
||||||
|
Categories = require('../classes/Controllers/Categories.class.js');
|
||||||
|
|
||||||
|
var template = new Template();
|
||||||
|
router.get("/", function(req, res){
|
||||||
|
var categories = new Categories();
|
||||||
|
Promise.all([
|
||||||
|
categories.getNav(),
|
||||||
|
categories.getHomeListArticles("html")
|
||||||
|
]).then((data) => {
|
||||||
|
var nav = data[0];
|
||||||
|
var content = data[1];
|
||||||
|
res.setHeader("Content-type", "text/html");
|
||||||
|
var tplData = {
|
||||||
|
"blogName": config.siteTitle,
|
||||||
|
"title": config.siteHomeTitle,
|
||||||
|
"nav": nav,
|
||||||
|
"content": content,
|
||||||
|
};
|
||||||
|
res.render('template.hbs', tplData);
|
||||||
|
}).catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
throw err;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/:uri/", function(req, res){
|
||||||
|
var categories = new Categories();
|
||||||
|
Promise.all([
|
||||||
|
categories.getNav(),
|
||||||
|
categories.getCategorie(req.params.uri),
|
||||||
|
]).then(data => {
|
||||||
|
var nav = data[0];
|
||||||
|
var categorie = data[1];
|
||||||
|
categories.getListArticles(categorie, "html").then((result) => {
|
||||||
|
res.setHeader("Content-type", "text/html");
|
||||||
|
var tplData = {
|
||||||
|
"blogName": config.siteTitle,
|
||||||
|
"title": categorie.getTitle() + " - "+config.siteHomeTitle,
|
||||||
|
"nav": nav,
|
||||||
|
"content": result,
|
||||||
|
};
|
||||||
|
res.render('template.hbs', tplData);
|
||||||
|
})
|
||||||
|
}).catch(err => {
|
||||||
|
res.setHeader("Content-type", "text/plain");
|
||||||
|
res.end("erreur");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/:categories/:slug", function(req, res){
|
||||||
|
var categories = new Categories();
|
||||||
|
var articles = new Articles();
|
||||||
|
Promise.all([
|
||||||
|
categories.getNav(),
|
||||||
|
categories.getCategorie(req.params.categories)
|
||||||
|
]).then(data => {
|
||||||
|
var nav = data[0];
|
||||||
|
var categorie = data[1];
|
||||||
|
categories.getArticle(categorie, req.params.slug).then((result) => {
|
||||||
|
res.setHeader("Content-type", "text/html");
|
||||||
|
var tplData = {
|
||||||
|
"blogName": config.siteTitle,
|
||||||
|
"title": categorie.getTitle() + " - "+config.siteHomeTitle,
|
||||||
|
"nav": nav,
|
||||||
|
"content": result,
|
||||||
|
};
|
||||||
|
res.render('template.hbs', tplData);
|
||||||
|
})
|
||||||
|
}).catch(err => {
|
||||||
|
log.debug(err);
|
||||||
|
res.setHeader("Content-type", "text/plain");
|
||||||
|
res.end("erreur");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
router.use(express.static("./public"));
|
||||||
|
|
||||||
|
module.exports = router;
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"name": "nodezzarela",
|
"name": "nodezzarella",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -33,11 +33,53 @@
|
||||||
"version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
"version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
||||||
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
|
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
|
||||||
},
|
},
|
||||||
|
"base64url": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs="
|
||||||
|
},
|
||||||
|
"bluebird": {
|
||||||
|
"version": "2.11.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz",
|
||||||
|
"integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE="
|
||||||
|
},
|
||||||
|
"body-parser": {
|
||||||
|
"version": "1.17.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz",
|
||||||
|
"integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=",
|
||||||
|
"dependencies": {
|
||||||
|
"debug": {
|
||||||
|
"version": "2.6.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
|
||||||
|
"integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4="
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"buffer-equal-constant-time": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
|
||||||
|
},
|
||||||
|
"bytes": {
|
||||||
|
"version": "2.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
|
||||||
|
"integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk="
|
||||||
|
},
|
||||||
"camelcase": {
|
"camelcase": {
|
||||||
"version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
|
"version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
|
||||||
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
|
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"camelize": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
|
||||||
|
},
|
||||||
"center-align": {
|
"center-align": {
|
||||||
"version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
|
"version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
|
||||||
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
|
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
|
||||||
|
@ -63,10 +105,37 @@
|
||||||
"version": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
|
"version": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
|
||||||
"integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
|
"integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
|
||||||
},
|
},
|
||||||
|
"connect": {
|
||||||
|
"version": "3.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/connect/-/connect-3.6.2.tgz",
|
||||||
|
"integrity": "sha1-aU6NIGgb/kkCgsiriGvpjwn0L+c=",
|
||||||
|
"dependencies": {
|
||||||
|
"debug": {
|
||||||
|
"version": "2.6.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
|
||||||
|
"integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4="
|
||||||
|
},
|
||||||
|
"finalhandler": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz",
|
||||||
|
"integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk="
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"content-disposition": {
|
"content-disposition": {
|
||||||
"version": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
|
"version": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
|
||||||
"integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
|
"integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
|
||||||
},
|
},
|
||||||
|
"content-security-policy-builder": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-1.1.0.tgz",
|
||||||
|
"integrity": "sha1-2R8bB2I2wRmFDH3umSS/VeBXcrM="
|
||||||
|
},
|
||||||
"content-type": {
|
"content-type": {
|
||||||
"version": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz",
|
"version": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz",
|
||||||
"integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0="
|
"integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0="
|
||||||
|
@ -75,14 +144,39 @@
|
||||||
"version": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
|
"version": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
|
||||||
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
|
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
|
||||||
},
|
},
|
||||||
|
"cookie-parser": {
|
||||||
|
"version": "1.4.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz",
|
||||||
|
"integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU="
|
||||||
|
},
|
||||||
"cookie-signature": {
|
"cookie-signature": {
|
||||||
"version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
"version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||||
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
|
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
|
||||||
},
|
},
|
||||||
|
"core-util-is": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||||
|
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
||||||
|
},
|
||||||
"cors": {
|
"cors": {
|
||||||
"version": "https://registry.npmjs.org/cors/-/cors-2.8.1.tgz",
|
"version": "https://registry.npmjs.org/cors/-/cors-2.8.1.tgz",
|
||||||
"integrity": "sha1-YYGqVqu0WiglvjMEcDdHrk6dI4M="
|
"integrity": "sha1-YYGqVqu0WiglvjMEcDdHrk6dI4M="
|
||||||
},
|
},
|
||||||
|
"crc": {
|
||||||
|
"version": "3.4.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz",
|
||||||
|
"integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms="
|
||||||
|
},
|
||||||
|
"dasherize": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg="
|
||||||
|
},
|
||||||
|
"dashify": {
|
||||||
|
"version": "0.2.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/dashify/-/dashify-0.2.2.tgz",
|
||||||
|
"integrity": "sha1-agdBWgHJH69KMuONnfunH2HLIP4="
|
||||||
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
"version": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz",
|
"version": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz",
|
||||||
"integrity": "sha1-eYVQkLosTjEVzH2HaUkdWPBJE1E="
|
"integrity": "sha1-eYVQkLosTjEVzH2HaUkdWPBJE1E="
|
||||||
|
@ -100,6 +194,21 @@
|
||||||
"version": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
|
"version": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
|
||||||
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
|
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
|
||||||
},
|
},
|
||||||
|
"dns-prefetch-control": {
|
||||||
|
"version": "0.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz",
|
||||||
|
"integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI="
|
||||||
|
},
|
||||||
|
"dont-sniff-mimetype": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g="
|
||||||
|
},
|
||||||
|
"ecdsa-sig-formatter": {
|
||||||
|
"version": "1.0.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
|
||||||
|
"integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE="
|
||||||
|
},
|
||||||
"ee-first": {
|
"ee-first": {
|
||||||
"version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
"version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||||
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
||||||
|
@ -116,10 +225,42 @@
|
||||||
"version": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz",
|
"version": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz",
|
||||||
"integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE="
|
"integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE="
|
||||||
},
|
},
|
||||||
|
"expect-ct": {
|
||||||
|
"version": "0.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.0.tgz",
|
||||||
|
"integrity": "sha1-UnNWeN4YUwiQ2Ne5XwrGNkCVgJQ="
|
||||||
|
},
|
||||||
"express": {
|
"express": {
|
||||||
"version": "https://registry.npmjs.org/express/-/express-4.15.2.tgz",
|
"version": "https://registry.npmjs.org/express/-/express-4.15.2.tgz",
|
||||||
"integrity": "sha1-rxB/wUhQRFfy3Kmm8lcdcSm5ezU="
|
"integrity": "sha1-rxB/wUhQRFfy3Kmm8lcdcSm5ezU="
|
||||||
},
|
},
|
||||||
|
"express-jwt": {
|
||||||
|
"version": "5.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.0.tgz",
|
||||||
|
"integrity": "sha1-PZDNZYAuYzYlLxnmo98+FJ4MXqA="
|
||||||
|
},
|
||||||
|
"express-session": {
|
||||||
|
"version": "1.15.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.4.tgz",
|
||||||
|
"integrity": "sha1-Xizc9t7+PB7aTpgPE7mGzFjPuVQ=",
|
||||||
|
"dependencies": {
|
||||||
|
"debug": {
|
||||||
|
"version": "2.6.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
|
||||||
|
"integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw="
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"express-unless": {
|
||||||
|
"version": "0.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.0.tgz",
|
||||||
|
"integrity": "sha1-XHlec5JXFRLdKPUgs4V6UrISYaI="
|
||||||
|
},
|
||||||
"finalhandler": {
|
"finalhandler": {
|
||||||
"version": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.1.tgz",
|
"version": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.1.tgz",
|
||||||
"integrity": "sha1-vNFdFonA5e1ym29/VBpt+YQRfbg=",
|
"integrity": "sha1-vNFdFonA5e1ym29/VBpt+YQRfbg=",
|
||||||
|
@ -138,6 +279,11 @@
|
||||||
"version": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz",
|
"version": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz",
|
||||||
"integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M="
|
"integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M="
|
||||||
},
|
},
|
||||||
|
"frameguard": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz",
|
||||||
|
"integrity": "sha1-e8rUae57lukdEs6zlZx4I1qScuk="
|
||||||
|
},
|
||||||
"fresh": {
|
"fresh": {
|
||||||
"version": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz",
|
"version": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz",
|
||||||
"integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44="
|
"integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44="
|
||||||
|
@ -156,10 +302,50 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"helmet": {
|
||||||
|
"version": "3.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/helmet/-/helmet-3.6.1.tgz",
|
||||||
|
"integrity": "sha1-kfOqf6TJRnFZX7Vo39jChImjiL4="
|
||||||
|
},
|
||||||
|
"helmet-csp": {
|
||||||
|
"version": "2.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.4.0.tgz",
|
||||||
|
"integrity": "sha1-flOhVxZ6BkWq3XF30SrmxgXBhC4="
|
||||||
|
},
|
||||||
|
"hide-powered-by": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys="
|
||||||
|
},
|
||||||
|
"hoek": {
|
||||||
|
"version": "2.16.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
|
||||||
|
"integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
|
||||||
|
},
|
||||||
|
"hpkp": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI="
|
||||||
|
},
|
||||||
|
"hsts": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/hsts/-/hsts-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-pSI0xgcN7PIUsra3C7FE0H5Hdsc="
|
||||||
|
},
|
||||||
"http-errors": {
|
"http-errors": {
|
||||||
"version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz",
|
"version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz",
|
||||||
"integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc="
|
"integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc="
|
||||||
},
|
},
|
||||||
|
"iconv-lite": {
|
||||||
|
"version": "0.4.15",
|
||||||
|
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
|
||||||
|
"integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es="
|
||||||
|
},
|
||||||
|
"ienoopen": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms="
|
||||||
|
},
|
||||||
"inherits": {
|
"inherits": {
|
||||||
"version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
"version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||||
|
@ -172,6 +358,38 @@
|
||||||
"version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
|
"version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
|
||||||
"integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw="
|
"integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw="
|
||||||
},
|
},
|
||||||
|
"isemail": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
|
||||||
|
"integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo="
|
||||||
|
},
|
||||||
|
"joi": {
|
||||||
|
"version": "6.10.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
|
||||||
|
"integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY="
|
||||||
|
},
|
||||||
|
"jsonwebtoken": {
|
||||||
|
"version": "7.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz",
|
||||||
|
"integrity": "sha1-fKMk9SFfi+A5zTWmxFu4y3SkSPs=",
|
||||||
|
"dependencies": {
|
||||||
|
"ms": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"jwa": {
|
||||||
|
"version": "1.1.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
|
||||||
|
"integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU="
|
||||||
|
},
|
||||||
|
"jws": {
|
||||||
|
"version": "3.1.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
|
||||||
|
"integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI="
|
||||||
|
},
|
||||||
"kind-of": {
|
"kind-of": {
|
||||||
"version": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz",
|
"version": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz",
|
||||||
"integrity": "sha1-R11pil5J/15T0U4+cyQp3Iv0z0c="
|
"integrity": "sha1-R11pil5J/15T0U4+cyQp3Iv0z0c="
|
||||||
|
@ -181,6 +399,21 @@
|
||||||
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
|
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"lodash.once": {
|
||||||
|
"version": "4.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
|
||||||
|
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
|
||||||
|
},
|
||||||
|
"lodash.reduce": {
|
||||||
|
"version": "4.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz",
|
||||||
|
"integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs="
|
||||||
|
},
|
||||||
|
"lodash.set": {
|
||||||
|
"version": "4.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
|
||||||
|
"integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
|
||||||
|
},
|
||||||
"longest": {
|
"longest": {
|
||||||
"version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
"version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
||||||
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
|
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
|
||||||
|
@ -218,6 +451,11 @@
|
||||||
"version": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
"version": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
||||||
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
|
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
|
||||||
},
|
},
|
||||||
|
"moment": {
|
||||||
|
"version": "2.18.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
|
||||||
|
"integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8="
|
||||||
|
},
|
||||||
"ms": {
|
"ms": {
|
||||||
"version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
|
"version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
|
||||||
"integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
|
"integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
|
||||||
|
@ -226,6 +464,11 @@
|
||||||
"version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
|
"version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
|
||||||
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
|
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
|
||||||
},
|
},
|
||||||
|
"nocache": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA="
|
||||||
|
},
|
||||||
"nopt": {
|
"nopt": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz",
|
||||||
|
@ -235,6 +478,11 @@
|
||||||
"version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
|
"version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
|
||||||
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc="
|
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc="
|
||||||
},
|
},
|
||||||
|
"on-headers": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
|
||||||
|
},
|
||||||
"optimist": {
|
"optimist": {
|
||||||
"version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
"version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
||||||
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY="
|
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY="
|
||||||
|
@ -247,6 +495,11 @@
|
||||||
"version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
"version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||||
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
|
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
|
||||||
},
|
},
|
||||||
|
"platform": {
|
||||||
|
"version": "1.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/platform/-/platform-1.3.3.tgz",
|
||||||
|
"integrity": "sha1-ZGx3ARiZhwtqCQPnXpl+jlHadGE="
|
||||||
|
},
|
||||||
"promise": {
|
"promise": {
|
||||||
"version": "8.0.0",
|
"version": "8.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/promise/-/promise-8.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/promise/-/promise-8.0.0.tgz",
|
||||||
|
@ -260,19 +513,44 @@
|
||||||
"version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
|
"version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
|
||||||
"integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM="
|
"integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM="
|
||||||
},
|
},
|
||||||
|
"random-bytes": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
|
||||||
|
},
|
||||||
"range-parser": {
|
"range-parser": {
|
||||||
"version": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
|
"version": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
|
||||||
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
|
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
|
||||||
},
|
},
|
||||||
|
"raw-body": {
|
||||||
|
"version": "2.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz",
|
||||||
|
"integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y="
|
||||||
|
},
|
||||||
|
"referrer-policy": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz",
|
||||||
|
"integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk="
|
||||||
|
},
|
||||||
"repeat-string": {
|
"repeat-string": {
|
||||||
"version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
|
"version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
|
||||||
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
|
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
|
||||||
},
|
},
|
||||||
|
"rethinkdb": {
|
||||||
|
"version": "2.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/rethinkdb/-/rethinkdb-2.3.3.tgz",
|
||||||
|
"integrity": "sha1-PcZYbiL6HavuDSVOZL0ON5+tL3I="
|
||||||
|
},
|
||||||
"right-align": {
|
"right-align": {
|
||||||
"version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
|
"version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
|
||||||
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
|
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"safe-buffer": {
|
||||||
|
"version": "5.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
|
||||||
|
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
|
||||||
|
},
|
||||||
"send": {
|
"send": {
|
||||||
"version": "https://registry.npmjs.org/send/-/send-0.15.1.tgz",
|
"version": "https://registry.npmjs.org/send/-/send-0.15.1.tgz",
|
||||||
"integrity": "sha1-igI1TCbm9cynAAZfXwzeupDse18="
|
"integrity": "sha1-igI1TCbm9cynAAZfXwzeupDse18="
|
||||||
|
@ -293,6 +571,11 @@
|
||||||
"version": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
|
"version": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
|
||||||
"integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
|
"integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
|
||||||
},
|
},
|
||||||
|
"topo": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
|
||||||
|
"integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU="
|
||||||
|
},
|
||||||
"type-is": {
|
"type-is": {
|
||||||
"version": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
|
"version": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
|
||||||
"integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA="
|
"integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA="
|
||||||
|
@ -314,6 +597,11 @@
|
||||||
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
|
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"uid-safe": {
|
||||||
|
"version": "2.1.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz",
|
||||||
|
"integrity": "sha1-Otbzg2jG1MjHXsF2I/t5qh0HHYE="
|
||||||
|
},
|
||||||
"unpipe": {
|
"unpipe": {
|
||||||
"version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
"version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
||||||
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
|
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
|
||||||
|
@ -339,6 +627,16 @@
|
||||||
"version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
"version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
||||||
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
|
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
|
||||||
},
|
},
|
||||||
|
"x-xss-protection": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-iYr7k4abJGYc+cUvnujbjtB2Tdk="
|
||||||
|
},
|
||||||
|
"xtend": {
|
||||||
|
"version": "4.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
|
||||||
|
"integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
|
||||||
|
},
|
||||||
"yargs": {
|
"yargs": {
|
||||||
"version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
|
"version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
|
||||||
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
|
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"name": "nodezzarela",
|
"name": "nodezzarella",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"util",
|
"util",
|
||||||
|
@ -15,12 +15,17 @@
|
||||||
},
|
},
|
||||||
"contributors": [],
|
"contributors": [],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"body-parser": "^1.17.2",
|
||||||
"color-logs": "0.6.1",
|
"color-logs": "0.6.1",
|
||||||
|
"cookie-parser": "^1.4.3",
|
||||||
"cors": "2.8.1",
|
"cors": "2.8.1",
|
||||||
"express": "4.15.2",
|
"express": "4.15.2",
|
||||||
|
"express-session": "^1.15.4",
|
||||||
"handlebars": "4.0.6",
|
"handlebars": "4.0.6",
|
||||||
"hbs": "4.0.1",
|
"hbs": "4.0.1",
|
||||||
|
"helmet": "^3.6.1",
|
||||||
"markdown": "^0.5.0",
|
"markdown": "^0.5.0",
|
||||||
"promise": "^8.0.0"
|
"promise": "^8.0.0",
|
||||||
|
"rethinkdb": "^2.3.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<nav>
|
<nav>
|
||||||
|
|
||||||
{{#listNav data}}<div class="navItem"><a href="{{slug}}">{{title}}</a></div>{{/listNav}}
|
{{#listNav data}}<div class="navItem"><a href="/{{uri}}/">{{title}}</a></div>{{/listNav}}
|
||||||
<!--<div class="navItem"><a href="index.html">Accueil</a></div>
|
<!--<div class="navItem"><a href="index.html">Accueil</a></div>
|
||||||
<div class="navItem"><a href="portfolio.html">Portfolio</a></div>
|
<div class="navItem"><a href="portfolio.html">Portfolio</a></div>
|
||||||
<div class="navItem">Contact</div>-->
|
<div class="navItem">Contact</div>-->
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
<div id="disclaimer">
|
||||||
|
<h2>Espace admin</h2>
|
||||||
|
<img class="separator" src="/assets/img/separator.png">
|
||||||
|
</div>
|
||||||
|
<main class="transparent">
|
||||||
|
<section>
|
||||||
|
<article>
|
||||||
|
<!-- <div class="articleTitle">
|
||||||
|
<h1></h1>
|
||||||
|
<p class="author">Par </p>
|
||||||
|
</div>-->
|
||||||
|
<div class="content">
|
||||||
|
<form action="" method="post">
|
||||||
|
<input type="input" name="login">
|
||||||
|
<input type="password" name="password">
|
||||||
|
<input type="submit" name="connexion">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
</main>
|
|
@ -1,18 +1,20 @@
|
||||||
<main>
|
{{#article data}}
|
||||||
<section>
|
<main>
|
||||||
<nav>
|
<section>
|
||||||
<button class="prev"><!--<img src="/assets/img/prev.png">Précédent--></button>
|
<nav>
|
||||||
<img class="blackAsset separator" src="/assets/img/separator.png">
|
<button class="prev"><!--<img src="/assets/img/prev.png">Précédent--></button>
|
||||||
<button class="next"><!--Suivant<img src="/assets/img/next.png">--></button>
|
<img class="blackAsset separator" src="/assets/img/separator.png">
|
||||||
</nav>
|
<button class="next"><!--Suivant<img src="/assets/img/next.png">--></button>
|
||||||
<article>
|
</nav>
|
||||||
<div class="articleTitle">
|
<article>
|
||||||
<h1>{{title}}</h1>
|
<div class="articleTitle">
|
||||||
<p class="author">Par {{author}}</p>
|
<h1>{{title}}</h1>
|
||||||
</div>
|
<p class="author">Par {{author}}</p>
|
||||||
<div class="content">
|
</div>
|
||||||
{{{content}}}
|
<div class="content">
|
||||||
</div>
|
{{{content}}}
|
||||||
</article>
|
</div>
|
||||||
</section>
|
</article>
|
||||||
</main>
|
</section>
|
||||||
|
</main>
|
||||||
|
{{/article}}
|
|
@ -1,8 +0,0 @@
|
||||||
<div id="disclaimer">
|
|
||||||
<div class="titleLegend">{{categorie}}</div>
|
|
||||||
<img class="separator" src="assets/img/separator.png">
|
|
||||||
<h2>{{title}}</h2>
|
|
||||||
<a href="{{slug}}">
|
|
||||||
<button>Consulter</button>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
|
@ -1,3 +1,13 @@
|
||||||
|
{{#disclamer article}}
|
||||||
|
<div id="disclaimer">
|
||||||
|
<div class="titleLegend">{{categorieName}}</div>
|
||||||
|
<img class="separator" src="/assets/img/separator.png">
|
||||||
|
<h2>{{title}}</h2>
|
||||||
|
<a href="{{slug}}">
|
||||||
|
<button>Consulter</button>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{{/disclamer}}
|
||||||
<main class="transparent">
|
<main class="transparent">
|
||||||
<section>
|
<section>
|
||||||
<div class="flexgrid">
|
<div class="flexgrid">
|
||||||
|
@ -10,7 +20,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="tileLegend">
|
<div class="tileLegend">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="titleLegend">{{categorie}}</div>
|
<div class="titleLegend">{{categorieName}}</div>
|
||||||
<img class="blackAsset separator" src="/assets/img/separator.png">
|
<img class="blackAsset separator" src="/assets/img/separator.png">
|
||||||
<h2>{{title}}</h2>
|
<h2>{{title}}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>{{title}}</title>
|
<title>{{title}}</title>
|
||||||
<link rel="stylesheet" href="/assets/css/global.css">
|
<link rel="stylesheet" href="/assets/css/global.css">
|
||||||
|
<link href='https://miaou.drycat.fr/favicon.ico' rel='icon' type='image/x-icon'>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
|
@ -16,7 +17,6 @@
|
||||||
<button> </button>
|
<button> </button>
|
||||||
</div>
|
</div>
|
||||||
</div>-->
|
</div>-->
|
||||||
{{{disclaimer}}}
|
|
||||||
{{{content}}}
|
{{{content}}}
|
||||||
<footer>
|
<footer>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Administration è {{title}}</title>
|
||||||
|
<link rel="stylesheet" href="/assets/css/global.css">
|
||||||
|
<link href='https://miaou.drycat.fr/favicon.ico' rel='icon' type='image/x-icon'>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div id="logo"><a href="/">{{blogName}}</a></div>
|
||||||
|
{{{nav}}}
|
||||||
|
</header>
|
||||||
|
<!--<div class="search">
|
||||||
|
<div class="inputContainer">
|
||||||
|
<input type="search" placeholder="Rechercher...">
|
||||||
|
<button> </button>
|
||||||
|
</div>
|
||||||
|
</div>-->
|
||||||
|
{{{content}}}
|
||||||
|
<footer>
|
||||||
|
|
||||||
|
</footer>
|
||||||
|
<script src="/assets/js/jquery-2.2.0.min.js"></script>
|
||||||
|
<script src="/assets/js/parallax.js"></script>
|
||||||
|
<script src="/assets/js/searchInput.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
Reference in New Issue