diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/buildpages.js | 178 | ||||
| -rw-r--r-- | src/controller.js | 70 | ||||
| -rw-r--r-- | src/logger.js | 37 | ||||
| -rw-r--r-- | src/routes.js | 47 | ||||
| -rw-r--r-- | src/session.js | 31 | ||||
| -rw-r--r-- | src/sitemap.js | 32 |
6 files changed, 395 insertions, 0 deletions
diff --git a/src/buildpages.js b/src/buildpages.js new file mode 100644 index 0000000..89409ec --- /dev/null +++ b/src/buildpages.js @@ -0,0 +1,178 @@ +const fs = require('fs') +const path = require('path') +const logger = require('./logger')() +const template = require('../template/template') + +class BuildPages { + constructor(x) { + this.newTemplate = new Map() + this.template = template({baseURL: x.baseURL}) + this.pages = this.#GetAllPages() + + this.path = [] + this.pages.forEach((value, key) => { + this.path.push(key) + }) + this.routes = x.routes + + this.#AddTemplate({ + name: 'start', + template: ` + <!DOCTYPE html> + <html> + ` + }) + this.html = { + start: ` + <!DOCTYPE html> + <html> + `, + end: ` + </html> + ` + } + } + + GetSitemap() {return this.path} + + Build(pageData) { + if (this.routes.has(pageData.path)) { + } else if (this.pages.has(pageData.path)) { + const pages = this.pages.get(pageData.path) + const data = pages({ + req: '', + res: '', + next: '', + baseURL: pageData.baseURL + }) + + this.map = new Map() + for (let i = 0; i < data.page.length; i++) { + this.object = {} + this.object.data = data.page[i] + this.object.name = this.object.data.name + + if (pageData.path === '/') { + if (this.object.name === 'index') { + this.data = this.object.data() + this.output = { + html: this.data.html, + css: this.data.css, + js: this.data.js + } + this.output.js.push('loading.js') + + return this.output + } + } else { + this.data = this.object.data() + this.output = { + html: this.data.html, + css: this.data.css, + js: this.data.js + } + this.output.js.push('loading.js') + return this.output + } + } + } else { + // ! 404 Not Found + const notFound = this.template.NotFound() + //const css = notFound.css + + this.output = { + html: { + header: this.template.Header(), + main: notFound.html, + footer: this.template.Footer() + }, + css: [], + js: ['loading.js'] + } + + notFound.css.forEach(file => this.output.css.push(file)) + notFound.js.forEach(file => this.output.js.push(file)) + + return this.output + } + return false + } + + Template(pageData) { + const html = { + start: ` + <!DOCTYPE html> + <html> + `, + head: ` + <head> + <title>website</title> + <link rel="stylesheet" type="text/css" href="/css/loading.css"> + </head> + `, + headerStart: ` + <body> + <header> + `, + headerEnd: ` + </header> + `, + mainStart: ` + <main> + `, + mainEnd: ` + </main> + `, + footerStart: ` + <footer> + `, + footerEnd: ` + </footer> + <script src='/js/page-init.js'></script> + <script src='/js/forge.min.js'></script> + </body> + `, + end: ` + </html> + ` + } + + html.headerEnd = this.template.Loading() + html.headerEnd + + let fullHTML = '' + Object.entries(html).forEach(([key, value]) => { + fullHTML += value + }) + + return this.#RemoveSpaces(fullHTML) + } + + #AddTemplate() { + this.newTemplate.set() + } + #RemoveSpaces(html) {return html.replace(/(\n)\s+/g, '$1')} + #GetAllPages() { + const object = { + modulesDir: path.resolve(`${__dirname}/../pages`), + map: new Map() + } + object.files = fs.readdirSync(object.modulesDir).filter(file => file.endsWith('.js')) + + object.files.forEach(file => { + try { + const name = file.replace('.js', '') + const modulePath = path.join(object.modulesDir, file) + const moduleObject = require(modulePath) + this.path = '/' + if (name !== 'home') this.path = `/${name}` + if (!object.map.has(this.path)) object.map.set(this.path, moduleObject) + } catch (err) { + logger.Error(err) + } + }) + return object.map + } +} + +module.exports = (x) => {return new BuildPages(x)} + diff --git a/src/controller.js b/src/controller.js new file mode 100644 index 0000000..9d81baf --- /dev/null +++ b/src/controller.js @@ -0,0 +1,70 @@ +const buildPages = require('./buildpages') +// ! Maybe write a library to create html elements + +class Controller { + constructor(data) { + this.baseURL = data.baseURL + this.data = { + req: data.req, + res: data.res + } + this.buildPages = buildPages({ + baseURL: data.baseURL, + routes: new Map() + }) + } + + Init(data) { + const template = this.#GetTemplate(data) + return template + } + + #GetTemplate(data) { + const query = new Map() + Object.entries(data.req.query).forEach(([key, value]) => { + query.set(key, value) + }) + + const object = {} + + if (query.size > 0) { + object.req = data.req + object.res = data.res + object.path = data.path + object.query = query + object.baseURL = data.baseURL + + const output = JSON.stringify(this.buildPages.Build(object)) + return output + } else { + object.req = data.req + object.res = data.res + object.path = data.path + object.query = null + object.baseURL = data.baseURL + + return this.buildPages.Template(object) + } + } + #GetRoutes() { + // ! Check if output is a `Map()` + const moduleObject = require(path.resolve(`${__dirname}/../config/routes`)) + return moduleObject + /* + fs.readdirSync(path.resolve(`${__dirname}`)) + + const object = { + modulesDir: path.resolve(`${__dirname}/../routes`), + map: new Map() + } + object.files = fs.readdirSync(object.modulesDir).filter(file => file.endsWith('.js')) + const routes = new Map() + + + return + */ + } +} + +module.exports = (x) => {return new Controller(x)} + diff --git a/src/logger.js b/src/logger.js new file mode 100644 index 0000000..c636681 --- /dev/null +++ b/src/logger.js @@ -0,0 +1,37 @@ +const winston = require('winston') +const chalk = require('chalk') + +class Logger { + constructor(x) { + this.logger = winston.createLogger({ + level: 'info', + format: winston.format.json(), + defaultMeta: {service: 'user-service'}, + transports: [ + new winston.transports.File({filename: 'error.log', level: 'error'}), + new winston.transports.File({filename: 'combined.log'}) + ] + }) + //if (process.env.NODE_ENV !== 'prod') {this.logger.add(new winston.transports.Console({format: winston.format.simple()}))} + } + + Error(x) { + if (process.env.NODE_ENV !== 'prod') { + //console.error(chalk.red(x)) + console.error(x) + } else { + this.logger.error(x) + } + } + Info(x) { + if (process.env.NODE_ENV !== 'prod') { + //console.log(chalk.yellow(x)) + console.log(x) + } else { + this.logger.info(x) + } + } +} + +module.exports = (x) => {return new Logger(x)} + diff --git a/src/routes.js b/src/routes.js new file mode 100644 index 0000000..42d26c1 --- /dev/null +++ b/src/routes.js @@ -0,0 +1,47 @@ +const fs = require('fs') +const path = require('path') +const logger = require('./logger')() + +class Routes { + constructor(x) { + const object = { + routesDir: path.resolve(`${__dirname}/../routes`), + } + object.files = fs.readdirSync(object.routesDir).filter(file => file.endsWith('.js')) + + object.files.forEach(file => { + try { + console.log(file) + } catch (err) { + logger.Error(err) + } + }) + + this.app = x.app + this.routes = new Map() + + + } + + Route() {return new Map()} +} + +module.exports = (x) => { + const routes = new Routes({ + app: x.app + }) + + const createRoute = () => { + const temp = routes.CreateRoute({ + path: x.path, + req: req, + methods: x.methods + }) + + console.log(temp) + } + + return { + createRoute: createRoute + } +} diff --git a/src/session.js b/src/session.js new file mode 100644 index 0000000..7fec352 --- /dev/null +++ b/src/session.js @@ -0,0 +1,31 @@ +const sessions = new Map() + +class Session { + constructor() {} + + Create() { + const object = { + result: '', + characters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + } + + for (let i = 0; i < object.characters.length; i++) object.result += object.characters.charAt(Math.floor(Math.random() * object.characters.length)) + sessions.set(object.result, Date.now() + (1000 * 60 * 60)) + return object.result + } + Exists(x) { + if (sessions.has(x)) { + sessions.set(x, Date.now() + (1000 * 60 * 60)) + return true + } else { + return false + } + } + Expired() {sessions.forEach((value, key) => {if (Date.now() > value) sessions.delete(key)})} + GetSessions() { + return sessions + } +} + +module.exports = () => {return new Session()} + diff --git a/src/sitemap.js b/src/sitemap.js new file mode 100644 index 0000000..1c07f99 --- /dev/null +++ b/src/sitemap.js @@ -0,0 +1,32 @@ +const buildPages = require('./buildpages') +const { SitemapStream, streamToPromise } = require('sitemap') +const { Readable } = require('stream') + +class Sitemap { + constructor(data) { + this.baseURL = data.baseURL + this.buildPages = buildPages({baseURL: this.baseURL}) + this.pages = this.#GetSitemap() + } + + Sitemap() {return this.pages} + + #GetSitemap() { + const pages = this.buildPages.GetSitemap() + const object = { + links: [], + remove: ['/', '/blog'], + stream: new SitemapStream({hostname: this.baseURL}) + } + + for (let i = 0; i < pages.length; i++) { + // ! Default priority + object.links.push({url: this.baseURL + pages[i].replace('/', ''), changefreq: 'weekly', priority: 0.8}) + } + + return streamToPromise(Readable.from(object.links).pipe(object.stream)).then(data => {return data.toString()}) + //return output + } +} + +module.exports = (x) => {return new Sitemap(x)} |
