├── 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 |
--------------------------------------------------------------------------------