From 6acdac90b15412ac0775445cd719ada39a17bdc7 Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Fri, 4 Feb 2022 09:35:50 -0800 Subject: [PATCH] feat(tools): add eslint/prettier (#151) * feat(tools): add eslint/prettier * fix: es2021 Co-authored-by: Oliver Eyton-Williams * fix: ignore the boilerplate test files * chore: lint american-british-translator * chore: lint anonymous-message-board * chore: lint chart-the-stock-market * chore: lint exercise-tracker * chore: lint file-metadata-microservice * chore: lint forum-proxy * chore: lint image-search-abstraction-layer * chore: lint issue-tracker * chore: lint manage-a-book-trading-club * chore: lint metric-imperial-converter * chore: lint p2p-video-chat-application * chore: lint personal-library * chore: lint request-header-parser-microservice * chore: lint secure-real-time-multiplayer-game * chore: lint stock-price-checker-proxy * chore: lint stock-price-checker * chore: lint sudoku-solver * chore: lint timestamp-microservice * chore: lint twitch-proxy * chore: lint voting-app * chore: lint weather-proxy * fix: modules for specific test file * feat: enable linting * chore: move configs around Co-authored-by: Oliver Eyton-Williams * chore: lint new react errors Co-authored-by: Oliver Eyton-Williams --- .eslintignore | 6 + .eslintrc.json | 42 + .github/workflows/node-ci.yml | 3 + .prettierrc | 9 + .../components/translator.js | 10 +- .../american-british-translator/routes/api.js | 2 +- apps/american-british-translator/server.js | 3 +- .../tests/2_functional-tests.js | 2 - .../controllers/replyHandler.js | 4 +- .../controllers/threadHandler.js | 2 +- apps/anonymous-message-board/routes/api.js | 1 - apps/anonymous-message-board/server.js | 3 +- apps/build-a-pinterest-clone/client/index.jsx | 7 +- .../build-a-pinterest-clone/client/navbar.jsx | 6 + apps/build-a-pinterest-clone/client/pic.jsx | 6 +- apps/chart-the-stock-market/index.js | 4 +- apps/chart-the-stock-market/public/stocks.js | 1 + apps/exercise-tracker/routes/api.js | 2 +- apps/exercise-tracker/server.js | 2 +- apps/file-metadata-microservice/server.js | 2 +- apps/forum-proxy/server.js | 4 +- .../public/imageSearch.js | 2 +- apps/issue-tracker/models/issue.js | 2 +- apps/issue-tracker/routes/api.js | 11 +- apps/issue-tracker/server.js | 3 +- .../manage-a-book-trading-club/.eslintrc.json | 8 - apps/manage-a-book-trading-club/server.js | 2 +- .../controllers/convertHandler.js | 2 +- apps/metric-imperial-converter/routes/api.js | 1 - apps/metric-imperial-converter/server.js | 3 +- .../public/client.js | 6 +- apps/p2p-video-chat-application/server.js | 2 - apps/personal-library/public/client.js | 6 +- apps/personal-library/routes/api.js | 4 +- apps/personal-library/server.js | 2 +- apps/personal-library/tests/1_unit-tests.js | 8 - .../tests/2_functional-tests.js | 3 +- .../server.js | 2 +- .../server.js | 3 +- .../tests/1_unit-tests.js | 9 +- apps/stock-price-checker-proxy/server.js | 4 +- apps/stock-price-checker/routes/api.js | 1 - apps/stock-price-checker/server.js | 3 +- .../stock-price-checker/tests/1_unit-tests.js | 20 - .../tests/2_functional-tests.js | 5 +- .../controllers/puzzle-strings.js | 4 +- .../controllers/sudoku-solver.js | 2 +- apps/sudoku-solver/server.js | 3 +- apps/sudoku-solver/tests/1_unit-tests.js | 6 +- apps/timestamp-microservice/server.js | 2 +- apps/twitch-proxy/server.js | 2 +- apps/twitch-proxy/static-data/update.js | 2 +- apps/voting-app/app.js | 4 +- apps/weather-proxy/server.js | 8 +- package-lock.json | 1358 ++++++++++++++++- package.json | 4 + 56 files changed, 1489 insertions(+), 139 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.json create mode 100644 .prettierrc delete mode 100644 apps/manage-a-book-trading-club/.eslintrc.json delete mode 100644 apps/personal-library/tests/1_unit-tests.js delete mode 100644 apps/stock-price-checker/tests/1_unit-tests.js diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..9fe50007 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,6 @@ +# Ignore minified libraries +apps/voting-app/public/*.min.js +# Ignore test runner files? +apps/**/assertion-analyser.js +apps/**/test-runner.js +apps/**/fcctesting.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..6ff8a2d5 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,42 @@ +{ + "env": { + "es2021": true, + "browser": true, + "mocha": true, + "node": true + }, + "globals": { + "Promise": true, + "window": true, + "$": true, + "ga": true, + "jQuery": true, + "router": true + }, + "extends": ["eslint:recommended", "prettier"], + "overrides": [ + { + "files": ["apps/secure-real-time-multiplayer-game/tests/1_unit-tests.js"], + "parserOptions": { + "sourceType": "module" + } + }, + { + "files": ["**/*.jsx"], + "settings": { + "react": { + "version": "15.7.0" + } + }, + "rules": { + "react/no-string-refs": "off" + }, + "extends": ["plugin:react/recommended"], + "parserOptions": { + "ecmaFeatures": { + "jsx": true + } + } + } + ] +} diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 34735b2a..3c8b92be 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -29,5 +29,8 @@ jobs: - name: Install Dependencies run: npm ci + - name: Lint Files + run: npm run lint + - name: Run Tests run: npm run test-local-or-ci diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..2c652fea --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "endOfLine": "lf", + "semi": true, + "singleQuote": true, + "jsxSingleQuote": true, + "tabWidth": 2, + "trailingComma": "none", + "arrowParens": "avoid" +} diff --git a/apps/american-british-translator/components/translator.js b/apps/american-british-translator/components/translator.js index 91b90ca7..53bfd054 100644 --- a/apps/american-british-translator/components/translator.js +++ b/apps/american-british-translator/components/translator.js @@ -5,11 +5,11 @@ const britishOnly = require('./british-only.js') class Translator { - static replaceCurry(word, replacement, highlight, adjustCase = false) { + static replaceCurry(_, replacement, highlight, adjustCase = false) { if(adjustCase) { replacement = replacement.replace(/^([a-z])/ig, letter => letter.toUpperCase()); } - return (word) => { + return () => { if(highlight) { return `${replacement}`.replace(/\s/g,"\0"); } else { @@ -35,14 +35,14 @@ class Translator { // Title Replacement for([american, british] of Object.entries(americanToBritishTitles) ) { - american = american.replace('.', '\.'); + american = american.replace('.', '\\.'); input = input.replace(new RegExp(`\\b${american}`,'gi'), Translator.replaceCurry(american,british,highlight, true)); } // Time Replacement, colon to period replacement if(highlight) { - input = input.replace(/(\d{1,2}):(\d{1,2})/gi, '\$1.\$2'); + input = input.replace(/(\d{1,2}):(\d{1,2})/gi, '$1.$2'); } else { input = input.replace(/(?<=\d{1,2}):(?=\d{1,2})/gi, '.'); } @@ -76,7 +76,7 @@ class Translator { // Time Replacement, period to colon replacement if(highlight) { - input = input.replace(/(\d{1,2}).(\d{1,2})/gi, '\$1:\$2'); + input = input.replace(/(\d{1,2}).(\d{1,2})/gi, '$1:$2'); } else { input = input.replace(/(?<=\d{1,2})\.(?=\d{1,2})/gi, ':'); } diff --git a/apps/american-british-translator/routes/api.js b/apps/american-british-translator/routes/api.js index c95f2373..31fd5155 100644 --- a/apps/american-british-translator/routes/api.js +++ b/apps/american-british-translator/routes/api.js @@ -15,7 +15,7 @@ module.exports = function (app) { app.route('/api/translate') .post((req, res) => { let text = req.body.text; - if(!req.body.hasOwnProperty('text') || !req.body.locale) { + if(!("text" in req.body) || !req.body.locale) { return res.json({ error: 'Required field(s) missing' }); } diff --git a/apps/american-british-translator/server.js b/apps/american-british-translator/server.js index 60f2d490..1c6b7dd3 100644 --- a/apps/american-british-translator/server.js +++ b/apps/american-british-translator/server.js @@ -1,7 +1,6 @@ require('dotenv').config(); const express = require('express'); const bodyParser = require('body-parser'); -const expect = require('chai').expect; const cors = require('cors'); const fccTestingRoutes = require('./routes/fcctesting.js'); @@ -29,7 +28,7 @@ fccTestingRoutes(app); userRoutes(app); // 404 Not Found Middleware -app.use(function(req, res, next) { +app.use(function(req, res) { res.status(404) .type('text') .send('Not Found'); diff --git a/apps/american-british-translator/tests/2_functional-tests.js b/apps/american-british-translator/tests/2_functional-tests.js index 74f7c9d3..347b816a 100644 --- a/apps/american-british-translator/tests/2_functional-tests.js +++ b/apps/american-british-translator/tests/2_functional-tests.js @@ -13,8 +13,6 @@ const server = require('../server.js'); chai.use(chaiHttp); -let Translator = require('../components/translator.js'); - suite('Functional Tests', () => { suite('"POST" to /api/translate', () => { diff --git a/apps/anonymous-message-board/controllers/replyHandler.js b/apps/anonymous-message-board/controllers/replyHandler.js index 43f9c971..37a89653 100644 --- a/apps/anonymous-message-board/controllers/replyHandler.js +++ b/apps/anonymous-message-board/controllers/replyHandler.js @@ -52,7 +52,7 @@ function ReplyHandler() { $set: { bumped_on: now }, $push: { replies: reply }, }, - (err, doc) => {} + () => {} ); } ); @@ -73,7 +73,7 @@ function ReplyHandler() { "replies._id": new ObjectId(req.body.reply_id), }, { $set: { "replies.$.reported": true } }, - (err, doc) => {} + () => {} ); } ); diff --git a/apps/anonymous-message-board/controllers/threadHandler.js b/apps/anonymous-message-board/controllers/threadHandler.js index 5fa2eca9..06858e28 100644 --- a/apps/anonymous-message-board/controllers/threadHandler.js +++ b/apps/anonymous-message-board/controllers/threadHandler.js @@ -73,7 +73,7 @@ function ThreadHandler() { collection.findOneAndUpdate( { _id: new ObjectId(req.body.report_id) }, { $set: { reported: true } }, - (err, doc) => {} + () => {} ); } ); diff --git a/apps/anonymous-message-board/routes/api.js b/apps/anonymous-message-board/routes/api.js index 0890da29..38eb8665 100644 --- a/apps/anonymous-message-board/routes/api.js +++ b/apps/anonymous-message-board/routes/api.js @@ -8,7 +8,6 @@ 'use strict'; -const expect = require('chai').expect; const ThreadHandler = require('../controllers/threadHandler.js'); const ReplyHandler = require('../controllers/replyHandler.js'); diff --git a/apps/anonymous-message-board/server.js b/apps/anonymous-message-board/server.js index 97daf8c6..4ca0a595 100644 --- a/apps/anonymous-message-board/server.js +++ b/apps/anonymous-message-board/server.js @@ -1,7 +1,6 @@ require('dotenv').config(); const express = require('express'); const bodyParser = require('body-parser'); -const expect = require('chai').expect; const cors = require('cors'); const helmet = require('helmet'); @@ -46,7 +45,7 @@ fccTestingRoutes(app); apiRoutes(app); // 404 Not Found middleware -app.use(function(req, res, next) { +app.use(function(req, res) { res.status(404) .type('text') .send('Not Found'); diff --git a/apps/build-a-pinterest-clone/client/index.jsx b/apps/build-a-pinterest-clone/client/index.jsx index bd77c21f..3998c332 100644 --- a/apps/build-a-pinterest-clone/client/index.jsx +++ b/apps/build-a-pinterest-clone/client/index.jsx @@ -10,6 +10,11 @@ var Nav = require('./navbar.jsx'); var appUrl = window.location.origin; +/** + * TODO: I assume at some point we'll bump the React version. + * When we do, we'll need to update this. + */ +// eslint-disable-next-line react/no-deprecated var App = React.createClass({ componentDidMount: function () { var self = this; @@ -83,7 +88,7 @@ var App = React.createClass({ deletePic: function(index) { var self = this; var id = this.state.pics[index]._id; - Ajax.delete(appUrl + '/api/pics/' + id, {}, function(err, d){ + Ajax.delete(appUrl + '/api/pics/' + id, {}, function(){ var pics = self.state.pics; pics.splice(index,1); self.setState({pics: pics}); diff --git a/apps/build-a-pinterest-clone/client/navbar.jsx b/apps/build-a-pinterest-clone/client/navbar.jsx index d75e163a..040d0503 100644 --- a/apps/build-a-pinterest-clone/client/navbar.jsx +++ b/apps/build-a-pinterest-clone/client/navbar.jsx @@ -1,5 +1,10 @@ var React = require('react'); +/** + * TODO: I assume at some point we'll bump the React version. + * When we do, we'll need to update this. + */ +// eslint-disable-next-line react/no-deprecated module.exports = React.createClass({ submit: function(e) { e.preventDefault(); @@ -13,6 +18,7 @@ module.exports = React.createClass({ var hideIfLoggedOut = this.props.loggedIn ? '' : ' hide'; var hideIfLoggedIn = this.props.loggedIn ? ' hide' : ''; var dOL = this.props.setPageDisabled; + var myPics; var all = myPics = ''; switch (this.props.page) { case 'all' : diff --git a/apps/build-a-pinterest-clone/client/pic.jsx b/apps/build-a-pinterest-clone/client/pic.jsx index 803d1bb4..657450fd 100644 --- a/apps/build-a-pinterest-clone/client/pic.jsx +++ b/apps/build-a-pinterest-clone/client/pic.jsx @@ -1,6 +1,10 @@ var React = require('react'); -var appUrl = window.location.origin; +/** + * TODO: I assume at some point we'll bump the React version. + * When we do, we'll need to update this. + */ +// eslint-disable-next-line react/no-deprecated module.exports = React.createClass({ render: function() { var likeClass = this.props.liked ? "liked btn btn-default btn-sm" : 'like btn btn-default btn-sm'; diff --git a/apps/chart-the-stock-market/index.js b/apps/chart-the-stock-market/index.js index 1d6a96e1..a476e672 100644 --- a/apps/chart-the-stock-market/index.js +++ b/apps/chart-the-stock-market/index.js @@ -24,7 +24,7 @@ io.on('connection', function(socket) { emitStockData(); socket.on('newStock', function(stock) { - if(!currentStockData.hasOwnProperty(stock.symbol) && Object.keys(currentStockData).length < 4) { + if(!(stock.symbol in currentStockData) && Object.keys(currentStockData).length < 4) { const requestUrl = `https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=${stock.symbol}&apikey=${process.env.APIKEY}`; https.get(requestUrl, res => { @@ -60,7 +60,7 @@ io.on('connection', function(socket) { socket.on('deleteStock', function(stock) { console.log('delete' + stock); console.log(stock.symbol); - if(currentStockData.hasOwnProperty(stock.symbol)) { + if(stock.symbol in currentStockData) { delete currentStockData[stock.symbol]; emitStockData(); diff --git a/apps/chart-the-stock-market/public/stocks.js b/apps/chart-the-stock-market/public/stocks.js index d37c56b7..50446426 100644 --- a/apps/chart-the-stock-market/public/stocks.js +++ b/apps/chart-the-stock-market/public/stocks.js @@ -1,3 +1,4 @@ +/* global io, Chart */ var stockData = {}; /////////// socket connection //////////// diff --git a/apps/exercise-tracker/routes/api.js b/apps/exercise-tracker/routes/api.js index 871f636d..cce945a4 100644 --- a/apps/exercise-tracker/routes/api.js +++ b/apps/exercise-tracker/routes/api.js @@ -3,7 +3,7 @@ const Exercises = require('../models/exercises'); const router = require('express').Router(); -router.get('/users', (req, res, next) => { +router.get('/users', (req, res) => { Users.find({}, (err, data) => { res.json(data) }) diff --git a/apps/exercise-tracker/server.js b/apps/exercise-tracker/server.js index 6bb0077c..457f70f2 100644 --- a/apps/exercise-tracker/server.js +++ b/apps/exercise-tracker/server.js @@ -27,7 +27,7 @@ app.use((req, res, next) => { }) // Error Handling middleware -app.use((err, req, res, next) => { +app.use((err, req, res) => { let errCode, errMessage if (err.errors) { diff --git a/apps/file-metadata-microservice/server.js b/apps/file-metadata-microservice/server.js index 1ebb9fa5..eeb9c8d4 100644 --- a/apps/file-metadata-microservice/server.js +++ b/apps/file-metadata-microservice/server.js @@ -30,7 +30,7 @@ app.post('/api/fileanalyse',upload.single('upfile'), function(req, res){ // 404-NOT FOUND Middleware - app.use(function(req, res, next){ + app.use(function(req, res){ res.status(404); res.type('txt').send('Not found'); }); diff --git a/apps/forum-proxy/server.js b/apps/forum-proxy/server.js index 8d2cfe4b..154f3c90 100644 --- a/apps/forum-proxy/server.js +++ b/apps/forum-proxy/server.js @@ -21,11 +21,11 @@ app.get('/latest', (req, res, next) => { app.use((req, res) => res.status(404).send('not found')); -app.use((err, req, res, next) => res.status(500).json(err)); +app.use((err, req, res) => res.status(500).json(err)); const portNum = process.env.PORT || 3000; -const listener = app.listen(portNum, function() { +app.listen(portNum, function() { console.log(`Your app is listening on port ${portNum}`); }); diff --git a/apps/image-search-abstraction-layer/public/imageSearch.js b/apps/image-search-abstraction-layer/public/imageSearch.js index 27bf70f8..f6bd342b 100644 --- a/apps/image-search-abstraction-layer/public/imageSearch.js +++ b/apps/image-search-abstraction-layer/public/imageSearch.js @@ -19,7 +19,7 @@ function enableInputs() { page.removeAttribute('disabled'); size.removeAttribute('disabled'); updateURL(); - } else if(selected = "recent") { + } else if(selected == "recent") { query.setAttribute('disabled', "true"); page.setAttribute('disabled', "true"); size.setAttribute('disabled', "true"); diff --git a/apps/issue-tracker/models/issue.js b/apps/issue-tracker/models/issue.js index fab3918f..f81a013b 100644 --- a/apps/issue-tracker/models/issue.js +++ b/apps/issue-tracker/models/issue.js @@ -19,7 +19,7 @@ const IssueSchema = new mongoose.Schema({ // Hide project and __v fields from JSON // Ref: https://stackoverflow.com/a/17063594/1420506 IssueSchema.set('toJSON', { - transform: function(doc, ret, options) { + transform: function(doc, ret) { delete ret.project; delete ret.__v; return ret; diff --git a/apps/issue-tracker/routes/api.js b/apps/issue-tracker/routes/api.js index 2abf066b..c1eebdb2 100644 --- a/apps/issue-tracker/routes/api.js +++ b/apps/issue-tracker/routes/api.js @@ -8,13 +8,10 @@ 'use strict'; -const expect = require('chai').expect; -const MongoClient = require('mongodb'); -const ObjectId = require('mongodb').ObjectID; const IssueModel = require('../models/issue').IssueModel; const mongoose = require('mongoose'); -const connection = mongoose.connect(process.env.DB, { +mongoose.connect(process.env.DB, { useNewUrlParser: true, useUnifiedTopology: true }); @@ -46,7 +43,7 @@ module.exports = function (app) { // Build Query let query = { project: project }; // We always filter by project field_list.forEach(field => { - if(req.query.hasOwnProperty(field)) { + if(field in req.query) { query[field] = req.query[field]; } }) @@ -61,7 +58,7 @@ module.exports = function (app) { // check required fields let missing_fields = ['issue_title', 'issue_text', 'created_by'] - .filter( field => !req.body.hasOwnProperty(field)) + .filter( field => !(field in req.body)) .join(','); if(missing_fields) { @@ -102,7 +99,7 @@ module.exports = function (app) { let update = {}; let count = 0; updatable_fields.forEach(field => { - if(req.body.hasOwnProperty(field)) { + if(field in req.body) { update[field] = req.body[field]; count++; } diff --git a/apps/issue-tracker/server.js b/apps/issue-tracker/server.js index 8437dbf1..fb2db464 100644 --- a/apps/issue-tracker/server.js +++ b/apps/issue-tracker/server.js @@ -3,7 +3,6 @@ require('dotenv').config(); const express = require('express'); const bodyParser = require('body-parser'); -const expect = require('chai').expect; const cors = require('cors'); const apiRoutes = require('./routes/api.js'); @@ -40,7 +39,7 @@ fccTestingRoutes(app); apiRoutes(app); //404 Not Found Middleware -app.use(function(req, res, next) { +app.use(function(req, res) { res.status(404) .type('text') .send('Not Found'); diff --git a/apps/manage-a-book-trading-club/.eslintrc.json b/apps/manage-a-book-trading-club/.eslintrc.json deleted file mode 100644 index f83a784e..00000000 --- a/apps/manage-a-book-trading-club/.eslintrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "airbnb-base", - "rules": { - "no-console": 0, - "no-underscore-dangle": 0, - "strict": 0 - } -} diff --git a/apps/manage-a-book-trading-club/server.js b/apps/manage-a-book-trading-club/server.js index cd7d6112..2381d8da 100644 --- a/apps/manage-a-book-trading-club/server.js +++ b/apps/manage-a-book-trading-club/server.js @@ -8,6 +8,6 @@ const app = require('./app/app'); const portNum = process.env.PORT || 3000; -const server = app.listen(portNum, () => { +app.listen(portNum, () => { console.log(`server listening on port ${portNum}`); }); diff --git a/apps/metric-imperial-converter/controllers/convertHandler.js b/apps/metric-imperial-converter/controllers/convertHandler.js index 925fb09c..9c9e2bcc 100644 --- a/apps/metric-imperial-converter/controllers/convertHandler.js +++ b/apps/metric-imperial-converter/controllers/convertHandler.js @@ -114,7 +114,7 @@ function ConvertHandler() { } // If unit exists, return it - if(units.hasOwnProperty(unit)) { + if(unit in units) { if(unit === "l") { return "L"; } diff --git a/apps/metric-imperial-converter/routes/api.js b/apps/metric-imperial-converter/routes/api.js index dd680801..6c674ef9 100644 --- a/apps/metric-imperial-converter/routes/api.js +++ b/apps/metric-imperial-converter/routes/api.js @@ -8,7 +8,6 @@ 'use strict'; -const expect = require('chai').expect; const ConvertHandler = require('../controllers/convertHandler.js'); module.exports = function (app) { diff --git a/apps/metric-imperial-converter/server.js b/apps/metric-imperial-converter/server.js index 570bd737..099b03c3 100644 --- a/apps/metric-imperial-converter/server.js +++ b/apps/metric-imperial-converter/server.js @@ -2,7 +2,6 @@ const express = require('express'); const bodyParser = require('body-parser'); -const expect = require('chai').expect; const cors = require('cors'); require('dotenv').config(); @@ -32,7 +31,7 @@ fccTestingRoutes(app); apiRoutes(app); //404 Not Found Middleware -app.use(function(req, res, next) { +app.use(function(req, res) { res.status(404) .type('text') .send('Not Found'); diff --git a/apps/p2p-video-chat-application/public/client.js b/apps/p2p-video-chat-application/public/client.js index 3ecc9201..29763b41 100644 --- a/apps/p2p-video-chat-application/public/client.js +++ b/apps/p2p-video-chat-application/public/client.js @@ -20,11 +20,11 @@ $(document).ready(function () { const localVideo = document.querySelector("#localVideo"); localVideo.srcObject = stream; - localVideo.onloadedmetadata = function (e) { + localVideo.onloadedmetadata = function () { localVideo.play(); }; - const room = prompt("Type a room name"); + let room = prompt("Type a room name"); while ($.trim(room) === "") room = prompt("Type a room name"); @@ -90,7 +90,7 @@ $(document).ready(function () { console.log("Streaming Remote Video!"); const remoteVideo = document.querySelector("#remoteVideo"); remoteVideo.srcObject = stream; - remoteVideo.onloadedmetadata = function (e) { + remoteVideo.onloadedmetadata = function () { remoteVideo.play(); }; }); diff --git a/apps/p2p-video-chat-application/server.js b/apps/p2p-video-chat-application/server.js index 1f1ca6df..2d9f6169 100644 --- a/apps/p2p-video-chat-application/server.js +++ b/apps/p2p-video-chat-application/server.js @@ -22,7 +22,6 @@ io.on('connection',function(socket){ io.in(room).clients(function(error, clients){ if (error) { throw error; - return; } if(clients.length >= 2) @@ -56,7 +55,6 @@ io.on('connection',function(socket){ io.in(roomMessage.room).clients(function(error, clients){ if (error) { throw error; - return; } if(clients.indexOf(socket.id)!==-1) { diff --git a/apps/personal-library/public/client.js b/apps/personal-library/public/client.js index 1f1f9612..63c0e744 100644 --- a/apps/personal-library/public/client.js +++ b/apps/personal-library/public/client.js @@ -50,7 +50,7 @@ $( document ).ready(function() { type: 'post', dataType: 'json', data: $('#newCommentForm').serialize(), - success: function(data) { + success: function() { comments.unshift(newComment); //adds new comment to top of list $('#detailComments').html(comments.join('')); } @@ -63,7 +63,7 @@ $( document ).ready(function() { type: 'post', dataType: 'json', data: $('#newBookForm').serialize(), - success: function(data) { + success: function() { //update list } }); @@ -75,7 +75,7 @@ $( document ).ready(function() { type: 'delete', dataType: 'json', data: $('#newBookForm').serialize(), - success: function(data) { + success: function() { //update list } }); diff --git a/apps/personal-library/routes/api.js b/apps/personal-library/routes/api.js index 77a2d23a..2a14e7a6 100644 --- a/apps/personal-library/routes/api.js +++ b/apps/personal-library/routes/api.js @@ -8,8 +8,6 @@ "use strict"; -const MongoClient = require("mongodb").MongoClient; -const ObjectId = require("mongodb").ObjectId; const MONGODB_CONNECTION_STRING = process.env.DB; const Mongoose = require("mongoose"); const BookModel = require("../db/BookModel").BookModel; @@ -106,7 +104,7 @@ module.exports = function (app) { res.status(200).send("no book exists"); return; } - const deleted = await BookModel.deleteOne({ _id: bookid }); + await BookModel.deleteOne({ _id: bookid }); res.status(200).send("delete successful"); }); }; diff --git a/apps/personal-library/server.js b/apps/personal-library/server.js index 30ccd142..1974a854 100644 --- a/apps/personal-library/server.js +++ b/apps/personal-library/server.js @@ -31,7 +31,7 @@ fccTestingRoutes(app); apiRoutes(app); //404 Not Found Middleware -app.use(function(req, res, next) { +app.use(function(req, res) { res.status(404) .type('text') .send('Not Found'); diff --git a/apps/personal-library/tests/1_unit-tests.js b/apps/personal-library/tests/1_unit-tests.js deleted file mode 100644 index 68d800c7..00000000 --- a/apps/personal-library/tests/1_unit-tests.js +++ /dev/null @@ -1,8 +0,0 @@ -const chai = require('chai'); -const assert = chai.assert; - -suite('Unit Tests', function(){ - - //No unit tests needed for this project - -}); \ No newline at end of file diff --git a/apps/personal-library/tests/2_functional-tests.js b/apps/personal-library/tests/2_functional-tests.js index 1ae04e98..8ab72bb4 100644 --- a/apps/personal-library/tests/2_functional-tests.js +++ b/apps/personal-library/tests/2_functional-tests.js @@ -10,11 +10,10 @@ const chaiHttp = require("chai-http"); const chai = require("chai"); const assert = chai.assert; const server = require("../server"); -const assertionAnalyser = require("../assertion-analyser"); chai.use(chaiHttp); -let id1, id2; +let id1; const idFake = "5f665eb46e296f6b9b6a504d" suite("Functional Tests", function () { diff --git a/apps/request-header-parser-microservice/server.js b/apps/request-header-parser-microservice/server.js index 3ec04498..07884e16 100644 --- a/apps/request-header-parser-microservice/server.js +++ b/apps/request-header-parser-microservice/server.js @@ -25,7 +25,7 @@ app.route('/api/whoami') }); // 404 Not Found Middleware -app.use(function(req, res, next) { +app.use(function(req, res) { res.status(404) .type('text') .send('Not Found'); diff --git a/apps/secure-real-time-multiplayer-game/server.js b/apps/secure-real-time-multiplayer-game/server.js index d155837a..89c13ebe 100644 --- a/apps/secure-real-time-multiplayer-game/server.js +++ b/apps/secure-real-time-multiplayer-game/server.js @@ -1,7 +1,6 @@ require('dotenv').config(); const express = require('express'); const bodyParser = require('body-parser'); -const expect = require('chai'); const helmet = require('helmet'); const cors = require('cors'); const socket = require('socket.io'); @@ -32,7 +31,7 @@ app.route('/') fccTestingRoutes(app); // 404 Not Found Middleware -app.use(function(req, res, next) { +app.use(function(req, res) { res.status(404) .type('text') .send('Not Found'); diff --git a/apps/secure-real-time-multiplayer-game/tests/1_unit-tests.js b/apps/secure-real-time-multiplayer-game/tests/1_unit-tests.js index 530f0a98..f52f81f1 100644 --- a/apps/secure-real-time-multiplayer-game/tests/1_unit-tests.js +++ b/apps/secure-real-time-multiplayer-game/tests/1_unit-tests.js @@ -6,9 +6,8 @@ * with [Ctrl + `] (backtick) and run the command `npm run test`. * */ - -import Player from '../public/Player.mjs'; -import Collectible from '../public/Collectible.mjs'; +import Player from "../public/Player.mjs"; +import Collectible from "../public/Collectible.mjs"; const chai = require('chai'); const assert = chai.assert; const { JSDOM } = require('jsdom'); @@ -93,8 +92,8 @@ suite('Unit Tests', () => { const testArr = [ testPlayer1, testPlayer2 ]; // Account for possible space - assert.match(testPlayer1.calculateRank(testArr), /Rank\: 1\s?\/\s?2/); - assert.match(testPlayer2.calculateRank(testArr), /Rank\: 2\s?\/\s?2/); + assert.match(testPlayer1.calculateRank(testArr), /Rank: 1\s?\/\s?2/); + assert.match(testPlayer2.calculateRank(testArr), /Rank: 2\s?\/\s?2/); done(); }); }); diff --git a/apps/stock-price-checker-proxy/server.js b/apps/stock-price-checker-proxy/server.js index c4b97935..28ace7bf 100644 --- a/apps/stock-price-checker-proxy/server.js +++ b/apps/stock-price-checker-proxy/server.js @@ -12,7 +12,7 @@ app.get("/", (req, res) => { res.sendFile(__dirname + "/views/index.html"); }); -app.use((err, req, res, next) => { +app.use((err, req, res) => { if (err) { console.log(err.message, err.stack); res.status(500).json({ status: "internal server error" }); @@ -21,6 +21,6 @@ app.use((err, req, res, next) => { const portNum = process.env.PORT || 3000; -const listener = app.listen(portNum, () => { +app.listen(portNum, () => { console.log("stock proxy is listening on port " + portNum); }); diff --git a/apps/stock-price-checker/routes/api.js b/apps/stock-price-checker/routes/api.js index 81b4ebc3..586d3a8e 100644 --- a/apps/stock-price-checker/routes/api.js +++ b/apps/stock-price-checker/routes/api.js @@ -8,7 +8,6 @@ 'use strict'; -var expect = require('chai').expect; var StockHandler = require('../controllers/stockHandler.js'); module.exports = function (app) { diff --git a/apps/stock-price-checker/server.js b/apps/stock-price-checker/server.js index 720a901b..f671b47f 100644 --- a/apps/stock-price-checker/server.js +++ b/apps/stock-price-checker/server.js @@ -3,7 +3,6 @@ require('dotenv').config(); var express = require('express'); var bodyParser = require('body-parser'); -var expect = require('chai').expect; var cors = require('cors'); var helmet = require('helmet'); @@ -41,7 +40,7 @@ fccTestingRoutes(app); apiRoutes(app); //404 Not Found Middleware -app.use(function(req, res, next) { +app.use(function(req, res) { res.status(404) .type('text') .send('Not Found'); diff --git a/apps/stock-price-checker/tests/1_unit-tests.js b/apps/stock-price-checker/tests/1_unit-tests.js deleted file mode 100644 index 1e7f2062..00000000 --- a/apps/stock-price-checker/tests/1_unit-tests.js +++ /dev/null @@ -1,20 +0,0 @@ -/* -* -* -* FILL IN EACH UNIT TEST BELOW COMPLETELY -* -----[Keep the tests in the same order!]---- -* (if additional are added, keep them at the very end!) -*/ - -var chai = require('chai'); -var StockHandler = require('../controllers/stockHandler.js'); - -var stockPrices = new StockHandler(); - -suite('Unit Tests', function(){ - - suite('Function convertHandler.getNum(input)', function() { - - }); - -}); \ No newline at end of file diff --git a/apps/stock-price-checker/tests/2_functional-tests.js b/apps/stock-price-checker/tests/2_functional-tests.js index 33da9c80..58055004 100644 --- a/apps/stock-price-checker/tests/2_functional-tests.js +++ b/apps/stock-price-checker/tests/2_functional-tests.js @@ -65,15 +65,12 @@ suite('Functional Tests', function() { done(); }); }); - - var rel_likes; - + test('2 stocks', function(done) { chai.request(server) .get('/api/stock-prices') .query({stock: ['goog','msft']}) .end(function(err, res){ - rel_likes = Math.abs(res.body.stockData[0].rel_likes); assert.equal(res.status, 200); assert.isArray(res.body.stockData); assert.property(res.body.stockData[0], 'stock'); diff --git a/apps/sudoku-solver/controllers/puzzle-strings.js b/apps/sudoku-solver/controllers/puzzle-strings.js index c58405cb..debb51c3 100644 --- a/apps/sudoku-solver/controllers/puzzle-strings.js +++ b/apps/sudoku-solver/controllers/puzzle-strings.js @@ -1,4 +1,4 @@ -export const puzzlesAndSolutions = [ +const puzzlesAndSolutions = [ [ '1.5..2.84..63.12.7.2..5.....9..1....8.2.3674.3.7.2..9.47...8..1..16....926914.37.', '135762984946381257728459613694517832812936745357824196473298561581673429269145378' @@ -20,3 +20,5 @@ export const puzzlesAndSolutions = [ '827549163531672894649831527496157382218396475753284916962415738185763249374928651' ] ]; + +module.exports = puzzlesAndSolutions; diff --git a/apps/sudoku-solver/controllers/sudoku-solver.js b/apps/sudoku-solver/controllers/sudoku-solver.js index 781b6427..6cb6f9e0 100644 --- a/apps/sudoku-solver/controllers/sudoku-solver.js +++ b/apps/sudoku-solver/controllers/sudoku-solver.js @@ -88,7 +88,7 @@ class SudokuSolver { } } - exportString(input) { + exportString() { let output = ""; for (let row = 0; row < WIDTH; row++) { for (let col = 0; col < HEIGHT; col++) { diff --git a/apps/sudoku-solver/server.js b/apps/sudoku-solver/server.js index 8c221f15..064dab85 100644 --- a/apps/sudoku-solver/server.js +++ b/apps/sudoku-solver/server.js @@ -1,7 +1,6 @@ require('dotenv').config(); const express = require('express'); const bodyParser = require('body-parser'); -const expect = require('chai').expect; const cors = require('cors'); const fccTestingRoutes = require('./routes/fcctesting.js'); @@ -29,7 +28,7 @@ fccTestingRoutes(app); apiRoutes(app); //404 Not Found Middleware -app.use(function(req, res, next) { +app.use(function(req, res) { res.status(404) .type('text') .send('Not Found'); diff --git a/apps/sudoku-solver/tests/1_unit-tests.js b/apps/sudoku-solver/tests/1_unit-tests.js index 8ce655fb..51354baa 100644 --- a/apps/sudoku-solver/tests/1_unit-tests.js +++ b/apps/sudoku-solver/tests/1_unit-tests.js @@ -22,7 +22,7 @@ suite('UnitTests', () => { test('Valid Characters, length of 81', (done) => { const input = '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..'; - let [err, errString] = solver.validate(input); + let [err] = solver.validate(input); assert.isFalse(err); done(); @@ -63,7 +63,6 @@ suite('UnitTests', () => { test('Valid placement for a row', done => { const input = '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..'; const row = 0; - const col = 0; const value = 3; assert.isTrue(solver.checkRowPlacement(input, row, value)); @@ -74,7 +73,6 @@ suite('UnitTests', () => { test('Invalid placement for a row', done => { const input = '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..'; const row = 0; - const col = 0; const value = 9; assert.isFalse(solver.checkRowPlacement(input, row, value)); @@ -88,7 +86,6 @@ suite('UnitTests', () => { test('Valid placement for a column', done => { const input = '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..'; const row = 0; - const col = 0; const value = 3; assert.isTrue(solver.checkRowPlacement(input, row, value)); @@ -99,7 +96,6 @@ suite('UnitTests', () => { test('Invalid placement for a column', done => { const input = '..9..5.1.85.4....2432......1...69.83.9.....6.62.71...9......1945....4.37.4.3..6..'; const row = 0; - const col = 0; const value = 9; assert.isFalse(solver.checkRowPlacement(input, row, value)); diff --git a/apps/timestamp-microservice/server.js b/apps/timestamp-microservice/server.js index ff5da60e..3768237b 100644 --- a/apps/timestamp-microservice/server.js +++ b/apps/timestamp-microservice/server.js @@ -41,7 +41,7 @@ app.route(['/api/timestamp/:date?', '/api/:date?']).get((req, res) => { }); // 404 Not Found Middleware -app.use((req, res, next) => { +app.use((req, res) => { res.status(404).type('text').send('Not Found'); }); diff --git a/apps/twitch-proxy/server.js b/apps/twitch-proxy/server.js index 14ae3dd8..8159ef44 100644 --- a/apps/twitch-proxy/server.js +++ b/apps/twitch-proxy/server.js @@ -202,7 +202,7 @@ app.use(function(req, res) { sendData(req, res, null, { status: 404, error: "not found" }); }); -app.use(function(err, req, res, next) { +app.use(function(err, req, res) { log.error(`!! ${err.message || err.msg || err.error}`); err.status = err.status || 500; err.error = err.error || "internal server error"; diff --git a/apps/twitch-proxy/static-data/update.js b/apps/twitch-proxy/static-data/update.js index 7e8ad285..7a7a18da 100644 --- a/apps/twitch-proxy/static-data/update.js +++ b/apps/twitch-proxy/static-data/update.js @@ -73,7 +73,7 @@ const getKrakenUserData = async user => { }); }; const getAllKrakenData = async () => - Promise.all(_users.map(getKrakenUserData)).then((data, i) => { + Promise.all(_users.map(getKrakenUserData)).then((data) => { const out = {}; data.forEach((d, i) => { out[_users[i]] = d; diff --git a/apps/voting-app/app.js b/apps/voting-app/app.js index 6b0a68cd..37d05a25 100644 --- a/apps/voting-app/app.js +++ b/apps/voting-app/app.js @@ -89,7 +89,7 @@ mongo.connect(process.env.MONGO_URI, function(err, client) { options[optionArray[i]] = 0; } - polls.insert({ 'creator':app.locals.user, 'question': req.body.newquestion, 'options': options }, function(err, result) { + polls.insert({ 'creator':app.locals.user, 'question': req.body.newquestion, 'options': options }, function() { return mypolls(req, res); }); }); @@ -105,7 +105,7 @@ mongo.connect(process.env.MONGO_URI, function(err, client) { }); app.get('/delete/:id', function(req, res){ - polls.remove({ _id : ObjectID(req.params.id)}, function(err, result) { + polls.remove({ _id : ObjectID(req.params.id)}, function() { return mypolls(req, res); }); }); diff --git a/apps/weather-proxy/server.js b/apps/weather-proxy/server.js index ae54e012..2ddda79b 100644 --- a/apps/weather-proxy/server.js +++ b/apps/weather-proxy/server.js @@ -10,19 +10,19 @@ var weatherAPI = 'http://api.openweathermap.org/data/2.5/weather?units=metric&ap function replaceIconsWithLinks(data){ for(var i = 0; i < data.weather.length; ++i){ - if(data.weather[0].hasOwnProperty('icon')){ + if('icon' in data.weather[0]){ data.weather[0].icon = imgLinks[data.weather[0].icon]; } } } -function getBestCachedData(lon, lat){ +function getBestCachedData(){ var fs = require('fs'); var obj = JSON.parse(fs.readFileSync('./data/cache.json', 'utf8')); return obj; } -function addToCache(data){ +function addToCache(){ //For now does nothing. We aren't saving data. } @@ -67,7 +67,7 @@ app.get("/api/current", function(req, res) { console.log("REQUEST:" + req.body); console.log("REQUESTED URL:" + url); } - if(data.hasOwnProperty('weather')){ + if('weather' in data){ addToCache(data); } else { data = getBestCachedData(longitude, latitude); diff --git a/package-lock.json b/package-lock.json index d47cb059..1cb124cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,8 +38,11 @@ }, "devDependencies": { "concurrently": "7.0.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-react": "^7.28.0", "jest": "27.4.7", "npm-run-all": "4.1.5", + "prettier": "^2.5.1", "wait-port": "0.2.9" }, "engines": { @@ -2383,6 +2386,108 @@ "kuler": "^2.0.0" } }, + "node_modules/@eslint/eslintrc": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", + "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", + "dev": true, + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true, + "peer": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2901,6 +3006,16 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", @@ -3093,6 +3208,25 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=" }, + "node_modules/array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -3101,6 +3235,23 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.flatmap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", @@ -5941,6 +6092,19 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -6326,6 +6490,322 @@ "source-map": "~0.6.1" } }, + "node_modules/eslint": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", + "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz", + "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "dev": true, + "peer": true, + "dependencies": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -6338,6 +6818,32 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -7175,6 +7681,19 @@ "resolved": "apps/file-metadata-microservice", "link": true }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/file-stream-rotator": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.4.1.tgz", @@ -7353,6 +7872,27 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "peer": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true, + "peer": true + }, "node_modules/fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", @@ -7473,6 +8013,13 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true, + "peer": true + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -8155,6 +8702,16 @@ } ] }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/imagesearch": { "resolved": "apps/image-search-abstraction-layer", "link": true @@ -8172,6 +8729,33 @@ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -9565,6 +10149,13 @@ "jsonify": "~0.0.0" } }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true, + "peer": true + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -9638,6 +10229,19 @@ "promise": "^7.0.1" } }, + "node_modules/jsx-ast-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "object.assign": "^4.1.2" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/kareem": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", @@ -9770,6 +10374,13 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "peer": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -10954,6 +11565,50 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", + "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -10965,6 +11620,23 @@ "node": ">=0.10.0" } }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -11124,6 +11796,19 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parents": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", @@ -11439,6 +12124,18 @@ "node": ">=0.10.0" } }, + "node_modules/prettier": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/pretty-format": { "version": "27.4.6", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz", @@ -11932,6 +12629,35 @@ "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/regexpu-core": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", @@ -13095,6 +13821,25 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", + "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.padend": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", @@ -13351,6 +14096,13 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true, + "peer": true + }, "node_modules/throat": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", @@ -14049,6 +14801,13 @@ "uuid": "bin/uuid" } }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true, + "peer": true + }, "node_modules/v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", @@ -16052,22 +16811,102 @@ "to-fast-properties": "^2.0.0" } }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "dev": true, + "peer": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "peer": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "peer": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", + "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", + "dev": true, + "peer": true, "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" } }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true, + "peer": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -16512,6 +17351,14 @@ } } }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peer": true, + "requires": {} + }, "acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", @@ -16677,11 +17524,35 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=" }, + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, + "array.prototype.flatmap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, "arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", @@ -19134,6 +20005,16 @@ } } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "peer": true, + "requires": { + "esutils": "^2.0.2" + } + }, "doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -19435,11 +20316,270 @@ "source-map": "~0.6.1" } }, + "eslint": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", + "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", + "dev": true, + "peer": true, + "requires": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "peer": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "peer": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "peer": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "peer": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "peer": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "peer": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "requires": {} + }, + "eslint-plugin-react": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz", + "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "peer": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "peer": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "peer": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "dev": true, + "peer": true + }, + "espree": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "dev": true, + "peer": true, + "requires": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "peer": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "requires": { + "estraverse": "^5.2.0" + } + }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -20366,6 +21506,16 @@ } } }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "peer": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "file-stream-rotator": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.4.1.tgz", @@ -20509,6 +21659,24 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "peer": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true, + "peer": true + }, "fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", @@ -20583,6 +21751,13 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true, + "peer": true + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -21091,6 +22266,13 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "peer": true + }, "imagesearch": { "version": "file:apps/image-search-abstraction-layer", "requires": { @@ -21114,6 +22296,26 @@ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "peer": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "peer": true + } + } + }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -22175,6 +23377,13 @@ "jsonify": "~0.0.0" } }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true, + "peer": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -22227,6 +23436,16 @@ "promise": "^7.0.1" } }, + "jsx-ast-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "object.assign": "^4.1.2" + } + }, "kareem": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", @@ -22337,6 +23556,13 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "peer": true + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -23252,6 +24478,38 @@ "object-keys": "^1.1.1" } }, + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.hasown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", + "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -23260,6 +24518,17 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -23392,6 +24661,16 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "peer": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parents": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", @@ -23730,6 +25009,12 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, + "prettier": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "dev": true + }, "pretty-format": { "version": "27.4.6", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz", @@ -24160,6 +25445,23 @@ "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" }, + "regexp.prototype.flags": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "peer": true + }, "regexpu-core": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", @@ -25255,6 +26557,22 @@ "strip-ansi": "^6.0.1" } }, + "string.prototype.matchall": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", + "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + } + }, "string.prototype.padend": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", @@ -25460,6 +26778,13 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true, + "peer": true + }, "throat": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", @@ -26006,6 +27331,13 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true, + "peer": true + }, "v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", diff --git a/package.json b/package.json index 4d98024a..0ebbb595 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ }, "description": "Example projects for the freeCodeCamp.org curriculum", "scripts": { + "lint": "eslint apps --max-warnings 0", "start": "pm2 start ecosystem.config.js", "reload": "pm2 reload ecosystem.config.js", "restart": "pm2 restart ecosystem.config.js", @@ -42,8 +43,11 @@ }, "devDependencies": { "concurrently": "7.0.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-react": "^7.28.0", "jest": "27.4.7", "npm-run-all": "4.1.5", + "prettier": "^2.5.1", "wait-port": "0.2.9" }, "dependencies": {