diff options
| -rw-r--r-- | app/components/forum_list/forum_list.svelte | 62 | ||||
| -rw-r--r-- | app/components/glyph/glyph.svelte | 38 | ||||
| -rw-r--r-- | app/components/header/header.svelte | 51 | ||||
| -rw-r--r-- | app/components/topic/topic.svelte | 61 | ||||
| -rw-r--r-- | app/css/global.css | 7 | ||||
| -rw-r--r-- | app/css/style.css | 0 | ||||
| -rw-r--r-- | app/forum.svelte | 29 | ||||
| -rw-r--r-- | app/index.html | 12 | ||||
| -rw-r--r-- | app/manifest.json | 8 | ||||
| -rw-r--r-- | app/manifest.webmanifest | 7 | ||||
| -rw-r--r-- | app/stores/forums.js (renamed from app/models/forums.js) | 28 | ||||
| -rw-r--r-- | app/utils/glyph_hash.js | 38 | ||||
| -rw-r--r-- | doc/COVERAGE.md | 31 | ||||
| -rw-r--r-- | docker-compose.yml | 2 | ||||
| -rw-r--r-- | package-lock.json | 183 | ||||
| -rw-r--r-- | package.json | 5 | ||||
| -rw-r--r-- | static/humans.txt | 15 | ||||
| -rw-r--r-- | static/robots.txt | 2 | ||||
| -rw-r--r-- | test/application.js | 13 | ||||
| -rw-r--r-- | test/forum.js | 13 |
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); + }); +}); |