summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildpages.js178
-rw-r--r--src/controller.js70
-rw-r--r--src/logger.js37
-rw-r--r--src/routes.js47
-rw-r--r--src/session.js31
-rw-r--r--src/sitemap.js32
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)}