├── README.md ├── client ├── .env.example ├── .gitignore ├── package-lock.json ├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── robots.txt ├── src │ ├── App.jsx │ ├── Dashboard.jsx │ ├── Login.jsx │ ├── Player.jsx │ ├── TrackSearchResult.jsx │ ├── hooks │ │ └── useAuth.jsx │ ├── index.jsx │ └── styles │ │ ├── App.styles.jsx │ │ ├── Dashboard.styles.jsx │ │ ├── Login.styles.jsx │ │ ├── TrackSearchResults.styles.jsx │ │ └── globalStyles.styles.jsx └── yarn.lock └── server ├── .env.example ├── .gitignore ├── index.js ├── package-lock.json └── package.json /README.md: -------------------------------------------------------------------------------- 1 | # Spotify App 2 | 3 | ## Introduction 4 | 5 | This Spotify clone which is made with React and Express allows the user to do the following 6 | 7 | 1. Login in using their Spotify Account 8 | 2. Search for artists or songs 9 | 3. Play songs 10 | 4. View the lyrics of the respective songs played 11 | -------------------------------------------------------------------------------- /client/.env.example: -------------------------------------------------------------------------------- 1 | REACT_APP_CLIENT_ID="YOUR CLIENT ID" 2 | REACT_APP_REDIRECT_URI=http://localhost:3000 3 | REACT_APP_BASE_URL=http://localhost:3001 -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "spotify-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.11.4", 7 | "@testing-library/react": "^11.1.0", 8 | "@testing-library/user-event": "^12.1.10", 9 | "axios": "^0.23.0", 10 | "react": "^17.0.2", 11 | "react-dom": "^17.0.2", 12 | "react-scripts": "4.0.3", 13 | "react-spotify-web-playback": "^0.9.1", 14 | "spotify-web-api-node": "^5.0.2", 15 | "styled-components": "^5.3.3", 16 | "web-vitals": "^1.0.1" 17 | }, 18 | "scripts": { 19 | "start": "react-scripts start", 20 | "build": "react-scripts build", 21 | "test": "react-scripts test", 22 | "eject": "react-scripts eject" 23 | }, 24 | "eslintConfig": { 25 | "extends": [ 26 | "react-app", 27 | "react-app/jest" 28 | ] 29 | }, 30 | "browserslist": { 31 | "production": [ 32 | ">0.2%", 33 | "not dead", 34 | "not op_mini all" 35 | ], 36 | "development": [ 37 | "last 1 chrome version", 38 | "last 1 firefox version", 39 | "last 1 safari version" 40 | ] 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antstackio/spotify-react-blog-app/3c04806c73c59ca2837660b168de3f151c69e9ba/client/public/favicon.ico -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /client/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antstackio/spotify-react-blog-app/3c04806c73c59ca2837660b168de3f151c69e9ba/client/public/logo192.png -------------------------------------------------------------------------------- /client/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antstackio/spotify-react-blog-app/3c04806c73c59ca2837660b168de3f151c69e9ba/client/public/logo512.png -------------------------------------------------------------------------------- /client/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /client/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /client/src/App.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import Dashboard from './Dashboard'; 4 | import Login from './Login'; 5 | 6 | import { Container } from './styles/App.styles'; 7 | 8 | const App = () => { 9 | const code = new URLSearchParams(window.location.search).get('code'); 10 | 11 | return {code ? : }; 12 | }; 13 | 14 | export default App; 15 | -------------------------------------------------------------------------------- /client/src/Dashboard.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from 'react'; 2 | 3 | import useAuth from './hooks/useAuth'; 4 | import Player from './Player'; 5 | import TrackSearchResult from './TrackSearchResult'; 6 | import SpotifyWebApi from 'spotify-web-api-node'; 7 | import axios from 'axios'; 8 | import { 9 | DashBoardContainer, 10 | SearchInput, 11 | ResultsContainer, 12 | LyricsContainer, 13 | PlayerContainer, 14 | } from './styles/Dashboard.styles'; 15 | 16 | const spotifyApi = new SpotifyWebApi({ 17 | clientId: process.env.REACT_APP_CLIENT_ID, 18 | }); 19 | 20 | const Dashboard = ({ code }) => { 21 | const accessToken = useAuth(code); 22 | const [search, setSearch] = useState(''); 23 | const [searchResults, setSearchResults] = useState([]); 24 | const [playingTrack, setPlayingTrack] = useState(); 25 | const [lyrics, setLyrics] = useState(''); 26 | 27 | function chooseTrack(track) { 28 | setPlayingTrack(track); 29 | setSearch(''); 30 | setLyrics(''); 31 | } 32 | 33 | useEffect(() => { 34 | if (!playingTrack) return; 35 | 36 | (async () => { 37 | const { 38 | data: { lyrics }, 39 | } = await axios.get(`${process.env.REACT_APP_BASE_URL}/lyrics`, { 40 | params: { 41 | track: playingTrack.title, 42 | artist: playingTrack.artist, 43 | }, 44 | }); 45 | setLyrics(lyrics); 46 | })(); 47 | }, [playingTrack]); 48 | 49 | useEffect(() => { 50 | if (!accessToken) return; 51 | spotifyApi.setAccessToken(accessToken); 52 | }, [accessToken]); 53 | 54 | useEffect(() => { 55 | if (!search) return setSearchResults([]); 56 | if (!accessToken) return; 57 | 58 | let cancel = false; 59 | (async () => { 60 | const { body } = await spotifyApi.searchTracks(search); 61 | if (cancel) return; 62 | setSearchResults( 63 | body.tracks.items.map((track) => { 64 | const smallestAlbumImage = track.album.images.reduce( 65 | (smallest, image) => { 66 | if (image.height < smallest.height) return image; 67 | return smallest; 68 | }, 69 | track.album.images[0] 70 | ); 71 | 72 | return { 73 | artist: track.artists[0].name, 74 | title: track.name, 75 | uri: track.uri, 76 | albumUrl: smallestAlbumImage.url, 77 | }; 78 | }) 79 | ); 80 | })(); 81 | 82 | return () => (cancel = true); 83 | }, [search, accessToken]); 84 | 85 | return ( 86 | 87 | setSearch(e.target.value)} 92 | /> 93 | 94 | {searchResults.map((track) => ( 95 | 100 | ))} 101 | {searchResults.length === 0 && ( 102 | {lyrics} 103 | )} 104 | 105 | 106 | 107 | 108 | 109 | ); 110 | }; 111 | 112 | export default Dashboard; 113 | -------------------------------------------------------------------------------- /client/src/Login.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { LoginButton, LoginLink } from './styles/Login.styles'; 4 | 5 | const Login = () => { 6 | const AUTH_URL = `https://accounts.spotify.com/authorize?client_id=${process.env.REACT_APP_CLIENT_ID}&response_type=code&redirect_uri=${process.env.REACT_APP_REDIRECT_URI}&scope=streaming%20user-read-email%20user-read-private%20user-library-read%20user-library-modify%20user-read-playback-state%20user-modify-playback-state`; 7 | 8 | return ( 9 | 10 | Login with Spotify 11 | 12 | ); 13 | }; 14 | 15 | export default Login; 16 | -------------------------------------------------------------------------------- /client/src/Player.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from 'react'; 2 | 3 | import SpotifyPlayer from 'react-spotify-web-playback'; 4 | 5 | const Player = ({ accessToken, trackUri }) => { 6 | const [play, setPlay] = useState(false); 7 | 8 | useEffect(() => { 9 | setPlay(true); 10 | }, [trackUri]); 11 | 12 | if (!accessToken) return null; 13 | return ( 14 | !state.isPlaying && setPlay(false)} 18 | play={play} 19 | uris={trackUri ? trackUri : []} 20 | styles={{ 21 | activeColor: '#fff', 22 | bgColor: '#333', 23 | color: '#fff', 24 | loaderColor: '#fff', 25 | sliderColor: '#1cb954', 26 | trackArtistColor: '#ccc', 27 | trackNameColor: '#fff', 28 | height: '55px', 29 | }} 30 | /> 31 | ); 32 | }; 33 | 34 | export default Player; 35 | -------------------------------------------------------------------------------- /client/src/TrackSearchResult.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { 4 | ResultContainer, 5 | ResultImage, 6 | SongContainer, 7 | TitleText, 8 | ArtistText, 9 | } from './styles/TrackSearchResults.styles'; 10 | 11 | const TrackSearchResult = ({ track, chooseTrack }) => { 12 | function handlePlay() { 13 | chooseTrack(track); 14 | } 15 | 16 | return ( 17 | 18 | 19 | 20 | {track.title} 21 | {track.artist} 22 | 23 | 24 | ); 25 | }; 26 | 27 | export default TrackSearchResult; 28 | -------------------------------------------------------------------------------- /client/src/hooks/useAuth.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | import axios from 'axios'; 3 | 4 | const useAuth = (code) => { 5 | const [accessToken, setAccessToken] = useState(); 6 | const [refreshToken, setRefreshToken] = useState(); 7 | const [expiresIn, setExpiresIn] = useState(); 8 | 9 | useEffect(() => { 10 | (async () => { 11 | try { 12 | const { 13 | data: { access_token, refresh_token, expires_in }, 14 | } = await axios.post(`${process.env.REACT_APP_BASE_URL}/login`, { 15 | code, 16 | }); 17 | setAccessToken(access_token); 18 | setRefreshToken(refresh_token); 19 | setExpiresIn(expires_in); 20 | window.history.pushState({}, null, '/'); 21 | } catch { 22 | window.location = '/'; 23 | } 24 | })(); 25 | }, [code]); 26 | 27 | useEffect(() => { 28 | if (!refreshToken || !expiresIn) return; 29 | const interval = setInterval(async () => { 30 | try { 31 | const { 32 | data: { access_token, expires_in }, 33 | } = await axios.post(`${process.env.REACT_APP_BASE_URL}/refresh`, { 34 | refreshToken, 35 | }); 36 | setAccessToken(access_token); 37 | setExpiresIn(expires_in); 38 | } catch { 39 | window.location = '/'; 40 | } 41 | }, (expiresIn - 60) * 1000); 42 | 43 | return () => clearInterval(interval); 44 | }, [refreshToken, expiresIn]); 45 | 46 | return accessToken; 47 | }; 48 | 49 | export default useAuth; 50 | -------------------------------------------------------------------------------- /client/src/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | import GlobalStyles from './styles/globalStyles.styles'; 5 | 6 | ReactDOM.render( 7 | <> 8 | 9 | 10 | , 11 | document.getElementById('root') 12 | ); 13 | -------------------------------------------------------------------------------- /client/src/styles/App.styles.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Container = styled.div` 4 | min-height: 100vh; 5 | display: flex; 6 | flex-direction: column; 7 | align-items: center; 8 | justify-content: center; 9 | background-color: #191414; 10 | `; 11 | -------------------------------------------------------------------------------- /client/src/styles/Dashboard.styles.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const DashBoardContainer = styled.div` 4 | padding: 2rem; 5 | min-height: 100vh; 6 | width: 100%; 7 | `; 8 | 9 | export const SearchInput = styled.input` 10 | width: 100%; 11 | height: 55px; 12 | padding: 10px; 13 | border-radius: 5px; 14 | font-size: 1.5rem; 15 | 16 | &::placeholder { 17 | font-size: 1.5rem; 18 | } 19 | `; 20 | 21 | export const ResultsContainer = styled.div` 22 | flex-grow: 1; 23 | margin: 3rem 0; 24 | overflow-y: auto; 25 | overflow-x: auto; 26 | `; 27 | 28 | export const LyricsContainer = styled.div` 29 | height: 65vh; 30 | text-align: center; 31 | color: #fff; 32 | white-space: pre; 33 | `; 34 | 35 | export const PlayerContainer = styled.div` 36 | width: 100%; 37 | position: fixed; 38 | bottom: 0; 39 | left: 0; 40 | `; 41 | -------------------------------------------------------------------------------- /client/src/styles/Login.styles.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const LoginButton = styled.button` 4 | background-color: #1db954; 5 | padding: 1rem; 6 | border: none; 7 | border-radius: 8px; 8 | `; 9 | 10 | export const LoginLink = styled.a` 11 | color: #ffff; 12 | font-size: 1.5rem; 13 | font-weight: bold; 14 | text-decoration: none; 15 | `; 16 | -------------------------------------------------------------------------------- /client/src/styles/TrackSearchResults.styles.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const ResultContainer = styled.div` 4 | display: flex; 5 | align-items: center; 6 | margin: 2rem; 7 | cursor: pointer; 8 | `; 9 | 10 | export const ResultImage = styled.img` 11 | height: 64px; 12 | width: 64px; 13 | `; 14 | 15 | export const SongContainer = styled.div` 16 | margin-left: 3rem; 17 | `; 18 | 19 | export const TitleText = styled.p` 20 | color: #fff; 21 | `; 22 | 23 | export const ArtistText = styled.p` 24 | color: #f5f5f5; 25 | `; 26 | -------------------------------------------------------------------------------- /client/src/styles/globalStyles.styles.jsx: -------------------------------------------------------------------------------- 1 | import { createGlobalStyle } from 'styled-components'; 2 | 3 | const GlobalStyles = createGlobalStyle` 4 | html, 5 | body { 6 | padding: 0; 7 | margin: 0; 8 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 9 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 10 | } 11 | 12 | a { 13 | color: inherit; 14 | text-decoration: none; 15 | } 16 | 17 | * { 18 | box-sizing: border-box; 19 | } 20 | `; 21 | 22 | export default GlobalStyles; 23 | -------------------------------------------------------------------------------- /server/.env.example: -------------------------------------------------------------------------------- 1 | REDIRECT_URI=http://localhost:3000 2 | CLIENT_ID="YOUR CLIENT ID" 3 | CLIENT_SECRET="YOUR CLIENT SECRET" -------------------------------------------------------------------------------- /server/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env -------------------------------------------------------------------------------- /server/index.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import cors from 'cors'; 3 | import lyricsFinder from 'lyrics-finder'; 4 | import SpotifyWebApi from 'spotify-web-api-node'; 5 | import dotenv from 'dotenv'; 6 | 7 | const app = express(); 8 | dotenv.config(); 9 | 10 | app.use(cors()); 11 | app.use(express.json()); 12 | app.use(express.urlencoded({ extended: true })); 13 | 14 | const PORT = 3001; 15 | 16 | app.post('/login', async (req, res) => { 17 | const { code } = req.body; 18 | 19 | const spotifyApi = new SpotifyWebApi({ 20 | redirectUri: process.env.REDIRECT_URI, 21 | clientId: process.env.CLIENT_ID, 22 | clientSecret: process.env.CLIENT_SECRET, 23 | }); 24 | 25 | try { 26 | const { 27 | body: { access_token, refresh_token, expires_in }, 28 | } = await spotifyApi.authorizationCodeGrant(code); 29 | 30 | res.json({ access_token, refresh_token, expires_in }); 31 | } catch (err) { 32 | console.log(err); 33 | res.sendStatus(400); 34 | } 35 | }); 36 | 37 | app.post('/refresh', async (req, res) => { 38 | const { refreshToken } = req.body; 39 | const spotifyApi = new SpotifyWebApi({ 40 | redirectUri: process.env.REDIRECT_URI, 41 | clientId: process.env.CLIENT_ID, 42 | clientSecret: process.env.CLIENT_SECRET, 43 | refreshToken, 44 | }); 45 | 46 | try { 47 | const { 48 | body: { access_token, expires_in }, 49 | } = await spotifyApi.refreshAccessToken(); 50 | res.json({ access_token, expires_in }); 51 | } catch (err) { 52 | console.log(err); 53 | res.sendStatus(400); 54 | } 55 | }); 56 | 57 | app.get('/lyrics', async (req, res) => { 58 | const { artist, track } = req.query; 59 | const lyrics = (await lyricsFinder(artist, track)) || 'No Lyrics Found'; 60 | res.json({ lyrics }); 61 | }); 62 | 63 | app.listen(PORT, (err) => { 64 | if (err) console.log(err); 65 | console.log('listening on port', PORT); 66 | }); 67 | -------------------------------------------------------------------------------- /server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "server", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cors": "^2.8.5", 13 | "dotenv": "^10.0.0", 14 | "express": "^4.17.1", 15 | "lyrics-finder": "^21.7.0", 16 | "spotify-web-api-node": "^5.0.2" 17 | } 18 | }, 19 | "node_modules/accepts": { 20 | "version": "1.3.7", 21 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 22 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 23 | "dependencies": { 24 | "mime-types": "~2.1.24", 25 | "negotiator": "0.6.2" 26 | }, 27 | "engines": { 28 | "node": ">= 0.6" 29 | } 30 | }, 31 | "node_modules/array-flatten": { 32 | "version": "1.1.1", 33 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 34 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 35 | }, 36 | "node_modules/asynckit": { 37 | "version": "0.4.0", 38 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 39 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 40 | }, 41 | "node_modules/body-parser": { 42 | "version": "1.19.0", 43 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 44 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 45 | "dependencies": { 46 | "bytes": "3.1.0", 47 | "content-type": "~1.0.4", 48 | "debug": "2.6.9", 49 | "depd": "~1.1.2", 50 | "http-errors": "1.7.2", 51 | "iconv-lite": "0.4.24", 52 | "on-finished": "~2.3.0", 53 | "qs": "6.7.0", 54 | "raw-body": "2.4.0", 55 | "type-is": "~1.6.17" 56 | }, 57 | "engines": { 58 | "node": ">= 0.8" 59 | } 60 | }, 61 | "node_modules/bytes": { 62 | "version": "3.1.0", 63 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 64 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", 65 | "engines": { 66 | "node": ">= 0.8" 67 | } 68 | }, 69 | "node_modules/call-bind": { 70 | "version": "1.0.2", 71 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 72 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 73 | "dependencies": { 74 | "function-bind": "^1.1.1", 75 | "get-intrinsic": "^1.0.2" 76 | }, 77 | "funding": { 78 | "url": "https://github.com/sponsors/ljharb" 79 | } 80 | }, 81 | "node_modules/combined-stream": { 82 | "version": "1.0.8", 83 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 84 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 85 | "dependencies": { 86 | "delayed-stream": "~1.0.0" 87 | }, 88 | "engines": { 89 | "node": ">= 0.8" 90 | } 91 | }, 92 | "node_modules/component-emitter": { 93 | "version": "1.3.0", 94 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 95 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 96 | }, 97 | "node_modules/content-disposition": { 98 | "version": "0.5.3", 99 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 100 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 101 | "dependencies": { 102 | "safe-buffer": "5.1.2" 103 | }, 104 | "engines": { 105 | "node": ">= 0.6" 106 | } 107 | }, 108 | "node_modules/content-type": { 109 | "version": "1.0.4", 110 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 111 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 112 | "engines": { 113 | "node": ">= 0.6" 114 | } 115 | }, 116 | "node_modules/cookie": { 117 | "version": "0.4.0", 118 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 119 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", 120 | "engines": { 121 | "node": ">= 0.6" 122 | } 123 | }, 124 | "node_modules/cookie-signature": { 125 | "version": "1.0.6", 126 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 127 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 128 | }, 129 | "node_modules/cookiejar": { 130 | "version": "2.1.3", 131 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", 132 | "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" 133 | }, 134 | "node_modules/cors": { 135 | "version": "2.8.5", 136 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 137 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 138 | "dependencies": { 139 | "object-assign": "^4", 140 | "vary": "^1" 141 | }, 142 | "engines": { 143 | "node": ">= 0.10" 144 | } 145 | }, 146 | "node_modules/debug": { 147 | "version": "2.6.9", 148 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 149 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 150 | "dependencies": { 151 | "ms": "2.0.0" 152 | } 153 | }, 154 | "node_modules/delayed-stream": { 155 | "version": "1.0.0", 156 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 157 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 158 | "engines": { 159 | "node": ">=0.4.0" 160 | } 161 | }, 162 | "node_modules/depd": { 163 | "version": "1.1.2", 164 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 165 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 166 | "engines": { 167 | "node": ">= 0.6" 168 | } 169 | }, 170 | "node_modules/destroy": { 171 | "version": "1.0.4", 172 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 173 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 174 | }, 175 | "node_modules/dom-serializer": { 176 | "version": "0.2.2", 177 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", 178 | "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", 179 | "dependencies": { 180 | "domelementtype": "^2.0.1", 181 | "entities": "^2.0.0" 182 | } 183 | }, 184 | "node_modules/dom-serializer/node_modules/domelementtype": { 185 | "version": "2.2.0", 186 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", 187 | "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", 188 | "funding": [ 189 | { 190 | "type": "github", 191 | "url": "https://github.com/sponsors/fb55" 192 | } 193 | ] 194 | }, 195 | "node_modules/dom-serializer/node_modules/entities": { 196 | "version": "2.2.0", 197 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 198 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", 199 | "funding": { 200 | "url": "https://github.com/fb55/entities?sponsor=1" 201 | } 202 | }, 203 | "node_modules/domelementtype": { 204 | "version": "1.3.1", 205 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", 206 | "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" 207 | }, 208 | "node_modules/domhandler": { 209 | "version": "2.4.2", 210 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", 211 | "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", 212 | "dependencies": { 213 | "domelementtype": "1" 214 | } 215 | }, 216 | "node_modules/domutils": { 217 | "version": "1.7.0", 218 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", 219 | "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", 220 | "dependencies": { 221 | "dom-serializer": "0", 222 | "domelementtype": "1" 223 | } 224 | }, 225 | "node_modules/dotenv": { 226 | "version": "10.0.0", 227 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", 228 | "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", 229 | "engines": { 230 | "node": ">=10" 231 | } 232 | }, 233 | "node_modules/ee-first": { 234 | "version": "1.1.1", 235 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 236 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 237 | }, 238 | "node_modules/encodeurl": { 239 | "version": "1.0.2", 240 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 241 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 242 | "engines": { 243 | "node": ">= 0.8" 244 | } 245 | }, 246 | "node_modules/encoding": { 247 | "version": "0.1.13", 248 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 249 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 250 | "dependencies": { 251 | "iconv-lite": "^0.6.2" 252 | } 253 | }, 254 | "node_modules/encoding/node_modules/iconv-lite": { 255 | "version": "0.6.3", 256 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 257 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 258 | "dependencies": { 259 | "safer-buffer": ">= 2.1.2 < 3.0.0" 260 | }, 261 | "engines": { 262 | "node": ">=0.10.0" 263 | } 264 | }, 265 | "node_modules/entities": { 266 | "version": "1.1.2", 267 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", 268 | "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" 269 | }, 270 | "node_modules/escape-html": { 271 | "version": "1.0.3", 272 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 273 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 274 | }, 275 | "node_modules/etag": { 276 | "version": "1.8.1", 277 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 278 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 279 | "engines": { 280 | "node": ">= 0.6" 281 | } 282 | }, 283 | "node_modules/express": { 284 | "version": "4.17.1", 285 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 286 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 287 | "dependencies": { 288 | "accepts": "~1.3.7", 289 | "array-flatten": "1.1.1", 290 | "body-parser": "1.19.0", 291 | "content-disposition": "0.5.3", 292 | "content-type": "~1.0.4", 293 | "cookie": "0.4.0", 294 | "cookie-signature": "1.0.6", 295 | "debug": "2.6.9", 296 | "depd": "~1.1.2", 297 | "encodeurl": "~1.0.2", 298 | "escape-html": "~1.0.3", 299 | "etag": "~1.8.1", 300 | "finalhandler": "~1.1.2", 301 | "fresh": "0.5.2", 302 | "merge-descriptors": "1.0.1", 303 | "methods": "~1.1.2", 304 | "on-finished": "~2.3.0", 305 | "parseurl": "~1.3.3", 306 | "path-to-regexp": "0.1.7", 307 | "proxy-addr": "~2.0.5", 308 | "qs": "6.7.0", 309 | "range-parser": "~1.2.1", 310 | "safe-buffer": "5.1.2", 311 | "send": "0.17.1", 312 | "serve-static": "1.14.1", 313 | "setprototypeof": "1.1.1", 314 | "statuses": "~1.5.0", 315 | "type-is": "~1.6.18", 316 | "utils-merge": "1.0.1", 317 | "vary": "~1.1.2" 318 | }, 319 | "engines": { 320 | "node": ">= 0.10.0" 321 | } 322 | }, 323 | "node_modules/fast-safe-stringify": { 324 | "version": "2.1.1", 325 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", 326 | "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" 327 | }, 328 | "node_modules/finalhandler": { 329 | "version": "1.1.2", 330 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 331 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 332 | "dependencies": { 333 | "debug": "2.6.9", 334 | "encodeurl": "~1.0.2", 335 | "escape-html": "~1.0.3", 336 | "on-finished": "~2.3.0", 337 | "parseurl": "~1.3.3", 338 | "statuses": "~1.5.0", 339 | "unpipe": "~1.0.0" 340 | }, 341 | "engines": { 342 | "node": ">= 0.8" 343 | } 344 | }, 345 | "node_modules/form-data": { 346 | "version": "3.0.1", 347 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 348 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 349 | "dependencies": { 350 | "asynckit": "^0.4.0", 351 | "combined-stream": "^1.0.8", 352 | "mime-types": "^2.1.12" 353 | }, 354 | "engines": { 355 | "node": ">= 6" 356 | } 357 | }, 358 | "node_modules/formidable": { 359 | "version": "1.2.2", 360 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", 361 | "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", 362 | "funding": { 363 | "url": "https://ko-fi.com/tunnckoCore/commissions" 364 | } 365 | }, 366 | "node_modules/forwarded": { 367 | "version": "0.2.0", 368 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 369 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 370 | "engines": { 371 | "node": ">= 0.6" 372 | } 373 | }, 374 | "node_modules/fresh": { 375 | "version": "0.5.2", 376 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 377 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 378 | "engines": { 379 | "node": ">= 0.6" 380 | } 381 | }, 382 | "node_modules/function-bind": { 383 | "version": "1.1.1", 384 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 385 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 386 | }, 387 | "node_modules/get-intrinsic": { 388 | "version": "1.1.1", 389 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 390 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 391 | "dependencies": { 392 | "function-bind": "^1.1.1", 393 | "has": "^1.0.3", 394 | "has-symbols": "^1.0.1" 395 | }, 396 | "funding": { 397 | "url": "https://github.com/sponsors/ljharb" 398 | } 399 | }, 400 | "node_modules/has": { 401 | "version": "1.0.3", 402 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 403 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 404 | "dependencies": { 405 | "function-bind": "^1.1.1" 406 | }, 407 | "engines": { 408 | "node": ">= 0.4.0" 409 | } 410 | }, 411 | "node_modules/has-symbols": { 412 | "version": "1.0.2", 413 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 414 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", 415 | "engines": { 416 | "node": ">= 0.4" 417 | }, 418 | "funding": { 419 | "url": "https://github.com/sponsors/ljharb" 420 | } 421 | }, 422 | "node_modules/he": { 423 | "version": "1.2.0", 424 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 425 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 426 | "bin": { 427 | "he": "bin/he" 428 | } 429 | }, 430 | "node_modules/html-to-text": { 431 | "version": "5.1.1", 432 | "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", 433 | "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", 434 | "dependencies": { 435 | "he": "^1.2.0", 436 | "htmlparser2": "^3.10.1", 437 | "lodash": "^4.17.11", 438 | "minimist": "^1.2.0" 439 | }, 440 | "bin": { 441 | "html-to-text": "bin/cli.js" 442 | }, 443 | "engines": { 444 | "node": ">= 4.0.0" 445 | } 446 | }, 447 | "node_modules/htmlparser2": { 448 | "version": "3.10.1", 449 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", 450 | "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", 451 | "dependencies": { 452 | "domelementtype": "^1.3.1", 453 | "domhandler": "^2.3.0", 454 | "domutils": "^1.5.1", 455 | "entities": "^1.1.1", 456 | "inherits": "^2.0.1", 457 | "readable-stream": "^3.1.1" 458 | } 459 | }, 460 | "node_modules/http-errors": { 461 | "version": "1.7.2", 462 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 463 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 464 | "dependencies": { 465 | "depd": "~1.1.2", 466 | "inherits": "2.0.3", 467 | "setprototypeof": "1.1.1", 468 | "statuses": ">= 1.5.0 < 2", 469 | "toidentifier": "1.0.0" 470 | }, 471 | "engines": { 472 | "node": ">= 0.6" 473 | } 474 | }, 475 | "node_modules/iconv-lite": { 476 | "version": "0.4.24", 477 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 478 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 479 | "dependencies": { 480 | "safer-buffer": ">= 2.1.2 < 3" 481 | }, 482 | "engines": { 483 | "node": ">=0.10.0" 484 | } 485 | }, 486 | "node_modules/inherits": { 487 | "version": "2.0.3", 488 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 489 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 490 | }, 491 | "node_modules/ipaddr.js": { 492 | "version": "1.9.1", 493 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 494 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 495 | "engines": { 496 | "node": ">= 0.10" 497 | } 498 | }, 499 | "node_modules/lodash": { 500 | "version": "4.17.21", 501 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 502 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 503 | }, 504 | "node_modules/lru-cache": { 505 | "version": "6.0.0", 506 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 507 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 508 | "dependencies": { 509 | "yallist": "^4.0.0" 510 | }, 511 | "engines": { 512 | "node": ">=10" 513 | } 514 | }, 515 | "node_modules/lyrics-finder": { 516 | "version": "21.7.0", 517 | "resolved": "https://registry.npmjs.org/lyrics-finder/-/lyrics-finder-21.7.0.tgz", 518 | "integrity": "sha512-AMaJ+MdbdemYOWM1Kxd/vzn23OD66/fdemaJWN9dU0qsxK6d09rODSphygAvaGka6mgfHaFlHN+ETHv/d60ftw==", 519 | "dependencies": { 520 | "encoding": "^0.1.13", 521 | "html-to-text": "^5.1.1", 522 | "node-fetch": "^2.6.0" 523 | }, 524 | "bin": { 525 | "lyrics-finder": "src/bin.js" 526 | } 527 | }, 528 | "node_modules/media-typer": { 529 | "version": "0.3.0", 530 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 531 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 532 | "engines": { 533 | "node": ">= 0.6" 534 | } 535 | }, 536 | "node_modules/merge-descriptors": { 537 | "version": "1.0.1", 538 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 539 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 540 | }, 541 | "node_modules/methods": { 542 | "version": "1.1.2", 543 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 544 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 545 | "engines": { 546 | "node": ">= 0.6" 547 | } 548 | }, 549 | "node_modules/mime": { 550 | "version": "1.6.0", 551 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 552 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 553 | "bin": { 554 | "mime": "cli.js" 555 | }, 556 | "engines": { 557 | "node": ">=4" 558 | } 559 | }, 560 | "node_modules/mime-db": { 561 | "version": "1.50.0", 562 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", 563 | "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", 564 | "engines": { 565 | "node": ">= 0.6" 566 | } 567 | }, 568 | "node_modules/mime-types": { 569 | "version": "2.1.33", 570 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", 571 | "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", 572 | "dependencies": { 573 | "mime-db": "1.50.0" 574 | }, 575 | "engines": { 576 | "node": ">= 0.6" 577 | } 578 | }, 579 | "node_modules/minimist": { 580 | "version": "1.2.5", 581 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 582 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 583 | }, 584 | "node_modules/ms": { 585 | "version": "2.0.0", 586 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 587 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 588 | }, 589 | "node_modules/negotiator": { 590 | "version": "0.6.2", 591 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 592 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", 593 | "engines": { 594 | "node": ">= 0.6" 595 | } 596 | }, 597 | "node_modules/node-fetch": { 598 | "version": "2.6.5", 599 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", 600 | "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", 601 | "dependencies": { 602 | "whatwg-url": "^5.0.0" 603 | }, 604 | "engines": { 605 | "node": "4.x || >=6.0.0" 606 | } 607 | }, 608 | "node_modules/object-assign": { 609 | "version": "4.1.1", 610 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 611 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 612 | "engines": { 613 | "node": ">=0.10.0" 614 | } 615 | }, 616 | "node_modules/object-inspect": { 617 | "version": "1.11.0", 618 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", 619 | "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", 620 | "funding": { 621 | "url": "https://github.com/sponsors/ljharb" 622 | } 623 | }, 624 | "node_modules/on-finished": { 625 | "version": "2.3.0", 626 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 627 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 628 | "dependencies": { 629 | "ee-first": "1.1.1" 630 | }, 631 | "engines": { 632 | "node": ">= 0.8" 633 | } 634 | }, 635 | "node_modules/parseurl": { 636 | "version": "1.3.3", 637 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 638 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 639 | "engines": { 640 | "node": ">= 0.8" 641 | } 642 | }, 643 | "node_modules/path-to-regexp": { 644 | "version": "0.1.7", 645 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 646 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 647 | }, 648 | "node_modules/proxy-addr": { 649 | "version": "2.0.7", 650 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 651 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 652 | "dependencies": { 653 | "forwarded": "0.2.0", 654 | "ipaddr.js": "1.9.1" 655 | }, 656 | "engines": { 657 | "node": ">= 0.10" 658 | } 659 | }, 660 | "node_modules/qs": { 661 | "version": "6.7.0", 662 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 663 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", 664 | "engines": { 665 | "node": ">=0.6" 666 | } 667 | }, 668 | "node_modules/range-parser": { 669 | "version": "1.2.1", 670 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 671 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 672 | "engines": { 673 | "node": ">= 0.6" 674 | } 675 | }, 676 | "node_modules/raw-body": { 677 | "version": "2.4.0", 678 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 679 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 680 | "dependencies": { 681 | "bytes": "3.1.0", 682 | "http-errors": "1.7.2", 683 | "iconv-lite": "0.4.24", 684 | "unpipe": "1.0.0" 685 | }, 686 | "engines": { 687 | "node": ">= 0.8" 688 | } 689 | }, 690 | "node_modules/readable-stream": { 691 | "version": "3.6.0", 692 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 693 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 694 | "dependencies": { 695 | "inherits": "^2.0.3", 696 | "string_decoder": "^1.1.1", 697 | "util-deprecate": "^1.0.1" 698 | }, 699 | "engines": { 700 | "node": ">= 6" 701 | } 702 | }, 703 | "node_modules/safe-buffer": { 704 | "version": "5.1.2", 705 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 706 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 707 | }, 708 | "node_modules/safer-buffer": { 709 | "version": "2.1.2", 710 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 711 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 712 | }, 713 | "node_modules/semver": { 714 | "version": "7.3.5", 715 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 716 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 717 | "dependencies": { 718 | "lru-cache": "^6.0.0" 719 | }, 720 | "bin": { 721 | "semver": "bin/semver.js" 722 | }, 723 | "engines": { 724 | "node": ">=10" 725 | } 726 | }, 727 | "node_modules/send": { 728 | "version": "0.17.1", 729 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 730 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 731 | "dependencies": { 732 | "debug": "2.6.9", 733 | "depd": "~1.1.2", 734 | "destroy": "~1.0.4", 735 | "encodeurl": "~1.0.2", 736 | "escape-html": "~1.0.3", 737 | "etag": "~1.8.1", 738 | "fresh": "0.5.2", 739 | "http-errors": "~1.7.2", 740 | "mime": "1.6.0", 741 | "ms": "2.1.1", 742 | "on-finished": "~2.3.0", 743 | "range-parser": "~1.2.1", 744 | "statuses": "~1.5.0" 745 | }, 746 | "engines": { 747 | "node": ">= 0.8.0" 748 | } 749 | }, 750 | "node_modules/send/node_modules/ms": { 751 | "version": "2.1.1", 752 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 753 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 754 | }, 755 | "node_modules/serve-static": { 756 | "version": "1.14.1", 757 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 758 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 759 | "dependencies": { 760 | "encodeurl": "~1.0.2", 761 | "escape-html": "~1.0.3", 762 | "parseurl": "~1.3.3", 763 | "send": "0.17.1" 764 | }, 765 | "engines": { 766 | "node": ">= 0.8.0" 767 | } 768 | }, 769 | "node_modules/setprototypeof": { 770 | "version": "1.1.1", 771 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 772 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 773 | }, 774 | "node_modules/side-channel": { 775 | "version": "1.0.4", 776 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 777 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 778 | "dependencies": { 779 | "call-bind": "^1.0.0", 780 | "get-intrinsic": "^1.0.2", 781 | "object-inspect": "^1.9.0" 782 | }, 783 | "funding": { 784 | "url": "https://github.com/sponsors/ljharb" 785 | } 786 | }, 787 | "node_modules/spotify-web-api-node": { 788 | "version": "5.0.2", 789 | "resolved": "https://registry.npmjs.org/spotify-web-api-node/-/spotify-web-api-node-5.0.2.tgz", 790 | "integrity": "sha512-r82dRWU9PMimHvHEzL0DwEJrzFk+SMCVfq249SLt3I7EFez7R+jeoKQd+M1//QcnjqlXPs2am4DFsGk8/GCsrA==", 791 | "dependencies": { 792 | "superagent": "^6.1.0" 793 | } 794 | }, 795 | "node_modules/statuses": { 796 | "version": "1.5.0", 797 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 798 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 799 | "engines": { 800 | "node": ">= 0.6" 801 | } 802 | }, 803 | "node_modules/string_decoder": { 804 | "version": "1.3.0", 805 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 806 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 807 | "dependencies": { 808 | "safe-buffer": "~5.2.0" 809 | } 810 | }, 811 | "node_modules/string_decoder/node_modules/safe-buffer": { 812 | "version": "5.2.1", 813 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 814 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 815 | "funding": [ 816 | { 817 | "type": "github", 818 | "url": "https://github.com/sponsors/feross" 819 | }, 820 | { 821 | "type": "patreon", 822 | "url": "https://www.patreon.com/feross" 823 | }, 824 | { 825 | "type": "consulting", 826 | "url": "https://feross.org/support" 827 | } 828 | ] 829 | }, 830 | "node_modules/superagent": { 831 | "version": "6.1.0", 832 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", 833 | "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", 834 | "dependencies": { 835 | "component-emitter": "^1.3.0", 836 | "cookiejar": "^2.1.2", 837 | "debug": "^4.1.1", 838 | "fast-safe-stringify": "^2.0.7", 839 | "form-data": "^3.0.0", 840 | "formidable": "^1.2.2", 841 | "methods": "^1.1.2", 842 | "mime": "^2.4.6", 843 | "qs": "^6.9.4", 844 | "readable-stream": "^3.6.0", 845 | "semver": "^7.3.2" 846 | }, 847 | "engines": { 848 | "node": ">= 7.0.0" 849 | } 850 | }, 851 | "node_modules/superagent/node_modules/debug": { 852 | "version": "4.3.2", 853 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 854 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 855 | "dependencies": { 856 | "ms": "2.1.2" 857 | }, 858 | "engines": { 859 | "node": ">=6.0" 860 | }, 861 | "peerDependenciesMeta": { 862 | "supports-color": { 863 | "optional": true 864 | } 865 | } 866 | }, 867 | "node_modules/superagent/node_modules/mime": { 868 | "version": "2.5.2", 869 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", 870 | "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", 871 | "bin": { 872 | "mime": "cli.js" 873 | }, 874 | "engines": { 875 | "node": ">=4.0.0" 876 | } 877 | }, 878 | "node_modules/superagent/node_modules/ms": { 879 | "version": "2.1.2", 880 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 881 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 882 | }, 883 | "node_modules/superagent/node_modules/qs": { 884 | "version": "6.10.1", 885 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", 886 | "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", 887 | "dependencies": { 888 | "side-channel": "^1.0.4" 889 | }, 890 | "engines": { 891 | "node": ">=0.6" 892 | }, 893 | "funding": { 894 | "url": "https://github.com/sponsors/ljharb" 895 | } 896 | }, 897 | "node_modules/toidentifier": { 898 | "version": "1.0.0", 899 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 900 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", 901 | "engines": { 902 | "node": ">=0.6" 903 | } 904 | }, 905 | "node_modules/tr46": { 906 | "version": "0.0.3", 907 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 908 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 909 | }, 910 | "node_modules/type-is": { 911 | "version": "1.6.18", 912 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 913 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 914 | "dependencies": { 915 | "media-typer": "0.3.0", 916 | "mime-types": "~2.1.24" 917 | }, 918 | "engines": { 919 | "node": ">= 0.6" 920 | } 921 | }, 922 | "node_modules/unpipe": { 923 | "version": "1.0.0", 924 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 925 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 926 | "engines": { 927 | "node": ">= 0.8" 928 | } 929 | }, 930 | "node_modules/util-deprecate": { 931 | "version": "1.0.2", 932 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 933 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 934 | }, 935 | "node_modules/utils-merge": { 936 | "version": "1.0.1", 937 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 938 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 939 | "engines": { 940 | "node": ">= 0.4.0" 941 | } 942 | }, 943 | "node_modules/vary": { 944 | "version": "1.1.2", 945 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 946 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 947 | "engines": { 948 | "node": ">= 0.8" 949 | } 950 | }, 951 | "node_modules/webidl-conversions": { 952 | "version": "3.0.1", 953 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 954 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 955 | }, 956 | "node_modules/whatwg-url": { 957 | "version": "5.0.0", 958 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 959 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 960 | "dependencies": { 961 | "tr46": "~0.0.3", 962 | "webidl-conversions": "^3.0.0" 963 | } 964 | }, 965 | "node_modules/yallist": { 966 | "version": "4.0.0", 967 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 968 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 969 | } 970 | }, 971 | "dependencies": { 972 | "accepts": { 973 | "version": "1.3.7", 974 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 975 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 976 | "requires": { 977 | "mime-types": "~2.1.24", 978 | "negotiator": "0.6.2" 979 | } 980 | }, 981 | "array-flatten": { 982 | "version": "1.1.1", 983 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 984 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 985 | }, 986 | "asynckit": { 987 | "version": "0.4.0", 988 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 989 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 990 | }, 991 | "body-parser": { 992 | "version": "1.19.0", 993 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 994 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 995 | "requires": { 996 | "bytes": "3.1.0", 997 | "content-type": "~1.0.4", 998 | "debug": "2.6.9", 999 | "depd": "~1.1.2", 1000 | "http-errors": "1.7.2", 1001 | "iconv-lite": "0.4.24", 1002 | "on-finished": "~2.3.0", 1003 | "qs": "6.7.0", 1004 | "raw-body": "2.4.0", 1005 | "type-is": "~1.6.17" 1006 | } 1007 | }, 1008 | "bytes": { 1009 | "version": "3.1.0", 1010 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 1011 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 1012 | }, 1013 | "call-bind": { 1014 | "version": "1.0.2", 1015 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1016 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1017 | "requires": { 1018 | "function-bind": "^1.1.1", 1019 | "get-intrinsic": "^1.0.2" 1020 | } 1021 | }, 1022 | "combined-stream": { 1023 | "version": "1.0.8", 1024 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 1025 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 1026 | "requires": { 1027 | "delayed-stream": "~1.0.0" 1028 | } 1029 | }, 1030 | "component-emitter": { 1031 | "version": "1.3.0", 1032 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 1033 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 1034 | }, 1035 | "content-disposition": { 1036 | "version": "0.5.3", 1037 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 1038 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 1039 | "requires": { 1040 | "safe-buffer": "5.1.2" 1041 | } 1042 | }, 1043 | "content-type": { 1044 | "version": "1.0.4", 1045 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 1046 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 1047 | }, 1048 | "cookie": { 1049 | "version": "0.4.0", 1050 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 1051 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 1052 | }, 1053 | "cookie-signature": { 1054 | "version": "1.0.6", 1055 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 1056 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 1057 | }, 1058 | "cookiejar": { 1059 | "version": "2.1.3", 1060 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", 1061 | "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" 1062 | }, 1063 | "cors": { 1064 | "version": "2.8.5", 1065 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 1066 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 1067 | "requires": { 1068 | "object-assign": "^4", 1069 | "vary": "^1" 1070 | } 1071 | }, 1072 | "debug": { 1073 | "version": "2.6.9", 1074 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1075 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1076 | "requires": { 1077 | "ms": "2.0.0" 1078 | } 1079 | }, 1080 | "delayed-stream": { 1081 | "version": "1.0.0", 1082 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1083 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 1084 | }, 1085 | "depd": { 1086 | "version": "1.1.2", 1087 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1088 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 1089 | }, 1090 | "destroy": { 1091 | "version": "1.0.4", 1092 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 1093 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 1094 | }, 1095 | "dom-serializer": { 1096 | "version": "0.2.2", 1097 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", 1098 | "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", 1099 | "requires": { 1100 | "domelementtype": "^2.0.1", 1101 | "entities": "^2.0.0" 1102 | }, 1103 | "dependencies": { 1104 | "domelementtype": { 1105 | "version": "2.2.0", 1106 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", 1107 | "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" 1108 | }, 1109 | "entities": { 1110 | "version": "2.2.0", 1111 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 1112 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" 1113 | } 1114 | } 1115 | }, 1116 | "domelementtype": { 1117 | "version": "1.3.1", 1118 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", 1119 | "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" 1120 | }, 1121 | "domhandler": { 1122 | "version": "2.4.2", 1123 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", 1124 | "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", 1125 | "requires": { 1126 | "domelementtype": "1" 1127 | } 1128 | }, 1129 | "domutils": { 1130 | "version": "1.7.0", 1131 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", 1132 | "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", 1133 | "requires": { 1134 | "dom-serializer": "0", 1135 | "domelementtype": "1" 1136 | } 1137 | }, 1138 | "dotenv": { 1139 | "version": "10.0.0", 1140 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", 1141 | "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" 1142 | }, 1143 | "ee-first": { 1144 | "version": "1.1.1", 1145 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1146 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 1147 | }, 1148 | "encodeurl": { 1149 | "version": "1.0.2", 1150 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1151 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 1152 | }, 1153 | "encoding": { 1154 | "version": "0.1.13", 1155 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 1156 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 1157 | "requires": { 1158 | "iconv-lite": "^0.6.2" 1159 | }, 1160 | "dependencies": { 1161 | "iconv-lite": { 1162 | "version": "0.6.3", 1163 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1164 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1165 | "requires": { 1166 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1167 | } 1168 | } 1169 | } 1170 | }, 1171 | "entities": { 1172 | "version": "1.1.2", 1173 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", 1174 | "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" 1175 | }, 1176 | "escape-html": { 1177 | "version": "1.0.3", 1178 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1179 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 1180 | }, 1181 | "etag": { 1182 | "version": "1.8.1", 1183 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1184 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 1185 | }, 1186 | "express": { 1187 | "version": "4.17.1", 1188 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 1189 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 1190 | "requires": { 1191 | "accepts": "~1.3.7", 1192 | "array-flatten": "1.1.1", 1193 | "body-parser": "1.19.0", 1194 | "content-disposition": "0.5.3", 1195 | "content-type": "~1.0.4", 1196 | "cookie": "0.4.0", 1197 | "cookie-signature": "1.0.6", 1198 | "debug": "2.6.9", 1199 | "depd": "~1.1.2", 1200 | "encodeurl": "~1.0.2", 1201 | "escape-html": "~1.0.3", 1202 | "etag": "~1.8.1", 1203 | "finalhandler": "~1.1.2", 1204 | "fresh": "0.5.2", 1205 | "merge-descriptors": "1.0.1", 1206 | "methods": "~1.1.2", 1207 | "on-finished": "~2.3.0", 1208 | "parseurl": "~1.3.3", 1209 | "path-to-regexp": "0.1.7", 1210 | "proxy-addr": "~2.0.5", 1211 | "qs": "6.7.0", 1212 | "range-parser": "~1.2.1", 1213 | "safe-buffer": "5.1.2", 1214 | "send": "0.17.1", 1215 | "serve-static": "1.14.1", 1216 | "setprototypeof": "1.1.1", 1217 | "statuses": "~1.5.0", 1218 | "type-is": "~1.6.18", 1219 | "utils-merge": "1.0.1", 1220 | "vary": "~1.1.2" 1221 | } 1222 | }, 1223 | "fast-safe-stringify": { 1224 | "version": "2.1.1", 1225 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", 1226 | "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" 1227 | }, 1228 | "finalhandler": { 1229 | "version": "1.1.2", 1230 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 1231 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 1232 | "requires": { 1233 | "debug": "2.6.9", 1234 | "encodeurl": "~1.0.2", 1235 | "escape-html": "~1.0.3", 1236 | "on-finished": "~2.3.0", 1237 | "parseurl": "~1.3.3", 1238 | "statuses": "~1.5.0", 1239 | "unpipe": "~1.0.0" 1240 | } 1241 | }, 1242 | "form-data": { 1243 | "version": "3.0.1", 1244 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 1245 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 1246 | "requires": { 1247 | "asynckit": "^0.4.0", 1248 | "combined-stream": "^1.0.8", 1249 | "mime-types": "^2.1.12" 1250 | } 1251 | }, 1252 | "formidable": { 1253 | "version": "1.2.2", 1254 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", 1255 | "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" 1256 | }, 1257 | "forwarded": { 1258 | "version": "0.2.0", 1259 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1260 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 1261 | }, 1262 | "fresh": { 1263 | "version": "0.5.2", 1264 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1265 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1266 | }, 1267 | "function-bind": { 1268 | "version": "1.1.1", 1269 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1270 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1271 | }, 1272 | "get-intrinsic": { 1273 | "version": "1.1.1", 1274 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 1275 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 1276 | "requires": { 1277 | "function-bind": "^1.1.1", 1278 | "has": "^1.0.3", 1279 | "has-symbols": "^1.0.1" 1280 | } 1281 | }, 1282 | "has": { 1283 | "version": "1.0.3", 1284 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1285 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1286 | "requires": { 1287 | "function-bind": "^1.1.1" 1288 | } 1289 | }, 1290 | "has-symbols": { 1291 | "version": "1.0.2", 1292 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 1293 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" 1294 | }, 1295 | "he": { 1296 | "version": "1.2.0", 1297 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1298 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" 1299 | }, 1300 | "html-to-text": { 1301 | "version": "5.1.1", 1302 | "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", 1303 | "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", 1304 | "requires": { 1305 | "he": "^1.2.0", 1306 | "htmlparser2": "^3.10.1", 1307 | "lodash": "^4.17.11", 1308 | "minimist": "^1.2.0" 1309 | } 1310 | }, 1311 | "htmlparser2": { 1312 | "version": "3.10.1", 1313 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", 1314 | "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", 1315 | "requires": { 1316 | "domelementtype": "^1.3.1", 1317 | "domhandler": "^2.3.0", 1318 | "domutils": "^1.5.1", 1319 | "entities": "^1.1.1", 1320 | "inherits": "^2.0.1", 1321 | "readable-stream": "^3.1.1" 1322 | } 1323 | }, 1324 | "http-errors": { 1325 | "version": "1.7.2", 1326 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 1327 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 1328 | "requires": { 1329 | "depd": "~1.1.2", 1330 | "inherits": "2.0.3", 1331 | "setprototypeof": "1.1.1", 1332 | "statuses": ">= 1.5.0 < 2", 1333 | "toidentifier": "1.0.0" 1334 | } 1335 | }, 1336 | "iconv-lite": { 1337 | "version": "0.4.24", 1338 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1339 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1340 | "requires": { 1341 | "safer-buffer": ">= 2.1.2 < 3" 1342 | } 1343 | }, 1344 | "inherits": { 1345 | "version": "2.0.3", 1346 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1347 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1348 | }, 1349 | "ipaddr.js": { 1350 | "version": "1.9.1", 1351 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1352 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1353 | }, 1354 | "lodash": { 1355 | "version": "4.17.21", 1356 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1357 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1358 | }, 1359 | "lru-cache": { 1360 | "version": "6.0.0", 1361 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1362 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1363 | "requires": { 1364 | "yallist": "^4.0.0" 1365 | } 1366 | }, 1367 | "lyrics-finder": { 1368 | "version": "21.7.0", 1369 | "resolved": "https://registry.npmjs.org/lyrics-finder/-/lyrics-finder-21.7.0.tgz", 1370 | "integrity": "sha512-AMaJ+MdbdemYOWM1Kxd/vzn23OD66/fdemaJWN9dU0qsxK6d09rODSphygAvaGka6mgfHaFlHN+ETHv/d60ftw==", 1371 | "requires": { 1372 | "encoding": "^0.1.13", 1373 | "html-to-text": "^5.1.1", 1374 | "node-fetch": "^2.6.0" 1375 | } 1376 | }, 1377 | "media-typer": { 1378 | "version": "0.3.0", 1379 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1380 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1381 | }, 1382 | "merge-descriptors": { 1383 | "version": "1.0.1", 1384 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1385 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1386 | }, 1387 | "methods": { 1388 | "version": "1.1.2", 1389 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1390 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1391 | }, 1392 | "mime": { 1393 | "version": "1.6.0", 1394 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1395 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1396 | }, 1397 | "mime-db": { 1398 | "version": "1.50.0", 1399 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", 1400 | "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" 1401 | }, 1402 | "mime-types": { 1403 | "version": "2.1.33", 1404 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", 1405 | "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", 1406 | "requires": { 1407 | "mime-db": "1.50.0" 1408 | } 1409 | }, 1410 | "minimist": { 1411 | "version": "1.2.5", 1412 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1413 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1414 | }, 1415 | "ms": { 1416 | "version": "2.0.0", 1417 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1418 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1419 | }, 1420 | "negotiator": { 1421 | "version": "0.6.2", 1422 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1423 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1424 | }, 1425 | "node-fetch": { 1426 | "version": "2.6.5", 1427 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", 1428 | "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", 1429 | "requires": { 1430 | "whatwg-url": "^5.0.0" 1431 | } 1432 | }, 1433 | "object-assign": { 1434 | "version": "4.1.1", 1435 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1436 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1437 | }, 1438 | "object-inspect": { 1439 | "version": "1.11.0", 1440 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", 1441 | "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" 1442 | }, 1443 | "on-finished": { 1444 | "version": "2.3.0", 1445 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1446 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1447 | "requires": { 1448 | "ee-first": "1.1.1" 1449 | } 1450 | }, 1451 | "parseurl": { 1452 | "version": "1.3.3", 1453 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1454 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1455 | }, 1456 | "path-to-regexp": { 1457 | "version": "0.1.7", 1458 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1459 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1460 | }, 1461 | "proxy-addr": { 1462 | "version": "2.0.7", 1463 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1464 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1465 | "requires": { 1466 | "forwarded": "0.2.0", 1467 | "ipaddr.js": "1.9.1" 1468 | } 1469 | }, 1470 | "qs": { 1471 | "version": "6.7.0", 1472 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1473 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1474 | }, 1475 | "range-parser": { 1476 | "version": "1.2.1", 1477 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1478 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1479 | }, 1480 | "raw-body": { 1481 | "version": "2.4.0", 1482 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1483 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1484 | "requires": { 1485 | "bytes": "3.1.0", 1486 | "http-errors": "1.7.2", 1487 | "iconv-lite": "0.4.24", 1488 | "unpipe": "1.0.0" 1489 | } 1490 | }, 1491 | "readable-stream": { 1492 | "version": "3.6.0", 1493 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1494 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1495 | "requires": { 1496 | "inherits": "^2.0.3", 1497 | "string_decoder": "^1.1.1", 1498 | "util-deprecate": "^1.0.1" 1499 | } 1500 | }, 1501 | "safe-buffer": { 1502 | "version": "5.1.2", 1503 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1504 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1505 | }, 1506 | "safer-buffer": { 1507 | "version": "2.1.2", 1508 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1509 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1510 | }, 1511 | "semver": { 1512 | "version": "7.3.5", 1513 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 1514 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 1515 | "requires": { 1516 | "lru-cache": "^6.0.0" 1517 | } 1518 | }, 1519 | "send": { 1520 | "version": "0.17.1", 1521 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1522 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1523 | "requires": { 1524 | "debug": "2.6.9", 1525 | "depd": "~1.1.2", 1526 | "destroy": "~1.0.4", 1527 | "encodeurl": "~1.0.2", 1528 | "escape-html": "~1.0.3", 1529 | "etag": "~1.8.1", 1530 | "fresh": "0.5.2", 1531 | "http-errors": "~1.7.2", 1532 | "mime": "1.6.0", 1533 | "ms": "2.1.1", 1534 | "on-finished": "~2.3.0", 1535 | "range-parser": "~1.2.1", 1536 | "statuses": "~1.5.0" 1537 | }, 1538 | "dependencies": { 1539 | "ms": { 1540 | "version": "2.1.1", 1541 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1542 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1543 | } 1544 | } 1545 | }, 1546 | "serve-static": { 1547 | "version": "1.14.1", 1548 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1549 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1550 | "requires": { 1551 | "encodeurl": "~1.0.2", 1552 | "escape-html": "~1.0.3", 1553 | "parseurl": "~1.3.3", 1554 | "send": "0.17.1" 1555 | } 1556 | }, 1557 | "setprototypeof": { 1558 | "version": "1.1.1", 1559 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1560 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1561 | }, 1562 | "side-channel": { 1563 | "version": "1.0.4", 1564 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1565 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1566 | "requires": { 1567 | "call-bind": "^1.0.0", 1568 | "get-intrinsic": "^1.0.2", 1569 | "object-inspect": "^1.9.0" 1570 | } 1571 | }, 1572 | "spotify-web-api-node": { 1573 | "version": "5.0.2", 1574 | "resolved": "https://registry.npmjs.org/spotify-web-api-node/-/spotify-web-api-node-5.0.2.tgz", 1575 | "integrity": "sha512-r82dRWU9PMimHvHEzL0DwEJrzFk+SMCVfq249SLt3I7EFez7R+jeoKQd+M1//QcnjqlXPs2am4DFsGk8/GCsrA==", 1576 | "requires": { 1577 | "superagent": "^6.1.0" 1578 | } 1579 | }, 1580 | "statuses": { 1581 | "version": "1.5.0", 1582 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1583 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1584 | }, 1585 | "string_decoder": { 1586 | "version": "1.3.0", 1587 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1588 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1589 | "requires": { 1590 | "safe-buffer": "~5.2.0" 1591 | }, 1592 | "dependencies": { 1593 | "safe-buffer": { 1594 | "version": "5.2.1", 1595 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1596 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1597 | } 1598 | } 1599 | }, 1600 | "superagent": { 1601 | "version": "6.1.0", 1602 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", 1603 | "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", 1604 | "requires": { 1605 | "component-emitter": "^1.3.0", 1606 | "cookiejar": "^2.1.2", 1607 | "debug": "^4.1.1", 1608 | "fast-safe-stringify": "^2.0.7", 1609 | "form-data": "^3.0.0", 1610 | "formidable": "^1.2.2", 1611 | "methods": "^1.1.2", 1612 | "mime": "^2.4.6", 1613 | "qs": "^6.9.4", 1614 | "readable-stream": "^3.6.0", 1615 | "semver": "^7.3.2" 1616 | }, 1617 | "dependencies": { 1618 | "debug": { 1619 | "version": "4.3.2", 1620 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 1621 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 1622 | "requires": { 1623 | "ms": "2.1.2" 1624 | } 1625 | }, 1626 | "mime": { 1627 | "version": "2.5.2", 1628 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", 1629 | "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" 1630 | }, 1631 | "ms": { 1632 | "version": "2.1.2", 1633 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1634 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1635 | }, 1636 | "qs": { 1637 | "version": "6.10.1", 1638 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", 1639 | "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", 1640 | "requires": { 1641 | "side-channel": "^1.0.4" 1642 | } 1643 | } 1644 | } 1645 | }, 1646 | "toidentifier": { 1647 | "version": "1.0.0", 1648 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1649 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1650 | }, 1651 | "tr46": { 1652 | "version": "0.0.3", 1653 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1654 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 1655 | }, 1656 | "type-is": { 1657 | "version": "1.6.18", 1658 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1659 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1660 | "requires": { 1661 | "media-typer": "0.3.0", 1662 | "mime-types": "~2.1.24" 1663 | } 1664 | }, 1665 | "unpipe": { 1666 | "version": "1.0.0", 1667 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1668 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1669 | }, 1670 | "util-deprecate": { 1671 | "version": "1.0.2", 1672 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1673 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1674 | }, 1675 | "utils-merge": { 1676 | "version": "1.0.1", 1677 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1678 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1679 | }, 1680 | "vary": { 1681 | "version": "1.1.2", 1682 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1683 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1684 | }, 1685 | "webidl-conversions": { 1686 | "version": "3.0.1", 1687 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1688 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 1689 | }, 1690 | "whatwg-url": { 1691 | "version": "5.0.0", 1692 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1693 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 1694 | "requires": { 1695 | "tr46": "~0.0.3", 1696 | "webidl-conversions": "^3.0.0" 1697 | } 1698 | }, 1699 | "yallist": { 1700 | "version": "4.0.0", 1701 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1702 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1703 | } 1704 | } 1705 | } 1706 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "type": "module", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "cors": "^2.8.5", 15 | "dotenv": "^10.0.0", 16 | "express": "^4.17.1", 17 | "lyrics-finder": "^21.7.0", 18 | "spotify-web-api-node": "^5.0.2" 19 | } 20 | } 21 | --------------------------------------------------------------------------------