new homepage and documentation pages

pull/45/head
unknown 2019-03-13 12:55:35 -04:00
parent 4c43371f90
commit 45e9cef1ae
16 changed files with 526 additions and 93 deletions

View File

@ -1,13 +1,11 @@
# River of Ebooks # River of Ebooks
https://github.com/EbookFoundation/RoE-pipe
## About ## About
The River of Ebooks serves as an easy-to-use ebook aggregator. Publishers can send metadata from new and updated ebooks through the River where it will be available for any downstream consumers to read, allowing for a more widely available ebook collection. This way, ebooks can be made available on all end user sites, instead of only the site they were published with. The River of Ebooks serves as an easy-to-use ebook aggregator. Publishers can send metadata from new and updated ebooks through the River where it will be available for any downstream consumers to read, allowing for a more widely available ebook collection. This way, ebooks can be made available on all end user sites, instead of only the site they were published with.
----- -----
### Links
+ [Sails framework documentation](https://sailsjs.com/documentation)
### Version info ### Version info
This app was originally generated on Tue Oct 16 2018 01:21:31 GMT+0000 (UTC) using Sails v1.0.2. This app was originally generated on Tue Oct 16 2018 01:21:31 GMT+0000 (UTC) using Sails v1.0.2.
<!-- Internally, Sails used [`sails-generate@1.15.28`](https://github.com/balderdashy/sails-generate/tree/v1.15.28/lib/core-generators/new). --> <!-- Internally, Sails used [`sails-generate@1.15.28`](https://github.com/balderdashy/sails-generate/tree/v1.15.28/lib/core-generators/new). -->

View File

@ -0,0 +1,21 @@
module.exports = {
show: async function (req, res) {
const docsHelper = await sails.helpers.docs()
const content = await docsHelper.read('README', '../../')
res.view('pages/index', {
content
})
},
docs: async function (req, res) {
const docsHelper = await sails.helpers.docs()
const page = req.param('page')
if (!page || !(['api', 'integrations', 'webhooks'].includes(page))) {
return res.notFound()
}
const content = await docsHelper.read(page)
res.view('pages/index', {
active: page,
content
})
}
}

35
api/helpers/docs.js Normal file
View File

@ -0,0 +1,35 @@
const showdown = require('showdown')
const fs = require('fs')
const path = require('path')
showdown.setFlavor('github')
const converter = new showdown.Converter()
module.exports = {
friendlyName: 'Load DocsHelper',
description: 'Load a DocsHelper instance',
inputs: {},
exits: {
success: {
outputFriendlyName: 'Docs helper',
outputDescription: 'A DocsHelper instance'
}
},
fn: async function (inputs, exits) {
return exits.success(new DocsHelper())
}
}
class DocsHelper {
read (file, relPath = '../../docs') {
return new Promise((resolve, reject) => {
fs.readFile(path.join(__dirname, relPath, `${file}.md`), { encoding: 'utf8' }, (err, data) => {
if (err) reject(err)
resolve(converter.makeHtml(data))
})
})
}
convert (md) {
return converter.makeHtml(md)
}
}

View File

@ -80,3 +80,106 @@
} }
} }
} }
.home {
header {
height: 50px;
line-height: 50px;
.logo {
color: $black-1;
text-decoration: none;
font-size: 1.2em;
padding: 0 20px;
}
nav {
a {
text-decoration: none;
display: inline-block;
line-height: 50px;
padding: 0 20px;
color: $accent-2;
&:hover {
text-decoration: underline;
}
&:last-of-type {
line-height: 40px;
height: 40px;
margin: 5px 20px 5px 0;
background: $accent-1;
color: $text-light-1;
border-radius: 3px;
}
}
}
}
footer {
height: 40px;
line-height: 40px;
background: $accent-1;
color: white;
padding: 0 20px;
box-shadow: $shadow-3;
a {
color: $accent-3;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
main {
background: white;
width: 85%;
max-width: 900px;
box-shadow: $shadow-1;
padding: 100px 60px 140px 60px;
margin: 60px auto 100px auto;
h2,
h3,
h4 {
margin: 40px 0 10px 0;
font-weight: normal;
color: $black-1;
}
hr {
border: none;
border-top: 1px solid $black-3;
margin: 40px 80px;
}
a {
color: $accent-2;
}
pre {
background: $black-5;
padding: 10px;
border-radius: 3px;
&:before {
display: block;
content: '';
background: $accent-3;
height: 100%;
width: 2px;
top: 0;
left: 0;
}
code {
background: transparent;
padding: 0;
}
}
code {
background: $black-5;
padding: 2px 5px;
border-radius: 3px;
}
p {
line-height: 1.4em;
}
}
}

View File

@ -1,7 +1,7 @@
<% var key, item %> <% var key, item %>
<% htmlWebpackPlugin.options.links = htmlWebpackPlugin.options.links || [] %> <% htmlWebpackPlugin.options.links = htmlWebpackPlugin.options.links || [] %>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="en-US">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>River of Ebooks | admin</title> <title>River of Ebooks | admin</title>
@ -10,7 +10,7 @@
if (typeof item === 'string' || item instanceof String) { item = { href: item, rel: 'stylesheet' } } %> if (typeof item === 'string' || item instanceof String) { item = { href: item, rel: 'stylesheet' } } %>
<link<% for (key in item) { %> <%= key %>="<%= item[key] %>"<% } %> /><% <link<% for (key in item) { %> <%= key %>="<%= item[key] %>"<% } %> /><%
} %> } %>
<meta name="viewport" content="initial-scale=1, width=device-width, maximum-scale=1, minimum-scale=1, user-scalable=no" /> <meta name="viewport" content="initial-scale=1, width=device-width, maximum-scale=1, minimum-scale=1" />
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

View File

@ -1,7 +1,7 @@
<% var key, item %> <% var key, item %>
<% htmlWebpackPlugin.options.links = htmlWebpackPlugin.options.links || [] %> <% htmlWebpackPlugin.options.links = htmlWebpackPlugin.options.links || [] %>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="en-US">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>River of Ebooks</title> <title>River of Ebooks</title>
@ -10,7 +10,7 @@
if (typeof item === 'string' || item instanceof String) { item = { href: item, rel: 'stylesheet' } } %> if (typeof item === 'string' || item instanceof String) { item = { href: item, rel: 'stylesheet' } } %>
<link<% for (key in item) { %> <%= key %>="<%= item[key] %>"<% } %> /><% <link<% for (key in item) { %> <%= key %>="<%= item[key] %>"<% } %> /><%
} %> } %>
<meta name="viewport" content="initial-scale=1, width=device-width, maximum-scale=1, minimum-scale=1, user-scalable=no" /> <meta name="viewport" content="initial-scale=1, width=device-width, maximum-scale=1, minimum-scale=1" />
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

View File

@ -1,7 +1,7 @@
<% var key, item %> <% var key, item %>
<% htmlWebpackPlugin.options.links = htmlWebpackPlugin.options.links || [] %> <% htmlWebpackPlugin.options.links = htmlWebpackPlugin.options.links || [] %>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="en-US">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>River of Ebooks - Login</title> <title>River of Ebooks - Login</title>
@ -10,7 +10,7 @@
if (typeof item === 'string' || item instanceof String) { item = { href: item, rel: 'stylesheet' } } %> if (typeof item === 'string' || item instanceof String) { item = { href: item, rel: 'stylesheet' } } %>
<link<% for (key in item) { %> <%= key %>="<%= item[key] %>"<% } %> /><% <link<% for (key in item) { %> <%= key %>="<%= item[key] %>"<% } %> /><%
} %> } %>
<meta name="viewport" content="initial-scale=1, width=device-width, maximum-scale=1, minimum-scale=1, user-scalable=no" /> <meta name="viewport" content="initial-scale=1, width=device-width, maximum-scale=1, minimum-scale=1" />
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

View File

@ -22,9 +22,9 @@ module.exports.routes = {
* * * *
***************************************************************************/ ***************************************************************************/
'GET /': { 'GET /': 'HomeController.show',
view: 'pages/index' 'GET /docs/:page': 'HomeController.docs',
},
'GET /login': { 'GET /login': {
view: 'pages/login' view: 'pages/login'
}, },

View File

View File

@ -2,7 +2,7 @@
## Information on existing RoE integrations with other websites and services ## Information on existing RoE integrations with other websites and services
### readthedocs.org ### - readthedocs.org
[view on github](https://github.com/ghowardsit/readthedocs.org) [view on github](https://github.com/ghowardsit/readthedocs.org)
New ebooks published using ReadTheDocs will automatically be sent to the River of Ebooks. New ebooks published using ReadTheDocs will automatically be sent to the River of Ebooks.

View File

@ -1,4 +1,4 @@
# River of Ebooks signed requests # River of Ebooks webhooks and signed requests
## Information on how to receive new publications from RoE ## Information on how to receive new publications from RoE
To have RoE send your service any newly published or updated ebooks, you will first need to register an account and then create a Push URI. RoE will send a POST request containing the OPDS2 metadata from any published or updated book to each valid URL. The POST body structure can be viewed in the [API documentation](docs/api). To have RoE send your service any newly published or updated ebooks, you will first need to register an account and then create a Push URI. RoE will send a POST request containing the OPDS2 metadata from any published or updated book to each valid URL. The POST body structure can be viewed in the [API documentation](docs/api).

View File

@ -52,6 +52,7 @@
"sails-hook-orm": "^2.1.1", "sails-hook-orm": "^2.1.1",
"sails-hook-sockets": "^1.4.0", "sails-hook-sockets": "^1.4.0",
"sails-postgresql": "^1.0.2", "sails-postgresql": "^1.0.2",
"showdown": "^1.9.0",
"ta-json-x": "^2.5.0", "ta-json-x": "^2.5.0",
"xmldom": "^0.1.27" "xmldom": "^0.1.27"
}, },

View File

@ -3,6 +3,7 @@ dependencies:
r2-utils-js: 1.0.6 r2-utils-js: 1.0.6
request: 2.88.0 request: 2.88.0
sails-postgresql: 1.0.2 sails-postgresql: 1.0.2
showdown: 1.9.0
ta-json-x: 2.5.0 ta-json-x: 2.5.0
xmldom: 0.1.27 xmldom: 0.1.27
devDependencies: devDependencies:
@ -35,6 +36,12 @@ packages:
node: '>=0.10.0' node: '>=0.10.0'
resolution: resolution:
integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8= integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
/ansi-regex/3.0.0:
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
/ansi-styles/2.2.1: /ansi-styles/2.2.1:
dev: false dev: false
engines: engines:
@ -176,6 +183,12 @@ packages:
node: '>=0.2.0' node: '>=0.2.0'
resolution: resolution:
integrity: sha1-skV5w77U1tOWru5tmorn9Ugqt7s= integrity: sha1-skV5w77U1tOWru5tmorn9Ugqt7s=
/camelcase/4.1.0:
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
/caseless/0.12.0: /caseless/0.12.0:
dev: false dev: false
resolution: resolution:
@ -198,6 +211,20 @@ packages:
node: '>=0.10.0' node: '>=0.10.0'
resolution: resolution:
integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
/cliui/4.1.0:
dependencies:
string-width: 2.1.1
strip-ansi: 4.0.0
wrap-ansi: 2.1.0
dev: false
resolution:
integrity: sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==
/code-point-at/1.1.0:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
/combined-stream/1.0.7: /combined-stream/1.0.7:
dependencies: dependencies:
delayed-stream: 1.0.0 delayed-stream: 1.0.0
@ -222,6 +249,14 @@ packages:
dev: false dev: false
resolution: resolution:
integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
/cross-spawn/5.1.0:
dependencies:
lru-cache: 4.1.5
shebang-command: 1.2.0
which: 1.3.1
dev: false
resolution:
integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
/dashdash/1.14.1: /dashdash/1.14.1:
dependencies: dependencies:
assert-plus: 1.0.0 assert-plus: 1.0.0
@ -248,6 +283,12 @@ packages:
dev: false dev: false
resolution: resolution:
integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
/decamelize/1.2.0:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
/delayed-stream/1.0.0: /delayed-stream/1.0.0:
dev: false dev: false
engines: engines:
@ -285,6 +326,20 @@ packages:
node: '>=0.8.0' node: '>=0.8.0'
resolution: resolution:
integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
/execa/0.7.0:
dependencies:
cross-spawn: 5.1.0
get-stream: 3.0.0
is-stream: 1.1.0
npm-run-path: 2.0.2
p-finally: 1.0.0
signal-exit: 3.0.2
strip-eof: 1.0.0
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
/expand-brackets/0.1.5: /expand-brackets/0.1.5:
dependencies: dependencies:
is-posix-bracket: 0.1.1 is-posix-bracket: 0.1.1
@ -392,6 +447,14 @@ packages:
node: '>=0.10.0' node: '>=0.10.0'
resolution: resolution:
integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==
/find-up/2.1.0:
dependencies:
locate-path: 2.0.0
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
/findup-sync/0.4.3: /findup-sync/0.4.3:
dependencies: dependencies:
detect-file: 0.1.0 detect-file: 0.1.0
@ -486,6 +549,16 @@ packages:
node: '>= 0.8.0' node: '>= 0.8.0'
resolution: resolution:
integrity: sha1-OMYYhRPhQDCUjsblz2VSPZd5KZs= integrity: sha1-OMYYhRPhQDCUjsblz2VSPZd5KZs=
/get-caller-file/1.0.3:
dev: false
resolution:
integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
/get-stream/3.0.0:
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
/getpass/0.1.7: /getpass/0.1.7:
dependencies: dependencies:
assert-plus: 1.0.0 assert-plus: 1.0.0
@ -630,6 +703,12 @@ packages:
dev: true dev: true
resolution: resolution:
integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
/invert-kv/1.0.0:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
/is-buffer/1.1.6: /is-buffer/1.1.6:
dev: false dev: false
resolution: resolution:
@ -660,6 +739,20 @@ packages:
node: '>=0.10.0' node: '>=0.10.0'
resolution: resolution:
integrity: sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= integrity: sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=
/is-fullwidth-code-point/1.0.0:
dependencies:
number-is-nan: 1.0.1
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
/is-fullwidth-code-point/2.0.0:
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
/is-glob/2.0.1: /is-glob/2.0.1:
dependencies: dependencies:
is-extglob: 1.0.0 is-extglob: 1.0.0
@ -694,6 +787,12 @@ packages:
node: '>=0.10.0' node: '>=0.10.0'
resolution: resolution:
integrity: sha1-IHurkWOEmcB7Kt8kCkGochADRXU= integrity: sha1-IHurkWOEmcB7Kt8kCkGochADRXU=
/is-stream/1.1.0:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
/is-typedarray/1.0.0: /is-typedarray/1.0.0:
dev: false dev: false
resolution: resolution:
@ -814,6 +913,14 @@ packages:
hasBin: true hasBin: true
resolution: resolution:
integrity: sha1-V5P1efB6KTi/mHRpPXS7pVxbqhw= integrity: sha1-V5P1efB6KTi/mHRpPXS7pVxbqhw=
/lcid/1.0.0:
dependencies:
invert-kv: 1.0.0
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
/liftoff/2.2.5: /liftoff/2.2.5:
dependencies: dependencies:
extend: 3.0.2 extend: 3.0.2
@ -830,6 +937,15 @@ packages:
dev: false dev: false
resolution: resolution:
integrity: sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= integrity: sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=
/locate-path/2.0.0:
dependencies:
p-locate: 2.0.0
path-exists: 3.0.0
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
/lodash/4.17.11: /lodash/4.17.11:
dev: false dev: false
resolution: resolution:
@ -841,6 +957,13 @@ packages:
hasBin: true hasBin: true
resolution: resolution:
integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
/lru-cache/4.1.5:
dependencies:
pseudomap: 1.0.2
yallist: 2.1.2
dev: false
resolution:
integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
/machine/15.2.2: /machine/15.2.2:
dependencies: dependencies:
'@sailshq/lodash': 3.10.3 '@sailshq/lodash': 3.10.3
@ -867,6 +990,14 @@ packages:
dev: false dev: false
resolution: resolution:
integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==
/mem/1.1.0:
dependencies:
mimic-fn: 1.2.0
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=
/micromatch/2.3.11: /micromatch/2.3.11:
dependencies: dependencies:
arr-diff: 2.0.0 arr-diff: 2.0.0
@ -901,6 +1032,12 @@ packages:
node: '>= 0.6' node: '>= 0.6'
resolution: resolution:
integrity: sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== integrity: sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==
/mimic-fn/1.2.0:
dev: false
engines:
node: '>=4'
resolution:
integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
/minimatch/3.0.4: /minimatch/3.0.4:
dependencies: dependencies:
brace-expansion: 1.1.11 brace-expansion: 1.1.11
@ -952,6 +1089,20 @@ packages:
node: '>=0.10.0' node: '>=0.10.0'
resolution: resolution:
integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
/npm-run-path/2.0.2:
dependencies:
path-key: 2.0.1
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
/number-is-nan/1.0.1:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
/oauth-sign/0.9.0: /oauth-sign/0.9.0:
dev: false dev: false
resolution: resolution:
@ -989,6 +1140,44 @@ packages:
node: '>=0.10.0' node: '>=0.10.0'
resolution: resolution:
integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M= integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
/os-locale/2.1.0:
dependencies:
execa: 0.7.0
lcid: 1.0.0
mem: 1.1.0
dev: false
engines:
node: '>=4'
resolution:
integrity: sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==
/p-finally/1.0.0:
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
/p-limit/1.3.0:
dependencies:
p-try: 1.0.0
dev: false
engines:
node: '>=4'
resolution:
integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
/p-locate/2.0.0:
dependencies:
p-limit: 1.3.0
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
/p-try/1.0.0:
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
/packet-reader/0.2.0: /packet-reader/0.2.0:
dev: false dev: false
resolution: resolution:
@ -1018,12 +1207,24 @@ packages:
node: '>=0.10.0' node: '>=0.10.0'
resolution: resolution:
integrity: sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= integrity: sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
/path-exists/3.0.0:
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
/path-is-absolute/1.0.1: /path-is-absolute/1.0.1:
dev: false dev: false
engines: engines:
node: '>=0.10.0' node: '>=0.10.0'
resolution: resolution:
integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
/path-key/2.0.1:
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
/path-parse/1.0.6: /path-parse/1.0.6:
dev: false dev: false
resolution: resolution:
@ -1142,6 +1343,10 @@ packages:
dev: false dev: false
resolution: resolution:
integrity: sha1-zv9d2J0+XxD7deHo52vHWAGlnDQ= integrity: sha1-zv9d2J0+XxD7deHo52vHWAGlnDQ=
/pseudomap/1.0.2:
dev: false
resolution:
integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
/psl/1.1.31: /psl/1.1.31:
dev: false dev: false
resolution: resolution:
@ -1394,6 +1599,16 @@ packages:
node: '>= 4' node: '>= 4'
resolution: resolution:
integrity: sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== integrity: sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
/require-directory/2.1.1:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
/require-main-filename/1.0.1:
dev: false
resolution:
integrity: sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
/resolve-dir/0.1.1: /resolve-dir/0.1.1:
dependencies: dependencies:
expand-tilde: 1.2.2 expand-tilde: 1.2.2
@ -1457,10 +1672,39 @@ packages:
hasBin: true hasBin: true
resolution: resolution:
integrity: sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= integrity: sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=
/set-blocking/2.0.0:
dev: false
resolution:
integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
/setimmediate/1.0.5: /setimmediate/1.0.5:
dev: false dev: false
resolution: resolution:
integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
/shebang-command/1.2.0:
dependencies:
shebang-regex: 1.0.0
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
/shebang-regex/1.0.0:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
/showdown/1.9.0:
dependencies:
yargs: 10.1.2
dev: false
hasBin: true
resolution:
integrity: sha512-x7xDCRIaOlicbC57nMhGfKamu+ghwsdVkHMttyn+DelwzuHOx4OHCVL/UW/2QOLH7BxfCcCCVVUix3boKXJKXQ==
/signal-exit/3.0.2:
dev: false
resolution:
integrity: sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
/slugify/1.3.4: /slugify/1.3.4:
dev: false dev: false
engines: engines:
@ -1496,6 +1740,25 @@ packages:
node: '>=0.10.0' node: '>=0.10.0'
resolution: resolution:
integrity: sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= integrity: sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
/string-width/1.0.2:
dependencies:
code-point-at: 1.1.0
is-fullwidth-code-point: 1.0.0
strip-ansi: 3.0.1
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
/string-width/2.1.1:
dependencies:
is-fullwidth-code-point: 2.0.0
strip-ansi: 4.0.0
dev: false
engines:
node: '>=4'
resolution:
integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
/string_decoder/0.10.31: /string_decoder/0.10.31:
dev: false dev: false
resolution: resolution:
@ -1514,6 +1777,20 @@ packages:
node: '>=0.10.0' node: '>=0.10.0'
resolution: resolution:
integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
/strip-ansi/4.0.0:
dependencies:
ansi-regex: 3.0.0
dev: false
engines:
node: '>=4'
resolution:
integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8=
/strip-eof/1.0.0:
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
/supports-color/2.0.0: /supports-color/2.0.0:
dev: false dev: false
engines: engines:
@ -1678,6 +1955,10 @@ packages:
dev: false dev: false
resolution: resolution:
integrity: sha512-WsS1yRw8xT6O7iIK8oAcYr3/vhMYiTHdA/vQnU/JsGbcad2Xi4p8bie8/F+BoEyN7SEpBZ8nFT9OdszDAt7Ugg== integrity: sha512-WsS1yRw8xT6O7iIK8oAcYr3/vhMYiTHdA/vQnU/JsGbcad2Xi4p8bie8/F+BoEyN7SEpBZ8nFT9OdszDAt7Ugg==
/which-module/2.0.0:
dev: false
resolution:
integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
/which/1.3.1: /which/1.3.1:
dependencies: dependencies:
isexe: 2.0.0 isexe: 2.0.0
@ -1685,6 +1966,15 @@ packages:
hasBin: true hasBin: true
resolution: resolution:
integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
/wrap-ansi/2.1.0:
dependencies:
string-width: 1.0.2
strip-ansi: 3.0.1
dev: false
engines:
node: '>=0.10.0'
resolution:
integrity: sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
/wrappy/1.0.2: /wrappy/1.0.2:
dev: false dev: false
resolution: resolution:
@ -1707,6 +1997,37 @@ packages:
node: '>=0.4' node: '>=0.4'
resolution: resolution:
integrity: sha1-pcbVMr5lbiPbgg77lDofBJmNY68= integrity: sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
/y18n/3.2.1:
dev: false
resolution:
integrity: sha1-bRX7qITAhnnA136I53WegR4H+kE=
/yallist/2.1.2:
dev: false
resolution:
integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
/yargs-parser/8.1.0:
dependencies:
camelcase: 4.1.0
dev: false
resolution:
integrity: sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==
/yargs/10.1.2:
dependencies:
cliui: 4.1.0
decamelize: 1.2.0
find-up: 2.1.0
get-caller-file: 1.0.3
os-locale: 2.1.0
require-directory: 2.1.1
require-main-filename: 1.0.1
set-blocking: 2.0.0
string-width: 2.1.1
which-module: 2.0.0
y18n: 3.2.1
yargs-parser: 8.1.0
dev: false
resolution:
integrity: sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==
/yauzl/2.10.0: /yauzl/2.10.0:
dependencies: dependencies:
buffer-crc32: 0.2.13 buffer-crc32: 0.2.13
@ -1730,5 +2051,6 @@ specifiers:
react-router-dom: ^4.3.1 react-router-dom: ^4.3.1
request: ^2.88.0 request: ^2.88.0
sails-postgresql: ^1.0.2 sails-postgresql: ^1.0.2
showdown: ^1.9.0
ta-json-x: ^2.5.0 ta-json-x: ^2.5.0
xmldom: ^0.1.27 xmldom: ^0.1.27

File diff suppressed because one or more lines are too long

3
views/shared/footer.html Normal file
View File

@ -0,0 +1,3 @@
<footer>
<span>River of Ebooks is a project of the <a href="https://ebookfoundation.org">Free Ebook Foundation</a>.</span>
</footer>

10
views/shared/header.html Normal file
View File

@ -0,0 +1,10 @@
<header class="flex-container header">
<a href="/" class="logo">River of Ebooks</a>
<div class="flex"></div>
<nav>
<a href="/docs/integrations">Integrations</a>
<a href="/docs/webhooks">Webhooks</a>
<a href="/docs/api">API</a>
<a href="/login">Sign in</a>
</nav>
</header>