mirror of
https://github.com/kevin-DL/sapper-template.git
synced 2026-01-13 10:45:34 +00:00
Work on signup. Removed polka, using express since passport was being weird
This commit is contained in:
@@ -1,16 +1,15 @@
|
||||
// WARNING: THIS HELPER FILE IS NOT GOOD PRACTICE AND ONLY HERE FOR CONVENIENCE
|
||||
// use a real database for persisting users instead
|
||||
|
||||
// const Users = [{
|
||||
// username: 'general-zod',
|
||||
// email: 'general.zod@krypton.com',
|
||||
// hash: '',
|
||||
// }, {
|
||||
// username: 'kal-el',
|
||||
// email: 'kal-el@krypton.com',
|
||||
// hash: '',
|
||||
// }];
|
||||
const Users = [];
|
||||
const Users = [{
|
||||
username: 'general-zod',
|
||||
email: 'general.zod@krypton.com',
|
||||
hash: '$2b$10$wP/YQvEX1pC4F1Unnf46ceOR1I6Q.OgOtRNjUT7NxbBDW8vxEEGSK', // the password is `password`
|
||||
}, {
|
||||
username: 'kal-el',
|
||||
email: 'kal-el@krypton.com',
|
||||
hash: '$2b$10$wP/YQvEX1pC4F1Unnf46ceOR1I6Q.OgOtRNjUT7NxbBDW8vxEEGSK', // the password is `password`
|
||||
}];
|
||||
|
||||
export default {
|
||||
find(key, value) {
|
||||
|
||||
@@ -9,6 +9,7 @@ import { Strategy as LocalStrategy } from 'passport-local';
|
||||
import db from './db';
|
||||
|
||||
const env = process.env.NODE_ENV;
|
||||
const JWT_SECRET = 'put-your-JWT-secret-here'; // you can set this w/ an environment variable
|
||||
|
||||
export function authSetup(app) {
|
||||
|
||||
@@ -33,6 +34,7 @@ export function authSetup(app) {
|
||||
|
||||
app.post('/auth/signup', async(req, res, next) => {
|
||||
try {
|
||||
debugger
|
||||
const { username, email, password } = req.body;
|
||||
|
||||
const userExists = db.find('username', username);
|
||||
@@ -51,13 +53,13 @@ export function authSetup(app) {
|
||||
|
||||
// generate a signed son web token with the contents of user object and return it in the response
|
||||
const month = 60 * 60 * 24 * 30;
|
||||
const token = jwt.sign(userToSendToClient, config.JWT_SECRET, { expiresIn: month });
|
||||
const token = jwt.sign(userToSendToClient, JWT_SECRET, { expiresIn: month });
|
||||
res.cookie('ds', token, {
|
||||
// httpOnly: false,
|
||||
secure: env === 'production' ? true : false,
|
||||
maxAge: 1000 * month,
|
||||
});
|
||||
res.status(200).send({ userToSendToClient });
|
||||
res.status(200).send({ user: userToSendToClient });
|
||||
} catch (error) {
|
||||
res.status(400).send({ error: 'req body should take the form { username, password }' });
|
||||
}
|
||||
@@ -77,7 +79,7 @@ export function authSetup(app) {
|
||||
}
|
||||
// generate a signed son web token with the contents of user object and return it in the response
|
||||
const month = 60 * 60 * 24 * 30;
|
||||
const token = jwt.sign(user, config.JWT_SECRET, { expiresIn: month });
|
||||
const token = jwt.sign(user, JWT_SECRET, { expiresIn: month });
|
||||
return res.cookie('ds', token, {
|
||||
// httpOnly: false,
|
||||
secure: env === 'production' ? true : false,
|
||||
|
||||
@@ -1,7 +1,27 @@
|
||||
import { init } from 'sapper/runtime.js';
|
||||
import { manifest } from './manifest/client.js';
|
||||
import { Store } from 'svelte/store.js'
|
||||
|
||||
init({
|
||||
target: document.querySelector('#sapper'),
|
||||
manifest
|
||||
});
|
||||
manifest,
|
||||
store: data => {
|
||||
const user = data.user;
|
||||
const store = new Store(data);
|
||||
if (!user) {
|
||||
// SEE: https://stackoverflow.com/questions/10593013/delete-cookie-by-name
|
||||
document.cookie = 'ds=;expires=Sun, 09 Jan 1974 00:00:01 GMT;';
|
||||
}
|
||||
store.set({
|
||||
logout: () => {
|
||||
return fetch('auth/logout', { method: 'POST' }).then(() => {
|
||||
// SEE: https://stackoverflow.com/questions/10593013/delete-cookie-by-name
|
||||
document.cookie = 'ds=;expires=Sun, 09 Jan 1974 00:00:01 GMT;';
|
||||
store.set({ user: null });
|
||||
window.location = '/'
|
||||
})
|
||||
},
|
||||
})
|
||||
return store
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,35 +1,36 @@
|
||||
import sirv from 'sirv';
|
||||
import polka from 'polka';
|
||||
// import bodyParser from 'body-parser';
|
||||
// import cookieParser from 'cookie-parser';
|
||||
import express from 'express';
|
||||
import bodyParser from 'body-parser';
|
||||
import cookieParser from 'cookie-parser';
|
||||
import { authSetup } from './auth/setup';
|
||||
import sapper from 'sapper';
|
||||
import compression from 'compression';
|
||||
// import { Store } from 'svelte/store.js';
|
||||
import { Store } from 'svelte/store.js';
|
||||
// import { validate } from '../routes/_services/auth-check.js';
|
||||
import { manifest } from './manifest/server.js';
|
||||
|
||||
const { PORT, NODE_ENV } = process.env;
|
||||
const dev = NODE_ENV === 'development';
|
||||
|
||||
const app = polka() // You can also use Express
|
||||
polka()
|
||||
app.use(compression({ threshold: 0 }))
|
||||
app.use(sirv('assets', { dev }))
|
||||
// app.use(bodyParser.json())
|
||||
// app.use(bodyParser.urlencoded({ extended: true }))
|
||||
// app.use(cookieParser())
|
||||
const app = express()
|
||||
|
||||
authSetup(app)
|
||||
app.use(compression({ threshold: 0 }))
|
||||
app.use(sirv('assets', { dev }))
|
||||
app.use(bodyParser.json())
|
||||
app.use(bodyParser.urlencoded({ extended: true }))
|
||||
app.use(cookieParser())
|
||||
|
||||
app.use(sapper({
|
||||
manifest,
|
||||
store: req => {
|
||||
// const user = validate(req);
|
||||
// return new Store({ user: user.unauthorized ? null : user });
|
||||
},
|
||||
}))
|
||||
authSetup(app)
|
||||
|
||||
app.listen(PORT, err => {
|
||||
if (err) console.log('error', err);
|
||||
})
|
||||
app.use(sapper({
|
||||
manifest,
|
||||
store: req => {
|
||||
// const user = validate(req);
|
||||
// return new Store({ user: user.unauthorized ? null : user });
|
||||
return new Store({ user: null });
|
||||
},
|
||||
}))
|
||||
|
||||
app.listen(PORT, err => {
|
||||
if (err) console.log('error', err);
|
||||
})
|
||||
|
||||
3
assets/svg/valid-bad.svg
Normal file
3
assets/svg/valid-bad.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" class="svg-src">
|
||||
<path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-1.524A6.476 6.476 0 1 0 8 1.524a6.476 6.476 0 0 0 0 12.952zM6.85 8L4.12 5.269a.407.407 0 0 1 0-.575l.574-.575a.407.407 0 0 1 .575 0L8 6.85l2.731-2.73a.407.407 0 0 1 .575 0l.575.574a.407.407 0 0 1 0 .575L9.15 8l2.73 2.731a.407.407 0 0 1 0 .575l-.574.575a.407.407 0 0 1-.575 0L8 9.15l-2.731 2.73a.407.407 0 0 1-.575 0l-.575-.574a.407.407 0 0 1 0-.575L6.85 8z" fill="#F0341B" fill-rule="nonzero"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 530 B |
3
assets/svg/valid-good.svg
Normal file
3
assets/svg/valid-good.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" class="svg-src">
|
||||
<path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-1.524A6.476 6.476 0 1 0 8 1.524a6.476 6.476 0 0 0 0 12.952zM4.382 7.743l2.089 2.09 5.333-5.335 1.144 1.144-6.6 6.6-3.232-3.233 1.266-1.266z" fill="#98EB26" fill-rule="nonzero"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 313 B |
414
package-lock.json
generated
414
package-lock.json
generated
@@ -4,11 +4,6 @@
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@arr/every": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@arr/every/-/every-1.0.0.tgz",
|
||||
"integrity": "sha1-MU+BaPUK5IoDLP2tX9tDb0ZKl6w="
|
||||
},
|
||||
"@babel/code-frame": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
|
||||
@@ -847,6 +842,11 @@
|
||||
"integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
|
||||
"dev": true
|
||||
},
|
||||
"array-flatten": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
|
||||
},
|
||||
"array-map": {
|
||||
"version": "0.0.0",
|
||||
"resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
|
||||
@@ -1380,6 +1380,23 @@
|
||||
"integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
|
||||
"dev": true
|
||||
},
|
||||
"body-parser": {
|
||||
"version": "1.18.3",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
|
||||
"integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
|
||||
"requires": {
|
||||
"bytes": "3.0.0",
|
||||
"content-type": "~1.0.4",
|
||||
"debug": "2.6.9",
|
||||
"depd": "~1.1.2",
|
||||
"http-errors": "~1.6.3",
|
||||
"iconv-lite": "0.4.23",
|
||||
"on-finished": "~2.3.0",
|
||||
"qs": "6.5.2",
|
||||
"raw-body": "2.3.3",
|
||||
"type-is": "~1.6.16"
|
||||
}
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
@@ -1610,12 +1627,41 @@
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
|
||||
"dev": true
|
||||
},
|
||||
"content-disposition": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
|
||||
"integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
|
||||
},
|
||||
"content-type": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
|
||||
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
|
||||
},
|
||||
"convert-source-map": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
|
||||
"integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
|
||||
"dev": true
|
||||
},
|
||||
"cookie": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
|
||||
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
|
||||
},
|
||||
"cookie-parser": {
|
||||
"version": "1.4.3",
|
||||
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz",
|
||||
"integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=",
|
||||
"requires": {
|
||||
"cookie": "0.3.1",
|
||||
"cookie-signature": "1.0.6"
|
||||
}
|
||||
},
|
||||
"cookie-signature": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
|
||||
},
|
||||
"copy-descriptor": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
|
||||
@@ -1705,6 +1751,16 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"depd": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
|
||||
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
|
||||
},
|
||||
"destroy": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
|
||||
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
|
||||
},
|
||||
"duplexer": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
|
||||
@@ -1719,12 +1775,22 @@
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"ee-first": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
||||
},
|
||||
"electron-to-chromium": {
|
||||
"version": "1.3.62",
|
||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.62.tgz",
|
||||
"integrity": "sha512-x09ndL/Gjnuk3unlAyoGyUg3wbs4w/bXurgL7wL913vXHAOWmMhrLf1VNGRaMLngmadd5Q8gsV9BFuIr6rP+Xg==",
|
||||
"dev": true
|
||||
},
|
||||
"encodeurl": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
|
||||
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
|
||||
},
|
||||
"error-ex": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
|
||||
@@ -1758,6 +1824,11 @@
|
||||
"is-symbol": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"escape-html": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
||||
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
|
||||
},
|
||||
"escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
@@ -1776,6 +1847,11 @@
|
||||
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
|
||||
"dev": true
|
||||
},
|
||||
"etag": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
||||
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
|
||||
},
|
||||
"event-stream": {
|
||||
"version": "3.3.4",
|
||||
"resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
|
||||
@@ -1877,6 +1953,116 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"express": {
|
||||
"version": "4.16.3",
|
||||
"resolved": "http://registry.npmjs.org/express/-/express-4.16.3.tgz",
|
||||
"integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
|
||||
"requires": {
|
||||
"accepts": "~1.3.5",
|
||||
"array-flatten": "1.1.1",
|
||||
"body-parser": "1.18.2",
|
||||
"content-disposition": "0.5.2",
|
||||
"content-type": "~1.0.4",
|
||||
"cookie": "0.3.1",
|
||||
"cookie-signature": "1.0.6",
|
||||
"debug": "2.6.9",
|
||||
"depd": "~1.1.2",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"etag": "~1.8.1",
|
||||
"finalhandler": "1.1.1",
|
||||
"fresh": "0.5.2",
|
||||
"merge-descriptors": "1.0.1",
|
||||
"methods": "~1.1.2",
|
||||
"on-finished": "~2.3.0",
|
||||
"parseurl": "~1.3.2",
|
||||
"path-to-regexp": "0.1.7",
|
||||
"proxy-addr": "~2.0.3",
|
||||
"qs": "6.5.1",
|
||||
"range-parser": "~1.2.0",
|
||||
"safe-buffer": "5.1.1",
|
||||
"send": "0.16.2",
|
||||
"serve-static": "1.13.2",
|
||||
"setprototypeof": "1.1.0",
|
||||
"statuses": "~1.4.0",
|
||||
"type-is": "~1.6.16",
|
||||
"utils-merge": "1.0.1",
|
||||
"vary": "~1.1.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"body-parser": {
|
||||
"version": "1.18.2",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
|
||||
"integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
|
||||
"requires": {
|
||||
"bytes": "3.0.0",
|
||||
"content-type": "~1.0.4",
|
||||
"debug": "2.6.9",
|
||||
"depd": "~1.1.1",
|
||||
"http-errors": "~1.6.2",
|
||||
"iconv-lite": "0.4.19",
|
||||
"on-finished": "~2.3.0",
|
||||
"qs": "6.5.1",
|
||||
"raw-body": "2.3.2",
|
||||
"type-is": "~1.6.15"
|
||||
}
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.19",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
|
||||
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.5.1",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
|
||||
"integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
|
||||
},
|
||||
"raw-body": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
|
||||
"integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
|
||||
"requires": {
|
||||
"bytes": "3.0.0",
|
||||
"http-errors": "1.6.2",
|
||||
"iconv-lite": "0.4.19",
|
||||
"unpipe": "1.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"depd": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
|
||||
"integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
|
||||
},
|
||||
"http-errors": {
|
||||
"version": "1.6.2",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
|
||||
"integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
|
||||
"requires": {
|
||||
"depd": "1.1.1",
|
||||
"inherits": "2.0.3",
|
||||
"setprototypeof": "1.0.3",
|
||||
"statuses": ">= 1.3.1 < 2"
|
||||
}
|
||||
},
|
||||
"setprototypeof": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
|
||||
"integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
|
||||
}
|
||||
}
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
|
||||
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
|
||||
},
|
||||
"statuses": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
|
||||
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"extend-shallow": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
|
||||
@@ -1992,6 +2178,27 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"finalhandler": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
|
||||
"integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"on-finished": "~2.3.0",
|
||||
"parseurl": "~1.3.2",
|
||||
"statuses": "~1.4.0",
|
||||
"unpipe": "~1.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"statuses": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
|
||||
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"for-in": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
|
||||
@@ -2007,6 +2214,11 @@
|
||||
"for-in": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"forwarded": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
|
||||
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
|
||||
},
|
||||
"fragment-cache": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
|
||||
@@ -2016,6 +2228,11 @@
|
||||
"map-cache": "^0.2.2"
|
||||
}
|
||||
},
|
||||
"fresh": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
|
||||
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
|
||||
},
|
||||
"from": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
|
||||
@@ -2714,11 +2931,29 @@
|
||||
"uglify-js": "3.4.x"
|
||||
}
|
||||
},
|
||||
"http-errors": {
|
||||
"version": "1.6.3",
|
||||
"resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
|
||||
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
|
||||
"requires": {
|
||||
"depd": "~1.1.2",
|
||||
"inherits": "2.0.3",
|
||||
"setprototypeof": "1.1.0",
|
||||
"statuses": ">= 1.4.0 < 2"
|
||||
}
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.23",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
|
||||
"integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
|
||||
"requires": {
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
}
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
|
||||
"dev": true
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||
},
|
||||
"invariant": {
|
||||
"version": "2.2.4",
|
||||
@@ -2729,6 +2964,11 @@
|
||||
"loose-envify": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"ipaddr.js": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
|
||||
"integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4="
|
||||
},
|
||||
"is-accessor-descriptor": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
||||
@@ -3139,26 +3379,33 @@
|
||||
"object-visit": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"matchit": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/matchit/-/matchit-1.0.6.tgz",
|
||||
"integrity": "sha1-gl2gZGi9Mk8CGevijhKkG/tVJMQ=",
|
||||
"requires": {
|
||||
"@arr/every": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"math-random": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
|
||||
"integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
|
||||
"dev": true
|
||||
},
|
||||
"media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
|
||||
},
|
||||
"memorystream": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
|
||||
"integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
|
||||
"dev": true
|
||||
},
|
||||
"merge-descriptors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
||||
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
|
||||
},
|
||||
"methods": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
|
||||
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
|
||||
},
|
||||
"micromatch": {
|
||||
"version": "3.1.10",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
|
||||
@@ -3388,6 +3635,14 @@
|
||||
"isobject": "^3.0.1"
|
||||
}
|
||||
},
|
||||
"on-finished": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
|
||||
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
|
||||
"requires": {
|
||||
"ee-first": "1.1.1"
|
||||
}
|
||||
},
|
||||
"on-headers": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
|
||||
@@ -3497,6 +3752,11 @@
|
||||
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
|
||||
"dev": true
|
||||
},
|
||||
"path-to-regexp": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
|
||||
},
|
||||
"path-type": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
|
||||
@@ -3526,15 +3786,6 @@
|
||||
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
|
||||
"dev": true
|
||||
},
|
||||
"polka": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/polka/-/polka-0.4.0.tgz",
|
||||
"integrity": "sha1-RT/FE81TCgid1V2P89rql1LxYd8=",
|
||||
"requires": {
|
||||
"parseurl": "^1.3.2",
|
||||
"trouter": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"posix-character-classes": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
|
||||
@@ -3559,6 +3810,15 @@
|
||||
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
|
||||
"dev": true
|
||||
},
|
||||
"proxy-addr": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
|
||||
"integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
|
||||
"requires": {
|
||||
"forwarded": "~0.1.2",
|
||||
"ipaddr.js": "1.8.0"
|
||||
}
|
||||
},
|
||||
"ps-tree": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz",
|
||||
@@ -3568,6 +3828,11 @@
|
||||
"event-stream": "~3.3.0"
|
||||
}
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
|
||||
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
|
||||
},
|
||||
"randomatic": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz",
|
||||
@@ -3587,6 +3852,22 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"range-parser": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
|
||||
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
|
||||
},
|
||||
"raw-body": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
|
||||
"integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
|
||||
"requires": {
|
||||
"bytes": "3.0.0",
|
||||
"http-errors": "1.6.3",
|
||||
"iconv-lite": "0.4.23",
|
||||
"unpipe": "1.0.0"
|
||||
}
|
||||
},
|
||||
"read-pkg": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
|
||||
@@ -3959,6 +4240,11 @@
|
||||
"ret": "~0.1.10"
|
||||
}
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||
},
|
||||
"sapper": {
|
||||
"version": "0.20.0",
|
||||
"resolved": "https://registry.npmjs.org/sapper/-/sapper-0.20.0.tgz",
|
||||
@@ -3978,6 +4264,49 @@
|
||||
"integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
|
||||
"dev": true
|
||||
},
|
||||
"send": {
|
||||
"version": "0.16.2",
|
||||
"resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
|
||||
"integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"depd": "~1.1.2",
|
||||
"destroy": "~1.0.4",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"etag": "~1.8.1",
|
||||
"fresh": "0.5.2",
|
||||
"http-errors": "~1.6.2",
|
||||
"mime": "1.4.1",
|
||||
"ms": "2.0.0",
|
||||
"on-finished": "~2.3.0",
|
||||
"range-parser": "~1.2.0",
|
||||
"statuses": "~1.4.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"mime": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
|
||||
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
|
||||
},
|
||||
"statuses": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
|
||||
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"serve-static": {
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
|
||||
"integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
|
||||
"requires": {
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"parseurl": "~1.3.2",
|
||||
"send": "0.16.2"
|
||||
}
|
||||
},
|
||||
"set-immediate-shim": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
|
||||
@@ -4007,6 +4336,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"setprototypeof": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
|
||||
"integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
|
||||
},
|
||||
"shebang-command": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
|
||||
@@ -4271,6 +4605,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"statuses": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
|
||||
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
|
||||
},
|
||||
"stream-combiner": {
|
||||
"version": "0.0.4",
|
||||
"resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
|
||||
@@ -4406,19 +4745,20 @@
|
||||
"integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
|
||||
"dev": true
|
||||
},
|
||||
"trouter": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/trouter/-/trouter-1.1.0.tgz",
|
||||
"integrity": "sha512-EH5irPolH2hPRpgH77V8ZDS3T05oMFJ7Pcq0Vn5Dlzol4xKLhjOe4ftWnnDnHmTFzPUgUF//H6xyjv5dYAE6Kg==",
|
||||
"requires": {
|
||||
"matchit": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"tslib": {
|
||||
"version": "1.9.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
|
||||
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
|
||||
},
|
||||
"type-is": {
|
||||
"version": "1.6.16",
|
||||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
|
||||
"integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
|
||||
"requires": {
|
||||
"media-typer": "0.3.0",
|
||||
"mime-types": "~2.1.18"
|
||||
}
|
||||
},
|
||||
"uglify-js": {
|
||||
"version": "3.4.9",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
|
||||
@@ -4491,6 +4831,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"unpipe": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
||||
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
|
||||
},
|
||||
"unset-value": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
|
||||
@@ -4560,6 +4905,11 @@
|
||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
|
||||
"dev": true
|
||||
},
|
||||
"utils-merge": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
||||
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
|
||||
},
|
||||
"validate-npm-package-license": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
|
||||
|
||||
@@ -13,11 +13,13 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"bcrypt": "3.0.1",
|
||||
"body-parser": "1.18.3",
|
||||
"compression": "^1.7.1",
|
||||
"cookie-parser": "1.4.3",
|
||||
"express": "4.16.3",
|
||||
"jsonwebtoken": "8.3.0",
|
||||
"passport": "0.4.0",
|
||||
"passport-local": "1.0.0",
|
||||
"polka": "^0.4.0",
|
||||
"sapper": "^0.20.0",
|
||||
"sirv": "^0.2.0"
|
||||
},
|
||||
|
||||
5
routes/auth/_email-regex.js
Normal file
5
routes/auth/_email-regex.js
Normal file
File diff suppressed because one or more lines are too long
34
routes/auth/validate.json.js
Normal file
34
routes/auth/validate.json.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import db from '../../app/auth/db'
|
||||
import emailRegex from './_email-regex'
|
||||
|
||||
|
||||
export async function post(req, res) {
|
||||
let message = '';
|
||||
res.writeHead(200, { 'Content-Type': 'application/json' });
|
||||
try {
|
||||
if (req.body.key === 'username') {
|
||||
debugger
|
||||
const found = db.find(req.body.key, req.body.value);
|
||||
if (found) {
|
||||
message = 'That username is already in use.';
|
||||
}
|
||||
res.end(JSON.stringify({ valid: !found, message }));
|
||||
} else if (req.body.key === 'email') {
|
||||
let valid = emailRegex.test(req.body.value);
|
||||
if (!valid) {
|
||||
message = 'Email is invalid.';
|
||||
} else {
|
||||
debugger
|
||||
const found = db.find(req.body.key, req.body.value);
|
||||
if (found) {
|
||||
message = 'Email is already taken.';
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
res.end(JSON.stringify({ valid, message }));
|
||||
}
|
||||
res.end({ valid: false, message: 'Something went wrong. Please <a href="/contact">contact us</a> for help.' });
|
||||
} catch (error) {
|
||||
res.end({ valid: false, message: 'Something went wrong. Please <a href="/contact">contact us</a> for help.' });
|
||||
}
|
||||
};
|
||||
@@ -2,4 +2,194 @@
|
||||
<title>Sign Up</title>
|
||||
</svelte:head>
|
||||
|
||||
<h1>Sign Up</h1>
|
||||
<div class="signup">
|
||||
<h1>Sign Up</h1>
|
||||
<form on:submit="signup(event)">
|
||||
<div class="border">
|
||||
<h2>Pick a username, email, and password</h2>
|
||||
<label data-valid={usernameValid}>
|
||||
<input ref:username bind:value=username type="text" name="username" placeholder="Pick a username" required="required">
|
||||
{#if usernameValid === false}
|
||||
<div class="message">{usernameMessage}</div>
|
||||
{/if}
|
||||
</label>
|
||||
<label data-valid={emailValid}>
|
||||
<input bind:value=email type="email" name="email" placeholder="Email Address" required="required">
|
||||
{#if emailValid === false}
|
||||
<div class="message">{emailMessage}</div>
|
||||
{/if}
|
||||
</label>
|
||||
<label data-valid={passwordValid}>
|
||||
<input bind:value=password type="password" name="password" placeholder="Create a password" required="required">
|
||||
{#if passwordValid === false}
|
||||
<div class="message">{passwordMessage}</div>
|
||||
{/if}
|
||||
</label>
|
||||
</div>
|
||||
<button class="button primary {submittable ? '' : 'disabled'}" type="submit">Sign Up</button>
|
||||
</form>
|
||||
<div class="divider"></div>
|
||||
<h3>
|
||||
Already have an account?
|
||||
<a href="/login">Log In</a>
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// THIS IS BROKEN FOR SOME WACKO REASON, SO JUST INLINING IT:
|
||||
// SEE: https://github.com/rollup/rollup/issues/2461
|
||||
// import debounce from '../_services/just/debounce'
|
||||
function debounce(t,n,i){var r;return function(){if(!n)return t.apply(this,arguments);var u=this,e=arguments,o=i&&!r;return clearTimeout(r),r=setTimeout(function(){if(r=null,!o)return t.apply(u,e)},n),o?t.apply(this,arguments):void 0}}
|
||||
const validate = debounce(cb => cb(), 500)
|
||||
const usernameRegex = /^[a-zA-Z0-9][a-zA-Z0-9-]{1,37}[a-zA-Z0-9]$/
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
username: '',
|
||||
usernameValid: 'inert',
|
||||
usernameMessage: '',
|
||||
email: '',
|
||||
emailValid: 'inert',
|
||||
emailMessage: '',
|
||||
password: '',
|
||||
passwordValid: 'inert',
|
||||
passwordMessage: '',
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
submittable: ({ usernameValid, emailValid, passwordValid }) => usernameValid === true && emailValid === true && passwordValid === true,
|
||||
},
|
||||
onstate({ changed, current, previous }) {
|
||||
if (previous) {
|
||||
if (changed.username) {
|
||||
let message = ''
|
||||
const length = current.username.length
|
||||
if (length < 1) {
|
||||
this.set({ usernameValid: 'inert', usernameMessage: message })
|
||||
} else if (length < 3) {
|
||||
this.set({ usernameValid: false, usernameMessage: 'Username is too short (minimum 3 characters).' })
|
||||
} else if (length > 39) {
|
||||
this.set({ usernameValid: false, usernameMessage: 'Username is too long (maximum is 39 characters).' })
|
||||
} else if (!usernameRegex.test(current.username)) {
|
||||
this.set({
|
||||
usernameValid: false,
|
||||
usernameMessage: 'Username may only contain alphanumeric characters or single hyphens, and cannot begin or end with a hyphen.',
|
||||
})
|
||||
} else {
|
||||
this.set({ usernameValid: 'inert', usernameMessage: '' })
|
||||
validate(async() => {
|
||||
const fetched = await fetch('/auth/validate.json', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
credentials: 'same-origin',
|
||||
body: JSON.stringify({ key: 'username', value: current.username })
|
||||
});
|
||||
const res = await fetched.json()
|
||||
this.set({ usernameValid: res.valid, usernameMessage: res.message })
|
||||
})
|
||||
}
|
||||
}
|
||||
if (changed.email) {
|
||||
validate(async() => {
|
||||
const fetched = await fetch('/auth/validate.json', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
credentials: 'same-origin',
|
||||
body: JSON.stringify({ key: 'email', value: current.email })
|
||||
});
|
||||
const res = await fetched.json()
|
||||
this.set({ emailValid: res.valid, emailMessage: res.message })
|
||||
})
|
||||
}
|
||||
if (changed.password) {
|
||||
const length = current.password.length
|
||||
const valid = length < 1 ? 'inert' : length >= 8
|
||||
this.set({ passwordValid: valid, passwordMessage: valid ? '' : 'Password must be 8 or more characters.' })
|
||||
}
|
||||
}
|
||||
},
|
||||
oncreate() {
|
||||
// for some reason, it's not ready until clearing the stack
|
||||
setTimeout(() => this.refs.username.focus(), 0)
|
||||
},
|
||||
methods: {
|
||||
signup: async function(event) {
|
||||
event.preventDefault()
|
||||
const { submittable } = this.get()
|
||||
if (submittable) {
|
||||
const { username, email, password } = this.get()
|
||||
const fetched = await fetch('/auth/signup', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
credentials: 'same-origin',
|
||||
body: JSON.stringify({ username, email, password })
|
||||
});
|
||||
const res = await fetched.json()
|
||||
if (res.error) {
|
||||
// handle the error!!!!
|
||||
console.log(res.error)
|
||||
} else {
|
||||
this.store.set({ user: res.user })
|
||||
window.location = '/'
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.border {
|
||||
margin: 0 0 1em;
|
||||
padding: 1em;
|
||||
border: 1px solid #aa1e1e;
|
||||
}
|
||||
label {
|
||||
position: relative;
|
||||
display: flex;
|
||||
}
|
||||
label[data-valid="true"]::after,
|
||||
label[data-valid="false"]::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 14px;
|
||||
right: 14px;
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
background: url(/svg/valid-good.svg) no-repeat center transparent;
|
||||
background-size: cover;
|
||||
}
|
||||
label[data-valid="false"] input[type="text"],
|
||||
label[data-valid="false"] input[type="email"],
|
||||
label[data-valid="false"] input[type="password"] {
|
||||
border: 1px solid red;
|
||||
box-shadow: 0 0 0 3px red;
|
||||
}
|
||||
label[data-valid="false"]::after {
|
||||
background-image: url(/svg/valid-bad.svg);
|
||||
}
|
||||
.popup {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
margin: -2.5rem 0 0 1.2rem;
|
||||
}
|
||||
input[type="text"],
|
||||
input[type="email"],
|
||||
input[type="password"] {
|
||||
margin: 0 0 1rem;
|
||||
padding: 1rem 4.5rem 1rem 1rem;
|
||||
width: 100%;
|
||||
}
|
||||
input[type="password"] {
|
||||
margin: 0;
|
||||
}
|
||||
.message {
|
||||
padding: 1rem 3rem 1rem 1rem;
|
||||
}
|
||||
.button {
|
||||
width: 100%;
|
||||
margin: 0 0 6px;
|
||||
padding: 1.2rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user