From 231cd70e7ed34a83f1782aad1356efba1f465b77 Mon Sep 17 00:00:00 2001 From: gfisk777 <112730593+gfisk777@users.noreply.github.com> Date: Wed, 19 Oct 2022 13:28:40 -0400 Subject: [PATCH 01/37] Update index.html --- client/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/client/index.html b/client/index.html index 6f4402acf..500df4376 100644 --- a/client/index.html +++ b/client/index.html @@ -7,6 +7,7 @@ +

group 1 Garrett Fisk, Jaeha Song

\ No newline at end of file From d6b712f85a2d979741dcd482200553d0403a80b7 Mon Sep 17 00:00:00 2001 From: gfisk777 <112730593+gfisk777@users.noreply.github.com> Date: Fri, 11 Nov 2022 17:57:21 -0500 Subject: [PATCH 02/37] Update index.html --- client/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/client/index.html b/client/index.html index 500df4376..eb31293c2 100644 --- a/client/index.html +++ b/client/index.html @@ -9,5 +9,6 @@

group 1 Garrett Fisk, Jaeha Song

+ hello \ No newline at end of file From ce6481c823f2a02962232d5ad269e326bb1b05c8 Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Thu, 1 Dec 2022 18:00:13 -0500 Subject: [PATCH 03/37] imported files from lab 8 --- client/index.html | 85 ++++++++-- client/script.js | 215 +++++++++++++++++++++++++ client/styles.css | 393 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 680 insertions(+), 13 deletions(-) diff --git a/client/index.html b/client/index.html index eb31293c2..c2c7f2c67 100644 --- a/client/index.html +++ b/client/index.html @@ -1,14 +1,73 @@ + - - - - - Group Project Base - - - -

group 1 Garrett Fisk, Jaeha Song

- - hello - - \ No newline at end of file + + Group 1 - Garrett Fisk, Jaeha Song + + + + + + + + + +
+
+

Jaeha Song's Labs for INST377

+
+ +
+
+
+

Form Inputs

+
+
+
+ + +
+
+ +
+
+ +
+
+

Local Restaurant Map

+
+
+
+

A list of restaurants from an API.

+
+
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/client/script.js b/client/script.js index e69de29bb..a3e3dd98e 100644 --- a/client/script.js +++ b/client/script.js @@ -0,0 +1,215 @@ +/* eslint-disable max-len */ + +/* + Hook this script to index.html + by adding ` + @@ -40,7 +41,10 @@

Form Inputs

Local Restaurant Map

-
+ +
+ +

A list of restaurants from an API.

diff --git a/client/script.js b/client/script.js index ebf7d4d64..28de474f0 100644 --- a/client/script.js +++ b/client/script.js @@ -112,8 +112,29 @@ function markerPlace(array, map) { }); } -async function getData() { - const url = 'https://data.princegeorgescountymd.gov/resource/umjn-t2iz.json'; // remote URL! you can test it in your browser +function initChart(chartTarget) { + return new Chart(chartTarget, { + type: 'bar', + data: { + labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'], + datasets: [{ + label: '# of Votes', + data: [12, 19, 3, 5, 2, 3], + borderWidth: 1 + }] + }, + options: { + scales: { + y: { + beginAtZero: true + } + } + } + }); +} + +async function getData(submit) { + const url = 'https://api.si.edu/openaccess/api/v1.0/search?q=q&api_key=v75sWiNNyg1QXFrgYo532qR0gwtYecj6kS8FtQBD'; // remote URL! you can test it in your browser const data = await fetch(url); // We're using a library that mimics a browser 'fetch' for simplicity const json = await data.json(); // the data isn't json until we access it using dot notation @@ -122,6 +143,27 @@ async function getData() { return reply; } +/* + This function retrieves a list of artists that are related to the artist ID in the request + Need to add a way for users to type in an artist's name and see a list of related artists +*/ +async function getRelatedArtists() { + const url = 'https://api.spotify.com/v1/artists/2wY79sveU1sp5g7SokKOiI/related-artists'; // remote URL! you can test it in your browser + const data = await fetch(url, { + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + Authorization: 'Bearer BQBNwlyHGUNsBGnvuW4-d8yXJp8gPIip34MDzGwkHNFABpZ9YcpkvgGzEvjHVlYd53wz_WrEAZMVBRmY1v4_2psYmDBK4xFnwD34HpFAcJjoUZcdoSRiCB2Cbj8dgG-pDEIvb1wleXJ7z51lazQBNFp3cNuBho8h0FkD7Q' + } + }); // We're using a library that mimics a browser 'fetch' for simplicity + const json = await data.json(); // the data isn't json until we access it using dot notation + console.log(json); + + // chained filters check if item has both a location and a name + // const reply = json.filter((item) => Boolean(item.geocoded_column_1)).filter((item) => Boolean(item.name)); + return json; +} + async function mainEvent() { /* ## Main Event @@ -129,19 +171,24 @@ async function mainEvent() { When you're not working in a heavily-commented "learning" file, this also is more legible If you separate your work, when one piece is complete, you can save it and trust it */ - const pageMap = initMap(); + // const pageMap = initMap(); // the async keyword means we can make API requests + const oAuth = 'BQBNwlyHGUNsBGnvuW4-d8yXJp8gPIip34MDzGwkHNFABpZ9YcpkvgGzEvjHVlYd53wz_WrEAZMVBRmY1v4_2psYmDBK4xFnwD34HpFAcJjoUZcdoSRiCB2Cbj8dgG-pDEIvb1wleXJ7z51lazQBNFp3cNuBho8h0FkD7Q'; const form = document.querySelector('.main_form'); // get your main form so you can do JS with it const submit = document.querySelector('#get-resto'); // get a reference to your submit button const loadAnimation = document.querySelector('.lds-ellipsis'); // get a reference to our loading animation + const chartTarget = document.querySelector('#myChart'); submit.style.display = 'none'; // let your submit button disappear + initChart(chartTarget); + /* Let's get some data from the API - it will take a second or two to load This next line goes to the request for 'GET' in the file at /server/routes/foodServiceRoutes.js It's at about line 27 - go have a look and see what we're retrieving and sending back. */ - const chartData = await getData(); + + const chartData = await getRelatedArtists(); /* Below this comment, we log out a table of all the results using "dot notation" @@ -173,7 +220,7 @@ async function mainEvent() { console.log('input', event.target.value); // contents const newFilterList = filterList(currentList, event.target.value); // filters currentList injectHTML(newFilterList); - markerPlace(newFilterList, pageMap); + // markerPlace(newFilterList, pageMap); }); // And here's an eventListener! It's listening for a "submit" button specifically being clicked // this is a synchronous event event, because we already did our async request above, and waited for it to resolve @@ -187,7 +234,7 @@ async function mainEvent() { // And this function call will perform the "side effect" of injecting the HTML list for you injectHTML(currentList); - markerPlace(currentList, pageMap); + // markerPlace(currentList, pageMap); // By separating the functions, we open the possibility of regenerating the list // without having to retrieve fresh data every time diff --git a/client/styles.css b/client/styles.css index 2a708c711..8ed38597c 100644 --- a/client/styles.css +++ b/client/styles.css @@ -316,6 +316,8 @@ } } + /* CHART STYLES */ + /* MAP STYLES */ #map { diff --git a/routes/apiRoutes.js b/routes/apiRoutes.js index 3c599dd0f..01c01e628 100644 --- a/routes/apiRoutes.js +++ b/routes/apiRoutes.js @@ -3,6 +3,7 @@ import express from 'express'; import fetch from 'node-fetch'; import foodService from './foodService.js'; +import jaehaSong from './jaehaSong.js'; const router = express.Router(); @@ -15,4 +16,6 @@ router.get('/', (req, res) => { // This leads to /api/member1 router.use('/foodService', foodService); +router.use('/jaehaSong', jaehaSong); + export default router; diff --git a/routes/jaehaSong.js b/routes/jaehaSong.js new file mode 100644 index 000000000..6fed2f125 --- /dev/null +++ b/routes/jaehaSong.js @@ -0,0 +1,97 @@ +import express from 'express'; +import fetch from 'node-fetch'; + +const router = express.Router(); + +// +// This is a demo of how to structure your final project API +// One route file is expected per student, with appropriate HTTP methods on each endpoint +// + +// ///////////////////////////////// +// Food Inspection Set Demos +// ///////////////////////////////// +router.route('/jaehaSong') // actually localhost:3000/api/foodServicesPG + .get(async (req, res) => { + try { + const url = 'https://data.princegeorgescountymd.gov/resource/umjn-t2iz.json'; + const data = await fetch(url); + const json = await data.json(); + console.log(json); + + res.json({data: json}); + } catch (error) { + console.log(error); + res.json({error: error}); + } + }) + .put((req, res) => { + try { + res.json({message: 'put FoodServices endpoint'}); + } catch (error) { + console.log(error); + res.json({error: 'Something went wrong on the server'}); + } + }) + .post((req, res) => { + try { + res.json({message: 'post FoodServices endpoint'}); + } catch (error) { + console.log(error); + res.json({error: 'Something went wrong on the server'}); + } + }) + .delete((req, res) => { + try { + res.json({message: 'delete FoodServices endpoint'}); + } catch (error) { + console.log(error); + res.json({error: 'Something went wrong on the server'}); + } + }); + +router.route('/jaehaSong/:zipCode') // actually localhost:3000/api/foodServicesPG/20782 + .get(async (req, res) => { + try { + const url = 'https://data.princegeorgescountymd.gov/resource/umjn-t2iz.json'; + const request = await fetch(url); + const json = await request.json(); + console.log(json); + + const filteredList = json.filter((item, index) => { + const {zipCode} = req.params; + return item.zip === zipCode; + }); + + res.json({data: filteredList}); + } catch (error) { + console.log(error); + res.json({error: error}); + } + }) + .put((req, res) => { + try { + res.json({message: 'put FoodServices ID endpoint'}); + } catch (error) { + console.log(error); + res.json({error: 'Something went wrong on the server'}); + } + }) + .post((req, res) => { + try { + res.json({message: 'post FoodServices ID endpoint'}); + } catch (error) { + console.log(error); + res.json({error: 'Something went wrong on the server'}); + } + }) + .delete((req, res) => { + try { + res.json({message: 'delete FoodServices ID endpoint'}); + } catch (error) { + console.log(error); + res.json({error: 'Something went wrong on the server'}); + } + }); + +export default router; \ No newline at end of file From 879527e66d4fdd91f26e4f444e12e8c82f40072a Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Fri, 2 Dec 2022 01:47:50 -0500 Subject: [PATCH 06/37] installed Buffer module --- package-lock.json | 1294 ++++++--------------------------------------- package.json | 1 + 2 files changed, 159 insertions(+), 1136 deletions(-) diff --git a/package-lock.json b/package-lock.json index d02133eff..b3294414f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "ISC", "dependencies": { "body-parser": "^1.19.0", + "buffer": "^6.0.3", "chalk": "^4.1.0", "express": "^4.17.1", "mysql2": "^2.2.5", @@ -506,25 +507,6 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", @@ -608,14 +590,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -731,6 +705,25 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -777,27 +770,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -847,6 +819,29 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -861,45 +856,6 @@ "node": ">= 0.8" } }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -922,17 +878,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001317", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001317.tgz", @@ -984,22 +929,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-color": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.1.tgz", @@ -1039,14 +968,6 @@ "node": ">=6" } }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1088,36 +1009,6 @@ "proto-list": "~1.2.1" } }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/configstore/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -1198,14 +1089,6 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -1239,36 +1122,12 @@ } } }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1314,27 +1173,11 @@ "node": ">=6.0.0" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dottie": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, "node_modules/editorconfig": { "version": "0.15.3", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", @@ -1395,14 +1238,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -1518,14 +1353,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "engines": { - "node": ">=8" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2255,17 +2082,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -2312,28 +2128,6 @@ "node": ">= 6" } }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -2343,27 +2137,6 @@ "node": ">=4" } }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -2424,19 +2197,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, "node_modules/http-errors": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", @@ -2463,6 +2223,25 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -2493,18 +2272,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "engines": { - "node": ">=4" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, "engines": { "node": ">=0.8.19" } @@ -2609,17 +2381,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", @@ -2673,21 +2434,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -2700,17 +2446,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2734,22 +2469,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2827,11 +2546,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -2844,11 +2558,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2914,11 +2623,6 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2957,14 +2661,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dependencies": { - "json-buffer": "3.0.0" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -2974,17 +2670,6 @@ "node": ">=0.10.0" } }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3033,14 +2718,6 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -3148,14 +2825,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3170,20 +2839,21 @@ "node_modules/minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, "node_modules/moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { "node": "*" } }, "node_modules/moment-timezone": { - "version": "0.5.34", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz", - "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", + "version": "0.5.39", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.39.tgz", + "integrity": "sha512-hoB6suq4ISDj7BDgctiOy6zljBsdYT0++0ZzZm9rtxIvJhIbQ3nmbgSWe7dNFGurl6/7b1OUkHlmN9JWgXVz7w==", "dependencies": { "moment": ">= 2.9.0" }, @@ -3288,9 +2958,9 @@ } }, "node_modules/node-fetch": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.3.tgz", - "integrity": "sha512-AXP18u4pidSZ1xYXRDPY/8jdv3RAozIt/WLNR/MBGZAz+xjtlr90RvCnsvHQRiXyWliZF/CpytExp32UU67/SA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", + "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -3311,21 +2981,20 @@ "dev": true }, "node_modules/nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", - "hasInstallScript": true, + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", "dependencies": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.5", - "update-notifier": "^5.1.0" + "undefsafe": "^2.0.5" }, "bin": { "nodemon": "bin/nodemon.js" @@ -3395,14 +3064,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" - } - }, "node_modules/object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", @@ -3506,14 +3167,6 @@ "node": ">= 0.8.0" } }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "engines": { - "node": ">=6" - } - }, "node_modules/p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -3547,20 +3200,6 @@ "node": ">=4" } }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3739,14 +3378,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "engines": { - "node": ">=4" - } - }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -3783,15 +3414,6 @@ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -3801,17 +3423,6 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", @@ -3845,28 +3456,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3890,28 +3479,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3954,14 +3521,6 @@ "node": ">=4" } }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, "node_modules/retry-as-promised": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-5.0.0.tgz", @@ -3997,21 +3556,11 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, "bin": { "semver": "bin/semver.js" } }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/send": { "version": "0.17.2", "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", @@ -4230,10 +3779,24 @@ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/slice-ansi": { "version": "4.0.0", @@ -4457,14 +4020,6 @@ "node": ">=4" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "engines": { - "node": ">=6" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4559,6 +4114,7 @@ "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, "engines": { "node": ">=10" }, @@ -4578,14 +4134,6 @@ "node": ">= 0.6" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/umzug": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", @@ -4614,19 +4162,8 @@ }, "node_modules/undefsafe": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" }, "node_modules/universalify": { "version": "2.0.0", @@ -4644,47 +4181,6 @@ "node": ">= 0.8" } }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4694,17 +4190,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -4782,17 +4267,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", @@ -4831,25 +4305,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "engines": { - "node": ">=8" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -5258,19 +4713,6 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, "@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", @@ -5339,14 +4781,6 @@ "uri-js": "^4.2.2" } }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "requires": { - "string-width": "^4.1.0" - } - }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -5429,6 +4863,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -5471,21 +4910,6 @@ } } }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5516,6 +4940,15 @@ "picocolors": "^1.0.0" } }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5527,35 +4960,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -5572,11 +4976,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - }, "caniuse-lite": { "version": "1.0.30001317", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001317.tgz", @@ -5607,16 +5006,6 @@ "readdirp": "~3.6.0" } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" - }, "cli-color": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.1.tgz", @@ -5650,14 +5039,6 @@ "shallow-clone": "^3.0.0" } }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5696,29 +5077,6 @@ "proto-list": "~1.2.1" } }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - } - } - }, "confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -5775,11 +5133,6 @@ "which": "^2.0.1" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -5802,30 +5155,12 @@ "ms": "2.1.2" } }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -5859,24 +5194,11 @@ "esutils": "^2.0.2" } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, "dottie": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, "editorconfig": { "version": "0.15.3", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", @@ -5930,14 +5252,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -6031,11 +5345,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -6613,14 +5922,6 @@ "has-symbols": "^1.0.1" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -6652,45 +5953,12 @@ "is-glob": "^4.0.1" } }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - } - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, "graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -6730,16 +5998,6 @@ "has-symbols": "^1.0.2" } }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, "http-errors": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", @@ -6760,6 +6018,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -6781,15 +6044,11 @@ "resolve-from": "^4.0.0" } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "inflection": { "version": "1.13.2", @@ -6864,14 +6123,6 @@ "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, "is-core-module": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", @@ -6907,26 +6158,12 @@ "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6941,16 +6178,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -7004,11 +6231,6 @@ "has-symbols": "^1.0.2" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -7018,11 +6240,6 @@ "call-bind": "^1.0.2" } }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -7068,11 +6285,6 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -7103,28 +6315,12 @@ "universalify": "^2.0.0" } }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "requires": { - "package-json": "^6.3.0" - } - }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -7167,11 +6363,6 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7254,11 +6445,6 @@ "mime-db": "1.52.0" } }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7270,17 +6456,18 @@ "minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, "moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==" + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moment-timezone": { - "version": "0.5.34", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz", - "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", + "version": "0.5.39", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.39.tgz", + "integrity": "sha512-hoB6suq4ISDj7BDgctiOy6zljBsdYT0++0ZzZm9rtxIvJhIbQ3nmbgSWe7dNFGurl6/7b1OUkHlmN9JWgXVz7w==", "requires": { "moment": ">= 2.9.0" } @@ -7361,9 +6548,9 @@ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" }, "node-fetch": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.3.tgz", - "integrity": "sha512-AXP18u4pidSZ1xYXRDPY/8jdv3RAozIt/WLNR/MBGZAz+xjtlr90RvCnsvHQRiXyWliZF/CpytExp32UU67/SA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", + "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", "requires": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -7377,20 +6564,20 @@ "dev": true }, "nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", "requires": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.5", - "update-notifier": "^5.1.0" + "undefsafe": "^2.0.5" }, "dependencies": { "debug": { @@ -7434,11 +6621,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - }, "object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", @@ -7515,11 +6697,6 @@ "word-wrap": "^1.2.3" } }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -7544,17 +6721,6 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7684,11 +6850,6 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -7719,29 +6880,12 @@ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "requires": { - "escape-goat": "^2.0.0" - } - }, "qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", @@ -7763,24 +6907,6 @@ "unpipe": "1.0.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - } - } - }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -7795,22 +6921,6 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "requires": { - "rc": "^1.2.8" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7838,14 +6948,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, "retry-as-promised": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-5.0.0.tgz", @@ -7874,15 +6976,8 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "requires": { - "semver": "^6.3.0" - } + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true }, "send": { "version": "0.17.2", @@ -8039,10 +7134,20 @@ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } }, "slice-ansi": { "version": "4.0.0", @@ -8212,11 +7317,6 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8293,7 +7393,8 @@ "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==" + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true }, "type-is": { "version": "1.6.18", @@ -8304,14 +7405,6 @@ "mime-types": "~2.1.24" } }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, "umzug": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", @@ -8337,14 +7430,6 @@ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" - } - }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -8355,37 +7440,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8395,14 +7449,6 @@ "punycode": "^2.1.0" } }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -8456,14 +7502,6 @@ "is-symbol": "^1.0.3" } }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "requires": { - "string-width": "^4.0.0" - } - }, "wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", @@ -8493,22 +7531,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" - }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 937e69697..cfc95edc0 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "license": "ISC", "dependencies": { "body-parser": "^1.19.0", + "buffer": "^6.0.3", "chalk": "^4.1.0", "express": "^4.17.1", "mysql2": "^2.2.5", From ecbd575d66248165b00527090e01454473364438 Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Fri, 2 Dec 2022 01:48:35 -0500 Subject: [PATCH 07/37] added getAccessToken(), edited getRelatedArtists() --- client/script.js | 48 +++++++++++++++++++++++++++++++++++---------- routes/jaehaSong.js | 1 + 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/client/script.js b/client/script.js index 28de474f0..92fbb7b22 100644 --- a/client/script.js +++ b/client/script.js @@ -1,5 +1,5 @@ /* eslint-disable max-len */ - +const {Buffer} = require('buffer/'); // note: the trailing slash is important! /* Hook this script to index.html by adding ` - - \ No newline at end of file From c085ea5eeafc033c99f908597849197cb5bbed3f Mon Sep 17 00:00:00 2001 From: gfisk777 <112730593+gfisk777@users.noreply.github.com> Date: Thu, 8 Dec 2022 19:58:29 -0500 Subject: [PATCH 15/37] Update styles.css --- client/styles.css | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/client/styles.css b/client/styles.css index 0545245c0..ed21ddcba 100644 --- a/client/styles.css +++ b/client/styles.css @@ -73,6 +73,15 @@ align-items: start; flex:1; } + + .intro { + display: flex; + height:fit-content; + font-size: 1.5rem; + text-align: center; + + } + .header { padding: 10px; @@ -80,19 +89,10 @@ background: #000000; color: rgb(12, 119, 18); font-size: 20px; - - /* padding-top: 1rem; - padding-left: 1rem; - padding-right: 1rem; - padding-bottom: 1.5rem; */ } - /* - This rule implies that the H1 tag lives within another HTML tag - It "inherits" some rules from the above - Those rules won't apply to an h1 that's outside a block with the class of 'header' - */ + .header h1 { display: block; @@ -113,19 +113,8 @@ box-shadow: 0 0.5em 1em -0.125em rgba(0, 0, 0, 0.1), 0 0 0 1px rgb(10 10 10 / 2%); } - - - /* - Rules can be combined on a block to apply the 'cascade' in order - So you can use two classnames in a single class attribute - like:
- - Rules may combine in unexpected ways - remember that the LAST thing written in this file will have "priority" - And will be what displays in your client - */ - .box { - background-color: #42938d; + background-color: #037c0b; border: 2px dashed; border-radius: 4px; height:fit-content; From 23345a6ef845566f64fe63524fe9a0b0e91f9a5c Mon Sep 17 00:00:00 2001 From: gfisk777 <112730593+gfisk777@users.noreply.github.com> Date: Thu, 8 Dec 2022 23:28:13 -0500 Subject: [PATCH 16/37] Update styles.css --- client/styles.css | 108 ++++++++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 56 deletions(-) diff --git a/client/styles.css b/client/styles.css index ed21ddcba..c106e2cb9 100644 --- a/client/styles.css +++ b/client/styles.css @@ -25,12 +25,12 @@ body { margin: 0; - padding: 0; + padding: 1em; font-family: ‘Segoe UI’, Candara, ‘Bitstream Vera Sans’, ‘DejaVu Sans’, ‘Bitsream Vera Sans’, ‘Trebuchet MS’, Verdana, ‘Verdana Ref’, sans-serif; font-weight: 400; line-height: 1.5; - background-color: #ffffff; + background-color: #463c3c; } @@ -39,64 +39,19 @@ text-decoration: none; } - .header h2, - .header h3 { - margin:0; - padding:0; - padding-bottom: 1.5rem; - } + form { accent-color: hsla(120, 100%, 50%, 0.482); } - /* - - These styles use 'class names' - - You can apply them by using the 'class' attribute on your HTML - - like this:
- - note that the period vanishes there! - */ - - - .wrapper { - min-height: 100vh; - display: flex; - flex-direction: column; - margin: 0; - flex: 1; - } - - .container { - margin: 0 20px; - display: flex; - justify-content: space-evenly; - align-items: start; - flex:1; - } - - .intro { - display: flex; - height:fit-content; - font-size: 1.5rem; - text-align: center; - - } - - .header { padding: 10px; - text-align: center; - background: #000000; - color: rgb(12, 119, 18); - font-size: 20px; + text-align: center; } - - - - + .header h1 { - display: block; - /* this will push other blocks out of the way */ + /* colors */ background-color: #000000; @@ -104,15 +59,55 @@ /* shapes */ border-radius: 6px; - font-size: 1.5rem; + font-size: 2.5rem; padding: 1.25rem; margin: 0; /* removing the margin on h1 tags means the header pins to the top if we move */ font-style: italic; + } - /* box-shadows are fancy */ - box-shadow: 0 0.5em 1em -0.125em rgba(0, 0, 0, 0.1), 0 0 0 1px rgb(10 10 10 / 2%); + .header h3 { + margin:0; + padding:0; + padding-bottom: 1.5rem; + color: #037c0b; + } + + .intro { + background-color: #070606; + margin: 20px; + display:flex; + height:fit-content; + justify-content: center; } + + .intro h2 { + font-family: 'Times New Roman', Times, serif; + font-size: 14px; + color: #037c0b; + + } + + .introdiscription { + font-size:100px; + } + + .wrapper { + min-height: 100vh; + display: flex; + flex-direction: column; + margin: 0; + flex: 1; + } + + .container { + margin: 0 20px; + display: flex; + justify-content: space-evenly; + align-items:start; + flex:1; + } + .box { background-color: #037c0b; border: 2px dashed; @@ -122,10 +117,10 @@ } .left_section { - background-color: #000001; + background-color: #242424; flex: 0 1 0; margin: 1rem; - padding: 1.5rem; + padding: 2.5rem; width: 90%; } @@ -138,6 +133,7 @@ flex-direction: column; justify-content: center; width: 90%; + padding: 2.5rem; } From 3c69bb5eaa3d7c1c70179f3443ed8be7dd87dda0 Mon Sep 17 00:00:00 2001 From: gfisk777 <112730593+gfisk777@users.noreply.github.com> Date: Thu, 8 Dec 2022 23:28:16 -0500 Subject: [PATCH 17/37] Update index.html --- client/index.html | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/index.html b/client/index.html index c7ba83f96..a41316bbe 100644 --- a/client/index.html +++ b/client/index.html @@ -22,10 +22,11 @@

Spotify Song Tracker

-
-
hhh
- +
+

On our website you can search and track the top songs that are available on Spotify....

+
+

Song Input

@@ -42,7 +43,7 @@

Song Input

-

Chart of songs

+

Chart of songs

From 832d485aca6adfa363ff16b0d3ae90ebb731dd89 Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Sat, 10 Dec 2022 19:25:42 -0500 Subject: [PATCH 18/37] bugfix - undefined processRestaurants array --- client/script.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/client/script.js b/client/script.js index 0ed12d2c0..d43e778cf 100644 --- a/client/script.js +++ b/client/script.js @@ -42,6 +42,7 @@ function injectHTML(list) { const el = document.createElement('li'); el.innerText = item.name; listEl.appendChild(el); + console.log(item.name); }); } @@ -49,7 +50,8 @@ function processRestaurants(list) { console.log('fired restaurants list'); const range = [...Array(15).keys()]; // Special notation to create an array of 15 elements const newArray = range.map((item) => { - const index = getRandomIntInclusive(0, list.length); + const index = getRandomIntInclusive(0, list.length - 1); + console.log(list[index]); return list[index]; }); return newArray; @@ -170,7 +172,7 @@ async function getAccessToken() { body: urlencoded, redirect: 'follow' }; - const reply = await fetch(url, requestOptions) + const reply = await fetch(url, requestOptions); const json = await reply.json(); console.log(json.access_token); return json.access_token; @@ -238,7 +240,7 @@ async function mainEvent() { console.log(`${chartData[0].name} ${chartData[0].popularity}`); // This IF statement ensures we can't do anything if we don't have information yet - if (!chartData.artists?.length) { return; } // Return if we have no data aka array has no length + if (!chartData.length) { return; } // Return if we have no data aka array has no length submit.style.display = 'block'; // let's turn the submit button back on by setting it to display as a block when we have data available @@ -261,7 +263,7 @@ async function mainEvent() { submitEvent.preventDefault(); // This constant will have the value of your 15-restaurant collection when it processes - currentList = processRestaurants(chartData.artists); + currentList = processRestaurants(chartData); console.log(currentList); // And this function call will perform the "side effect" of injecting the HTML list for you From 2391395f53286938751c45cbffae9f33b302632a Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Sun, 11 Dec 2022 14:24:19 -0500 Subject: [PATCH 19/37] Update script.js --- client/script.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/script.js b/client/script.js index d43e778cf..48fe16b5f 100644 --- a/client/script.js +++ b/client/script.js @@ -230,7 +230,7 @@ async function mainEvent() { Dot notation is preferred in JS unless you have a good reason to use brackets The 'data' key, which we set at line 38 in foodServiceRoutes.js, contains all 1,000 records we need */ - // console.table(arrayFromJson.data); + console.table(chartData); // in your browser console, try expanding this object to see what fields are available to work with // for example: arrayFromJson.data[0].name, etc @@ -248,7 +248,7 @@ async function mainEvent() { loadAnimation.classList.remove('lds-ellipsis'); loadAnimation.classList.add('lds-ellipsis_hidden'); - let currentList = []; // used by both event listeners, allows them to interact with each other + // let currentList = []; // used by both event listeners, allows them to interact with each other form.addEventListener('input', (event) => { // event bubbling console.log('input', event.target.value); // contents @@ -263,11 +263,11 @@ async function mainEvent() { submitEvent.preventDefault(); // This constant will have the value of your 15-restaurant collection when it processes - currentList = processRestaurants(chartData); - console.log(currentList); + // currentList = processRestaurants(chartData); + // console.log(currentList); // And this function call will perform the "side effect" of injecting the HTML list for you - injectHTML(currentList); + injectHTML(chartData); // markerPlace(currentList, pageMap); // By separating the functions, we open the possibility of regenerating the list From 5fc95b49d181c7ef42dc66093ba76251a24c2735 Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Sun, 11 Dec 2022 14:38:02 -0500 Subject: [PATCH 20/37] edited injectHTML --- client/script.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/client/script.js b/client/script.js index 48fe16b5f..2ef24aaa2 100644 --- a/client/script.js +++ b/client/script.js @@ -31,6 +31,7 @@ function getRandomIntInclusive(min, max) { - using a .forEach method, inject a list element into your index.html for every element in the list - Display the name of that restaurant and what category of food it is */ + function injectHTML(list) { console.log('fired injectHTML'); const target = document.querySelector('#restaurant_list'); @@ -40,9 +41,12 @@ function injectHTML(list) { target.appendChild(listEl); list.forEach((item) => { const el = document.createElement('li'); - el.innerText = item.name; + const anchor = document.createElement('a'); + anchor.href = item.external_urls.spotify; + anchor.innerText = item.name; + el.appendChild(anchor); listEl.appendChild(el); - console.log(item.name); + // console.log(item.name); }); } From bfb3cf42eb2d24d2264ca373845d74522a95cdfc Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Sun, 11 Dec 2022 14:43:17 -0500 Subject: [PATCH 21/37] fixed list filtering --- client/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/script.js b/client/script.js index 2ef24aaa2..f6a4030c5 100644 --- a/client/script.js +++ b/client/script.js @@ -256,7 +256,7 @@ async function mainEvent() { form.addEventListener('input', (event) => { // event bubbling console.log('input', event.target.value); // contents - const newFilterList = filterList(currentList, event.target.value); // filters currentList + const newFilterList = filterList(chartData, event.target.value); // filters currentList injectHTML(newFilterList); // markerPlace(newFilterList, pageMap); }); From 56cc95c008425fcb12cce1fd67dd0b16a8ce1b3c Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Sun, 11 Dec 2022 21:54:45 -0500 Subject: [PATCH 22/37] implemented basic search bar --- client/index.html | 4 ++++ client/script.js | 55 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/client/index.html b/client/index.html index 3ce2de388..4f312dd19 100644 --- a/client/index.html +++ b/client/index.html @@ -31,10 +31,14 @@

Form Inputs

+
+
+

+
diff --git a/client/script.js b/client/script.js index f6a4030c5..1fdea0306 100644 --- a/client/script.js +++ b/client/script.js @@ -11,6 +11,8 @@ */ // gets a random integer between two numbers +const apiURL = 'https://api.spotify.com/v1/'; + function getRandomIntInclusive(min, max) { const newMin = Math.ceil(min); const newMax = Math.floor(max); @@ -31,12 +33,11 @@ function getRandomIntInclusive(min, max) { - using a .forEach method, inject a list element into your index.html for every element in the list - Display the name of that restaurant and what category of food it is */ - -function injectHTML(list) { + +function injectHTML(list, div) { console.log('fired injectHTML'); - const target = document.querySelector('#restaurant_list'); + const target = document.querySelector(div); target.innerHTML = ''; - const listEl = document.createElement('ol'); target.appendChild(listEl); list.forEach((item) => { @@ -90,6 +91,23 @@ function filterList(array, filterInputValue) { return newArray; } +async function searchArtists(term, token) { + const search = encodeURIComponent(term); + console.log(search); + const url = `${apiURL}search?q=${search}&type=artist&limit=5`; + console.log(url); + const data = await fetch(url, { + headers: { + Accept: 'application/json', + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + const json = await data.json(); + console.log(json.artists.items); + return json.artists; // object containing, among other things, an array of artists +} + function initMap() { console.log('initMap'); const map = L.map('map').setView([38.7849, -76.8721], 13); @@ -215,6 +233,9 @@ async function mainEvent() { const submit = document.querySelector('#get-resto'); // get a reference to your submit button const loadAnimation = document.querySelector('.lds-ellipsis'); // get a reference to our loading animation const chartTarget = document.querySelector('#myChart'); + const divResults = '#results'; + const relatedArtists = '#restaurant_list'; + let artists = []; submit.style.display = 'none'; // let your submit button disappear initChart(chartTarget); @@ -252,26 +273,32 @@ async function mainEvent() { loadAnimation.classList.remove('lds-ellipsis'); loadAnimation.classList.add('lds-ellipsis_hidden'); - // let currentList = []; // used by both event listeners, allows them to interact with each other - - form.addEventListener('input', (event) => { // event bubbling - console.log('input', event.target.value); // contents - const newFilterList = filterList(chartData, event.target.value); // filters currentList - injectHTML(newFilterList); - // markerPlace(newFilterList, pageMap); - }); + // form.addEventListener('input', (event) => { // event bubbling + // console.log('input', event.target.value); // contents + // const searchQuery = event.target.value; + // return searchQuery; + // }); // And here's an eventListener! It's listening for a "submit" button specifically being clicked // this is a synchronous event event, because we already did our async request above, and waited for it to resolve - form.addEventListener('submit', (submitEvent) => { + form.addEventListener('submit', async (submitEvent) => { // This is needed to stop our page from changing to a new URL even though it heard a GET request submitEvent.preventDefault(); + console.log(document.getElementById('resto')); + + const formText = document.getElementById('resto').value; + + const searchResults = await searchArtists(formText, token); // json containing an array containing artists + artists = searchResults.items; + console.log(artists); + + injectHTML(artists, divResults); // This constant will have the value of your 15-restaurant collection when it processes // currentList = processRestaurants(chartData); // console.log(currentList); // And this function call will perform the "side effect" of injecting the HTML list for you - injectHTML(chartData); + // injectHTML(chartData); // markerPlace(currentList, pageMap); // By separating the functions, we open the possibility of regenerating the list From 44a83e8cec625b881333de126df3ce203997ce12 Mon Sep 17 00:00:00 2001 From: jsong073-UMD <112523065+jsong073-UMD@users.noreply.github.com> Date: Mon, 12 Dec 2022 00:18:18 -0500 Subject: [PATCH 23/37] Revert "Jaeha" --- client/index.html | 4 --- client/script.js | 73 +++++++++++++---------------------------------- 2 files changed, 20 insertions(+), 57 deletions(-) diff --git a/client/index.html b/client/index.html index 3aef3a462..ffaf23181 100644 --- a/client/index.html +++ b/client/index.html @@ -31,14 +31,10 @@

Form Inputs

-
-
-

-
diff --git a/client/script.js b/client/script.js index 1fdea0306..0ed12d2c0 100644 --- a/client/script.js +++ b/client/script.js @@ -11,8 +11,6 @@ */ // gets a random integer between two numbers -const apiURL = 'https://api.spotify.com/v1/'; - function getRandomIntInclusive(min, max) { const newMin = Math.ceil(min); const newMax = Math.floor(max); @@ -33,21 +31,17 @@ function getRandomIntInclusive(min, max) { - using a .forEach method, inject a list element into your index.html for every element in the list - Display the name of that restaurant and what category of food it is */ - -function injectHTML(list, div) { +function injectHTML(list) { console.log('fired injectHTML'); - const target = document.querySelector(div); + const target = document.querySelector('#restaurant_list'); target.innerHTML = ''; + const listEl = document.createElement('ol'); target.appendChild(listEl); list.forEach((item) => { const el = document.createElement('li'); - const anchor = document.createElement('a'); - anchor.href = item.external_urls.spotify; - anchor.innerText = item.name; - el.appendChild(anchor); + el.innerText = item.name; listEl.appendChild(el); - // console.log(item.name); }); } @@ -55,8 +49,7 @@ function processRestaurants(list) { console.log('fired restaurants list'); const range = [...Array(15).keys()]; // Special notation to create an array of 15 elements const newArray = range.map((item) => { - const index = getRandomIntInclusive(0, list.length - 1); - console.log(list[index]); + const index = getRandomIntInclusive(0, list.length); return list[index]; }); return newArray; @@ -91,23 +84,6 @@ function filterList(array, filterInputValue) { return newArray; } -async function searchArtists(term, token) { - const search = encodeURIComponent(term); - console.log(search); - const url = `${apiURL}search?q=${search}&type=artist&limit=5`; - console.log(url); - const data = await fetch(url, { - headers: { - Accept: 'application/json', - Authorization: `Bearer ${token}`, - 'Content-Type': 'application/json' - } - }); - const json = await data.json(); - console.log(json.artists.items); - return json.artists; // object containing, among other things, an array of artists -} - function initMap() { console.log('initMap'); const map = L.map('map').setView([38.7849, -76.8721], 13); @@ -194,7 +170,7 @@ async function getAccessToken() { body: urlencoded, redirect: 'follow' }; - const reply = await fetch(url, requestOptions); + const reply = await fetch(url, requestOptions) const json = await reply.json(); console.log(json.access_token); return json.access_token; @@ -233,9 +209,6 @@ async function mainEvent() { const submit = document.querySelector('#get-resto'); // get a reference to your submit button const loadAnimation = document.querySelector('.lds-ellipsis'); // get a reference to our loading animation const chartTarget = document.querySelector('#myChart'); - const divResults = '#results'; - const relatedArtists = '#restaurant_list'; - let artists = []; submit.style.display = 'none'; // let your submit button disappear initChart(chartTarget); @@ -255,7 +228,7 @@ async function mainEvent() { Dot notation is preferred in JS unless you have a good reason to use brackets The 'data' key, which we set at line 38 in foodServiceRoutes.js, contains all 1,000 records we need */ - console.table(chartData); + // console.table(arrayFromJson.data); // in your browser console, try expanding this object to see what fields are available to work with // for example: arrayFromJson.data[0].name, etc @@ -265,7 +238,7 @@ async function mainEvent() { console.log(`${chartData[0].name} ${chartData[0].popularity}`); // This IF statement ensures we can't do anything if we don't have information yet - if (!chartData.length) { return; } // Return if we have no data aka array has no length + if (!chartData.artists?.length) { return; } // Return if we have no data aka array has no length submit.style.display = 'block'; // let's turn the submit button back on by setting it to display as a block when we have data available @@ -273,32 +246,26 @@ async function mainEvent() { loadAnimation.classList.remove('lds-ellipsis'); loadAnimation.classList.add('lds-ellipsis_hidden'); - // form.addEventListener('input', (event) => { // event bubbling - // console.log('input', event.target.value); // contents - // const searchQuery = event.target.value; - // return searchQuery; - // }); + let currentList = []; // used by both event listeners, allows them to interact with each other + + form.addEventListener('input', (event) => { // event bubbling + console.log('input', event.target.value); // contents + const newFilterList = filterList(currentList, event.target.value); // filters currentList + injectHTML(newFilterList); + // markerPlace(newFilterList, pageMap); + }); // And here's an eventListener! It's listening for a "submit" button specifically being clicked // this is a synchronous event event, because we already did our async request above, and waited for it to resolve - form.addEventListener('submit', async (submitEvent) => { + form.addEventListener('submit', (submitEvent) => { // This is needed to stop our page from changing to a new URL even though it heard a GET request submitEvent.preventDefault(); - console.log(document.getElementById('resto')); - - const formText = document.getElementById('resto').value; - - const searchResults = await searchArtists(formText, token); // json containing an array containing artists - artists = searchResults.items; - console.log(artists); - - injectHTML(artists, divResults); // This constant will have the value of your 15-restaurant collection when it processes - // currentList = processRestaurants(chartData); - // console.log(currentList); + currentList = processRestaurants(chartData.artists); + console.log(currentList); // And this function call will perform the "side effect" of injecting the HTML list for you - // injectHTML(chartData); + injectHTML(currentList); // markerPlace(currentList, pageMap); // By separating the functions, we open the possibility of regenerating the list From 7eea48646f9af4e5773276558c9aa776693416c3 Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Mon, 12 Dec 2022 00:31:49 -0500 Subject: [PATCH 24/37] Merge pull request #2 from gfisk777/gfisk Gfisk --- client/index.html | 29 ++++------- client/script.js | 16 +++++++ client/styles.css | 120 ++++++++++++++++++++++------------------------ 3 files changed, 80 insertions(+), 85 deletions(-) diff --git a/client/index.html b/client/index.html index ffaf23181..a41316bbe 100644 --- a/client/index.html +++ b/client/index.html @@ -19,13 +19,17 @@
-

Group 1 - Garrett Fisk, Jaeha Song

+

Spotify Song Tracker

+
+ +
+

On our website you can search and track the top songs that are available on Spotify....

-

Form Inputs

+

Song Input

@@ -39,7 +43,7 @@

Form Inputs

-

Chart of songs

+

Chart of songs

@@ -51,27 +55,10 @@

Chart of songs

- +
Group 1 - Garrett Fisk, Jaeha Song
- - \ No newline at end of file diff --git a/client/script.js b/client/script.js index 0ed12d2c0..5db33084d 100644 --- a/client/script.js +++ b/client/script.js @@ -31,6 +31,10 @@ function getRandomIntInclusive(min, max) { - using a .forEach method, inject a list element into your index.html for every element in the list - Display the name of that restaurant and what category of food it is */ +<<<<<<< HEAD +======= + +>>>>>>> parent of 56cc95c (implemented basic search bar) function injectHTML(list) { console.log('fired injectHTML'); const target = document.querySelector('#restaurant_list'); @@ -246,11 +250,19 @@ async function mainEvent() { loadAnimation.classList.remove('lds-ellipsis'); loadAnimation.classList.add('lds-ellipsis_hidden'); +<<<<<<< HEAD let currentList = []; // used by both event listeners, allows them to interact with each other form.addEventListener('input', (event) => { // event bubbling console.log('input', event.target.value); // contents const newFilterList = filterList(currentList, event.target.value); // filters currentList +======= + // let currentList = []; // used by both event listeners, allows them to interact with each other + + form.addEventListener('input', (event) => { // event bubbling + console.log('input', event.target.value); // contents + const newFilterList = filterList(chartData, event.target.value); // filters currentList +>>>>>>> parent of 56cc95c (implemented basic search bar) injectHTML(newFilterList); // markerPlace(newFilterList, pageMap); }); @@ -265,7 +277,11 @@ async function mainEvent() { console.log(currentList); // And this function call will perform the "side effect" of injecting the HTML list for you +<<<<<<< HEAD injectHTML(currentList); +======= + injectHTML(chartData); +>>>>>>> parent of 56cc95c (implemented basic search bar) // markerPlace(currentList, pageMap); // By separating the functions, we open the possibility of regenerating the list diff --git a/client/styles.css b/client/styles.css index 3fdb35a69..1fb697b0d 100644 --- a/client/styles.css +++ b/client/styles.css @@ -25,12 +25,13 @@ body { margin: 0; - padding: 0; + padding: 1em; font-family: ‘Segoe UI’, Candara, ‘Bitstream Vera Sans’, ‘DejaVu Sans’, ‘Bitsream Vera Sans’, ‘Trebuchet MS’, Verdana, ‘Verdana Ref’, sans-serif; font-weight: 400; line-height: 1.5; - background-color: #000000; + background-color: #463c3c; + } @@ -39,24 +40,58 @@ text-decoration: none; } - .header h2, - .header h3 { - margin:0; - padding:0; - padding-bottom: 1.5rem; - } + form { accent-color: hsla(120, 100%, 50%, 0.482); } - /* - - These styles use 'class names' - - You can apply them by using the 'class' attribute on your HTML - - like this:
- - note that the period vanishes there! - */ + .header { + padding: 10px; + text-align: center; + } + + .header h1 { + + + /* colors */ + background-color: #000000; + color: rgb(57, 116, 12); + /* shapes */ + border-radius: 6px; + font-size: 2.5rem; + padding: 1.25rem; + margin: 0; /* removing the margin on h1 tags means the header pins to the top if we move */ + font-style: italic; + } + + .header h3 { + margin:0; + padding:0; + padding-bottom: 1.5rem; + color: #037c0b; + } + + .intro { + background-color: #070606; + margin: 20px; + display:flex; + height:fit-content; + justify-content: center; + + } + + .intro h2 { + font-family: 'Times New Roman', Times, serif; + font-size: 14px; + color: #037c0b; + + } + + .introdiscription { + font-size:100px; + } .wrapper { min-height: 100vh; @@ -70,57 +105,12 @@ margin: 0 20px; display: flex; justify-content: space-evenly; - align-items: start; + align-items:start; flex:1; } - .header { - /* padding-top: 1rem; - padding-left: 1rem; - padding-right: 1rem; - padding-bottom: 1.5rem; */ - } - - - /* - This rule implies that the H1 tag lives within another HTML tag - It "inherits" some rules from the above - Those rules won't apply to an h1 that's outside a block with the class of 'header' - */ - - .header h1 { - display: block; - /* this will push other blocks out of the way */ - - /* colors */ - background-color: #66B0FB; - color: #000; - - /* shapes */ - border: 2px dashed; - border-radius: 6px; - font-size: 1.5rem; - padding: 1.25rem; - margin:0; /* removing the margin on h1 tags means the header pins to the top if we move */ - - - /* box-shadows are fancy */ - box-shadow: 0 0.5em 1em -0.125em rgb(10 10 10 / 10%), 0 0 0 1px rgb(10 10 10 / 2%); - - } - - - /* - Rules can be combined on a block to apply the 'cascade' in order - So you can use two classnames in a single class attribute - like:
- - Rules may combine in unexpected ways - remember that the LAST thing written in this file will have "priority" - And will be what displays in your client - */ - .box { - background-color: #7CC9F4; + background-color: #037c0b; border: 2px dashed; border-radius: 4px; height:fit-content; @@ -128,15 +118,16 @@ } .left_section { - background-color: #2300ae; + background-color: #242424; flex: 0 1 0; margin: 1rem; - padding: 1.5rem; + padding: 2.5rem; width: 90%; } .right_section { - background-color: #310bca; + background-color: #242424; + flex: 0 1 auto; margin: 1rem; align-items: center; @@ -144,6 +135,7 @@ flex-direction: column; justify-content: center; width: 90%; + padding: 2.5rem; } From 9ef8ed3b670d7a7f04d3e80510efd0a437dcdd7f Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Mon, 12 Dec 2022 00:33:25 -0500 Subject: [PATCH 25/37] Revert "Merge pull request #2 from gfisk777/gfisk" This reverts commit 7eea48646f9af4e5773276558c9aa776693416c3. --- client/index.html | 29 +++++++---- client/script.js | 16 ------- client/styles.css | 120 ++++++++++++++++++++++++---------------------- 3 files changed, 85 insertions(+), 80 deletions(-) diff --git a/client/index.html b/client/index.html index a41316bbe..ffaf23181 100644 --- a/client/index.html +++ b/client/index.html @@ -19,17 +19,13 @@
-

Spotify Song Tracker

-
- -
-

On our website you can search and track the top songs that are available on Spotify....

+

Group 1 - Garrett Fisk, Jaeha Song

-

Song Input

+

Form Inputs

@@ -43,7 +39,7 @@

Song Input

-

Chart of songs

+

Chart of songs

@@ -55,10 +51,27 @@

Chart of songs

-
Group 1 - Garrett Fisk, Jaeha Song
+
+ + \ No newline at end of file diff --git a/client/script.js b/client/script.js index 5db33084d..0ed12d2c0 100644 --- a/client/script.js +++ b/client/script.js @@ -31,10 +31,6 @@ function getRandomIntInclusive(min, max) { - using a .forEach method, inject a list element into your index.html for every element in the list - Display the name of that restaurant and what category of food it is */ -<<<<<<< HEAD -======= - ->>>>>>> parent of 56cc95c (implemented basic search bar) function injectHTML(list) { console.log('fired injectHTML'); const target = document.querySelector('#restaurant_list'); @@ -250,19 +246,11 @@ async function mainEvent() { loadAnimation.classList.remove('lds-ellipsis'); loadAnimation.classList.add('lds-ellipsis_hidden'); -<<<<<<< HEAD let currentList = []; // used by both event listeners, allows them to interact with each other form.addEventListener('input', (event) => { // event bubbling console.log('input', event.target.value); // contents const newFilterList = filterList(currentList, event.target.value); // filters currentList -======= - // let currentList = []; // used by both event listeners, allows them to interact with each other - - form.addEventListener('input', (event) => { // event bubbling - console.log('input', event.target.value); // contents - const newFilterList = filterList(chartData, event.target.value); // filters currentList ->>>>>>> parent of 56cc95c (implemented basic search bar) injectHTML(newFilterList); // markerPlace(newFilterList, pageMap); }); @@ -277,11 +265,7 @@ async function mainEvent() { console.log(currentList); // And this function call will perform the "side effect" of injecting the HTML list for you -<<<<<<< HEAD injectHTML(currentList); -======= - injectHTML(chartData); ->>>>>>> parent of 56cc95c (implemented basic search bar) // markerPlace(currentList, pageMap); // By separating the functions, we open the possibility of regenerating the list diff --git a/client/styles.css b/client/styles.css index 1fb697b0d..3fdb35a69 100644 --- a/client/styles.css +++ b/client/styles.css @@ -25,13 +25,12 @@ body { margin: 0; - padding: 1em; + padding: 0; font-family: ‘Segoe UI’, Candara, ‘Bitstream Vera Sans’, ‘DejaVu Sans’, ‘Bitsream Vera Sans’, ‘Trebuchet MS’, Verdana, ‘Verdana Ref’, sans-serif; font-weight: 400; line-height: 1.5; - background-color: #463c3c; - + background-color: #000000; } @@ -40,59 +39,25 @@ text-decoration: none; } - - - form { - accent-color: hsla(120, 100%, 50%, 0.482); - } - - .header { - padding: 10px; - text-align: center; - } - - .header h1 { - - - /* colors */ - background-color: #000000; - color: rgb(57, 116, 12); - - /* shapes */ - border-radius: 6px; - font-size: 2.5rem; - padding: 1.25rem; - margin: 0; /* removing the margin on h1 tags means the header pins to the top if we move */ - font-style: italic; - } - + .header h2, .header h3 { margin:0; padding:0; padding-bottom: 1.5rem; - color: #037c0b; } - - .intro { - background-color: #070606; - margin: 20px; - display:flex; - height:fit-content; - justify-content: center; - - } - - .intro h2 { - font-family: 'Times New Roman', Times, serif; - font-size: 14px; - color: #037c0b; - - } - - .introdiscription { - font-size:100px; + + form { + accent-color: hsla(120, 100%, 50%, 0.482); } + /* + - These styles use 'class names' + - You can apply them by using the 'class' attribute on your HTML + - like this:
+ - note that the period vanishes there! + */ + + .wrapper { min-height: 100vh; display: flex; @@ -105,12 +70,57 @@ margin: 0 20px; display: flex; justify-content: space-evenly; - align-items:start; + align-items: start; flex:1; } + .header { + /* padding-top: 1rem; + padding-left: 1rem; + padding-right: 1rem; + padding-bottom: 1.5rem; */ + } + + + /* + This rule implies that the H1 tag lives within another HTML tag + It "inherits" some rules from the above + Those rules won't apply to an h1 that's outside a block with the class of 'header' + */ + + .header h1 { + display: block; + /* this will push other blocks out of the way */ + + /* colors */ + background-color: #66B0FB; + color: #000; + + /* shapes */ + border: 2px dashed; + border-radius: 6px; + font-size: 1.5rem; + padding: 1.25rem; + margin:0; /* removing the margin on h1 tags means the header pins to the top if we move */ + + + /* box-shadows are fancy */ + box-shadow: 0 0.5em 1em -0.125em rgb(10 10 10 / 10%), 0 0 0 1px rgb(10 10 10 / 2%); + + } + + + /* + Rules can be combined on a block to apply the 'cascade' in order + So you can use two classnames in a single class attribute + like:
+ + Rules may combine in unexpected ways - remember that the LAST thing written in this file will have "priority" + And will be what displays in your client + */ + .box { - background-color: #037c0b; + background-color: #7CC9F4; border: 2px dashed; border-radius: 4px; height:fit-content; @@ -118,16 +128,15 @@ } .left_section { - background-color: #242424; + background-color: #2300ae; flex: 0 1 0; margin: 1rem; - padding: 2.5rem; + padding: 1.5rem; width: 90%; } .right_section { - background-color: #242424; - + background-color: #310bca; flex: 0 1 auto; margin: 1rem; align-items: center; @@ -135,7 +144,6 @@ flex-direction: column; justify-content: center; width: 90%; - padding: 2.5rem; } From d8f31e0150a96d0e16225eecfb6e41a3385f2304 Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Mon, 12 Dec 2022 00:33:31 -0500 Subject: [PATCH 26/37] Revert "Merge pull request #4 from gfisk777/revert-3-jaeha" This reverts commit 14cfdab631131fec2c3a4cba075d68d789c84db1, reversing changes made to ac6b75ac0ce94269efe39934cd107d27741cb0b2. --- client/index.html | 4 +++ client/script.js | 73 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 57 insertions(+), 20 deletions(-) diff --git a/client/index.html b/client/index.html index ffaf23181..3aef3a462 100644 --- a/client/index.html +++ b/client/index.html @@ -31,10 +31,14 @@

Form Inputs

+
+
+

+
diff --git a/client/script.js b/client/script.js index 0ed12d2c0..1fdea0306 100644 --- a/client/script.js +++ b/client/script.js @@ -11,6 +11,8 @@ */ // gets a random integer between two numbers +const apiURL = 'https://api.spotify.com/v1/'; + function getRandomIntInclusive(min, max) { const newMin = Math.ceil(min); const newMax = Math.floor(max); @@ -31,17 +33,21 @@ function getRandomIntInclusive(min, max) { - using a .forEach method, inject a list element into your index.html for every element in the list - Display the name of that restaurant and what category of food it is */ -function injectHTML(list) { + +function injectHTML(list, div) { console.log('fired injectHTML'); - const target = document.querySelector('#restaurant_list'); + const target = document.querySelector(div); target.innerHTML = ''; - const listEl = document.createElement('ol'); target.appendChild(listEl); list.forEach((item) => { const el = document.createElement('li'); - el.innerText = item.name; + const anchor = document.createElement('a'); + anchor.href = item.external_urls.spotify; + anchor.innerText = item.name; + el.appendChild(anchor); listEl.appendChild(el); + // console.log(item.name); }); } @@ -49,7 +55,8 @@ function processRestaurants(list) { console.log('fired restaurants list'); const range = [...Array(15).keys()]; // Special notation to create an array of 15 elements const newArray = range.map((item) => { - const index = getRandomIntInclusive(0, list.length); + const index = getRandomIntInclusive(0, list.length - 1); + console.log(list[index]); return list[index]; }); return newArray; @@ -84,6 +91,23 @@ function filterList(array, filterInputValue) { return newArray; } +async function searchArtists(term, token) { + const search = encodeURIComponent(term); + console.log(search); + const url = `${apiURL}search?q=${search}&type=artist&limit=5`; + console.log(url); + const data = await fetch(url, { + headers: { + Accept: 'application/json', + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + const json = await data.json(); + console.log(json.artists.items); + return json.artists; // object containing, among other things, an array of artists +} + function initMap() { console.log('initMap'); const map = L.map('map').setView([38.7849, -76.8721], 13); @@ -170,7 +194,7 @@ async function getAccessToken() { body: urlencoded, redirect: 'follow' }; - const reply = await fetch(url, requestOptions) + const reply = await fetch(url, requestOptions); const json = await reply.json(); console.log(json.access_token); return json.access_token; @@ -209,6 +233,9 @@ async function mainEvent() { const submit = document.querySelector('#get-resto'); // get a reference to your submit button const loadAnimation = document.querySelector('.lds-ellipsis'); // get a reference to our loading animation const chartTarget = document.querySelector('#myChart'); + const divResults = '#results'; + const relatedArtists = '#restaurant_list'; + let artists = []; submit.style.display = 'none'; // let your submit button disappear initChart(chartTarget); @@ -228,7 +255,7 @@ async function mainEvent() { Dot notation is preferred in JS unless you have a good reason to use brackets The 'data' key, which we set at line 38 in foodServiceRoutes.js, contains all 1,000 records we need */ - // console.table(arrayFromJson.data); + console.table(chartData); // in your browser console, try expanding this object to see what fields are available to work with // for example: arrayFromJson.data[0].name, etc @@ -238,7 +265,7 @@ async function mainEvent() { console.log(`${chartData[0].name} ${chartData[0].popularity}`); // This IF statement ensures we can't do anything if we don't have information yet - if (!chartData.artists?.length) { return; } // Return if we have no data aka array has no length + if (!chartData.length) { return; } // Return if we have no data aka array has no length submit.style.display = 'block'; // let's turn the submit button back on by setting it to display as a block when we have data available @@ -246,26 +273,32 @@ async function mainEvent() { loadAnimation.classList.remove('lds-ellipsis'); loadAnimation.classList.add('lds-ellipsis_hidden'); - let currentList = []; // used by both event listeners, allows them to interact with each other - - form.addEventListener('input', (event) => { // event bubbling - console.log('input', event.target.value); // contents - const newFilterList = filterList(currentList, event.target.value); // filters currentList - injectHTML(newFilterList); - // markerPlace(newFilterList, pageMap); - }); + // form.addEventListener('input', (event) => { // event bubbling + // console.log('input', event.target.value); // contents + // const searchQuery = event.target.value; + // return searchQuery; + // }); // And here's an eventListener! It's listening for a "submit" button specifically being clicked // this is a synchronous event event, because we already did our async request above, and waited for it to resolve - form.addEventListener('submit', (submitEvent) => { + form.addEventListener('submit', async (submitEvent) => { // This is needed to stop our page from changing to a new URL even though it heard a GET request submitEvent.preventDefault(); + console.log(document.getElementById('resto')); + + const formText = document.getElementById('resto').value; + + const searchResults = await searchArtists(formText, token); // json containing an array containing artists + artists = searchResults.items; + console.log(artists); + + injectHTML(artists, divResults); // This constant will have the value of your 15-restaurant collection when it processes - currentList = processRestaurants(chartData.artists); - console.log(currentList); + // currentList = processRestaurants(chartData); + // console.log(currentList); // And this function call will perform the "side effect" of injecting the HTML list for you - injectHTML(currentList); + // injectHTML(chartData); // markerPlace(currentList, pageMap); // By separating the functions, we open the possibility of regenerating the list From c24602f5392c52f2f5e0535a244cb2f4865e9333 Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Mon, 12 Dec 2022 00:36:11 -0500 Subject: [PATCH 27/37] resolved accidental push to origin --- client/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/script.js b/client/script.js index 1fdea0306..11f54564b 100644 --- a/client/script.js +++ b/client/script.js @@ -286,7 +286,7 @@ async function mainEvent() { console.log(document.getElementById('resto')); const formText = document.getElementById('resto').value; - + const searchResults = await searchArtists(formText, token); // json containing an array containing artists artists = searchResults.items; console.log(artists); From fa00845db4ea6f210c2f3bfbe83d67d5dde8e8db Mon Sep 17 00:00:00 2001 From: gfisk777 <112730593+gfisk777@users.noreply.github.com> Date: Mon, 12 Dec 2022 11:12:56 -0500 Subject: [PATCH 28/37] Update README.md --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5562e093e..088a1fe65 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ -# This is your readme -You are required to fill it in with documentation similar to that found in the Sequelize example for the course as part of your final project. +# README -### How to use Markdown -Markdown is a text notation system used in Discord, Whatsapp and similar to structure pages without writing HTML at all. You'll be using it for your documentation. -* [Markdown guide](https://www.markdownguide.org/cheat-sheet/) \ No newline at end of file + +# Target Browsers +The main target of our site is people that use the newest versions of MAC and IOS + +# Description of Project +We used the spotify API(link) \ No newline at end of file From 25f3a09515c98e49324c74df10ecc21bbac2b524 Mon Sep 17 00:00:00 2001 From: gfisk777 <112730593+gfisk777@users.noreply.github.com> Date: Mon, 12 Dec 2022 11:25:50 -0500 Subject: [PATCH 29/37] Update index.html --- client/index.html | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/client/index.html b/client/index.html index 9f2cbfbfd..8864d34e1 100644 --- a/client/index.html +++ b/client/index.html @@ -16,16 +16,24 @@ - -
-
-

Spotify Song Tracker

-
- -
-

On our website you can search and track the top songs that are available on Spotify....

-
- + +
+
+ +
+
+

Spotify Song Tracker

+
+ + +
+

On our website you can search and track the top artists that are available on Spotify. You can try typing you favorite songs and artists from spotify and + a list of artists that have have a song by that name name will pop up. You can also type in your favorite artist and a link to that artist and other similar + artists will pop up.You will also be able to see what other people rate the artists that you are interested in. + For example if you were to search "Something in the Orange", artists that have made songs that have that name will pop up and in this case the top artist + Zach Bryan. +

+
From 0594521a82f08708a5dcbfdf2f2f8c09470b1c8e Mon Sep 17 00:00:00 2001 From: gfisk777 <112730593+gfisk777@users.noreply.github.com> Date: Mon, 12 Dec 2022 11:29:58 -0500 Subject: [PATCH 30/37] Update styles.css --- client/styles.css | 311 ++++++++++++++++++++++++---------------------- 1 file changed, 159 insertions(+), 152 deletions(-) diff --git a/client/styles.css b/client/styles.css index 1fb697b0d..5c0142bed 100644 --- a/client/styles.css +++ b/client/styles.css @@ -1,164 +1,171 @@ * { - box-sizing: border-box; - } - - /* - These rules apply to actual HTML elements with no labelling! - So: they style the tags directly - */ - - html { - background-color: rgb(255, 241, 241); - font-size: 16px; - min-width: 300px; - overflow-x: hidden; - overflow-y: scroll; - - /* these are specific to different browsers */ - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - text-rendering: optimizeLegibility; - -webkit-text-size-adjust: 100%; - -moz-text-size-adjust: 100%; - text-size-adjust: 100%; - } - - body { - margin: 0; - padding: 1em; - - font-family: ‘Segoe UI’, Candara, ‘Bitstream Vera Sans’, ‘DejaVu Sans’, ‘Bitsream Vera Sans’, ‘Trebuchet MS’, Verdana, ‘Verdana Ref’, sans-serif; - font-weight: 400; - line-height: 1.5; - background-color: #463c3c; + box-sizing: border-box; +} - } - - - a { - display: inline-block; - text-decoration: none; - } - - - - form { - accent-color: hsla(120, 100%, 50%, 0.482); - } - - .header { - padding: 10px; - text-align: center; - } +/* + These rules apply to actual HTML elements with no labelling! + So: they style the tags directly +*/ - .header h1 { +html { + background-color: rgb(255, 241, 241); + font-size: 16px; + min-width: 300px; + overflow-x: hidden; + overflow-y: scroll; - - /* colors */ - background-color: #000000; - color: rgb(57, 116, 12); - - /* shapes */ - border-radius: 6px; - font-size: 2.5rem; - padding: 1.25rem; - margin: 0; /* removing the margin on h1 tags means the header pins to the top if we move */ - font-style: italic; - } - - .header h3 { - margin:0; - padding:0; - padding-bottom: 1.5rem; - color: #037c0b; - } + /* these are specific to different browsers */ + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + text-size-adjust: 100%; +} - .intro { - background-color: #070606; - margin: 20px; - display:flex; - height:fit-content; - justify-content: center; - - } +body { + margin: 0; + padding: 1em; - .intro h2 { - font-family: 'Times New Roman', Times, serif; - font-size: 14px; - color: #037c0b; + font-family: ‘Segoe UI’, Candara, ‘Bitstream Vera Sans’, ‘DejaVu Sans’, ‘Bitsream Vera Sans’, ‘Trebuchet MS’, Verdana, ‘Verdana Ref’, sans-serif; + font-weight: 400; + line-height: 1.5; + background-color: #463c3c; - } +} - .introdiscription { - font-size:100px; - } - - .wrapper { - min-height: 100vh; - display: flex; - flex-direction: column; - margin: 0; - flex: 1; - } - - .container { - margin: 0 20px; - display: flex; - justify-content: space-evenly; - align-items:start; - flex:1; - } - - .box { - background-color: #037c0b; - border: 2px dashed; - border-radius: 4px; - height:fit-content; - padding: 1.5rem; - } - - .left_section { - background-color: #242424; - flex: 0 1 0; - margin: 1rem; - padding: 2.5rem; - width: 90%; - } - - .right_section { - background-color: #242424; - flex: 0 1 auto; - margin: 1rem; - align-items: center; - display: flex; - flex-direction: column; - justify-content: center; - width: 90%; - padding: 2.5rem; - } - - - /* - This block is actually dependent on the "container" block having a flex set on it - and the "wrapper" block displaying as a flex column with a "vertical height" (vh) of 100. - That serves to cram the footer to the bottom of the page. - */ - - .footer { - flex-shrink: 0; - padding: 1rem; - background-color: #291db6; - font-size: 1.2rem; - font-weight: 600; - border: 2px dashed; - } - - .footer a { - color: rgba(255, 224, 138, 1); - text-decoration: underline; - } - +a { + display: inline-block; + text-decoration: none; +} + + + +form { + accent-color: hsla(120, 100%, 50%, 0.482); +} + +.header { + padding: 10px; + text-align: center; +} + +.header h1 { + + + /* colors */ + background-color: #000000; + color: rgb(57, 116, 12); + + /* shapes */ + border-radius: 6px; + font-size: 2.5rem; + padding: 1.25rem; + margin: 0; /* removing the margin on h1 tags means the header pins to the top if we move */ + font-style: italic; +} + +.header h3 { + margin:0; + padding:0; + padding-bottom: 1.5rem; + color: #037c0b; +} + +.spotifyimage { + display: flex; + justify-content: center; +} + +.intro { + background-color: #070606; + margin: 20px 20px 20px; + padding: 2rem 2rem; + display:flex; + height:fit-content; + justify-content: center; + border-style: solid; +} + +.intro h2 { + font-family: 'Times New Roman', Times, serif; + font-size: 14px; + color: #037c0b; + +} + +.introdiscription { + font-size:100px; +} + +.wrapper { + min-height: 100vh; + display: flex; + flex-direction: column; + margin: 0; + flex: 1; +} + +.container { + margin: 0 20px; + display: flex; + justify-content: space-evenly; + align-items:start; + flex:1; +} + +.box { + background-color: #037c0b; + border: 2px ; + border-radius: 4px; + height:fit-content; + padding: 1.5rem; + margin-top: 10px; + border-style: solid; +} + +.left_section { + background-color: #242424; + flex: 0 1 0; + margin: 1rem; + padding: 2.5rem; + width: 90%; +} + +.right_section { + background-color: #242424; + + flex: 0 1 auto; + margin: 1rem; + align-items: center; + display: flex; + flex-direction: column; + justify-content: center; + width: 90%; + padding: 1.5rem; +} + + +/* + This block is actually dependent on the "container" block having a flex set on it + and the "wrapper" block displaying as a flex column with a "vertical height" (vh) of 100. + That serves to cram the footer to the bottom of the page. +*/ + +.footer { + flex-shrink: 0; + padding: 1rem; + background-color: #242424; + font-size: 1.2rem; + font-weight: 600; +} + +.footer a { + color: rgba(255, 224, 138, 1); + text-decoration: underline; +} + /* This is an example of a 'pseudoclass' In this instance, it says what to do if a mouse hovers over a link From 80266c8753381a85059737560cd2c9a2ba540f51 Mon Sep 17 00:00:00 2001 From: gfisk777 <112730593+gfisk777@users.noreply.github.com> Date: Mon, 12 Dec 2022 11:32:35 -0500 Subject: [PATCH 31/37] Create spotify.png --- client/images/spotify.png | Bin 0 -> 4355 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 client/images/spotify.png diff --git a/client/images/spotify.png b/client/images/spotify.png new file mode 100644 index 0000000000000000000000000000000000000000..8a09fb12bac8f856d07f6aa097d07a9191c5fecb GIT binary patch literal 4355 zcmd6rhdUIG1BdN|!?#@Ltcwb{;;gf?v&YFDNA_0s$}B4@qc~)j?JlyiGS56Ao2<;s z4jrBO>(BT-&-;Ad_iy;b8R}~Q7&sUxC@270nrcQA6qL|^T}Ds+Z+Yx>q#ntpd6&aQik^#^!&{0~ z=?+h#2Bh5RUau|isVIAp9FrIrpw0zQ00T7z_=fET+O6+=u>c5xZdprluUg&9Hm0Xw zq`OW55C94kB0|}1cD+q-fFhH51F}jRG9M?ryXFL_Z zQ&6z%YpE$4zsT9mN$_8hzVW)pdf>6xYttFZHv_bu{rW1u^7J^y2JD^u7q8xXGX&CY=p4&i?ZhGHK=M%jzKYzz%Q8ty^As^SA#5v+Q{3R=%AqftWGv~xFS9hYF z{FbL5)7Ev3-0Zr8F2DbK$nXN$O?1{at8GNHCl#fr`3#&Ir$F zJI?ZuzoMIOb#bR()R#HXb%*^cLBpCk+PgQ?>W1CK6Ux@hS~-S{YtQ%3IQ{~rfwTN| z*}B2IXkSJ0fho&iMUP)!6A>X)lSbfKd#sLP(xl$=(}%$& znp`_+Pk$!Le4EWE8;Zw2Tc@^iY%VX%$<11OcxjEz_p{5-re+(iMLqSohn@-IQ`qY5 z)yiWR;bi0)OtzK0Q8MiUk-K7XinxVOi9g$N2Zf31lCF46rq=gau#Cs(&))qWM*Y84 z@(~Sl4hfrO++l3k3Ey~spQ_(uJj42l7d4<>+BdGuyGlehUT}$vpk1a2N66OzPz5ec zmWY?{aK$Rc^ai<;Pm(oQ1W^JHq*za$Gp-%Gi?K5s7#PI#3FNlereSu8HAA}e%J`Pu zQc9T%hWzR&rSN@-#&krBghJ3Vg~+c!b8fsg*QQ1G21U}Tfm^d-Z3EH3lEnGbG5eP( zxW|=nB#Qs`X9=Cy`+hJgrHMwT)=L6{Yq)TM1LJ~A&`q|;z46AO<q66pm*!n@z9r3jU;cE`4`O5DY^zBJ(FVT9=H(7UH@rw_}pV-tAY(1Hf(kTQuVv39DwWulUK87@aF%i#f|@+7 zKl+$~=q39FBSVg02}ZkQ$K=l^_nIQFf?PRtf3&ggjWFt*1*=$-5*s-Z6Z>28f z=jn?UdE#<>v%6p=wjW=c07eqU3t?A`|9vr;!=_F1o1z}&?NQFrSXjSG6623~kCy|?+I@F2! zE|B+jDfwMC+WU_$JIeKP=~Hh<>`j7JlQ2!VyP&abzn&e5NeSb%>8N+use^73tA&|c z$hQb~R4f;lBnPfxGEmgs+1E!VH4oYN`~@n;$$}%a{`C&^scs0%Mk4FTHeP&(GpR+f_W3Sp0I^ zBY;QSpM+#>oNoL|j8T~`*A7vtHN4hv8GG&8arD~O1AvtN8EXH0yPdeaTEM35pE^=RsRj*s5=rZqO)g4(Wiz9DWy@F zUhpNlL~7?W0XaEbRtv5SI`nlcGVrl3X~G+9;rSsnoHBuUai|>6OtxuP+)!6E2d;*fL~mB z*q0<5jPZu@`{uSJrB*Q}$&{%4W8wISO4T+DHKZx%pg)7?CUtTI<9mhaBlNttS@goZ zt+;O6e8J}_Y#nk4Pe&@Dwsg~mG#^!;mHH)Av!hDGdY%x&N)FMF(lYZO-?Tm7H%y~s zvGnm77P9l~RFIVI?Wi#7mp$g41Y=_JF74%eHp}C~@OgQzUj)e-4v3!1#%x(Y83JTI?etaOBC~ z_>u28VD{<8aSyj-1+mCux_VRdy-3>Hi;pWA?>)h4a^WlhRfMxs zi#wg^F{oN3w#wzctFdD2)?4|-^puk~9q58>;4$yYOVnOpeT54G67!OT;UqH)&_HQh z>So0C%H84BoOFwJLGag_LJ8*mA)O1SPk2HI6Kdm|TE`HYo}aWH51Q)>PP74J^~`#)TdHn#l#Ff>{7np# zaxHA#k9o7%Ze9ph?t4f}2HnS$% zXg{y}Xb0m7l{!^6Hbh9$ND-Z7hiC`!6GIG~t~qJd*qK7#mgCo0PgV1dz&71i8;|vy zaaT;4f^oQ@!-G>q-CYM8V+#n2FW&Xr_`5 zj3%?W7A>|g<#0UQ`UBWYzCAIGGi4iFks}Q+M421l8f~rPDv2Nrn^TL#8v{1zBn|-e z<3QL-ir!mvH4fH9X^&SFub~h@Zn7Ir#3bf~3iN2L4AFUwp-h%&SQK1Y6&t5s^_utO z@Qk}AWdD-EwLr$&z|zBRDj{Vv0{7)-lGus#@V1E;SMVYFqPcoWOn?pB(F9m}fhvDv z;E&vDc~C`JBoXQ_zb-R8_nGcG6*~Riw$TMak$*668*lPK#i}Vg^oQ;5=-lsPLt5E++=ITUhB4UMYB7MN*-CEUvRgg#9|uRHB95w*M@ zHO_@N@2zrSr=9waHhqy62}K}@B|z%vFPj${{;v9i`$y#R`+~UX?Mt(3@TAlBc42}| zkZ@j)&^`NgBRb0&$&~frC=dLhAl4Lfh^n$LmxEj*v&&b8pfo&CAKTOgE^6sZD4R2! zs;Zd-|JqVrh*chP@-SN}gvZ0QPkv%?Syc~W0G5^_RUcOx&Z^m-HbCohY6o& z?SfVDLOSQK-3U7VeuA{k)-Jay4-|$f=&*C!3Z{s>4}FMPEAFQO>MwN56$4)$fudjb zcFSCUhCeK8!Bsc60urXe;w|1XTF@fUt@J04!g8H5!j^_C7Nwvs4T<*;z(->eTwmL5 z+$0Ck@0#93FO&`UU@N9-(|xW20n2*E%PzTJXc|Jl8w75!p3byKV$4ZC8!Du{WxbGZ z)L&`ui-eGqx)qU<`2lTJl!H%Dr1G%R4|}!CLZq(IkMj!UVC~BVWGYfg`0dC6VQRKC zXy*M6sRdG)GTPuZO2?QwB6+EFcK(^vfk8)))s5KTVtDqS$q4Y;!{OJ#Ts6*P_C-~(vjaX9r*u6 c`#B4FhE9kjhX22RZw7^yy1rVaigm>Q06+P3@Bjb+ literal 0 HcmV?d00001 From c1751160b651dd42400a12a42bfcb2989927c04c Mon Sep 17 00:00:00 2001 From: gfisk777 <112730593+gfisk777@users.noreply.github.com> Date: Mon, 12 Dec 2022 11:35:29 -0500 Subject: [PATCH 32/37] Update index.html --- client/index.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/index.html b/client/index.html index 8864d34e1..bdce14af5 100644 --- a/client/index.html +++ b/client/index.html @@ -37,11 +37,11 @@

On our website you can search and track the top artists that are available o
-

Song Input

+

Aritst Input

- +
@@ -49,20 +49,20 @@

Song Input

-

+

List of Artists

-

Chart of songs

+

Chart of Artists

-

A list of songs from api

+

A list of Artists from api

From 0b7177877cfba6d18ac8fbd7ba9c1f9bbe1e0a6f Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Mon, 12 Dec 2022 12:55:08 -0500 Subject: [PATCH 33/37] link button to relatedArtists function --- client/index.html | 4 +-- client/script.js | 68 +++++++++++++++++++++++++++++------------------ client/styles.css | 12 ++++++++- 3 files changed, 54 insertions(+), 30 deletions(-) diff --git a/client/index.html b/client/index.html index 9f2cbfbfd..4706e56e7 100644 --- a/client/index.html +++ b/client/index.html @@ -40,9 +40,7 @@

Song Input

-
-

-
+

diff --git a/client/script.js b/client/script.js index 11f54564b..7a6aade7e 100644 --- a/client/script.js +++ b/client/script.js @@ -34,17 +34,40 @@ function getRandomIntInclusive(min, max) { - Display the name of that restaurant and what category of food it is */ -function injectHTML(list, div) { +function injectHTML(list, divTarget) { console.log('fired injectHTML'); - const target = document.querySelector(div); + const target = document.querySelector(divTarget); target.innerHTML = ''; const listEl = document.createElement('ol'); target.appendChild(listEl); list.forEach((item) => { const el = document.createElement('li'); + const image = document.createElement('img'); const anchor = document.createElement('a'); + image.src = item.images[2].url; anchor.href = item.external_urls.spotify; anchor.innerText = item.name; + el.appendChild(image); + el.appendChild(anchor); + listEl.appendChild(el); + // console.log(item.name); + }); +} + +function injectSearchResults(list, divTarget) { + console.log('fired injectSearchResults'); + const target = document.querySelector(divTarget); + target.innerHTML = ''; + const listEl = document.createElement('ol'); + target.appendChild(listEl); + list.forEach((item) => { + const el = document.createElement('li'); + const image = document.createElement('img'); + const anchor = document.createElement('a'); + image.src = item.images[2].url; + anchor.href = item.external_urls.spotify; + anchor.innerText = item.name; + el.appendChild(image); el.appendChild(anchor); listEl.appendChild(el); // console.log(item.name); @@ -204,8 +227,8 @@ async function getAccessToken() { This function retrieves a list of artists that are related to the artist ID in the request Need to add a way for users to type in an artist's name and see a list of related artists */ -async function getRelatedArtists(token) { - const url = 'https://api.spotify.com/v1/artists/2wY79sveU1sp5g7SokKOiI/related-artists'; // remote URL! you can test it in your browser +async function getRelatedArtists(token, id) { + const url = `https://api.spotify.com/v1/artists/${id}/related-artists`; // remote URL! you can test it in your browser const data = await fetch(url, { headers: { Accept: 'application/json', @@ -233,8 +256,6 @@ async function mainEvent() { const submit = document.querySelector('#get-resto'); // get a reference to your submit button const loadAnimation = document.querySelector('.lds-ellipsis'); // get a reference to our loading animation const chartTarget = document.querySelector('#myChart'); - const divResults = '#results'; - const relatedArtists = '#restaurant_list'; let artists = []; submit.style.display = 'none'; // let your submit button disappear @@ -246,8 +267,7 @@ async function mainEvent() { It's at about line 27 - go have a look and see what we're retrieving and sending back. */ const token = await getAccessToken(); - const chartData = await getRelatedArtists(token); - console.log(chartData); + let chartData; /* Below this comment, we log out a table of all the results using "dot notation" @@ -255,17 +275,14 @@ async function mainEvent() { Dot notation is preferred in JS unless you have a good reason to use brackets The 'data' key, which we set at line 38 in foodServiceRoutes.js, contains all 1,000 records we need */ - console.table(chartData); // in your browser console, try expanding this object to see what fields are available to work with // for example: arrayFromJson.data[0].name, etc - console.log(chartData[0].name); // this is called "string interpolation" and is how we build large text blocks with variables - console.log(`${chartData[0].name} ${chartData[0].popularity}`); // This IF statement ensures we can't do anything if we don't have information yet - if (!chartData.length) { return; } // Return if we have no data aka array has no length + // if (!chartData.length) { return; } // Return if we have no data aka array has no length submit.style.display = 'block'; // let's turn the submit button back on by setting it to display as a block when we have data available @@ -273,25 +290,24 @@ async function mainEvent() { loadAnimation.classList.remove('lds-ellipsis'); loadAnimation.classList.add('lds-ellipsis_hidden'); - // form.addEventListener('input', (event) => { // event bubbling - // console.log('input', event.target.value); // contents - // const searchQuery = event.target.value; - // return searchQuery; - // }); + form.addEventListener('input', async (event) => { // event bubbling + console.log('input', event.target.value); // contents + const searchQuery = event.target.value; + const searchResults = await searchArtists(searchQuery, token); // json containing an array containing artists + artists = searchResults.items; + console.log(artists); + + injectHTML(artists, '#results'); + }); // And here's an eventListener! It's listening for a "submit" button specifically being clicked // this is a synchronous event event, because we already did our async request above, and waited for it to resolve form.addEventListener('submit', async (submitEvent) => { // This is needed to stop our page from changing to a new URL even though it heard a GET request submitEvent.preventDefault(); - console.log(document.getElementById('resto')); - - const formText = document.getElementById('resto').value; - - const searchResults = await searchArtists(formText, token); // json containing an array containing artists - artists = searchResults.items; - console.log(artists); - - injectHTML(artists, divResults); + chartData = await getRelatedArtists(token, artists[0].id); + console.log(chartData); + console.log(artists[0].id); + injectHTML(chartData, '#restaurant_list'); // This constant will have the value of your 15-restaurant collection when it processes // currentList = processRestaurants(chartData); diff --git a/client/styles.css b/client/styles.css index 1fb697b0d..70b43464b 100644 --- a/client/styles.css +++ b/client/styles.css @@ -193,7 +193,11 @@ width: 150px; height: 150px; } - + + .search img { + width: 75px; + height: 75px; + } /* Carousel */ div.carousel { @@ -240,6 +244,12 @@ width: 150px; } + .embed { + border-radius: 12px; + width: 100%; + height: 80; + } + .prev, .next { border: none; From 638ce5194ab4e225db1ba9f9b81ebfb17e653e9c Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Mon, 12 Dec 2022 13:49:07 -0500 Subject: [PATCH 34/37] cleaned up script --- client/script.js | 120 ----------------------------------------------- 1 file changed, 120 deletions(-) diff --git a/client/script.js b/client/script.js index 7a6aade7e..7ae6a6f02 100644 --- a/client/script.js +++ b/client/script.js @@ -54,65 +54,7 @@ function injectHTML(list, divTarget) { }); } -function injectSearchResults(list, divTarget) { - console.log('fired injectSearchResults'); - const target = document.querySelector(divTarget); - target.innerHTML = ''; - const listEl = document.createElement('ol'); - target.appendChild(listEl); - list.forEach((item) => { - const el = document.createElement('li'); - const image = document.createElement('img'); - const anchor = document.createElement('a'); - image.src = item.images[2].url; - anchor.href = item.external_urls.spotify; - anchor.innerText = item.name; - el.appendChild(image); - el.appendChild(anchor); - listEl.appendChild(el); - // console.log(item.name); - }); -} - -function processRestaurants(list) { - console.log('fired restaurants list'); - const range = [...Array(15).keys()]; // Special notation to create an array of 15 elements - const newArray = range.map((item) => { - const index = getRandomIntInclusive(0, list.length - 1); - console.log(list[index]); - return list[index]; - }); - return newArray; - /* - ## Process Data Separately From Injecting It - This function should accept your 1,000 records - then select 15 random records - and return an object containing only the restaurant's name, category, and geocoded location - So we can inject them using the HTML injection function - - You can find the column names by carefully looking at your single returned record - https://data.princegeorgescountymd.gov/Health/Food-Inspection/umjn-t2iz - - ## What to do in this function: - - - Create an array of 15 empty elements (there are a lot of fun ways to do this, and also very basic ways) - - using a .map function on that range, - - Make a list of 15 random restaurants from your list of 100 from your data request - - Return only their name, category, and location - - Return the new list of 15 restaurants so we can work on it separately in the HTML injector - */ -} - // good programming practice: one idea per line -function filterList(array, filterInputValue) { - const newArray = array.filter((item) => { // .filter(array) checks if true and adds the item to a new array - if (!item.name) { return; } - const lowerCaseName = item.name.toLowerCase(); - const lowerCaseQuery = filterInputValue.toLowerCase(); - return lowerCaseName.includes(lowerCaseQuery); - }); - return newArray; -} async function searchArtists(term, token) { const search = encodeURIComponent(term); @@ -131,32 +73,6 @@ async function searchArtists(term, token) { return json.artists; // object containing, among other things, an array of artists } -function initMap() { - console.log('initMap'); - const map = L.map('map').setView([38.7849, -76.8721], 13); - L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { - maxZoom: 19, - attribution: '© OpenStreetMap' - }).addTo(map); - return map; -} - -function markerPlace(array, map) { - console.log('markerPlace', array); - // const marker = L.marker([51.5, -0.09]).addTo(map); - map.eachLayer((layer) => { - if (layer instanceof L.Marker) { - layer.remove(); - } - }); - array.forEach((item, index) => { - const {coordinates} = item.geocoded_column_1; - L.marker([coordinates[1], coordinates[0]]).addTo(map); - if (index === 0) { - map.setView([coordinates[1], coordinates[0]], 10); - } - }); -} function initChart(chartTarget) { return new Chart(chartTarget, { @@ -259,31 +175,9 @@ async function mainEvent() { let artists = []; submit.style.display = 'none'; // let your submit button disappear - initChart(chartTarget); - - /* - Let's get some data from the API - it will take a second or two to load - This next line goes to the request for 'GET' in the file at /server/routes/foodServiceRoutes.js - It's at about line 27 - go have a look and see what we're retrieving and sending back. - */ const token = await getAccessToken(); let chartData; - /* - Below this comment, we log out a table of all the results using "dot notation" - An alternate notation would be "bracket notation" - arrayFromJson["data"] - Dot notation is preferred in JS unless you have a good reason to use brackets - The 'data' key, which we set at line 38 in foodServiceRoutes.js, contains all 1,000 records we need - */ - - // in your browser console, try expanding this object to see what fields are available to work with - // for example: arrayFromJson.data[0].name, etc - - // this is called "string interpolation" and is how we build large text blocks with variables - - // This IF statement ensures we can't do anything if we don't have information yet - // if (!chartData.length) { return; } // Return if we have no data aka array has no length - submit.style.display = 'block'; // let's turn the submit button back on by setting it to display as a block when we have data available // hides loading animation once data has been loaded @@ -291,11 +185,9 @@ async function mainEvent() { loadAnimation.classList.add('lds-ellipsis_hidden'); form.addEventListener('input', async (event) => { // event bubbling - console.log('input', event.target.value); // contents const searchQuery = event.target.value; const searchResults = await searchArtists(searchQuery, token); // json containing an array containing artists artists = searchResults.items; - console.log(artists); injectHTML(artists, '#results'); }); @@ -308,18 +200,6 @@ async function mainEvent() { console.log(chartData); console.log(artists[0].id); injectHTML(chartData, '#restaurant_list'); - - // This constant will have the value of your 15-restaurant collection when it processes - // currentList = processRestaurants(chartData); - // console.log(currentList); - - // And this function call will perform the "side effect" of injecting the HTML list for you - // injectHTML(chartData); - // markerPlace(currentList, pageMap); - - // By separating the functions, we open the possibility of regenerating the list - // without having to retrieve fresh data every time - // We also have access to some form values, so we could filter the list based on name }); } From 7463d64d6d48b7fa0fe57101b6c111638a4b7bb6 Mon Sep 17 00:00:00 2001 From: jsong073-UMD Date: Mon, 12 Dec 2022 13:56:21 -0500 Subject: [PATCH 35/37] cleaned up script --- client/script.js | 65 ------------------------------------------------ 1 file changed, 65 deletions(-) diff --git a/client/script.js b/client/script.js index 7ae6a6f02..59307ea60 100644 --- a/client/script.js +++ b/client/script.js @@ -9,31 +9,8 @@ Under this comment place any utility functions you need - like an inclusive random number selector https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random */ - -// gets a random integer between two numbers const apiURL = 'https://api.spotify.com/v1/'; -function getRandomIntInclusive(min, max) { - const newMin = Math.ceil(min); - const newMax = Math.floor(max); - return Math.floor(Math.random() * (newMax - newMin + 1) + min); // The maximum is inclusive and the minimum is inclusive -} - -/* - ## JS and HTML Injection - There are a bunch of methods to inject text or HTML into a document using JS - Mainly, they're considered "unsafe" because they can spoof a page pretty easily - But they're useful for starting to understand how websites work - the usual ones are element.innerText and element.innerHTML - Here's an article on the differences if you want to know more: - https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent#differences_from_innertext - - ## What to do in this function - - Accept a list of restaurant objects - - using a .forEach method, inject a list element into your index.html for every element in the list - - Display the name of that restaurant and what category of food it is - */ - function injectHTML(list, divTarget) { console.log('fired injectHTML'); const target = document.querySelector(divTarget); @@ -54,8 +31,6 @@ function injectHTML(list, divTarget) { }); } -// good programming practice: one idea per line - async function searchArtists(term, token) { const search = encodeURIComponent(term); console.log(search); @@ -74,44 +49,6 @@ async function searchArtists(term, token) { } -function initChart(chartTarget) { - return new Chart(chartTarget, { - type: 'bar', - data: { - labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'], - datasets: [{ - label: '# of Votes', - data: [12, 19, 3, 5, 2, 3], - borderWidth: 1 - }] - }, - options: { - scales: { - y: { - beginAtZero: true - } - } - } - }); -} - -function generateRandomString() { - const array = new Uint32Array(1); - self.crypto.getRandomValues(array); - - return array[0]; -} - -async function getData(submit) { - const url = 'https://api.si.edu/openaccess/api/v1.0/search?q=q&api_key=v75sWiNNyg1QXFrgYo532qR0gwtYecj6kS8FtQBD'; // remote URL! you can test it in your browser - const data = await fetch(url); // We're using a library that mimics a browser 'fetch' for simplicity - const json = await data.json(); // the data isn't json until we access it using dot notation - - // chained filters check if item has both a location and a name - const reply = json.filter((item) => Boolean(item.geocoded_column_1)).filter((item) => Boolean(item.name)); - return reply; -} - // This function retrieves the access token from Spotify // Used the "Client Credentials Flow" on Spotify API // Problem with Buffer module. Browser doesn't recognize it, but won't let me import it @@ -166,12 +103,10 @@ async function mainEvent() { When you're not working in a heavily-commented "learning" file, this also is more legible If you separate your work, when one piece is complete, you can save it and trust it */ - // const pageMap = initMap(); // the async keyword means we can make API requests const form = document.querySelector('.main_form'); // get your main form so you can do JS with it const submit = document.querySelector('#get-resto'); // get a reference to your submit button const loadAnimation = document.querySelector('.lds-ellipsis'); // get a reference to our loading animation - const chartTarget = document.querySelector('#myChart'); let artists = []; submit.style.display = 'none'; // let your submit button disappear From f45142a6212e85318e5ad5c8c7a68b5791cc0e96 Mon Sep 17 00:00:00 2001 From: gfisk777 <112730593+gfisk777@users.noreply.github.com> Date: Mon, 12 Dec 2022 14:49:57 -0500 Subject: [PATCH 36/37] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 088a1fe65..0df5ecf19 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ # README +#Link to our page +https://gfisk777.github.io/Group1-Project-Base/routes/client/index.html # Target Browsers The main target of our site is people that use the newest versions of MAC and IOS # Description of Project -We used the spotify API(link) \ No newline at end of file +We used the spotify API(https://developer.spotify.com/documentation/web-api/) From 2c7c41e6333fadce759d42e3b017ed5b75ebb127 Mon Sep 17 00:00:00 2001 From: gfisk777 <112730593+gfisk777@users.noreply.github.com> Date: Mon, 12 Dec 2022 14:50:20 -0500 Subject: [PATCH 37/37] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0df5ecf19..b66c2d6fb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # README -#Link to our page +# Link to our page https://gfisk777.github.io/Group1-Project-Base/routes/client/index.html # Target Browsers