From aa280a646bbc0f1ffa74aeee86557e3cfc02c224 Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Sat, 7 Nov 2020 11:56:03 +1300 Subject: [PATCH] Refactor Signed-off-by: Richie Bendall --- .editorconfig | 2 - middleware/load-options.js | 82 +++++++++-------------- middleware/load-user.js | 17 +++-- package.json | 5 +- routes/get.js | 129 +++++++++++++++++++++---------------- routes/post.js | 66 ++++++++++--------- routes/utils.js | 4 +- server.js | 8 +-- test.js | 4 +- yarn.lock | Bin 195091 -> 194675 bytes 10 files changed, 158 insertions(+), 159 deletions(-) diff --git a/.editorconfig b/.editorconfig index b219b5b7..124645fc 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,5 +1,3 @@ -# editorconfig.org - root = true [*] diff --git a/middleware/load-options.js b/middleware/load-options.js index a624b9f6..e72d7ad7 100644 --- a/middleware/load-options.js +++ b/middleware/load-options.js @@ -1,62 +1,42 @@ const currentYear = new Date().getFullYear() -module.exports = (req, res, next) => { - const parts = req.url.split('/') +const yearRegex = /^@?(\d{4})$/ +const yearRangeRegex = /^(\d{4})-(\d{4})$/ - res.locals.options = parts.reduce( - (acc, curr) => { - if (!curr) return acc +const getUrlParts = url => { + if (url === '/') { + return [] + } - let match = curr.match(/^@?(\d{4})$/) || [] + return url.slice(1).split('/') +} - if (match.length) { - // Pinned year - if (curr.startsWith('@')) { - acc.pinnedYear = parseInt(curr.substr(1), 10) - } else { - acc.startYear = parseInt(curr, 10) - } - return acc +module.exports = (request, response, next) => { + const urlParts = getUrlParts(request.url) + + response.locals.options = { + format: 'html', + startYear: null, + endYear: currentYear + } + + for (const urlPart of urlParts) { + if (yearRegex.test(urlPart)) { + if (urlPart.startsWith('@')) { + response.locals.options.pinnedYear = Number.parseInt(urlPart.slice(1)) + } else { + response.locals.options.startYear = Number.parseInt(urlPart) } + } else if (yearRangeRegex.test(urlPart)) { + const [startYear, endYear] = urlPart.match(yearRangeRegex).slice(1) - match = curr.match(/^(\d{4})-(\d{4})$/) || [] - - if (match.length) { - acc.startYear = parseInt(match[1], 10) - acc.endYear = parseInt(match[2], 10) - - return acc - } - - if (curr.startsWith('license')) { - acc.format = curr - .split('.') - .pop() - .trim() - return acc - } - - if (curr.startsWith('+')) { - acc.license = curr.substr(1).toUpperCase() - return acc - } - - acc.sha = curr // not actually supported now - 2019-06-19 - return acc - }, - { - format: 'html', - startYear: null, - endYear: currentYear, - sha: null + response.locals.options.startYear = Number.parseInt(startYear) + response.locals.options.endYear = Number.parseInt(endYear) + } else if (urlPart.startsWith('license')) { + response.locals.options.format = urlPart.split('.')[1].trim() + } else if (urlPart.startsWith('+')) { + response.locals.options.license = urlPart.slice(1).toUpperCase() } - ) - - if (res.locals.options.sha) { - res.setHeader( - 'X-note', - 'SHA and commit pinning is no longer supported, showing you latest release' - ) } next() diff --git a/middleware/load-user.js b/middleware/load-user.js index 483c2345..58103291 100644 --- a/middleware/load-user.js +++ b/middleware/load-user.js @@ -1,27 +1,26 @@ const path = require('path') const loadJsonFile = require('load-json-file') -module.exports = async (req, res, next) => { - const id = req.hostname.split('.')[0] - res.locals.id = id +module.exports = async (request, response, next) => { + response.locals.id = request.hostname.split('.')[0] - if (req.method.toUpperCase() !== 'GET') { + if (request.method.toUpperCase() !== 'GET') { return next() } // Otherwise load up the user json file - res.locals.user = { + response.locals.user = { copyright: '' } try { - res.locals.user = { - ...res.locals.user, - ...await loadJsonFile(path.join(__dirname, '..', 'users', `${id}.json`)) + response.locals.user = { + ...response.locals.user, + ...await loadJsonFile(path.join(__dirname, '..', 'users', `${response.locals.id}.json`)) } } catch ({ code, message }) { if (code !== 'ENOENT') { - res + response .code(500) .send( `An internal error occurred - open an issue on https://github.com/remy/mit-license with the following information: ${message}` diff --git a/package.json b/package.json index 0f50409c..4058d9f7 100644 --- a/package.json +++ b/package.json @@ -26,16 +26,17 @@ "dependencies": { "@octokit/rest": "^18.0.6", "@sindresorhus/is": "^3.1.2", - "any-size": "^1.0.2", + "any-size": "^1.2.0", "btoa": "^1.2.1", "cors": "^2.8.5", + "create-html-element": "^3.0.0", "ejs": "^3.1.5", "escape-goat": "^3.0.0", "express": "^4.17.1", "express-minify": "^1.0.0", + "gravatar-url": "^3.1.0", "html-text": "^1.0.1", "load-json-file": "^6.2.0", - "md5": "^2.3.0", "path-exists": "^4.0.0", "postcss-middleware": "^1.1.4", "postcss-preset-env": "^6.7.0", diff --git a/routes/get.js b/routes/get.js index a55e96d4..1db5c870 100644 --- a/routes/get.js +++ b/routes/get.js @@ -1,97 +1,118 @@ -const md5 = require('md5') const path = require('path') const { htmlEscape, htmlUnescape } = require('escape-goat') const stripHtml = require('html-text') const is = require('@sindresorhus/is') +const getGravatarUrl = require('gravatar-url') +const createHtmlElement = require('create-html-element') +const { renderFile } = require('ejs') -function getCopyrightHTML (user, plain) { - let html = '' - - const name = is.string(user) - ? user - : plain - ? user.name || user.copyright - : htmlEscape(user.name || user.copyright) - - if (user.url) { - html = `${name}` - } else { - html = name +const getCopyrightName = (user, isPlainText) => { + if (is.string(user)) { + return user } + const copyright = user.name || user.copyright + + return isPlainText ? copyright : htmlEscape(copyright) +} + +const getCopyrightHtml = (user, isPlainText) => { + const name = getCopyrightName(user, isPlainText) + let html = user.url ? createHtmlElement({ + name: 'a', + attributes: { + href: user.url + }, + text: name + }) : name + if (user.email) { - html += ` <${ - plain ? user.email : htmlEscape(user.email) - }>` + html += ` <${createHtmlElement({ + name: 'a', + attributes: { + href: `mailto:${user.email}` + }, + text: user.email + })}>` } return html } -module.exports = (req, res) => { - const { user, options } = res.locals +const getGravatarEmail = user => { + if (user.gravatar && user.email) { + // Supports regular format + return user.email.trim().toLowerCase() + } + + if (is.object(user.copyright[0]) && user.gravatar) { + // Supports multi-user format + return user.copyright[0].email.trim().toLowerCase() + } +} + +const removeFalsy = array => array.filter(Boolean) + +module.exports = async (_, response) => { + const { user, options } = response.locals + const isPlainText = options.format !== 'html' + let name - let gravatar // No error and valid if (user.copyright) { if (is.string(user.copyright)) { - name = getCopyrightHTML(user, options.format !== 'html') - } else if (is.array(user.copyright) && user.copyright.every(val => is.string(val))) { + name = getCopyrightHtml(user, isPlainText) + } else if (is.array(user.copyright) && user.copyright.every(value => is.string(value))) { // Supports: ['Remy Sharp', 'Richie Bendall'] - name = user.copyright - .map(v => (options.format !== 'html' ? v : htmlEscape(v))) - .join(', ') + name = user.copyright.map(value => (isPlainText ? value : htmlEscape(value))).join(', ') } else { - name = user.copyright.map(getCopyrightHTML).join(', ') + name = user.copyright.map(value => getCopyrightHtml(value)).join(', ') } } - if (user.gravatar && user.email) { - // Supports regular format - gravatar = `Profile image` - } else if (is.object(user.copyright[0]) && user.gravatar) { - // Supports multi-user format - gravatar = `Profile image` + let gravatar + const gravatarEmail = getGravatarEmail(user) + + if (gravatarEmail) { + gravatar = createHtmlElement({ + name: 'img', + attributes: { + id: 'gravatar', + alt: 'Profile image', + src: getGravatarUrl(gravatarEmail) + } + }) } const year = options.pinnedYear ? options.pinnedYear - : [options.startYear, options.endYear].filter(Boolean).join('-') + : removeFalsy([options.startYear, options.endYear]).join('-') const license = (options.license || user.license || 'MIT').toUpperCase() const format = options.format || user.format || 'html' - const args = { - info: `${year} ${name}`, - theme: user.theme || 'default', - gravatar - } - - const filename = path.join(__dirname, '..', 'licenses', license) - req.app.render(filename, args, (error, content) => { - if (error) { - res.status(500).send(error) - return - } + try { + const content = await renderFile(path.join(__dirname, '..', 'licenses', `${license}.ejs`), { + info: `${year} ${name}`, + theme: user.theme || 'default', + gravatar + }) if (format === 'txt') { const plain = content.match(/
(.*)<\/article>/ms)[1] - res + response .set('Content-Type', 'text/plain; charset=UTF-8') .send(htmlUnescape(stripHtml(plain)).trim()) return } if (format === 'html') { - res.send(content) + response.send(content) return } - - res.json({ ...user, ...options }) - }) + response.json({ ...user, ...options }) + } catch (error) { + response.status(500).send(error) + } } diff --git a/routes/post.js b/routes/post.js index c803e56b..e49a32fb 100644 --- a/routes/post.js +++ b/routes/post.js @@ -14,41 +14,45 @@ const github = new Octokit({ const yn = require('yn') const is = require('@sindresorhus/is') -const { validDomainId } = require('./utils') +const { isDomainId } = require('./utils') function getUserData ({ query, body }) { // If query parameters provided - if (size(query) > 0) return query + if (size(query) > 0) { + return query + } // If the data parsed as {'{data: "value"}': ''} - if (size(body) === 1 && !Object.values(body)[0]) return JSON.parse(Object.keys(body)[0]) + if (size(body) === 1 && !Object.values(body)[0]) { + return JSON.parse(Object.keys(body)[0]) + } // Fallback return body } // HTTP POST API -module.exports = async (req, res) => { - const { hostname } = req +module.exports = async (request, response) => { + const { hostname } = request // Get different parts of hostname (example: remy.mit-license.org -> ['remy', 'mit-license', 'org']) const params = hostname.split('.') // This includes the copyright, year, etc. - const userData = getUserData(req) + const userData = getUserData(request) // If there isn't enough part of the hostname if (params.length < 2) { - res.status(400).send('Please specify a subdomain in the URL.') + response.status(400).send('Please specify a subdomain in the URL.') return } // Extract the name from the URL - const id = params[0] + const [id] = params - if (!validDomainId(id)) { + if (!isDomainId(id)) { // Return a vague error intentionally - res + response .status(400) .send( 'User already exists - to update values, please send a pull request on https://github.com/remy/mit-license' @@ -58,9 +62,8 @@ module.exports = async (req, res) => { } // Check if the user file exists in the users directory - const exists = await pathExists(path.join(__dirname, '..', 'users', `${id}.json`)) - if (exists) { - res + if (await pathExists(path.join(__dirname, '..', 'users', `${id}.json`))) { + response .status(409) .send( 'User already exists - to update values, please send a pull request on https://github.com/remy/mit-license' @@ -72,7 +75,7 @@ module.exports = async (req, res) => { // Parse the string version of a boolean or similar userData.gravatar = yn(userData.gravatar, { lenient: true }) if (is.undefined(userData.gravatar)) { - res + response .status(400) .send( 'The "gravatar" JSON property must be a boolean.' @@ -84,28 +87,29 @@ module.exports = async (req, res) => { // File doesn't exist // If copyright property and key doesn't exist if (!userData.copyright) { - res.status(400).send('JSON requires "copyright" property and value') + response.status(400).send('JSON requires "copyright" property and value') return } try { - await github.repos.createOrUpdateFileContents({ - owner: 'remy', - repo: 'mit-license', - path: `users/${id}.json`, - message: `Automated creation of user ${id}.`, - content: btoa(JSON.stringify(userData, 0, 2)), - committer: { - name: 'MIT License Bot', - email: 'remy@leftlogic.com' - } - }) + await Promise.all([ + github.repos.createOrUpdateFileContents({ + owner: 'remy', + repo: 'mit-license', + path: `users/${id}.json`, + message: `Automated creation of user ${id}.`, + content: btoa(JSON.stringify(userData, 0, 2)), + committer: { + name: 'MIT License Bot', + email: 'remy@leftlogic.com' + } + }), + writeJsonFile(path.join(__dirname, '..', 'users', `${id}.json`), userData, { indent: undefined }) + ]) - await writeJsonFile(path.join(__dirname, '..', 'users', `${id}.json`), userData, { indent: undefined }) - - res.status(201).send(`MIT license page created: https://${hostname}`) - } catch (err) { - res + response.status(201).send(`MIT license page created: https://${hostname}`) + } catch { + response .status(500) .send( 'Unable to create new user - please send a pull request on https://github.com/remy/mit-license' diff --git a/routes/utils.js b/routes/utils.js index d07c3d94..763b46a2 100644 --- a/routes/utils.js +++ b/routes/utils.js @@ -1,3 +1 @@ -module.exports = { - validDomainId: str => /^[\w-_]+$/.test(str) -} +exports.isDomainId = value => /^[\w-_]+$/.test(value) diff --git a/server.js b/server.js index a87f1b4e..17d77852 100644 --- a/server.js +++ b/server.js @@ -24,7 +24,6 @@ app.use( ) app.use(favicon(path.join(__dirname, 'favicon.ico'))) app.set('views', path.join(__dirname, '/licenses')) -app.set('view engine', 'ejs') // Setup static files app.use('/robots.txt', express.static('robots.txt')) @@ -34,12 +33,11 @@ app.use( postcssMiddleware({ plugins: [ require('postcss-preset-env')({ - overrideBrowserslist: '>= 0%', - stage: 0 + overrideBrowserslist: '>= 0%' }) ], - src (req) { - return path.join(__dirname, 'themes', req.path) + src (request) { + return path.join(__dirname, 'themes', request.path) } }), express.static('themes') diff --git a/test.js b/test.js index 1eee5192..9b4315b1 100644 --- a/test.js +++ b/test.js @@ -1,7 +1,7 @@ const { promises: fs } = require('fs') const writeJsonFile = require('write-json-file') const CSS = require('css') -const { validDomainId } = require('./routes/utils') +const { isDomainId } = require('./routes/utils') const hasFlag = require('has-flag') const getExtension = require('file-ext') const path = require('path-extra') @@ -23,7 +23,7 @@ async function report (content, fix) { }) } - if (!validDomainId(path.base(user))) { + if (!isDomainId(path.base(user))) { await report(`${user} is not a valid domain id.`) } diff --git a/yarn.lock b/yarn.lock index b701101facb908898fc0575dba6c6ca119f15f47..b0f5033fd263dc1e1c269254ad6ffb852823fc68 100644 GIT binary patch delta 22538 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