{1}\n',[e,t[r]]);n.innerHTML=l.trim()}}function c(n){return 0===n.length?[]:n.split(L)}function d(n){return(n.trim().match(L)||[]).length}function u(e){n.setTimeout(e,0)}function h(n,e){return n.replace(/\{(\d+)\}/g,function(n,t){return e[t]?e[t]:n})}var f="hljs-ln",g="hljs-ln-line",p="hljs-ln-code",v="hljs-ln-numbers",m="hljs-ln-n",j="data-line-number",L=/\r\n|\r|\n/g;n.hljs?(n.hljs.initLineNumbersOnLoad=r,n.hljs.lineNumbersBlock=i,t()):n.console.error("highlight.js not detected!")}(window,document);
\ No newline at end of file
diff --git a/server/uploads/paste.css b/server/uploads/paste.css
new file mode 100644
index 0000000..d4ce3ce
--- /dev/null
+++ b/server/uploads/paste.css
@@ -0,0 +1,20 @@
+::selection {
+ background: rgba(0, 0, 0, 0.46); /* WebKit/Blink Browsers */
+ }
+ ::-moz-selection {
+ background: rgba(0, 0, 0, 0.46); /* Gecko Browsers */
+ }
+
+ td.hljs-ln-numbers {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
+ text-align: center;
+ color: #414754;
+ vertical-align: top;
+ padding-right: 12px !important;
+}
\ No newline at end of file
diff --git a/server/uploads/sample.html b/server/uploads/sample.html
new file mode 100644
index 0000000..e875dc0
--- /dev/null
+++ b/server/uploads/sample.html
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+
+ using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+
+namespace Script
+{
+ public class ScriptVariable
+ {
+
+ public object Value { get; set; }
+
+ public ScriptTypes Type { get; set; }
+
+ public string Name { get; set; }
+
+ public ScriptVariable()
+ {
+ Value = null;
+ Type = ScriptTypes.Undefined;
+ }
+
+ public ScriptVariable(object value)
+ {
+ Value = value;
+ Type = value is string ? ScriptTypes.String
+ : value is int ? ScriptTypes.Integer
+ : value is double ? ScriptTypes.Double
+ : value is bool ? ScriptTypes.Boolean
+ : value is Regex ? ScriptTypes.Regex
+ : value is List ? ScriptTypes.ListString
+ : value is List ? ScriptTypes.ListInteger
+ : value is List ? ScriptTypes.ListDouble
+ : value is List ? ScriptTypes.ListBoolean
+ : ScriptTypes.Null;
+ }
+
+ public ScriptVariable(object value, ScriptTypes type)
+ {
+ Value = value;
+ Type = type;
+ }
+
+ public ScriptVariable(string name, object value)
+ {
+ Name = name;
+ Value = value;
+ Type = value is string ? ScriptTypes.String
+ : value is int ? ScriptTypes.Integer
+ : value is double ? ScriptTypes.Double
+ : value is bool ? ScriptTypes.Boolean
+ : value is Regex ? ScriptTypes.Regex
+ : value is List ? ScriptTypes.ListString
+ : value is List ? ScriptTypes.ListInteger
+ : value is List ? ScriptTypes.ListDouble
+ : value is List ? ScriptTypes.ListBoolean
+ : ScriptTypes.Null;
+ }
+
+ public ScriptVariable(string name, object value, ScriptTypes type)
+ {
+ Name = name;
+ Value = value;
+ Type = type;
+ }
+
+ public T Return()
+ {
+ var returnT = ScriptType.ToEnum(typeof(T));
+ switch (returnT)
+ {
+ case ScriptTypes.String:
+ case ScriptTypes.Integer:
+ case ScriptTypes.Double:
+ case ScriptTypes.Boolean:
+ case ScriptTypes.Regex:
+ return (T)this.Value;
+ case ScriptTypes.ListString:
+ return (T)(object)((List)this.Value).Select(x => x.Value.ToString()).ToList();
+ case ScriptTypes.ListInteger:
+ return (T)(object)((List)(this.Value)).Select(x => x).ToList();
+ case ScriptTypes.ListDouble:
+ return (T)(object)((List)(this.Value)).Select(x => x).ToList();
+ case ScriptTypes.ListBoolean:
+ return (T)(object)((List)(this.Value)).Select(x => x).ToList();
+ default:
+ return default(T);
+ }
+ }
+
+ public ScriptVariable Cast(Lexer lexer)
+ {
+ var outputType = ScriptType.ToEnum(typeof(ReturnT));
+ switch (outputType)
+ {
+ case ScriptTypes.String:
+ switch (this.Type)
+ {
+ case ScriptTypes.Integer:
+ case ScriptTypes.Double:
+ this.Value = this.Value.ToString();
+ break;
+ case ScriptTypes.Boolean:
+ this.Value = (bool)this.Value ? "true" : "false";
+ break;
+ case ScriptTypes.Null:
+ this.Value = "null";
+ break;
+ }
+ this.Type = ScriptTypes.String;
+ break;
+ case ScriptTypes.Integer:
+ switch (this.Type)
+ {
+ case ScriptTypes.String:
+ int tryInt = 0;
+ if (int.TryParse(this.Value.ToString(), out tryInt))
+ {
+ this.Value = tryInt;
+ }
+ else
+ {
+ goto castError;
+ }
+ break;
+ case ScriptTypes.Double:
+ double tryDouble = 0;
+ if (double.TryParse(this.Value.ToString(), out tryDouble))
+ {
+ this.Value = tryDouble;
+ }
+ else
+ {
+ goto castError;
+ }
+ break;
+ case ScriptTypes.Boolean:
+ this.Value = (bool)this.Value ? 1 : 0;
+ break;
+ }
+ this.Type = ScriptTypes.Integer;
+ break;
+ case ScriptTypes.Double:
+ switch (this.Type)
+ {
+ case ScriptTypes.String:
+ case ScriptTypes.Integer:
+ double tryDouble = 0;
+ if (double.TryParse(this.Value.ToString(), out tryDouble))
+ {
+ this.Value = tryDouble;
+ }
+ else
+ {
+ goto castError;
+ }
+ break;
+ case ScriptTypes.Boolean:
+ this.Value = (bool)this.Value ? 1.0 : 0.0;
+ break;
+ }
+ this.Type = ScriptTypes.Double;
+ break;
+ case ScriptTypes.Boolean:
+
+ switch (this.Type)
+ {
+ case ScriptTypes.String:
+ this.Value = this.Value.ToString() == "true";
+ break;
+ }
+ this.Type = ScriptTypes.Boolean;
+ break;
+ case ScriptTypes.ListString:
+ case ScriptTypes.ListInteger:
+ case ScriptTypes.ListDouble:
+ case ScriptTypes.ListBoolean:
+
+ break;
+ case ScriptTypes.Void:
+ this.Value = default(ReturnT);
+ break;
+ }
+ return this;
+ castError:
+ lexer.Prev();
+ lexer.Prev();
+ throw new ScriptException(
+ message: String.Format("Unable to cast value '{0}' from '{1}' to '{2}' on Line {3} Col {4}",
+ Value.ToString(),
+ Type.ToString(),
+ outputType.ToString(),
+ lexer.LineNumber,
+ lexer.Position),
+ row: lexer.LineNumber,
+ column: lexer.Position,
+ method: lexer.TokenContents
+ );
+ }
+
+ /*public ScriptVariable Cast(Lexer lexer)
+ {
+ var outputType = ScriptType.ToEnum(typeof(ReturnT));
+ var outValue = default(ReturnT);
+ if (TryCast(Type, Value, out outValue))
+ {
+ return this;
+ }
+ lexer.Prev();
+ lexer.Prev();
+ throw new ScriptException(
+ message: String.Format("Unable to cast value '{0}' from '{1}' to '{2}' on Line {3} Col {4}",
+ Value.ToString(),
+ Type.ToString(),
+ outputType.ToString(),
+ lexer.LineNumber,
+ lexer.Position),
+ row: lexer.LineNumber,
+ column: lexer.Position,
+ method: lexer.TokenContents
+ );
+ }*/
+ }
+}
+
+
+
+
\ No newline at end of file
diff --git a/server/uploads/sample.png b/server/uploads/sample.png
new file mode 100644
index 0000000..1617e8e
Binary files /dev/null and b/server/uploads/sample.png differ
diff --git a/server/views/404.ejs b/server/views/404.ejs
new file mode 100644
index 0000000..5921fd1
--- /dev/null
+++ b/server/views/404.ejs
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+ ERROR 404
+
+
+
+
+
+
+
+
+
+
+
+ 404
+
+
+
+
+
\ No newline at end of file
diff --git a/server/views/ERR_FILE_TOO_BIG.ejs b/server/views/ERR_FILE_TOO_BIG.ejs
new file mode 100644
index 0000000..a85cb91
--- /dev/null
+++ b/server/views/ERR_FILE_TOO_BIG.ejs
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+ ERROR
+
+
+
+
+
+
+
+
+
+
+
+
The file you uploaded exceeds the file size limit
+
+
+
+
+
\ No newline at end of file
diff --git a/server/views/ERR_ILLEGAL_FILE_TYPE.ejs b/server/views/ERR_ILLEGAL_FILE_TYPE.ejs
new file mode 100644
index 0000000..9f430ca
--- /dev/null
+++ b/server/views/ERR_ILLEGAL_FILE_TYPE.ejs
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+ ERROR
+
+
+
+
+
+
+
+
+
+
+
+
The file type you attempted to upload is not allowed
+
+
+
+
+
\ No newline at end of file
diff --git a/server/views/assets/css/styles.min.css b/server/views/assets/css/styles.min.css
new file mode 100644
index 0000000..5320bfb
--- /dev/null
+++ b/server/views/assets/css/styles.min.css
@@ -0,0 +1 @@
+button{border-radius:0}button:focus{outline:dotted 1px;outline:-webkit-focus-ring-color auto 5px}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.125rem}.alert-success{color:#496330;background-color:#e8f2df;border-color:#dfedd2}.close{float:right;font-size:1.3125rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.mr-1,.mx-1{margin-right:.3125rem!important}.icon{width:20px;height:20px;vertical-align:middle;display:inline-block;background-size:auto}.fbox3>div[class*=col]{padding-top:5px;padding-bottom:5px}.features-clean{color:#313437;background-color:#fff;padding-bottom:30px}.features-clean p{color:#7d8285}.features-clean h2{font-weight:700;margin-bottom:40px;padding-top:40px;color:inherit}@media (max-width:767px){.features-clean{padding-bottom:10px}.features-clean h2{margin-bottom:25px;padding-top:25px;font-size:24px}}.features-clean .intro{font-size:16px;max-width:500px;margin:0 auto 60px}.features-clean .item{min-height:100px;padding-left:80px;margin-bottom:40px}@media (max-width:767px){.features-clean .intro{margin-bottom:40px}.features-clean .item{min-height:0}}.features-clean .item .name{font-size:20px;font-weight:700;margin-top:0;margin-bottom:20px;color:inherit}.features-clean .item .description{font-size:15px;margin-bottom:0}.features-clean .item .icon{font-size:40px;color:#1485ee;float:left;margin-left:-65px}.form-control.d-xl-flex.justify-content-center.align-items-center.align-content-center.align-self-end.justify-content-lg-center.justify-content-xl-center{text-align:center}.login-clean{background:#f1f7fc;padding:80px 0}.login-clean form{max-width:320px;width:90%;margin:0 auto;background-color:#fff;padding:40px;border-radius:4px;color:#505e6c;box-shadow:1px 1px 5px rgba(0,0,0,.1)}.login-clean .illustration{text-align:center;padding:0 0 20px;font-size:100px;color:#f4476b}.login-clean form .form-control{background:#f7f9fc;border:none;border-bottom:1px solid #dfe7f1;border-radius:0;box-shadow:none;outline:0;color:inherit;text-indent:8px;height:42px}.login-clean form .btn-primary{background:#f4476b;border:none;border-radius:4px;padding:11px;box-shadow:none;margin-top:26px;text-shadow:none;outline:0!important}.login-clean form .btn-primary:active,.login-clean form .btn-primary:hover{background:#eb3b60}.login-clean form .btn-primary:active{transform:translateY(1px)}.login-clean form .forgot{display:block;text-align:center;font-size:12px;color:#6f7a85;opacity:.9;text-decoration:none}.login-clean form .forgot:active,.login-clean form .forgot:hover{opacity:1;text-decoration:none}.navigation-clean{background:#fff;padding-top:.75rem;padding-bottom:.75rem;color:#333;border-radius:0;box-shadow:none;border:none;margin-bottom:0}@media (min-width:768px){.navigation-clean{padding-top:1rem;padding-bottom:1rem}}.navigation-clean .navbar-brand{font-weight:700;color:inherit}.navigation-clean .navbar-brand:hover{color:#222}.navigation-clean .navbar-toggler{border-color:#ddd;color:#888}.navigation-clean .navbar-toggler:focus,.navigation-clean .navbar-toggler:hover{background:0 0}.navigation-clean .form-inline,.navigation-clean .navbar-collapse{border-top-color:#ddd}.navigation-clean.navbar-light .navbar-nav .nav-link.active,.navigation-clean.navbar-light .navbar-nav .nav-link.active:focus,.navigation-clean.navbar-light .navbar-nav .nav-link.active:hover{color:#8f8f8f;box-shadow:none;background:0 0;pointer-events:none}.navigation-clean.navbar .navbar-nav .nav-link{padding-left:18px;padding-right:18px}.navigation-clean.navbar-light .navbar-nav .nav-link{color:#465765}.navigation-clean.navbar-light .navbar-nav .nav-link:focus,.navigation-clean.navbar-light .navbar-nav .nav-link:hover{color:#37434d!important;background-color:transparent}.navigation-clean .navbar-nav>li>.dropdown-menu{margin-top:-5px;box-shadow:none;background-color:#fff;border-radius:2px}.navigation-clean .dropdown-menu .dropdown-item,.navigation-clean .dropdown-menu .dropdown-item:focus{line-height:2;color:#37434d}.navigation-clean .dropdown-menu .dropdown-item:focus,.navigation-clean .dropdown-menu .dropdown-item:hover{background:#eee;color:inherit}.social-icons{color:#313437;background-color:#fff;text-align:center;padding:70px 0}@media (max-width:767px){.social-icons{padding:50px 0}}.social-icons i{font-size:32px;display:inline-block;color:#757980;margin:0 10px;width:60px;height:60px;border:1px solid #c8ced7;text-align:center;border-radius:50%;line-height:60px}
\ No newline at end of file
diff --git a/server/views/css/404.css b/server/views/css/404.css
new file mode 100644
index 0000000..baed6f5
--- /dev/null
+++ b/server/views/css/404.css
@@ -0,0 +1,179 @@
+ @import url(https://fonts.googleapis.com/css?family=Lato:100,300,400);
+
+input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
+ color: #aca49c;
+ font-size: 0.875em;
+}
+
+input:focus::-webkit-input-placeholder, textarea:focus::-webkit-input-placeholder {
+ color: #bbb5af;
+}
+
+input::-moz-placeholder, textarea::-moz-placeholder {
+ color: #aca49c;
+ font-size: 0.875em;
+}
+
+input:focus::-moz-placeholder, textarea:focus::-moz-placeholder {
+ color: #bbb5af;
+}
+
+input::placeholder, textarea::placeholder {
+ color: #aca49c;
+ font-size: 0.875em;
+}
+
+input:focus::placeholder, textarea::focus:placeholder {
+ color: #bbb5af;
+}
+
+input::-ms-placeholder, textarea::-ms-placeholder {
+ color: #aca49c;
+ font-size: 0.875em;
+}
+
+input:focus::-ms-placeholder, textarea:focus::-ms-placeholder {
+ color: #bbb5af;
+}
+
+/* on hover placeholder */
+
+input:hover::-webkit-input-placeholder, textarea:hover::-webkit-input-placeholder {
+ color: #e2dedb;
+ font-size: 0.875em;
+}
+
+input:hover:focus::-webkit-input-placeholder, textarea:hover:focus::-webkit-input-placeholder {
+ color: #cbc6c1;
+}
+
+input:hover::-moz-placeholder, textarea:hover::-moz-placeholder {
+ color: #e2dedb;
+ font-size: 0.875em;
+}
+
+input:hover:focus::-moz-placeholder, textarea:hover:focus::-moz-placeholder {
+ color: #cbc6c1;
+}
+
+input:hover::placeholder, textarea:hover::placeholder {
+ color: #e2dedb;
+ font-size: 0.875em;
+}
+
+input:hover:focus::placeholder, textarea:hover:focus::placeholder {
+ color: #cbc6c1;
+}
+
+input:hover::placeholder, textarea:hover::placeholder {
+ color: #e2dedb;
+ font-size: 0.875em;
+}
+
+input:hover:focus::-ms-placeholder, textarea:hover::focus:-ms-placeholder {
+ color: #cbc6c1;
+}
+
+body {
+ font-family: 'Lato', sans-serif;
+ background: #e2dedb;
+ color: #b3aca7;
+}
+
+header {
+ position: relative;
+ margin: 100px 0 25px 0;
+ font-size: 2.3em;
+ text-align: center;
+ letter-spacing: 7px;
+}
+
+return {
+ position: relative;
+ margin: 100px 0 25px 0;
+ font-size: 1.0em;
+ text-align: center;
+ letter-spacing: 3px;
+}
+
+#form {
+ position: relative;
+ width: 500px;
+ margin: 50px auto 100px auto;
+}
+
+input {
+ font-family: 'Lato', sans-serif;
+ font-size: 0.875em;
+ width: 470px;
+ height: 50px;
+ padding: 0px 15px 0px 15px;
+
+ background: transparent;
+ outline: none;
+ color: #726659;
+
+ border: solid 1px #b3aca7;
+ border-bottom: none;
+
+ transition: all 0.3s ease-in-out;
+ -webkit-transition: all 0.3s ease-in-out;
+ -moz-transition: all 0.3s ease-in-out;
+ -ms-transition: all 0.3s ease-in-out;
+}
+
+input:hover {
+ background: #b3aca7;
+ color: #e2dedb;
+}
+
+textarea {
+ width: 470px;
+ max-width: 470px;
+ height: 110px;
+ max-height: 110px;
+ padding: 15px;
+
+ background: transparent;
+ outline: none;
+
+ color: #726659;
+ font-family: 'Lato', sans-serif;
+ font-size: 0.875em;
+
+ border: solid 1px #b3aca7;
+
+ transition: all 0.3s ease-in-out;
+ -webkit-transition: all 0.3s ease-in-out;
+ -moz-transition: all 0.3s ease-in-out;
+ -ms-transition: all 0.3s ease-in-out;
+}
+
+textarea:hover {
+ background: #b3aca7;
+ color: #e2dedb;
+}
+
+#submit {
+ width: 470px;
+
+ padding: 0;
+ margin: -5px 0px 0px 0px;
+
+ font-family: 'Lato', sans-serif;
+ font-size: 0.875em;
+ color: #b3aca7;
+
+ outline:none;
+ cursor: pointer;
+
+ border: solid 1px #b3aca7;
+}
+
+#submit:hover {
+ color: #e2dedb;
+}
+
+a {
+ color: #726659;
+}
\ No newline at end of file
diff --git a/server/views/gallery.ejs b/server/views/gallery.ejs
new file mode 100644
index 0000000..fd5bf1a
--- /dev/null
+++ b/server/views/gallery.ejs
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+ Gallery
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <% pictures.forEach(pic => { %>
+
+ <% })%>
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/server/views/galleryLogin.ejs b/server/views/galleryLogin.ejs
new file mode 100644
index 0000000..5a8efdd
--- /dev/null
+++ b/server/views/galleryLogin.ejs
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+ Gallery
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/server/views/md.ejs b/server/views/md.ejs
new file mode 100644
index 0000000..1c7e7b9
--- /dev/null
+++ b/server/views/md.ejs
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+<%- mdRender; %>
+
+
+
\ No newline at end of file
diff --git a/server/views/mp3.ejs b/server/views/mp3.ejs
new file mode 100644
index 0000000..2c3d1ac
--- /dev/null
+++ b/server/views/mp3.ejs
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/server/views/paste.ejs b/server/views/paste.ejs
new file mode 100644
index 0000000..f0161c3
--- /dev/null
+++ b/server/views/paste.ejs
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+<%= pData; %>
+
+
+
+
\ No newline at end of file
diff --git a/server/views/photoShowCase.ejs b/server/views/photoShowCase.ejs
new file mode 100644
index 0000000..f48e997
--- /dev/null
+++ b/server/views/photoShowCase.ejs
@@ -0,0 +1,51 @@
+
+
+
+
+ Image Showcase
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
<%= dims; %>
+
+

+
+
+
\ No newline at end of file
diff --git a/server/views/puploadAuth.ejs b/server/views/puploadAuth.ejs
new file mode 100644
index 0000000..b4ec54f
--- /dev/null
+++ b/server/views/puploadAuth.ejs
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+ Authorization
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/server/views/short.ejs b/server/views/short.ejs
new file mode 100644
index 0000000..609c52f
--- /dev/null
+++ b/server/views/short.ejs
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+ URL Shortener
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/server/views/unauthorized.ejs b/server/views/unauthorized.ejs
new file mode 100644
index 0000000..954c168
--- /dev/null
+++ b/server/views/unauthorized.ejs
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+ UNAUTHORIZED
+
+
+
+
+
+
+
+
+
+
+
+
UNAUTHORIZED
+
+
+
+
+
\ No newline at end of file
diff --git a/server/views/upload.ejs b/server/views/upload.ejs
new file mode 100644
index 0000000..6b6ac19
--- /dev/null
+++ b/server/views/upload.ejs
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+ Upload
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/util/auth.js b/util/auth.js
new file mode 100644
index 0000000..18f597f
--- /dev/null
+++ b/util/auth.js
@@ -0,0 +1,5 @@
+function auth(myKey, givenKey, c) {
+ if (c.key.includes(givenKey) || c.admin.key.includes(givenKey) || c.public === true || myKey === null) return true;
+ return false;
+}
+module.exports = auth;
diff --git a/util/index.js b/util/index.js
new file mode 100644
index 0000000..8fe323b
--- /dev/null
+++ b/util/index.js
@@ -0,0 +1,6 @@
+require('fs')
+ .readdirSync(__dirname)
+ .map(filename => {
+ const moduleName = filename.split('.')[0];
+ exports[moduleName] = require(`${__dirname}/${filename}`);
+ });
diff --git a/util/log.js b/util/log.js
new file mode 100644
index 0000000..1a97f20
--- /dev/null
+++ b/util/log.js
@@ -0,0 +1,55 @@
+/* eslint-disable no-console */
+/** Colors to display in terminal */
+const fg = {
+ black: '\x1b[30m',
+ red: '\x1b[31m',
+ green: '\x1b[32m',
+ yellow: '\x1b[33m',
+ blue: '\x1b[34m',
+ magenta: '\x1b[35m',
+ cyan: '\x1b[36m',
+ white: '\x1b[37m',
+};
+const bg = {
+ black: '\x1b[40m',
+ red: '\x1b[41m',
+ green: '\x1b[42m',
+ yellow: '\x1b[43m',
+ blue: '\x1b[44m',
+ magenta: '\x1b[45m',
+ cyan: '\x1b[46m',
+ white: '\x1b[47m',
+};
+const endColor = '\x1b[0m';
+
+/**
+ * Timestamp generation
+ * @returns {string} [11:05:49 PM]
+ */
+function timestamp() {
+ const time = new Date();
+ return time.toLocaleString('en-US', {
+ hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true,
+ });
+}
+
+/**
+ * Logs to console with proper styling and a timestamp
+ * @param {string} log - string you want to log
+ * @returns {Promise}
+ */
+function uncaughtError(log) {
+ console.log(`${fg.red} |> ${endColor}${bg.red}[${timestamp()}]${endColor}${fg.red} | ${log}${endColor}`);
+}
+function success(log) {
+ console.log(`${fg.red} |> ${endColor}${bg.green}[${timestamp()}]${endColor}${fg.green} | ${log}${endColor}`);
+}
+function warning(log) {
+ console.log(`${fg.red} |> ${endColor}${bg.magenta}[${timestamp()}]${endColor}${fg.magenta} | ${log}${endColor}`);
+}
+function verbose(log) {
+ console.log(`${fg.red} |> ${endColor}${bg.blue}[${timestamp()}]${endColor}${fg.blue} | ${log}${endColor}`);
+}
+module.exports = {
+ uncaughtError, success, warning, verbose,
+};
diff --git a/util/mimeType.js b/util/mimeType.js
new file mode 100644
index 0000000..e20a3d5
--- /dev/null
+++ b/util/mimeType.js
@@ -0,0 +1,656 @@
+/* eslint-disable no-dupe-keys */
+/**
+ * Takes a file extension and returns it's MIME type
+ * @param {string} fileName - file name including extension (example.pdf)
+ * @returns {string} MIME Type
+ */
+function mimeType(fileName) {
+ const mimeTypes = {
+ '.3dm': 'x-world/x-3dmf',
+ '.3dmf': 'x-world/x-3dmf',
+ '.a': 'application/octet-stream',
+ '.aab': 'application/x-authorware-bin',
+ '.aam': 'application/x-authorware-map',
+ '.aas': 'application/x-authorware-seg',
+ '.abc': 'text/vnd.abc',
+ '.acgi': 'text/html',
+ '.afl': 'video/animaflex',
+ '.ai': 'application/postscript',
+ '.aif': 'audio/aiff',
+ '.aif': 'audio/x-aiff',
+ '.aifc': 'audio/aiff',
+ '.aifc': 'audio/x-aiff',
+ '.aiff': 'audio/aiff',
+ '.aiff': 'audio/x-aiff',
+ '.aim': 'application/x-aim',
+ '.aip': 'text/x-audiosoft-intra',
+ '.ani': 'application/x-navi-animation',
+ '.aos': 'application/x-nokia-9000-communicator-add-on-software',
+ '.aps': 'application/mime',
+ '.arc': 'application/octet-stream',
+ '.arj': 'application/arj',
+ '.arj': 'application/octet-stream',
+ '.art': 'image/x-jg',
+ '.asf': 'video/x-ms-asf',
+ '.asm': 'text/x-asm',
+ '.asp': 'text/asp',
+ '.asx': 'application/x-mplayer2',
+ '.asx': 'video/x-ms-asf',
+ '.asx': 'video/x-ms-asf-plugin',
+ '.au': 'audio/basic',
+ '.au': 'audio/x-au',
+ '.avi': 'application/x-troff-msvideo',
+ '.avi': 'video/avi',
+ '.avi': 'video/msvideo',
+ '.avi': 'video/x-msvideo',
+ '.avs': 'video/avs-video',
+ '.bcpio': 'application/x-bcpio',
+ '.bin': 'application/mac-binary',
+ '.bin': 'application/macbinary',
+ '.bin': 'application/octet-stream',
+ '.bin': 'application/x-binary',
+ '.bin': 'application/x-macbinary',
+ '.bm': 'image/bmp',
+ '.bmp': 'image/bmp',
+ '.bmp': 'image/x-windows-bmp',
+ '.boo': 'application/book',
+ '.book': 'application/book',
+ '.boz': 'application/x-bzip2',
+ '.bsh': 'application/x-bsh',
+ '.bz': 'application/x-bzip',
+ '.bz2': 'application/x-bzip2',
+ '.c': 'text/plain',
+ '.c': 'text/x-c',
+ '.c++': 'text/plain',
+ '.cat': 'application/vnd.ms-pki.seccat',
+ '.cc': 'text/plain',
+ '.cc': 'text/x-c',
+ '.ccad': 'application/clariscad',
+ '.cco': 'application/x-cocoa',
+ '.cdf': 'application/cdf',
+ '.cdf': 'application/x-cdf',
+ '.cdf': 'application/x-netcdf',
+ '.cer': 'application/pkix-cert',
+ '.cer': 'application/x-x509-ca-cert',
+ '.cha': 'application/x-chat',
+ '.chat': 'application/x-chat',
+ '.class': 'application/java',
+ '.class': 'application/java-byte-code',
+ '.class': 'application/x-java-class',
+ '.com': 'application/octet-stream',
+ '.com': 'text/plain',
+ '.conf': 'text/plain',
+ '.cpio': 'application/x-cpio',
+ '.cpp': 'text/x-c',
+ '.cpt': 'application/mac-compactpro',
+ '.cpt': 'application/x-compactpro',
+ '.cpt': 'application/x-cpt',
+ '.crl': 'application/pkcs-crl',
+ '.crl': 'application/pkix-crl',
+ '.crt': 'application/pkix-cert',
+ '.crt': 'application/x-x509-ca-cert',
+ '.crt': 'application/x-x509-user-cert',
+ '.csh': 'application/x-csh',
+ '.csh': 'text/x-script.csh',
+ '.css': 'application/x-pointplus',
+ '.css': 'text/css',
+ '.cxx': 'text/plain',
+ '.dcr': 'application/x-director',
+ '.deepv': 'application/x-deepv',
+ '.def': 'text/plain',
+ '.der': 'application/x-x509-ca-cert',
+ '.dif': 'video/x-dv',
+ '.dir': 'application/x-director',
+ '.dl': 'video/dl',
+ '.dl': 'video/x-dl',
+ '.doc': 'application/msword',
+ '.dot': 'application/msword',
+ '.dp': 'application/commonground',
+ '.drw': 'application/drafting',
+ '.dump': 'application/octet-stream',
+ '.dv': 'video/x-dv',
+ '.dvi': 'application/x-dvi',
+ '.dwf': 'drawing/x-dwf',
+ '.dwf': 'model/vnd.dwf',
+ '.dwg': 'application/acad',
+ '.dwg': 'image/vnd.dwg',
+ '.dwg': 'image/x-dwg',
+ '.dxf': 'application/dxf',
+ '.dxf': 'image/vnd.dwg',
+ '.dxf': 'image/x-dwg',
+ '.dxr': 'application/x-director',
+ '.el': 'text/x-script.elisp',
+ '.elc': 'application/x-bytecode.elisp',
+ '.elc': 'application/x-elc',
+ '.env': 'application/x-envoy',
+ '.eps': 'application/postscript',
+ '.es': 'application/x-esrehber',
+ '.etx': 'text/x-setext',
+ '.evy': 'application/envoy',
+ '.evy': 'application/x-envoy',
+ '.exe': 'application/octet-stream',
+ '.f': 'text/plain',
+ '.f': 'text/x-fortran',
+ '.f77': 'text/x-fortran',
+ '.f90': 'text/plain',
+ '.f90': 'text/x-fortran',
+ '.fdf': 'application/vnd.fdf',
+ '.fif': 'application/fractals',
+ '.fif': 'image/fif',
+ '.fli': 'video/fli',
+ '.fli': 'video/x-fli',
+ '.flo': 'image/florian',
+ '.flx': 'text/vnd.fmi.flexstor',
+ '.fmf': 'video/x-atomic3d-feature',
+ '.for': 'text/plain',
+ '.for': 'text/x-fortran',
+ '.fpx': 'image/vnd.fpx',
+ '.fpx': 'image/vnd.net-fpx',
+ '.frl': 'application/freeloader',
+ '.funk': 'audio/make',
+ '.g': 'text/plain',
+ '.g3': 'image/g3fax',
+ '.gif': 'image/gif',
+ '.gl': 'video/gl',
+ '.gl': 'video/x-gl',
+ '.gsd': 'audio/x-gsm',
+ '.gsm': 'audio/x-gsm',
+ '.gsp': 'application/x-gsp',
+ '.gss': 'application/x-gss',
+ '.gtar': 'application/x-gtar',
+ '.gz': 'application/x-compressed',
+ '.gz': 'application/x-gzip',
+ '.gzip': 'application/x-gzip',
+ '.gzip': 'multipart/x-gzip',
+ '.h': 'text/plain',
+ '.h': 'text/x-h',
+ '.hdf': 'application/x-hdf',
+ '.help': 'application/x-helpfile',
+ '.hgl': 'application/vnd.hp-hpgl',
+ '.hh': 'text/plain',
+ '.hh': 'text/x-h',
+ '.hlb': 'text/x-script',
+ '.hlp': 'application/hlp',
+ '.hlp': 'application/x-helpfile',
+ '.hlp': 'application/x-winhelp',
+ '.hpg': 'application/vnd.hp-hpgl',
+ '.hpgl': 'application/vnd.hp-hpgl',
+ '.hqx': 'application/binhex',
+ '.hqx': 'application/binhex4',
+ '.hqx': 'application/mac-binhex',
+ '.hqx': 'application/mac-binhex40',
+ '.hqx': 'application/x-binhex40',
+ '.hqx': 'application/x-mac-binhex40',
+ '.hta': 'application/hta',
+ '.htc': 'text/x-component',
+ '.htm': 'text/html',
+ '.html': 'text/html',
+ '.htmls': 'text/html',
+ '.htt': 'text/webviewhtml',
+ '.htx': 'text/html',
+ '.ice': 'x-conference/x-cooltalk',
+ '.ico': 'image/x-icon',
+ '.idc': 'text/plain',
+ '.ief': 'image/ief',
+ '.iefs': 'image/ief',
+ '.iges': 'application/iges',
+ '.iges': 'model/iges',
+ '.igs': 'application/iges',
+ '.igs': 'model/iges',
+ '.ima': 'application/x-ima',
+ '.imap': 'application/x-httpd-imap',
+ '.inf': 'application/inf',
+ '.ins': 'application/x-internett-signup',
+ '.ip': 'application/x-ip2',
+ '.isu': 'video/x-isvideo',
+ '.it': 'audio/it',
+ '.iv': 'application/x-inventor',
+ '.ivr': 'i-world/i-vrml',
+ '.ivy': 'application/x-livescreen',
+ '.jam': 'audio/x-jam',
+ '.jav': 'text/plain',
+ '.jav': 'text/x-java-source',
+ '.java': 'text/plain',
+ '.java': 'text/x-java-source',
+ '.jcm': 'application/x-java-commerce',
+ '.jfif': 'image/jpeg',
+ '.jfif-tbnl': 'image/jpeg',
+ '.jpe': 'image/jpeg',
+ '.jpeg': 'image/jpeg',
+ '.jpg': 'image/jpeg',
+ '.jps': 'image/x-jps',
+ '.js': 'application/x-javascript',
+ '.jut': 'image/jutvision',
+ '.kar': 'audio/midi',
+ '.kar': 'music/x-karaoke',
+ '.ksh': 'application/x-ksh',
+ '.ksh': 'text/x-script.ksh',
+ '.la': 'audio/nspaudio',
+ '.la': 'audio/x-nspaudio',
+ '.lam': 'audio/x-liveaudio',
+ '.latex': 'application/x-latex',
+ '.lha': 'application/lha',
+ '.lha': 'application/octet-stream',
+ '.lha': 'application/x-lha',
+ '.lhx': 'application/octet-stream',
+ '.list': 'text/plain',
+ '.lma': 'audio/nspaudio',
+ '.lma': 'audio/x-nspaudio',
+ '.log': 'text/plain',
+ '.lsp': 'application/x-lisp',
+ '.lsp': 'text/x-script.lisp',
+ '.lst': 'text/plain',
+ '.lsx': 'text/x-la-asf',
+ '.ltx': 'application/x-latex',
+ '.lzh': 'application/octet-stream',
+ '.lzh': 'application/x-lzh',
+ '.lzx': 'application/lzx',
+ '.lzx': 'application/octet-stream',
+ '.lzx': 'application/x-lzx',
+ '.m': 'text/plain',
+ '.m': 'text/x-m',
+ '.m1v': 'video/mpeg',
+ '.m2a': 'audio/mpeg',
+ '.m2v': 'video/mpeg',
+ '.m3u': 'audio/x-mpequrl',
+ '.man': 'application/x-troff-man',
+ '.map': 'application/x-navimap',
+ '.mar': 'text/plain',
+ '.mbd': 'application/mbedlet',
+ '.mc$': 'application/x-magic-cap-package-1.0',
+ '.mcd': 'application/mcad',
+ '.mcd': 'application/x-mathcad',
+ '.mcf': 'image/vasa',
+ '.mcf': 'text/mcf',
+ '.mcp': 'application/netmc',
+ '.me': 'application/x-troff-me',
+ '.mht': 'message/rfc822',
+ '.mhtml': 'message/rfc822',
+ '.mid': 'application/x-midi',
+ '.mid': 'audio/midi',
+ '.mid': 'audio/x-mid',
+ '.mid': 'audio/x-midi',
+ '.mid': 'music/crescendo',
+ '.mid': 'x-music/x-midi',
+ '.midi': 'application/x-midi',
+ '.midi': 'audio/midi',
+ '.midi': 'audio/x-mid',
+ '.midi': 'audio/x-midi',
+ '.midi': 'music/crescendo',
+ '.midi': 'x-music/x-midi',
+ '.mif': 'application/x-frame',
+ '.mif': 'application/x-mif',
+ '.mime': 'message/rfc822',
+ '.mime': 'www/mime',
+ '.mjf': 'audio/x-vnd.audioexplosion.mjuicemediafile',
+ '.mjpg': 'video/x-motion-jpeg',
+ '.mm': 'application/base64',
+ '.mm': 'application/x-meme',
+ '.mme': 'application/base64',
+ '.mod': 'audio/mod',
+ '.mod': 'audio/x-mod',
+ '.moov': 'video/quicktime',
+ '.mov': 'video/quicktime',
+ '.movie': 'video/x-sgi-movie',
+ '.mp2': 'audio/mpeg',
+ '.mp2': 'audio/x-mpeg',
+ '.mp2': 'video/mpeg',
+ '.mp2': 'video/x-mpeg',
+ '.mp2': 'video/x-mpeq2a',
+ '.mp3': 'audio/mpeg3',
+ '.mp3': 'audio/x-mpeg-3',
+ '.mp3': 'video/mpeg',
+ '.mp3': 'video/x-mpeg',
+ '.mpa': 'audio/mpeg',
+ '.mpa': 'video/mpeg',
+ '.mpc': 'application/x-project',
+ '.mpe': 'video/mpeg',
+ '.mpeg': 'video/mpeg',
+ '.mpg': 'audio/mpeg',
+ '.mpg': 'video/mpeg',
+ '.mpga': 'audio/mpeg',
+ '.mpp': 'application/vnd.ms-project',
+ '.mpt': 'application/x-project',
+ '.mpv': 'application/x-project',
+ '.mpx': 'application/x-project',
+ '.mrc': 'application/marc',
+ '.ms': 'application/x-troff-ms',
+ '.mv': 'video/x-sgi-movie',
+ '.my': 'audio/make',
+ '.mzz': 'application/x-vnd.audioexplosion.mzz',
+ '.nap': 'image/naplps',
+ '.naplps': 'image/naplps',
+ '.nc': 'application/x-netcdf',
+ '.ncm': 'application/vnd.nokia.configuration-message',
+ '.nif': 'image/x-niff',
+ '.niff': 'image/x-niff',
+ '.nix': 'application/x-mix-transfer',
+ '.nsc': 'application/x-conference',
+ '.nvd': 'application/x-navidoc',
+ '.o': 'application/octet-stream',
+ '.oda': 'application/oda',
+ '.omc': 'application/x-omc',
+ '.omcd': 'application/x-omcdatamaker',
+ '.omcr': 'application/x-omcregerator',
+ '.p': 'text/x-pascal',
+ '.p10': 'application/pkcs10',
+ '.p10': 'application/x-pkcs10',
+ '.p12': 'application/pkcs-12',
+ '.p12': 'application/x-pkcs12',
+ '.p7a': 'application/x-pkcs7-signature',
+ '.p7c': 'application/pkcs7-mime',
+ '.p7c': 'application/x-pkcs7-mime',
+ '.p7m': 'application/pkcs7-mime',
+ '.p7m': 'application/x-pkcs7-mime',
+ '.p7r': 'application/x-pkcs7-certreqresp',
+ '.p7s': 'application/pkcs7-signature',
+ '.part': 'application/pro_eng',
+ '.pas': 'text/pascal',
+ '.pbm': 'image/x-portable-bitmap',
+ '.pcl': 'application/vnd.hp-pcl',
+ '.pcl': 'application/x-pcl',
+ '.pct': 'image/x-pict',
+ '.pcx': 'image/x-pcx',
+ '.pdb': 'chemical/x-pdb',
+ '.pdf': 'application/pdf',
+ '.pfunk': 'audio/make',
+ '.pfunk': 'audio/make.my.funk',
+ '.pgm': 'image/x-portable-graymap',
+ '.pgm': 'image/x-portable-greymap',
+ '.pic': 'image/pict',
+ '.pict': 'image/pict',
+ '.pkg': 'application/x-newton-compatible-pkg',
+ '.pko': 'application/vnd.ms-pki.pko',
+ '.pl': 'text/plain',
+ '.pl': 'text/x-script.perl',
+ '.plx': 'application/x-pixclscript',
+ '.pm': 'image/x-xpixmap',
+ '.pm': 'text/x-script.perl-module',
+ '.pm4': 'application/x-pagemaker',
+ '.pm5': 'application/x-pagemaker',
+ '.png': 'image/png',
+ '.pnm': 'application/x-portable-anymap',
+ '.pnm': 'image/x-portable-anymap',
+ '.pot': 'application/mspowerpoint',
+ '.pot': 'application/vnd.ms-powerpoint',
+ '.pov': 'model/x-pov',
+ '.ppa': 'application/vnd.ms-powerpoint',
+ '.ppm': 'image/x-portable-pixmap',
+ '.pps': 'application/mspowerpoint',
+ '.pps': 'application/vnd.ms-powerpoint',
+ '.ppt': 'application/mspowerpoint',
+ '.ppt': 'application/powerpoint',
+ '.ppt': 'application/vnd.ms-powerpoint',
+ '.ppt': 'application/x-mspowerpoint',
+ '.ppz': 'application/mspowerpoint',
+ '.pre': 'application/x-freelance',
+ '.prt': 'application/pro_eng',
+ '.ps': 'application/postscript',
+ '.psd': 'application/octet-stream',
+ '.pvu': 'paleovu/x-pv',
+ '.pwz': 'application/vnd.ms-powerpoint',
+ '.py': 'text/x-script.phyton',
+ '.pyc': 'applicaiton/x-bytecode.python',
+ '.qcp': 'audio/vnd.qcelp',
+ '.qd3': 'x-world/x-3dmf',
+ '.qd3d': 'x-world/x-3dmf',
+ '.qif': 'image/x-quicktime',
+ '.qt': 'video/quicktime',
+ '.qtc': 'video/x-qtc',
+ '.qti': 'image/x-quicktime',
+ '.qtif': 'image/x-quicktime',
+ '.ra': 'audio/x-pn-realaudio',
+ '.ra': 'audio/x-pn-realaudio-plugin',
+ '.ra': 'audio/x-realaudio',
+ '.ram': 'audio/x-pn-realaudio',
+ '.ras': 'application/x-cmu-raster',
+ '.ras': 'image/cmu-raster',
+ '.ras': 'image/x-cmu-raster',
+ '.rast': 'image/cmu-raster',
+ '.rexx': 'text/x-script.rexx',
+ '.rf': 'image/vnd.rn-realflash',
+ '.rgb': 'image/x-rgb',
+ '.rm': 'application/vnd.rn-realmedia',
+ '.rm': 'audio/x-pn-realaudio',
+ '.rmi': 'audio/mid',
+ '.rmm': 'audio/x-pn-realaudio',
+ '.rmp': 'audio/x-pn-realaudio',
+ '.rmp': 'audio/x-pn-realaudio-plugin',
+ '.rng': 'application/ringing-tones',
+ '.rng': 'application/vnd.nokia.ringing-tone',
+ '.rnx': 'application/vnd.rn-realplayer',
+ '.roff': 'application/x-troff',
+ '.rp': 'image/vnd.rn-realpix',
+ '.rpm': 'audio/x-pn-realaudio-plugin',
+ '.rt': 'text/richtext',
+ '.rt': 'text/vnd.rn-realtext',
+ '.rtf': 'application/rtf',
+ '.rtf': 'application/x-rtf',
+ '.rtf': 'text/richtext',
+ '.rtx': 'application/rtf',
+ '.rtx': 'text/richtext',
+ '.rv': 'video/vnd.rn-realvideo',
+ '.s': 'text/x-asm',
+ '.s3m': 'audio/s3m',
+ '.saveme': 'application/octet-stream',
+ '.sbk': 'application/x-tbook',
+ '.scm': 'application/x-lotusscreencam',
+ '.scm': 'text/x-script.guile',
+ '.scm': 'text/x-script.scheme',
+ '.scm': 'video/x-scm',
+ '.sdml': 'text/plain',
+ '.sdp': 'application/sdp',
+ '.sdp': 'application/x-sdp',
+ '.sdr': 'application/sounder',
+ '.sea': 'application/sea',
+ '.sea': 'application/x-sea',
+ '.set': 'application/set',
+ '.sgm': 'text/sgml',
+ '.sgm': 'text/x-sgml',
+ '.sgml': 'text/sgml',
+ '.sgml': 'text/x-sgml',
+ '.sh': 'application/x-bsh',
+ '.sh': 'application/x-sh',
+ '.sh': 'application/x-shar',
+ '.sh': 'text/x-script.sh',
+ '.shar': 'application/x-bsh',
+ '.shar': 'application/x-shar',
+ '.shtml': 'text/html',
+ '.shtml': 'text/x-server-parsed-html',
+ '.sid': 'audio/x-psid',
+ '.sit': 'application/x-sit',
+ '.sit': 'application/x-stuffit',
+ '.skd': 'application/x-koan',
+ '.skm': 'application/x-koan',
+ '.skp': 'application/x-koan',
+ '.skt': 'application/x-koan',
+ '.sl': 'application/x-seelogo',
+ '.smi': 'application/smil',
+ '.smil': 'application/smil',
+ '.snd': 'audio/basic',
+ '.snd': 'audio/x-adpcm',
+ '.sol': 'application/solids',
+ '.spc': 'application/x-pkcs7-certificates',
+ '.spc': 'text/x-speech',
+ '.spl': 'application/futuresplash',
+ '.spr': 'application/x-sprite',
+ '.sprite': 'application/x-sprite',
+ '.src': 'application/x-wais-source',
+ '.ssi': 'text/x-server-parsed-html',
+ '.ssm': 'application/streamingmedia',
+ '.sst': 'application/vnd.ms-pki.certstore',
+ '.step': 'application/step',
+ '.stl': 'application/sla',
+ '.stl': 'application/vnd.ms-pki.stl',
+ '.stl': 'application/x-navistyle',
+ '.stp': 'application/step',
+ '.sv4cpio': 'application/x-sv4cpio',
+ '.sv4crc': 'application/x-sv4crc',
+ '.svf': 'image/vnd.dwg',
+ '.svf': 'image/x-dwg',
+ '.svr': 'application/x-world',
+ '.svr': 'x-world/x-svr',
+ '.swf': 'application/x-shockwave-flash',
+ '.t': 'application/x-troff',
+ '.talk': 'text/x-speech',
+ '.tar': 'application/x-tar',
+ '.tbk': 'application/toolbook',
+ '.tbk': 'application/x-tbook',
+ '.tcl': 'application/x-tcl',
+ '.tcl': 'text/x-script.tcl',
+ '.tcsh': 'text/x-script.tcsh',
+ '.tex': 'application/x-tex',
+ '.texi': 'application/x-texinfo',
+ '.texinfo': 'application/x-texinfo',
+ '.text': 'application/plain',
+ '.text': 'text/plain',
+ '.tgz': 'application/gnutar',
+ '.tgz': 'application/x-compressed',
+ '.tif': 'image/tiff',
+ '.tif': 'image/x-tiff',
+ '.tiff': 'image/tiff',
+ '.tiff': 'image/x-tiff',
+ '.tr': 'application/x-troff',
+ '.tsi': 'audio/tsp-audio',
+ '.tsp': 'application/dsptype',
+ '.tsp': 'audio/tsplayer',
+ '.tsv': 'text/tab-separated-values',
+ '.turbot': 'image/florian',
+ '.txt': 'text/plain',
+ '.uil': 'text/x-uil',
+ '.uni': 'text/uri-list',
+ '.unis': 'text/uri-list',
+ '.unv': 'application/i-deas',
+ '.uri': 'text/uri-list',
+ '.uris': 'text/uri-list',
+ '.ustar': 'application/x-ustar',
+ '.ustar': 'multipart/x-ustar',
+ '.uu': 'application/octet-stream',
+ '.uu': 'text/x-uuencode',
+ '.uue': 'text/x-uuencode',
+ '.vcd': 'application/x-cdlink',
+ '.vcs': 'text/x-vcalendar',
+ '.vda': 'application/vda',
+ '.vdo': 'video/vdo',
+ '.vew': 'application/groupwise',
+ '.viv': 'video/vivo',
+ '.viv': 'video/vnd.vivov',
+ '.vivo': 'video/vivo',
+ '.vivo': 'video/vnd.vivo',
+ '.vmd': 'application/vocaltec-media-desc',
+ '.vmf': 'application/vocaltec-media-file',
+ '.voc': 'audio/voc',
+ '.voc': 'audio/x-voc',
+ '.vos': 'video/vosaic',
+ '.vox': 'audio/voxware',
+ '.vqe': 'audio/x-twinvq-plugin',
+ '.vqf': 'audio/x-twinvq',
+ '.vql': 'audio/x-twinvq-plugin',
+ '.vrml': 'application/x-vrml',
+ '.vrml': 'model/vrml',
+ '.vrml': 'x-world/x-vrml',
+ '.vrt': 'x-world/x-vrt',
+ '.vsd': 'application/x-visio',
+ '.vst': 'application/x-visio',
+ '.vsw': 'application/x-visio',
+ '.w60': 'application/wordperfect6.0',
+ '.w61': 'application/wordperfect6.1',
+ '.w6w': 'application/msword',
+ '.wav': 'audio/wav',
+ '.wav': 'audio/x-wav',
+ '.wb1': 'application/x-qpro',
+ '.wbmp': 'image/vnd.wap.wbmp',
+ '.web': 'application/vnd.xara',
+ '.wiz': 'application/msword',
+ '.wk1': 'application/x-123',
+ '.wmf': 'windows/metafile',
+ '.wml': 'text/vnd.wap.wml',
+ '.wmlc': 'application/vnd.wap.wmlc',
+ '.wmls': 'text/vnd.wap.wmlscript',
+ '.wmlsc': 'application/vnd.wap.wmlscriptc',
+ '.word': 'application/msword',
+ '.wp': 'application/wordperfect',
+ '.wp5': 'application/wordperfect',
+ '.wp5': 'application/wordperfect6.0',
+ '.wp6': 'application/wordperfect',
+ '.wpd': 'application/wordperfect',
+ '.wpd': 'application/x-wpwin',
+ '.wq1': 'application/x-lotus',
+ '.wri': 'application/mswrite',
+ '.wri': 'application/x-wri',
+ '.wrl': 'application/x-world',
+ '.wrl': 'model/vrml',
+ '.wrl': 'x-world/x-vrml',
+ '.wrz': 'model/vrml',
+ '.wrz': 'x-world/x-vrml',
+ '.wsc': 'text/scriplet',
+ '.wsrc': 'application/x-wais-source',
+ '.wtk': 'application/x-wintalk',
+ '.xbm': 'image/x-xbitmap',
+ '.xbm': 'image/x-xbm',
+ '.xbm': 'image/xbm',
+ '.xdr': 'video/x-amt-demorun',
+ '.xgz': 'xgl/drawing',
+ '.xif': 'image/vnd.xiff',
+ '.xl': 'application/excel',
+ '.xla': 'application/excel',
+ '.xla': 'application/x-excel',
+ '.xla': 'application/x-msexcel',
+ '.xlb': 'application/excel',
+ '.xlb': 'application/vnd.ms-excel',
+ '.xlb': 'application/x-excel',
+ '.xlc': 'application/excel',
+ '.xlc': 'application/vnd.ms-excel',
+ '.xlc': 'application/x-excel',
+ '.xld': 'application/excel',
+ '.xld': 'application/x-excel',
+ '.xlk': 'application/excel',
+ '.xlk': 'application/x-excel',
+ '.xll': 'application/excel',
+ '.xll': 'application/vnd.ms-excel',
+ '.xll': 'application/x-excel',
+ '.xlm': 'application/excel',
+ '.xlm': 'application/vnd.ms-excel',
+ '.xlm': 'application/x-excel',
+ '.xls': 'application/excel',
+ '.xls': 'application/vnd.ms-excel',
+ '.xls': 'application/x-excel',
+ '.xls': 'application/x-msexcel',
+ '.xlt': 'application/excel',
+ '.xlt': 'application/x-excel',
+ '.xlv': 'application/excel',
+ '.xlv': 'application/x-excel',
+ '.xlw': 'application/excel',
+ '.xlw': 'application/vnd.ms-excel',
+ '.xlw': 'application/x-excel',
+ '.xlw': 'application/x-msexcel',
+ '.xm': 'audio/xm',
+ '.xml': 'application/xml',
+ '.xml': 'text/xml',
+ '.xmz': 'xgl/movie',
+ '.xpix': 'application/x-vnd.ls-xpix',
+ '.xpm': 'image/x-xpixmap',
+ '.xpm': 'image/xpm',
+ '.x-png': 'image/png',
+ '.xsr': 'video/x-amt-showrun',
+ '.xwd': 'image/x-xwd',
+ '.xwd': 'image/x-xwindowdump',
+ '.xyz': 'chemical/x-pdb',
+ '.z': 'application/x-compress',
+ '.z': 'application/x-compressed',
+ '.zip': 'application/x-compressed',
+ '.zip': 'application/x-zip-compressed',
+ '.zip': 'application/zip',
+ '.zip': 'multipart/x-zip',
+ '.zoo': 'application/octet-stream',
+ '.zsh': 'text/x-script.zsh',
+ };
+
+ const i = fileName.lastIndexOf('.');
+ let ext = '';
+ if (i > 0) { ext = fileName.substr(i); }
+ let mime = mimeTypes[ext];
+ if (mime == null) { mime = 'application/octet-stream'; }
+ return mime;
+}
+module.exports = mimeType;
diff --git a/util/randomToken.js b/util/randomToken.js
new file mode 100644
index 0000000..4f3e83b
--- /dev/null
+++ b/util/randomToken.js
@@ -0,0 +1,20 @@
+/** Used to generate file names
+ * @param {number} number - Number of characters the file name should be
+ * @returns {string} String containing file name
+ */
+function randomToken(number, symbols) {
+ // eslint-disable-next-line no-param-reassign
+ number = parseInt(number, 10);
+ let text = '';
+ let possible
+ if(symbols !== true) {
+ possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+ } else {
+ possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*()-_=+[]{}|;:/?><,.';
+ }
+ for (let i = 0; i < number; i++) {
+ text += possible.charAt(Math.floor(Math.random() * possible.length));
+ }
+ return text;
+}
+module.exports = randomToken;