From 6688cdf96d7cd99195512c9e060f0abf5375b976 Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Fri, 31 Jan 2020 21:20:04 +1300 Subject: [PATCH] refactor: Use reliable packages Signed-off-by: Richie Bendall --- .eslintrc.js | 1 - licenses/ISC.ejs | 33 ++++++++++---------- licenses/MIT.ejs | 43 +++++++++++++------------- licenses/components/footer.ejs | 3 +- licenses/components/header.ejs | 53 ++++++++++++++++----------------- package.json | 24 ++++++++------- routes/get.js | 14 +++++---- routes/post.js | 11 +++---- routes/utils.js | 13 -------- server.js | 4 +-- yarn.lock | Bin 175171 -> 183038 bytes 11 files changed, 97 insertions(+), 102 deletions(-) delete mode 100644 .eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 00cf4cd6..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@remy/eslint')('node'); diff --git a/licenses/ISC.ejs b/licenses/ISC.ejs index 4f433020..d993b2b0 100644 --- a/licenses/ISC.ejs +++ b/licenses/ISC.ejs @@ -1,26 +1,27 @@ <%- include('components/header') %> + -
-<%- gravatar %> -

The ISC License (ISC)

+
+ <%- gravatar %> +

The ISC License (ISC)

-

Copyright © <%- info %>

+

Copyright © <%- info %>

-

Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies.

+

Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies.

-

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

-
-<%- include('components/footer') %> +

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+
+ <%- include('components/footer') %> diff --git a/licenses/MIT.ejs b/licenses/MIT.ejs index 9823d05f..a3eda69a 100644 --- a/licenses/MIT.ejs +++ b/licenses/MIT.ejs @@ -1,32 +1,33 @@ <%- include('components/header') %> + -
-<%- gravatar %> -

The MIT License (MIT)

+
+ <%- gravatar %> +

The MIT License (MIT)

-

Copyright © <%- info %>

+

Copyright © <%- info %>

-

Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions:

+

Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the “Software”), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions:

-

The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software.

+

The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software.

-

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.

-
-<%- include('components/footer') %> +

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE.

+
+ <%- include('components/footer') %> diff --git a/licenses/components/footer.ejs b/licenses/components/footer.ejs index 4f857c83..2efbcf12 100644 --- a/licenses/components/footer.ejs +++ b/licenses/components/footer.ejs @@ -1,3 +1,4 @@ diff --git a/licenses/components/header.ejs b/licenses/components/header.ejs index 3ad2e4ab..92f315b9 100644 --- a/licenses/components/header.ejs +++ b/licenses/components/header.ejs @@ -1,38 +1,37 @@ -MIT License - - - - - - - - + + diff --git a/package.json b/package.json index 101c86ca..689154ca 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,4 @@ { - "author": "Remy Sharp (http://remysharp.com/)", "name": "mit-licence", "description": "Hosted MIT License with details controlled through this repo", "private": true, @@ -12,12 +11,7 @@ "engines": { "node": ">=10" }, - "husky": { - "hooks": { - "pre-commit": "npm run lint", - "pre-push": "npm test" - } - }, + "author": "Remy Sharp (http://remysharp.com/)", "scripts": { "start": "node .", "dev": "nodemon .", @@ -30,28 +24,38 @@ }, "license": "MIT", "dependencies": { - "@octokit/rest": "^16.36.0", + "@octokit/rest": "^16.41.0", + "@sindresorhus/is": "^2.0.0", + "any-size": "^1.0.0", "btoa": "^1.2.1", "ejs": "^3.0.1", + "escape-html": "^1.0.3", "express": "^4.17.1", "express-minify": "^1.0.0", "fs-extra": "^8.1.0", - "lodash": "^4.17.15", + "html-text": "^1.0.1", "md5": "^2.2.1", "postcss-middleware": "^1.1.4", "postcss-preset-env": "^6.7.0", "serve-favicon": "^2.5.0", "temp-dir": "^2.0.0", + "unescape-html": "^1.1.0", "yn": "^4.0.0" }, "devDependencies": { "css": "^2.2.4", "has-flag": "^4.0.0", - "husky": "^4.0.7", + "husky": "^4.2.1", "nodemon": "^2.0.2", "standard": "^14.3.1" }, "resolutions": { "postcss-middleware/vinyl-fs/glob-stream/micromatch/braces": "^3.0.2" + }, + "husky": { + "hooks": { + "pre-commit": "npm run lint", + "pre-push": "npm test" + } } } diff --git a/routes/get.js b/routes/get.js index 15d0f937..7193ceb8 100644 --- a/routes/get.js +++ b/routes/get.js @@ -1,12 +1,14 @@ const md5 = require('md5') const path = require('path') -const { stripTags, escapeTags, unescapeTags } = require('./utils') -const _ = require('lodash') +const escapeTags = require('escape-html') +const unescapeTags = require('unescape-html') +const stripTags = require('html-text') +const is = require('@sindresorhus/is') function getCopyrightHTML (user, plain) { let html = '' - const name = _.isString(user) + const name = is.string(user) ? user : plain ? user.name || user.copyright @@ -34,9 +36,9 @@ module.exports = (req, res) => { // No error and valid if (user.copyright) { - if (_.isString(user.copyright)) { + if (is.string(user.copyright)) { name = getCopyrightHTML(user, options.format !== 'html') - } else if (_.isArray(user.copyright) && user.copyright.every(val => _.isString(val))) { + } else if (is.array(user.copyright) && user.copyright.every(val => is.string(val))) { // Supports: ['Remy Sharp', 'Richie Bendall'] name = user.copyright .map(v => (options.format !== 'html' ? v : escapeTags(v))) @@ -51,7 +53,7 @@ module.exports = (req, res) => { gravatar = `Profile image` - } else if (_.isObject(user.copyright[0]) && user.gravatar) { + } else if (is.object(user.copyright[0]) && user.gravatar) { // Supports multi-user format gravatar = `Profile image { } // Extract the name from the URL - const id = _.first(params) + const id = params[0] if (!validDomainId(id)) { // Return a vague error intentionally @@ -65,7 +66,7 @@ module.exports = async (req, res) => { if (userData.gravatar) { // Parse the string version of a boolean or similar userData.gravatar = yn(userData.gravatar, { lenient: true }) - if (_.isUndefined(userData.gravatar)) { + if (is.undefined(userData.gravatar)) { res .status(400) .send( diff --git a/routes/utils.js b/routes/utils.js index 869c28af..d07c3d94 100644 --- a/routes/utils.js +++ b/routes/utils.js @@ -1,16 +1,3 @@ -const _ = require('lodash') - -const tags = { - '<': '<', - '>': '>', - '&': '&' -} -const untags = _.invert(tags) - module.exports = { - escapeTags: str => (str || '').replace(/[<>&]/g, m => tags[m]), - unescapeTags: str => - (str || '').replace(/(<|>|&)/g, m => untags[m]), - stripTags: str => (str || '').replace(/<(?:.|\n)*?>/gm, ''), validDomainId: str => /^[\w-_]+$/.test(str) } diff --git a/server.js b/server.js index 6df2a972..8dbac25d 100644 --- a/server.js +++ b/server.js @@ -9,7 +9,7 @@ const express = require('express') const minify = require('express-minify') const favicon = require('serve-favicon') const postcssMiddleware = require('postcss-middleware') -const tmpdir = require('temp-dir') +const tempdir = require('temp-dir') const path = require('path') // Server @@ -19,7 +19,7 @@ var PORT = process.env.PORT || 8080 const app = express() app.use( minify({ - cache: tmpdir + cache: tempdir }) ) app.use(favicon(path.join(__dirname, 'favicon.ico'))) diff --git a/yarn.lock b/yarn.lock index 46bd5c3cdd7dc10707c6c13a5a9e40be0c9e5d6e..9774c24182153fcb885ee92d04cb4c8b937bae30 100644 GIT binary patch delta 8880 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 V9d}Zzb-aD=-pLn!#OFTu{{iQp{E7eo delta 3490 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