]> git.r.bdr.sh - rbdr/forum/commitdiff
Add skeleton for topic
authorBen Beltran <redacted>
Sun, 26 Jan 2020 15:33:43 +0000 (16:33 +0100)
committerBen Beltran <redacted>
Sun, 26 Jan 2020 15:33:43 +0000 (16:33 +0100)
Tested with VoiceOver

20 files changed:
app/components/forum_list/forum_list.svelte
app/components/glyph/glyph.svelte [new file with mode: 0644]
app/components/header/header.svelte
app/components/topic/topic.svelte [new file with mode: 0644]
app/css/global.css [new file with mode: 0644]
app/css/style.css [deleted file]
app/forum.svelte
app/index.html
app/manifest.json [new file with mode: 0644]
app/manifest.webmanifest [new file with mode: 0644]
app/stores/forums.js [moved from app/models/forums.js with 76% similarity]
app/utils/glyph_hash.js [new file with mode: 0644]
doc/COVERAGE.md [new file with mode: 0644]
docker-compose.yml
package-lock.json
package.json
static/humans.txt [new file with mode: 0644]
static/robots.txt [new file with mode: 0644]
test/application.js [new file with mode: 0644]
test/forum.js [new file with mode: 0644]

index 905421ee19264eb21f3ae973d3a18dbc07bbe407..e49c8d827ef0c0757c468f4d4e8e17efe4e79d4e 100644 (file)
@@ -1,21 +1,47 @@
 <script>
 <script>
-  import {forums, addForum} from '../../models/forums.js'
-
-  import { fade } from 'svelte/transition';
+  import {forums, addForum} from '../../stores/forums.js'
 </script>
 
 </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 (file)
index 0000000..45a415b
--- /dev/null
@@ -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>
index 15b75b84bd4e4d5fc43fe7e6180fd0467103cad7..edcbc79b7a88336a56299740795c3a1a52e0af2f 100644 (file)
@@ -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>
 </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 (file)
index 0000000..367a5b8
--- /dev/null
@@ -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 (file)
index 0000000..84e9f8c
--- /dev/null
@@ -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 (file)
index e69de29..0000000
index 99ce5a8341f93b0eaf4d1bb7305a46e9bfefc271..d944d8e7b5c7aa65f82dd0d2e0ced4f4f7684d66 100644 (file)
@@ -1,35 +1,10 @@
 <script>
   import ForumList from './components/forum_list/forum_list.svelte';
   import Header from './components/header/header.svelte';
 <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>
 
 
 </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 />
 <Header />
+<Topic />
 <ForumList />
 <ForumList />
-
-<style>
-  h1 {
-    color: magenta;
-  }
-</style>
index 7dad4724c79e3ac66bcb1f2ef8ffaa263830b6b9..7c4d601387ac1032adf04a697cc193a860101e31 100644 (file)
@@ -1,16 +1,24 @@
 <!doctype html>
 <!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" />
   <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>
 
 
     <title>Forum.</title>
 
+    <link rel="manifest" href="./manifest.webmanifest">
+
     <script defer src="./application.js"></script>
 
     <script defer src="./application.js"></script>
 
-    <link href="./css/style.css" rel="stylesheet">
+    <link href="./css/global.css" rel="stylesheet">
   </head>
   <body>
   </head>
   <body>
+    <noscript>
+      <h1>Javascript Required.</h1>
+      <p>Please enable Javascript to use this forum.</p>
+    </noscript>
   </body>
 </html>
   </body>
 </html>
diff --git a/app/manifest.json b/app/manifest.json
new file mode 100644 (file)
index 0000000..dbeaa18
--- /dev/null
@@ -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 (file)
index 0000000..68a60f7
--- /dev/null
@@ -0,0 +1,7 @@
+{
+  "name": "Forum",
+  "start_url": "/",
+  "background_color": "#ffffff",
+  "display": "standalone",
+  "theme_color": "#ffffff"
+}
similarity index 76%
rename from app/models/forums.js
rename to app/stores/forums.js
index 211181eccc4d7245cfc22057a1e8d1827a8400ea..adc8758d1fc9e20a1efda07f1058b1d4bc09c880 100644 (file)
@@ -5,67 +5,67 @@ const internals = {};
 internals.forums = [
   {
     id: 'life',
 internals.forums = [
   {
     id: 'life',
-    kanji: '命',
+    glyph: '☆',
     label: 'Life'
   },
   {
     id: 'the-world',
     label: 'Life'
   },
   {
     id: 'the-world',
-    kanji: '世',
+    glyph: '◯',
     label: 'The World'
   },
   {
     id: 'online',
     label: 'The World'
   },
   {
     id: 'online',
-    kanji: '直結',
+    glyph: '⏀',
     label: 'Online'
   },
   {
     id: 'experience',
     label: 'Online'
   },
   {
     id: 'experience',
-    kanji: '体験',
+    glyph: '♢',
     label: 'Experience'
   },
   {
     id: 'belief',
     label: 'Experience'
   },
   {
     id: 'belief',
-    kanji: '信念',
+    glyph: '⏃',
     label: 'Belief'
   },
   {
     id: 'movement',
     label: 'Belief'
   },
   {
     id: 'movement',
-    kanji: '動',
+    glyph: '▷',
     label: 'Movement'
   },
   {
     id: 'emotion',
     label: 'Movement'
   },
   {
     id: 'emotion',
-    kanji: '情',
+    glyph: '☽',
     label: 'Emotion'
   },
   {
     id: 'interaction',
     label: 'Emotion'
   },
   {
     id: 'interaction',
-    kanji: '交流',
+    glyph: '〒',
     label: 'Interaction'
   },
   {
     id: 'structure',
     label: 'Interaction'
   },
   {
     id: 'structure',
-    kanji: '構造',
+    glyph: '▢',
     label: 'Structure'
   },
   {
     id: 'sound',
     label: 'Structure'
   },
   {
     id: 'sound',
-    kanji: '音',
+    glyph: '〰',
     label: 'Sound'
   },
   {
     id: 'words',
     label: 'Sound'
   },
   {
     id: 'words',
-    kanji: '言葉',
+    glyph: '╳',
     label: 'Words'
   },
   {
     id: 'us',
     label: 'Words'
   },
   {
     id: 'us',
-    kanji: '一同',
+    glyph: '╱',
     label: 'Us'
   },
   {
     id: 'everything',
     label: 'Us'
   },
   {
     id: 'everything',
-    kanji: '何事も',
+    glyph: '♡',
     label: 'Everything'
   }
 ];
     label: 'Everything'
   }
 ];
@@ -78,7 +78,7 @@ export function addForum() {
   forums.update((forums) => ([...forums,
     {
       id,
   forums.update((forums) => ([...forums,
     {
       id,
-      kanji: 'の',
+      glyph: 'の',
       label: `Woah ${id}`
     }
   ]));
       label: `Woah ${id}`
     }
   ]));
diff --git a/app/utils/glyph_hash.js b/app/utils/glyph_hash.js
new file mode 100644 (file)
index 0000000..c074376
--- /dev/null
@@ -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 (file)
index 0000000..dd1f5ef
--- /dev/null
@@ -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  
+  
index 3551ec61323d3f0717bc8e2d782e3120ff7fb046..03bf6b86a52c7892be6470974d0c91da38a7d9f0 100644 (file)
@@ -14,6 +14,6 @@ services:
     links:
       - db
   db:
     links:
       - db
   db:
-    image: rethinkdb:2.3.7
+    image: rethinkdb:2.4
     ports:
       - "8080:8080"
     ports:
       - "8080:8080"
index c3321cc70e66ca129a5d200f49a33ac96d0d9768..03ba9cb68cd2f94c7818c138b30d66f8bd65251a 100644 (file)
         "@hapi/joi": "16.x.x"
       }
     },
         "@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",
     "@hapi/eslint-config-hapi": {
       "version": "12.3.0",
       "resolved": "https://registry.npmjs.org/@hapi/eslint-config-hapi/-/eslint-config-hapi-12.3.0.tgz",
         "supports-color": "7.x.x",
         "typescript": "3.6.x",
         "will-call": "1.x.x"
         "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": {
       }
     },
     "@hapi/pinpoint": {
       "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
       "dev": true
     },
       "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",
     "array-unique": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
         "randombytes": "^2.0.0"
       }
     },
         "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",
     "dmd": {
       "version": "4.0.6",
       "resolved": "https://registry.npmjs.org/dmd/-/dmd-4.0.6.tgz",
         "flat-cache": "^2.0.1"
       }
     },
         "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",
     "file-set": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/file-set/-/file-set-3.0.0.tgz",
         "glob": "^7.1.5"
       }
     },
         "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",
     "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",
         "type-fest": "^0.8.1"
       }
     },
         "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",
     "graceful-fs": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
         }
       }
     },
         }
       }
     },
+    "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",
     "parcel-plugin-svelte": {
       "version": "4.0.5",
       "resolved": "https://registry.npmjs.org/parcel-plugin-svelte/-/parcel-plugin-svelte-4.0.5.tgz",
       "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
       "dev": true
     },
       "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",
     "path-browserify": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
       "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
       "dev": true
     },
       "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",
     "pbkdf2": {
       "version": "3.0.17",
       "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
         "xmlchars": "^1.3.1"
       }
     },
         "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",
     "semver": {
       "version": "6.3.0",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
         }
       }
     },
         }
       }
     },
+    "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",
     "slice-ansi": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
         "object.getownpropertydescriptors": "^2.0.3"
       }
     },
         "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",
     "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",
     },
     "v8-compile-cache": {
       "version": "2.1.0",
index 8694c4c7678cc858eccfc1299f25df18b9a502d8..c1272d8bd2d8ab0d86db8231ee58b50a020ff768 100644 (file)
     "koa": "^2.11.0",
     "koa-send": "^5.0.0",
     "koa-static": "^5.0.0",
     "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": {
   },
   "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",
     "@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",
     "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"
   },
     "parcel-plugin-svelte": "^4.0.5",
     "svelte": "^3.16.5"
   },
diff --git a/static/humans.txt b/static/humans.txt
new file mode 100644 (file)
index 0000000..6f54bec
--- /dev/null
@@ -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 (file)
index 0000000..eb05362
--- /dev/null
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/test/application.js b/test/application.js
new file mode 100644 (file)
index 0000000..c02b914
--- /dev/null
@@ -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 (file)
index 0000000..c02b914
--- /dev/null
@@ -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);
+  });
+});