aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/components/forum_list/forum_list.svelte62
-rw-r--r--app/components/glyph/glyph.svelte38
-rw-r--r--app/components/header/header.svelte51
-rw-r--r--app/components/topic/topic.svelte61
-rw-r--r--app/css/global.css7
-rw-r--r--app/css/style.css0
-rw-r--r--app/forum.svelte29
-rw-r--r--app/index.html12
-rw-r--r--app/manifest.json8
-rw-r--r--app/manifest.webmanifest7
-rw-r--r--app/stores/forums.js (renamed from app/models/forums.js)28
-rw-r--r--app/utils/glyph_hash.js38
-rw-r--r--doc/COVERAGE.md31
-rw-r--r--docker-compose.yml2
-rw-r--r--package-lock.json183
-rw-r--r--package.json5
-rw-r--r--static/humans.txt15
-rw-r--r--static/robots.txt2
-rw-r--r--test/application.js13
-rw-r--r--test/forum.js13
20 files changed, 473 insertions, 132 deletions
diff --git a/app/components/forum_list/forum_list.svelte b/app/components/forum_list/forum_list.svelte
index 905421e..e49c8d8 100644
--- a/app/components/forum_list/forum_list.svelte
+++ b/app/components/forum_list/forum_list.svelte
@@ -1,21 +1,47 @@
<script>
- import {forums, addForum} from '../../models/forums.js'
-
- import { fade } from 'svelte/transition';
+ import {forums, addForum} from '../../stores/forums.js'
</script>
-<aside>
- <button on:click="{addForum}">Add a Forum</button>
- <nav>
- <ul>
- {#each $forums as forum}
- <li transition:fade>
- <a href="/f/{forum.id}">
- <span class="navigation-kanji">{forum.kanji}</span>
- <span class="navigation-label">{forum.label}</span>
- </a>
- </li>
- {/each}
- </ul>
- </nav>
-</aside>
+<nav title="List of Forums">
+ <ul>
+ {#each $forums as forum}
+ <li>
+ <a href="/f/{forum.id}">
+ <span aria-hidden="true" class="navigation-glyph {forum.glyph}">{forum.glyph}</span>
+ <span class="navigation-label">{forum.label}</span>
+ </a>
+ </li>
+ {/each}
+ </ul>
+</nav>
+
+<style>
+ nav {
+ grid-column: col-start 1;
+ grid-row: 2;
+ border-right: 1px solid black;
+ }
+
+ ul {
+ padding: 0;
+ }
+
+ li {
+ display: block;
+ text-align: left;
+ margin-bottom: 20px;
+ }
+
+ .navigation-glyph {
+ font-size: 1.5rem;
+ display: block;
+ }
+
+ .☽ {
+ font-size: 2rem;
+ }
+
+ a {
+ text-decoration: none;
+ }
+</style>
diff --git a/app/components/glyph/glyph.svelte b/app/components/glyph/glyph.svelte
new file mode 100644
index 0000000..45a415b
--- /dev/null
+++ b/app/components/glyph/glyph.svelte
@@ -0,0 +1,38 @@
+<script>
+ import { getGlyphHash } from '../../utils/glyph_hash';
+
+ export let uuid;
+</script>
+
+<div class="glyphicon" aria-hidden="true" title="User avatar.">
+ {#each getGlyphHash(uuid) as fragment}
+ <span class="{fragment.glyph}" style="color: {fragment.color} ">
+ {fragment.glyph}
+ </span>
+ {/each}
+</div>
+
+<style>
+ .glyphicon {
+ border: 1px solid black;
+ display: inline-block;
+ font-size: 1.4rem;
+ height: 48px;
+ margin-top: 5px;
+ width: 48px;
+ }
+
+ span {
+ display: block;
+ float: left;
+ width: 24px;
+ height: 24px;
+ text-align: center;
+ line-height: 24px;
+ }
+
+ .☽ {
+ font-size: 2rem;
+ line-height: 19px;
+ }
+</style>
diff --git a/app/components/header/header.svelte b/app/components/header/header.svelte
index 15b75b8..edcbc79 100644
--- a/app/components/header/header.svelte
+++ b/app/components/header/header.svelte
@@ -1,11 +1,42 @@
-<header>
- <nav class="top-navigation">
- <ul>
- <li><strong><a href="/">Forum v1.0.0</a></strong></li>
- <li><a href="/new"><u class="action-key">N</u>ew Post</a></li>
- <li><a href="/reply"><u class="action-key">R</u>eply</a></li>
- <li><a href="/search"><u class="action-key">S</u>earch</a></li>
- <li><a href="/logout">Log <u class="action-key">O</u>ut</a></li>
- </ul>
- </nav>
+<header title="Toolbar">
+ <ul>
+ <li><strong><a href="/" aria-label="Forum Version 1.0.0">Forum v1.0.0</a></strong></li>
+ <li><a href="/new" aria-label="New"><u class="action-key">N</u>ew</a></li>
+ <li><a href="/reply" aria-label="Reply"><u class="action-key">R</u>eply</a></li>
+ <li><a href="/search" aria-label="Search"><u class="action-key">S</u>earch</a></li>
+ <li><a href="/logout" aria-label="Log Out">Log <u class="action-key">O</u>ut</a></li>
+ </ul>
</header>
+
+<style>
+ header {
+ grid-column: col-start 1 / span 12;
+ border-bottom: 1px solid black;
+ }
+
+ ul {
+ padding: 0;
+ }
+
+ .action-key {
+ font-weight: bold;
+ text-decoration: underline;
+ }
+
+ li {
+ display: inline;
+ margin: 5px;
+ }
+
+ a {
+ text-decoration: none;
+ line-height: 3em;
+ display: inline-block;
+ }
+
+ strong a {
+ color: blue;
+ text-decoration: underline;
+ }
+
+</style>
diff --git a/app/components/topic/topic.svelte b/app/components/topic/topic.svelte
new file mode 100644
index 0000000..367a5b8
--- /dev/null
+++ b/app/components/topic/topic.svelte
@@ -0,0 +1,61 @@
+<script>
+ import Glyph from '../glyph/glyph.svelte';
+</script>
+
+<main class="h-entry" title="Topic">
+ <h1 class="p-name">This is a post in the forum.</h1>
+ <aside class="topic-meta" title="Topic metadata">
+ <span class="topic-location">Posted on <a href="/f/interaction"
+ class="p-category">Interaction</a>.</span>
+ <span class="topic-ttl"><a class="u-url u-uid" href="/t/2a3fc567af8c897ca6f55fb5fj">3 days remaining</a>.</span>
+ </aside>
+ <aside class="topic-tags" title="Topic Tags">
+ Tags:
+ <a href="/t/question" class="p-category">question<span class="tag-weight">(5)</span></a>
+ <a href="/t/meta" class="p-category">meta<span class="tag-weight">(34)</span></a>
+ <a href="/t/carrots" class="p-category">carrots<span class="tag-weight">(1)</span></a>
+ <a href="/t/tpbo" class="p-category">tpbo<span class="tag-weight">(2)</span></a>
+ </aside>
+ <aside class="post-meta" title="Post 1 of 2 metadata">
+ <Glyph uuid="3cd8c84e18144a2da71f6bace9392abc" />
+ <span class="h-card">
+ By: <a href="/a/rbdr" class="p-nickname u-url">rbdr</a>.
+ </span>
+ <time class="dt-published" datetime="2018-08-14T03:32:10.929Z">
+ <a href="/p/a80c70ea0120387123097ce1907ff">
+ 2018-08-14 03:32:10
+ </a>
+ </time>
+ </aside>
+ <article class="e-content" title="Post 1 of 2 by rbdr">
+ <p>This is a main topic in the forum. Does that abstraction still even make sense?</p>
+ <p>Is this really it??</p>
+ <p>This might all be fake but at least the links look purple when visited</p>
+ </article>
+ <hr/>
+ <aside class="post-meta" title="Post 2 of 2 metadata">
+ <Glyph uuid="b33f0339f7d64d1ca27f1c0aefb7d753" />
+ <span class="h-card">
+ By: <a href="/a/time4carrots" class="p-nickname u-url">time4carrots</a>.
+ </span>
+ <time class="dt-published" datetime="2018-08-15T04:10:00.929Z">
+ <a href="/p/da9910f3febde91948000ce1535ea">
+ 2018-08-15 04:10:00
+ </a>
+ </time>
+ </aside>
+ <article class="e-content" title="Post 2 of 2 by time4carrots">
+ <p>It's just how it is...</p>
+ </article>
+ <hr/>
+</main>
+
+<style>
+ main {
+ grid-column: col-start 2 / span 11;
+ }
+
+ .post-meta > * {
+ vertical-align: top;
+ }
+</style>
diff --git a/app/css/global.css b/app/css/global.css
new file mode 100644
index 0000000..84e9f8c
--- /dev/null
+++ b/app/css/global.css
@@ -0,0 +1,7 @@
+body {
+ display: grid;
+ font-family : 'ヒラギノ明朝 ProN' , 'Hiragino Mincho ProN' , '游明朝','游明朝体',YuMincho,'Yu Mincho' , 'MS 明朝' , 'MS Mincho' , HiraMinProN-W3 , 'TakaoEx明朝' , TakaoExMincho , 'MotoyaLCedar' , 'Droid Sans Japanese' , serif;
+ grid-template-columns: repeat(12, [col-start] 1fr);
+ grid-gap: 20px;
+ grid-auto-rows: minmax(24px, auto);
+}
diff --git a/app/css/style.css b/app/css/style.css
deleted file mode 100644
index e69de29..0000000
--- a/app/css/style.css
+++ /dev/null
diff --git a/app/forum.svelte b/app/forum.svelte
index 99ce5a8..d944d8e 100644
--- a/app/forum.svelte
+++ b/app/forum.svelte
@@ -1,35 +1,10 @@
<script>
import ForumList from './components/forum_list/forum_list.svelte';
import Header from './components/header/header.svelte';
+ import Topic from './components/topic/topic.svelte';
</script>
-<main class="topic">
- <h1>Is this really what the forum looks like?</h1>
- <p class="topic-meta">
- <span class="topic-location">Posted on <a href="/f/interaction">Interaction</a>.</span>
- <span class="topic-ttl"><a href="/t/2a3fc567af8c897ca6f55fb5fj">3 days remaining</a>.</span>
- </p>
- <p class="topic-tags">
- Tags:
- <a href="/t/question">question<span class="tag-weight">(5)</span></a>
- <a href="/t/meta">meta<span class="tag-weight">(34)</span></a>
- <a href="/t/carrots">carrots<span class="tag-weight">(1)</span></a>
- <a href="/t/tpbo">tpbo<span class="tag-weight">(2)</span></a>
- </p>
- <article class="post">
- <footer>
- <span class="post-author">By: <a href="/a/rbdr">rbdr</a>.</span>
- <span class="post-date"><a href="/p/a80c70ea0120387123097ce1907ff">2018-08-14 03:32:10</a></span>
- <p>So, I’m new here and I had heard a lot about the forums.<br><br>Is this really it??<br><br>It has barely any features, also I think I accidentaally created a post without a board? what’s up with that??</p>
- </footer>
- </article>
-</main>
<Header />
+<Topic />
<ForumList />
-
-<style>
- h1 {
- color: magenta;
- }
-</style>
diff --git a/app/index.html b/app/index.html
index 7dad472..7c4d601 100644
--- a/app/index.html
+++ b/app/index.html
@@ -1,16 +1,24 @@
<!doctype html>
-<html>
+<html lang="en">
<head>
<meta charset="utf-8">
<meta name="description" content="A forum for the year 3000">
<meta name="robots" content="noindex, nofollow" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="theme-color" content="#ffffff">
<title>Forum.</title>
+ <link rel="manifest" href="./manifest.webmanifest">
+
<script defer src="./application.js"></script>
- <link href="./css/style.css" rel="stylesheet">
+ <link href="./css/global.css" rel="stylesheet">
</head>
<body>
+ <noscript>
+ <h1>Javascript Required.</h1>
+ <p>Please enable Javascript to use this forum.</p>
+ </noscript>
</body>
</html>
diff --git a/app/manifest.json b/app/manifest.json
new file mode 100644
index 0000000..dbeaa18
--- /dev/null
+++ b/app/manifest.json
@@ -0,0 +1,8 @@
+{
+ "name": "Forum",
+ "short_name": "Forum",
+ start_url": "/",
+"background_color": "#ffffff",
+ "display": "standalone",
+ "theme_color": "#ffffff"
+}
diff --git a/app/manifest.webmanifest b/app/manifest.webmanifest
new file mode 100644
index 0000000..68a60f7
--- /dev/null
+++ b/app/manifest.webmanifest
@@ -0,0 +1,7 @@
+{
+ "name": "Forum",
+ "start_url": "/",
+ "background_color": "#ffffff",
+ "display": "standalone",
+ "theme_color": "#ffffff"
+}
diff --git a/app/models/forums.js b/app/stores/forums.js
index 211181e..adc8758 100644
--- a/app/models/forums.js
+++ b/app/stores/forums.js
@@ -5,67 +5,67 @@ const internals = {};
internals.forums = [
{
id: 'life',
- kanji: '命',
+ glyph: '☆',
label: 'Life'
},
{
id: 'the-world',
- kanji: '世',
+ glyph: '◯',
label: 'The World'
},
{
id: 'online',
- kanji: '直結',
+ glyph: '⏀',
label: 'Online'
},
{
id: 'experience',
- kanji: '体験',
+ glyph: '♢',
label: 'Experience'
},
{
id: 'belief',
- kanji: '信念',
+ glyph: '⏃',
label: 'Belief'
},
{
id: 'movement',
- kanji: '動',
+ glyph: '▷',
label: 'Movement'
},
{
id: 'emotion',
- kanji: '情',
+ glyph: '☽',
label: 'Emotion'
},
{
id: 'interaction',
- kanji: '交流',
+ glyph: '〒',
label: 'Interaction'
},
{
id: 'structure',
- kanji: '構造',
+ glyph: '▢',
label: 'Structure'
},
{
id: 'sound',
- kanji: '音',
+ glyph: '〰',
label: 'Sound'
},
{
id: 'words',
- kanji: '言葉',
+ glyph: '╳',
label: 'Words'
},
{
id: 'us',
- kanji: '一同',
+ glyph: '╱',
label: 'Us'
},
{
id: 'everything',
- kanji: '何事も',
+ glyph: '♡',
label: 'Everything'
}
];
@@ -78,7 +78,7 @@ export function addForum() {
forums.update((forums) => ([...forums,
{
id,
- kanji: 'の',
+ glyph: 'の',
label: `Woah ${id}`
}
]));
diff --git a/app/utils/glyph_hash.js b/app/utils/glyph_hash.js
new file mode 100644
index 0000000..c074376
--- /dev/null
+++ b/app/utils/glyph_hash.js
@@ -0,0 +1,38 @@
+const internals = {
+ kSplitterRegex: /.{1,8}/g,
+ kGlyphs: [
+ "☽",
+ "☆",
+ "♢",
+ "♡",
+ "╱",
+ "╲",
+ "╳",
+ "〰",
+ "▷",
+ "⏊",
+ "〒",
+ "▢",
+ "◯",
+ "⏃",
+ "⏀",
+ "⏆"
+ ]
+};
+
+// Return a glyph with color based on a 4 byte fragment of a UUIDv4
+const getGlyphHashFragment = function (uuidFragment) {
+
+ const glyphIndex = parseInt(uuidFragment.substring(0,2), 16) % 16;
+ return {
+ glyph: internals.kGlyphs[glyphIndex],
+ color: `#${uuidFragment.substring(2,8)}`
+ }
+};
+
+// Return an array of glyphs based on a UUIDv4
+export const getGlyphHash = function (uuid) {
+
+ const hashFragments = uuid.match(internals.kSplitterRegex);
+ return hashFragments.map(getGlyphHashFragment);
+};
diff --git a/doc/COVERAGE.md b/doc/COVERAGE.md
new file mode 100644
index 0000000..dd1f5ef
--- /dev/null
+++ b/doc/COVERAGE.md
@@ -0,0 +1,31 @@
+# Code Quality Report
+Thu Nov 15 2018 01:45:42 GMT+0100 (Central European Standard Time)
+
+## Tests
+
+**Application Loader**
+✔ 1) Should instantiate and start Forum on window load (18 ms)
+
+
+1 test
+0 tests failed
+0 tests skipped
+
+Test duration: 27 ms
+
+
+## Leaks
+The following global variable leaks were detected:_registeredHandlers, _eventHandlers, DOMException, NamedNodeMap, Attr, Node, Element, DocumentFragment, HTMLDocument, Document, XMLDocument, CharacterData, Text, CDATASection, ProcessingInstruction, Comment, DocumentType, DOMImplementation, NodeList, HTMLCollection, HTMLOptionsCollection, DOMStringMap, DOMTokenList, SVGAnimatedString, SVGNumber, SVGStringList, Event, CloseEvent, CustomEvent, MessageEvent, ErrorEvent, HashChangeEvent, FocusEvent, PopStateEvent, UIEvent, MouseEvent, KeyboardEvent, TouchEvent, ProgressEvent, CompositionEvent, WheelEvent, EventTarget, BarProp, Location, History, Screen, Performance, Blob, File, FileList, DOMParser, FormData, XMLHttpRequestEventTarget, XMLHttpRequestUpload, NodeIterator, TreeWalker, HTMLElement, HTMLAnchorElement, HTMLAreaElement, HTMLAudioElement, HTMLBaseElement, HTMLBodyElement, HTMLBRElement, HTMLButtonElement, HTMLCanvasElement, HTMLDataElement, HTMLDataListElement, HTMLDetailsElement, HTMLDialogElement, HTMLDirectoryElement, HTMLDivElement, HTMLDListElement, HTMLEmbedElement, HTMLFieldSetElement, HTMLFontElement, HTMLFormElement, HTMLFrameElement, HTMLFrameSetElement, HTMLHeadingElement, HTMLHeadElement, HTMLHRElement, HTMLHtmlElement, HTMLIFrameElement, HTMLImageElement, HTMLInputElement, HTMLLabelElement, HTMLLegendElement, HTMLLIElement, HTMLLinkElement, HTMLMapElement, HTMLMarqueeElement, HTMLMediaElement, HTMLMenuElement, HTMLMetaElement, HTMLMeterElement, HTMLModElement, HTMLObjectElement, HTMLOListElement, HTMLOptGroupElement, HTMLOptionElement, HTMLOutputElement, HTMLParagraphElement, HTMLParamElement, HTMLPictureElement, HTMLPreElement, HTMLProgressElement, HTMLQuoteElement, HTMLScriptElement, HTMLSelectElement, HTMLSourceElement, HTMLSpanElement, HTMLStyleElement, HTMLTableCaptionElement, HTMLTableCellElement, HTMLTableColElement, HTMLTableElement, HTMLTimeElement, HTMLTitleElement, HTMLTableRowElement, HTMLTableSectionElement, HTMLTemplateElement, HTMLTextAreaElement, HTMLTrackElement, HTMLUListElement, HTMLUnknownElement, HTMLVideoElement, SVGElement, SVGGraphicsElement, SVGSVGElement, StyleSheet, MediaList, CSSStyleSheet, CSSRule, CSSStyleRule, CSSMediaRule, CSSImportRule, CSSStyleDeclaration, StyleSheetList, XPathException, XPathExpression, XPathResult, XPathEvaluator, NodeFilter, Window, _globalProxy, _document, _sessionHistory, _virtualConsole, _runScripts, _top, _parent, _frameElement, _length, _pretendToBeVisual, length, window, frameElement, frames, self, parent, top, document, external, location, history, navigator, locationbar, menubar, personalbar, scrollbars, statusbar, toolbar, performance, screen, addEventListener, removeEventListener, dispatchEvent, __stopAllTimers, Option, Image, Audio, postMessage, atob, btoa, FileReader, WebSocket, AbortSignal, AbortController, XMLHttpRequest, stop, close, getComputedStyle, captureEvents, releaseEvents, name, devicePixelRatio, innerWidth, innerHeight, outerWidth, outerHeight, pageXOffset, pageYOffset, screenX, screenY, scrollX, scrollY, screenLeft, screenTop, alert, blur, confirm, focus, moveBy, moveTo, open, print, prompt, resizeBy, resizeTo, scroll, scrollBy, scrollTo
+
+
+## Coverage
+Threshold: 100%
+Coverage: 0.00% (0/0)
+
+
+
+## Linting
+Warnings threshold: 0
+Errors threshold: 0
+No issues
+
diff --git a/docker-compose.yml b/docker-compose.yml
index 3551ec6..03bf6b8 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -14,6 +14,6 @@ services:
links:
- db
db:
- image: rethinkdb:2.3.7
+ image: rethinkdb:2.4
ports:
- "8080:8080"
diff --git a/package-lock.json b/package-lock.json
index c3321cc..03ba9cb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -969,6 +969,15 @@
"@hapi/joi": "16.x.x"
}
},
+ "@hapi/code": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@hapi/code/-/code-7.0.0.tgz",
+ "integrity": "sha512-fTq1x12vpchD/+9WfxhUbEnlEPVv5QNrsymw9/fSyN/mKNBfQmkv4Ssq3cDgW6mDyN4oiVFJBdLw6jpkmWZ9dQ==",
+ "dev": true,
+ "requires": {
+ "@hapi/hoek": "8.x.x"
+ }
+ },
"@hapi/eslint-config-hapi": {
"version": "12.3.0",
"resolved": "https://registry.npmjs.org/@hapi/eslint-config-hapi/-/eslint-config-hapi-12.3.0.tgz",
@@ -1033,63 +1042,6 @@
"supports-color": "7.x.x",
"typescript": "3.6.x",
"will-call": "1.x.x"
- },
- "dependencies": {
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- },
- "dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "requires": {
- "path-type": "^4.0.0"
- }
- },
- "globby": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz",
- "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==",
- "dev": true,
- "requires": {
- "@types/glob": "^7.1.1",
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.0.3",
- "glob": "^7.1.3",
- "ignore": "^5.1.1",
- "merge2": "^1.2.3",
- "slash": "^3.0.0"
- }
- },
- "ignore": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
- "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
- "dev": true
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- },
- "seedrandom": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
- "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==",
- "dev": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- }
}
},
"@hapi/pinpoint": {
@@ -1574,6 +1526,12 @@
"integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
"dev": true
},
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
"array-unique": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
@@ -3348,6 +3306,15 @@
"randombytes": "^2.0.0"
}
},
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
"dmd": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/dmd/-/dmd-4.0.6.tgz",
@@ -4057,6 +4024,15 @@
"flat-cache": "^2.0.1"
}
},
+ "file-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/file-match/-/file-match-1.0.2.tgz",
+ "integrity": "sha1-ycrSZdLIrfOoFHWw30dYWQafrvc=",
+ "dev": true,
+ "requires": {
+ "utils-extend": "^1.0.6"
+ }
+ },
"file-set": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/file-set/-/file-set-3.0.0.tgz",
@@ -4067,6 +4043,16 @@
"glob": "^7.1.5"
}
},
+ "file-system": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/file-system/-/file-system-2.2.2.tgz",
+ "integrity": "sha1-fWWDPjojR9zZVqgTxncVPtPt2Yc=",
+ "dev": true,
+ "requires": {
+ "file-match": "^1.0.1",
+ "utils-extend": "^1.0.4"
+ }
+ },
"file-uri-to-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
@@ -4871,6 +4857,30 @@
"type-fest": "^0.8.1"
}
},
+ "globby": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz",
+ "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "^7.1.1",
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.0.3",
+ "glob": "^7.1.3",
+ "ignore": "^5.1.1",
+ "merge2": "^1.2.3",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "ignore": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
+ "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
+ "dev": true
+ }
+ }
+ },
"graceful-fs": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
@@ -7170,6 +7180,17 @@
}
}
},
+ "parcel-plugin-static-files-copy": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/parcel-plugin-static-files-copy/-/parcel-plugin-static-files-copy-2.2.1.tgz",
+ "integrity": "sha512-Mj//+258Q05ZL72uD1VDJZ7jOW4PuwJO5WNM7ODpgHtDwXlhIURklSX0Ua8J4d/Vr1xWkNCg2HIVlhacdZ3M3w==",
+ "dev": true,
+ "requires": {
+ "file-system": "2.2.2",
+ "minimatch": "3.0.4",
+ "path": "0.12.7"
+ }
+ },
"parcel-plugin-svelte": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/parcel-plugin-svelte/-/parcel-plugin-svelte-4.0.5.tgz",
@@ -7265,6 +7286,27 @@
"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
"dev": true
},
+ "path": {
+ "version": "0.12.7",
+ "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
+ "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
+ "dev": true,
+ "requires": {
+ "process": "^0.11.1",
+ "util": "^0.10.3"
+ },
+ "dependencies": {
+ "util": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
+ "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ }
+ }
+ },
"path-browserify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
@@ -7300,6 +7342,12 @@
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"dev": true
},
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
"pbkdf2": {
"version": "3.0.17",
"resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
@@ -8654,6 +8702,12 @@
"xmlchars": "^1.3.1"
}
},
+ "seedrandom": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
+ "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==",
+ "dev": true
+ },
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -8858,6 +8912,12 @@
}
}
},
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
"slice-ansi": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
@@ -10177,11 +10237,16 @@
"object.getownpropertydescriptors": "^2.0.3"
}
},
+ "utils-extend": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/utils-extend/-/utils-extend-1.0.8.tgz",
+ "integrity": "sha1-zP17ZFQPjpDuIe7Fd2nQZRyril8=",
+ "dev": true
+ },
"uuid": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
- "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
- "dev": true
+ "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ=="
},
"v8-compile-cache": {
"version": "2.1.0",
diff --git a/package.json b/package.json
index 8694c4c..c1272d8 100644
--- a/package.json
+++ b/package.json
@@ -29,9 +29,11 @@
"koa": "^2.11.0",
"koa-send": "^5.0.0",
"koa-static": "^5.0.0",
- "rethinkdb": "^2.4.2"
+ "rethinkdb": "^2.4.2",
+ "uuid": "^3.3.3"
},
"devDependencies": {
+ "@hapi/code": "^7.0.0",
"@hapi/eslint-config-hapi": "^12.3.0",
"@hapi/eslint-plugin-hapi": "^4.3.4",
"@hapi/lab": "^21.0.0",
@@ -40,6 +42,7 @@
"jsdoc-to-markdown": "^5.0.3",
"lab-markdown-reporter": "^1.0.2",
"parcel-bundler": "^1.12.4",
+ "parcel-plugin-static-files-copy": "^2.2.1",
"parcel-plugin-svelte": "^4.0.5",
"svelte": "^3.16.5"
},
diff --git a/static/humans.txt b/static/humans.txt
new file mode 100644
index 0000000..6f54bec
--- /dev/null
+++ b/static/humans.txt
@@ -0,0 +1,15 @@
+/* TEAM */
+Maintainer: Rubén Beltrán del Río
+Site: https://unlimited.pizza
+Twitter: @pigeonfolk
+From: Berlin, Germany
+
+/* THANKS */
+Essau Ramirez: https://saumotions.com
+Twitter: @saumotions
+From: Guadalajara, Jalisco, Mexico
+
+/* SITE */
+Last update: 2019/12/26
+Language: English
+Components: Svelte
diff --git a/static/robots.txt b/static/robots.txt
new file mode 100644
index 0000000..eb05362
--- /dev/null
+++ b/static/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/test/application.js b/test/application.js
new file mode 100644
index 0000000..c02b914
--- /dev/null
+++ b/test/application.js
@@ -0,0 +1,13 @@
+const { expect } = require('@hapi/code');
+const Lab = require('@hapi/lab');
+const Forum = require('../lib/forum');
+
+const { it, describe } = exports.lab = Lab.script();
+
+describe('Forum Backend Library', () => {
+
+ it('Should initialize the server', () => {
+
+ expect(true).to.equal(true);
+ });
+});
diff --git a/test/forum.js b/test/forum.js
new file mode 100644
index 0000000..c02b914
--- /dev/null
+++ b/test/forum.js
@@ -0,0 +1,13 @@
+const { expect } = require('@hapi/code');
+const Lab = require('@hapi/lab');
+const Forum = require('../lib/forum');
+
+const { it, describe } = exports.lab = Lab.script();
+
+describe('Forum Backend Library', () => {
+
+ it('Should initialize the server', () => {
+
+ expect(true).to.equal(true);
+ });
+});