add mongodb; store refresh token
This commit is contained in:
		
							parent
							
								
									090a585a92
								
							
						
					
					
						commit
						933e6a85b2
					
				| @ -1,8 +1,7 @@ | ||||
| import spotifyApi from "spotify-api.js"; | ||||
| const { Client, Player } = spotifyApi; | ||||
| import { store } from "../store.mjs"; | ||||
| import { randomString } from "../lib/randomString.js"; | ||||
| import axios from "axios"; | ||||
| import { randomString } from "../lib/randomString.mjs"; | ||||
| import { UserStore } from "../db/schemas.mjs"; | ||||
| import { createLocalUser, findUserBySpotifyId } from "../lib/helpers.mjs"; | ||||
| 
 | ||||
| export const applyAuthRoutes = (router) => { | ||||
| 
 | ||||
| @ -14,44 +13,36 @@ export const applyAuthRoutes = (router) => { | ||||
|     } | ||||
|     const { code, state } = req.body; | ||||
|     try { | ||||
|       const params = new URLSearchParams(); | ||||
|       params.append('grant_type', 'authorization_code'); | ||||
|       params.append('code', code); | ||||
|       params.append('redirect_uri', store.redirectURL); | ||||
|       const newUser = await createLocalUser({ code }); | ||||
|       const user = await findUserBySpotifyId({ userId: newUser.client.user.id }); | ||||
| 
 | ||||
|       const config = { | ||||
|         headers: { | ||||
|           'Authorization': 'Basic ' + (new Buffer(store.clientID + ':' + store.clientSecret).toString('base64')), | ||||
|           'Content-Type': 'application/x-www-form-urlencoded', | ||||
|         } | ||||
|       }; | ||||
| 
 | ||||
|       const tokens = (await axios.post('https://accounts.spotify.com/api/token', params, config))?.data; | ||||
| 
 | ||||
|       const newClient = await Client.create({ | ||||
|         refreshToken: true, | ||||
|         retryOnRateLimit: true, | ||||
|         token: { | ||||
|           clientID: store.clientID, | ||||
|           clientSecret: store.clientSecret, | ||||
|           redirectURL: store.redirectURL, | ||||
|           refreshToken: tokens.refresh_token, | ||||
|         }, | ||||
|       }); | ||||
|       const player = new Player(newClient); | ||||
|       const accessToken = randomString(64); | ||||
|       const user = store.users.find(({ client }) => client.user.id === newClient.user.id); | ||||
|       if (user) { | ||||
|         user.client = newClient; | ||||
|         user.player = player; | ||||
|         user.accessToken = accessToken; | ||||
|         user.client = newUser.client; | ||||
|         user.player = newUser.client; | ||||
|       } else { | ||||
|         store.users.push({ client: newClient, player, accessToken, listeners: [], role: 'none' }); | ||||
|         store.users.push(newUser); | ||||
|       } | ||||
| 
 | ||||
|       const accessToken = randomString(64); | ||||
| 
 | ||||
|       const userStore = await UserStore.findOneAndUpdate( | ||||
|         { 'spotify.userId': newUser.client.user.id }, | ||||
|         { | ||||
|           accessToken, | ||||
|           role: 'none', | ||||
|           spotify: { | ||||
|             refreshToken: newUser.client.refreshMeta.refreshToken, | ||||
|             userId: newUser.client.user.id, | ||||
|             local: true, | ||||
|           }, | ||||
|         }, | ||||
|         { upsert: true }, | ||||
|       ); | ||||
| 
 | ||||
|       res.status(200); | ||||
|       res.send({ message: 'authorized', accessToken }); | ||||
|     } catch (e) { | ||||
|       console.log(e.message); | ||||
|       console.log(e); | ||||
|       res.status(500); | ||||
|       res.send({ message: 'unauthorized' }); | ||||
|     } | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| import { store } from "../store.mjs"; | ||||
| import { UserStore } from "../db/schemas.mjs"; | ||||
| 
 | ||||
| export const applyUserRoutes = (router) => { | ||||
| 
 | ||||
| @ -42,7 +43,7 @@ export const applyUserRoutes = (router) => { | ||||
|   }); | ||||
| 
 | ||||
|   router.get('/user/currentlyPlaying', async (req, res) => { | ||||
|     const currentlyPlaying = await res.locals.user.player?.getCurrentlyPlaying('track'); | ||||
|     const currentlyPlaying = await (await res.locals.user.spotify.local)?.player?.getCurrentlyPlaying('track'); | ||||
|     res.status(200); | ||||
|     res.send({ currentlyPlaying }); | ||||
|   }); | ||||
| @ -83,14 +84,20 @@ export const applyUserRoutesPublic = (router) => { | ||||
|       res.send({ message: 'userId is missing' }); | ||||
|     } | ||||
|     const { userId } = req.params; | ||||
|     const host = store.users.find(({ client }) => client.user.id === userId); | ||||
|     if (!host?.player) { | ||||
|     const hostDB = await UserStore.findOne().bySpotifyId(userId); | ||||
|     if (!hostDB) { | ||||
|       res.status(400); | ||||
|       res.send({ message: 'user is not registered' }); | ||||
|       return; | ||||
|     } | ||||
|     const host = await hostDB?.spotify?.local; | ||||
|     if (!host.player) { | ||||
|       res.status(500); | ||||
|       res.send({ message: 'user is outdated' }); | ||||
|       return; | ||||
|     } | ||||
|     try { | ||||
|       const currentlyPlaying = await host?.player?.getCurrentlyPlaying('track'); | ||||
|       const currentlyPlaying = await host.player.getCurrentlyPlaying('track'); | ||||
|       res.status(200); | ||||
|       res.send({ | ||||
|         currentlyPlaying, | ||||
|  | ||||
							
								
								
									
										33
									
								
								backend/db/schemas.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								backend/db/schemas.mjs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| import mongoose, { model } from "mongoose"; | ||||
| const { Schema } = mongoose; | ||||
| import { findUserBySpotifyId } from "../lib/helpers.mjs"; | ||||
| 
 | ||||
| const userSchema = new Schema({ | ||||
|   accessToken: String, | ||||
|   role: String, | ||||
|   spotify: { | ||||
|     refreshToken: String, | ||||
|     userId: String, | ||||
|     local: { | ||||
|       type: Boolean, | ||||
|       async get(local) { | ||||
|         if (!local) return false; | ||||
|         return await findUserBySpotifyId({ | ||||
|           userId: this.spotify.userId, | ||||
|           refreshToken: this.spotify.refreshToken, | ||||
|         }, { create: true }); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
| }, { | ||||
|   query: { | ||||
|     bySpotifyId(id) { | ||||
|       return this.where({ 'spotify.userId': id }); | ||||
|     }, | ||||
|     byAccessToken(accessToken) { | ||||
|       return this.where({ accessToken }); | ||||
|     }, | ||||
|   }, | ||||
| }); | ||||
| 
 | ||||
| export const UserStore = model('User', userSchema); | ||||
| @ -3,6 +3,8 @@ import { auth } from "./middlewares/auth.mjs"; | ||||
| 
 | ||||
| import { applyAuthRoutes } from "./api/auth.mjs"; | ||||
| import { applyApiRoutes, applyPublicRoutes } from "./api/index.mjs"; | ||||
| import mongoose from "mongoose"; | ||||
| import { store } from "./store.mjs"; | ||||
| 
 | ||||
| // express server
 | ||||
| const port = 3000; | ||||
| @ -28,5 +30,8 @@ applyApiRoutes(router); | ||||
| 
 | ||||
| applyPublicRoutes(publicRouter); | ||||
| 
 | ||||
| await mongoose.connect(store.mongodbConnstring); | ||||
| console.log('mongodb connected'); | ||||
| 
 | ||||
| app.listen(port); | ||||
| console.log('ready'); | ||||
| console.log('express started'); | ||||
|  | ||||
							
								
								
									
										37
									
								
								backend/lib/helpers.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								backend/lib/helpers.mjs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | ||||
| import { Client, Player } from "spotify-api.js"; | ||||
| import { store } from "../store.mjs"; | ||||
| import { UserStore } from "../db/schemas.mjs"; | ||||
| 
 | ||||
| export const createLocalUser = async ({ refreshToken = undefined, code = undefined }) => { | ||||
|   const client = await Client.create({ | ||||
|     refreshToken: true, | ||||
|     retryOnRateLimit: true, | ||||
|     token: { | ||||
|       clientID: store.clientID, | ||||
|       clientSecret: store.clientSecret, | ||||
|       redirectURL: store.redirectURL, | ||||
|       refreshToken, | ||||
|       code, | ||||
|     }, | ||||
|     async onRefresh() { | ||||
|       await UserStore.findOneAndUpdate( | ||||
|         { 'spotify.userId': client.user.id }, | ||||
|         { spotify: { refreshToken: client.refreshMeta.refreshToken } } | ||||
|       ); | ||||
|     }, | ||||
|   }); | ||||
|   const player = new Player(client); | ||||
|   return { client, player }; | ||||
| }; | ||||
| 
 | ||||
| export const findUserBySpotifyId = async ( | ||||
|   { userId, refreshToken }, | ||||
|   { create = false } = {}, | ||||
| ) => { | ||||
|   const user = store.users.find(user => user.client.user.id === userId); | ||||
|   if (user) return user; | ||||
|   if (!create) return null; | ||||
|   const newUser = await createLocalUser({ refreshToken }); | ||||
|   store.users.push(newUser); | ||||
|   return newUser; | ||||
| } | ||||
| @ -1,11 +1,14 @@ | ||||
| import { store } from "../store.mjs"; | ||||
| import { UserStore } from "../db/schemas.mjs"; | ||||
| 
 | ||||
| export const auth = async (req, res, next) => { | ||||
| 
 | ||||
| export const auth = (req, res, next) => { | ||||
|   const accessToken = req.headers['access-token']; | ||||
|   res.locals.user = store.users.find(user => user.accessToken === accessToken); | ||||
|   res.locals.user = await UserStore.findOne().byAccessToken(accessToken); | ||||
|   if (!res.locals.user) { | ||||
|     res.status(401); | ||||
|     res.send({ message: 'unauthorized' }); | ||||
|     return; | ||||
|   } | ||||
|   else next(); | ||||
|   console.log('middleware', res.locals.user, await res.locals.user.spotify.local); | ||||
|   next(); | ||||
| }; | ||||
|  | ||||
							
								
								
									
										496
									
								
								backend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										496
									
								
								backend/package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -11,9 +11,29 @@ | ||||
|         "axios": "^0.27.2", | ||||
|         "dotenv": "^16.0.3", | ||||
|         "express": "^4.18.1", | ||||
|         "mongoose": "^6.6.3", | ||||
|         "spotify-api.js": "^9.2.3" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@types/node": { | ||||
|       "version": "18.7.23", | ||||
|       "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", | ||||
|       "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==" | ||||
|     }, | ||||
|     "node_modules/@types/webidl-conversions": { | ||||
|       "version": "7.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", | ||||
|       "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" | ||||
|     }, | ||||
|     "node_modules/@types/whatwg-url": { | ||||
|       "version": "8.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", | ||||
|       "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", | ||||
|       "dependencies": { | ||||
|         "@types/node": "*", | ||||
|         "@types/webidl-conversions": "*" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/accepts": { | ||||
|       "version": "1.3.8", | ||||
|       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", | ||||
| @ -45,6 +65,25 @@ | ||||
|         "form-data": "^4.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/base64-js": { | ||||
|       "version": "1.5.1", | ||||
|       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", | ||||
|       "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", | ||||
|       "funding": [ | ||||
|         { | ||||
|           "type": "github", | ||||
|           "url": "https://github.com/sponsors/feross" | ||||
|         }, | ||||
|         { | ||||
|           "type": "patreon", | ||||
|           "url": "https://www.patreon.com/feross" | ||||
|         }, | ||||
|         { | ||||
|           "type": "consulting", | ||||
|           "url": "https://feross.org/support" | ||||
|         } | ||||
|       ] | ||||
|     }, | ||||
|     "node_modules/body-parser": { | ||||
|       "version": "1.20.0", | ||||
|       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", | ||||
| @ -68,6 +107,40 @@ | ||||
|         "npm": "1.2.8000 || >= 1.4.16" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/bson": { | ||||
|       "version": "4.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", | ||||
|       "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", | ||||
|       "dependencies": { | ||||
|         "buffer": "^5.6.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=6.9.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/buffer": { | ||||
|       "version": "5.7.1", | ||||
|       "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", | ||||
|       "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", | ||||
|       "funding": [ | ||||
|         { | ||||
|           "type": "github", | ||||
|           "url": "https://github.com/sponsors/feross" | ||||
|         }, | ||||
|         { | ||||
|           "type": "patreon", | ||||
|           "url": "https://www.patreon.com/feross" | ||||
|         }, | ||||
|         { | ||||
|           "type": "consulting", | ||||
|           "url": "https://feross.org/support" | ||||
|         } | ||||
|       ], | ||||
|       "dependencies": { | ||||
|         "base64-js": "^1.3.1", | ||||
|         "ieee754": "^1.1.13" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/bytes": { | ||||
|       "version": "3.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", | ||||
| @ -147,6 +220,14 @@ | ||||
|         "node": ">=0.4.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/denque": { | ||||
|       "version": "2.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", | ||||
|       "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", | ||||
|       "engines": { | ||||
|         "node": ">=0.10" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/depd": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", | ||||
| @ -370,11 +451,35 @@ | ||||
|         "node": ">=0.10.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/ieee754": { | ||||
|       "version": "1.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", | ||||
|       "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", | ||||
|       "funding": [ | ||||
|         { | ||||
|           "type": "github", | ||||
|           "url": "https://github.com/sponsors/feross" | ||||
|         }, | ||||
|         { | ||||
|           "type": "patreon", | ||||
|           "url": "https://www.patreon.com/feross" | ||||
|         }, | ||||
|         { | ||||
|           "type": "consulting", | ||||
|           "url": "https://feross.org/support" | ||||
|         } | ||||
|       ] | ||||
|     }, | ||||
|     "node_modules/inherits": { | ||||
|       "version": "2.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||
|       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | ||||
|     }, | ||||
|     "node_modules/ip": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", | ||||
|       "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" | ||||
|     }, | ||||
|     "node_modules/ipaddr.js": { | ||||
|       "version": "1.9.1", | ||||
|       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", | ||||
| @ -383,6 +488,11 @@ | ||||
|         "node": ">= 0.10" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/kareem": { | ||||
|       "version": "2.4.1", | ||||
|       "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.4.1.tgz", | ||||
|       "integrity": "sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA==" | ||||
|     }, | ||||
|     "node_modules/media-typer": { | ||||
|       "version": "0.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", | ||||
| @ -391,6 +501,12 @@ | ||||
|         "node": ">= 0.6" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/memory-pager": { | ||||
|       "version": "1.5.0", | ||||
|       "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", | ||||
|       "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", | ||||
|       "optional": true | ||||
|     }, | ||||
|     "node_modules/merge-descriptors": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", | ||||
| @ -434,6 +550,98 @@ | ||||
|         "node": ">= 0.6" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/mongodb": { | ||||
|       "version": "4.9.1", | ||||
|       "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", | ||||
|       "integrity": "sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ==", | ||||
|       "dependencies": { | ||||
|         "bson": "^4.7.0", | ||||
|         "denque": "^2.1.0", | ||||
|         "mongodb-connection-string-url": "^2.5.3", | ||||
|         "socks": "^2.7.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=12.9.0" | ||||
|       }, | ||||
|       "optionalDependencies": { | ||||
|         "saslprep": "^1.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/mongodb-connection-string-url": { | ||||
|       "version": "2.5.4", | ||||
|       "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz", | ||||
|       "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==", | ||||
|       "dependencies": { | ||||
|         "@types/whatwg-url": "^8.2.1", | ||||
|         "whatwg-url": "^11.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/mongoose": { | ||||
|       "version": "6.6.3", | ||||
|       "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.6.3.tgz", | ||||
|       "integrity": "sha512-2Ye018PNBBXJd717qhfjBGo7k8HQb/pKziO9d5wY14iZSUI7hxqL7bwNDg+poeBwnlhBYLncZkips15Blfgxbw==", | ||||
|       "dependencies": { | ||||
|         "bson": "^4.6.5", | ||||
|         "kareem": "2.4.1", | ||||
|         "mongodb": "4.9.1", | ||||
|         "mpath": "0.9.0", | ||||
|         "mquery": "4.0.3", | ||||
|         "ms": "2.1.3", | ||||
|         "sift": "16.0.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=12.0.0" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "type": "opencollective", | ||||
|         "url": "https://opencollective.com/mongoose" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/mongoose/node_modules/ms": { | ||||
|       "version": "2.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", | ||||
|       "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" | ||||
|     }, | ||||
|     "node_modules/mpath": { | ||||
|       "version": "0.9.0", | ||||
|       "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", | ||||
|       "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", | ||||
|       "engines": { | ||||
|         "node": ">=4.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/mquery": { | ||||
|       "version": "4.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", | ||||
|       "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", | ||||
|       "dependencies": { | ||||
|         "debug": "4.x" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=12.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/mquery/node_modules/debug": { | ||||
|       "version": "4.3.4", | ||||
|       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", | ||||
|       "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", | ||||
|       "dependencies": { | ||||
|         "ms": "2.1.2" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=6.0" | ||||
|       }, | ||||
|       "peerDependenciesMeta": { | ||||
|         "supports-color": { | ||||
|           "optional": true | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/mquery/node_modules/ms": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", | ||||
|       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" | ||||
|     }, | ||||
|     "node_modules/ms": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", | ||||
| @ -491,6 +699,14 @@ | ||||
|         "node": ">= 0.10" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/punycode": { | ||||
|       "version": "2.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", | ||||
|       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", | ||||
|       "engines": { | ||||
|         "node": ">=6" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/qs": { | ||||
|       "version": "6.10.3", | ||||
|       "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", | ||||
| @ -551,6 +767,18 @@ | ||||
|       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", | ||||
|       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" | ||||
|     }, | ||||
|     "node_modules/saslprep": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", | ||||
|       "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", | ||||
|       "optional": true, | ||||
|       "dependencies": { | ||||
|         "sparse-bitfield": "^3.0.3" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=6" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/send": { | ||||
|       "version": "0.18.0", | ||||
|       "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", | ||||
| @ -611,6 +839,42 @@ | ||||
|         "url": "https://github.com/sponsors/ljharb" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/sift": { | ||||
|       "version": "16.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz", | ||||
|       "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ==" | ||||
|     }, | ||||
|     "node_modules/smart-buffer": { | ||||
|       "version": "4.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", | ||||
|       "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", | ||||
|       "engines": { | ||||
|         "node": ">= 6.0.0", | ||||
|         "npm": ">= 3.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/socks": { | ||||
|       "version": "2.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", | ||||
|       "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", | ||||
|       "dependencies": { | ||||
|         "ip": "^2.0.0", | ||||
|         "smart-buffer": "^4.2.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">= 10.13.0", | ||||
|         "npm": ">= 3.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/sparse-bitfield": { | ||||
|       "version": "3.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", | ||||
|       "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", | ||||
|       "optional": true, | ||||
|       "dependencies": { | ||||
|         "memory-pager": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/spotify-api.js": { | ||||
|       "version": "9.2.3", | ||||
|       "resolved": "https://registry.npmjs.org/spotify-api.js/-/spotify-api.js-9.2.3.tgz", | ||||
| @ -641,6 +905,17 @@ | ||||
|         "node": ">=0.6" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/tr46": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", | ||||
|       "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", | ||||
|       "dependencies": { | ||||
|         "punycode": "^2.1.1" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=12" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/type-is": { | ||||
|       "version": "1.6.18", | ||||
|       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", | ||||
| @ -676,9 +951,48 @@ | ||||
|       "engines": { | ||||
|         "node": ">= 0.8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/webidl-conversions": { | ||||
|       "version": "7.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", | ||||
|       "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", | ||||
|       "engines": { | ||||
|         "node": ">=12" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/whatwg-url": { | ||||
|       "version": "11.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", | ||||
|       "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", | ||||
|       "dependencies": { | ||||
|         "tr46": "^3.0.0", | ||||
|         "webidl-conversions": "^7.0.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=12" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@types/node": { | ||||
|       "version": "18.7.23", | ||||
|       "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", | ||||
|       "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==" | ||||
|     }, | ||||
|     "@types/webidl-conversions": { | ||||
|       "version": "7.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", | ||||
|       "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" | ||||
|     }, | ||||
|     "@types/whatwg-url": { | ||||
|       "version": "8.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", | ||||
|       "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", | ||||
|       "requires": { | ||||
|         "@types/node": "*", | ||||
|         "@types/webidl-conversions": "*" | ||||
|       } | ||||
|     }, | ||||
|     "accepts": { | ||||
|       "version": "1.3.8", | ||||
|       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", | ||||
| @ -707,6 +1021,11 @@ | ||||
|         "form-data": "^4.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "base64-js": { | ||||
|       "version": "1.5.1", | ||||
|       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", | ||||
|       "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" | ||||
|     }, | ||||
|     "body-parser": { | ||||
|       "version": "1.20.0", | ||||
|       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", | ||||
| @ -726,6 +1045,23 @@ | ||||
|         "unpipe": "1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "bson": { | ||||
|       "version": "4.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", | ||||
|       "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", | ||||
|       "requires": { | ||||
|         "buffer": "^5.6.0" | ||||
|       } | ||||
|     }, | ||||
|     "buffer": { | ||||
|       "version": "5.7.1", | ||||
|       "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", | ||||
|       "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", | ||||
|       "requires": { | ||||
|         "base64-js": "^1.3.1", | ||||
|         "ieee754": "^1.1.13" | ||||
|       } | ||||
|     }, | ||||
|     "bytes": { | ||||
|       "version": "3.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", | ||||
| @ -784,6 +1120,11 @@ | ||||
|       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", | ||||
|       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" | ||||
|     }, | ||||
|     "denque": { | ||||
|       "version": "2.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", | ||||
|       "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" | ||||
|     }, | ||||
|     "depd": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", | ||||
| @ -944,21 +1285,42 @@ | ||||
|         "safer-buffer": ">= 2.1.2 < 3" | ||||
|       } | ||||
|     }, | ||||
|     "ieee754": { | ||||
|       "version": "1.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", | ||||
|       "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" | ||||
|     }, | ||||
|     "inherits": { | ||||
|       "version": "2.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||
|       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | ||||
|     }, | ||||
|     "ip": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", | ||||
|       "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" | ||||
|     }, | ||||
|     "ipaddr.js": { | ||||
|       "version": "1.9.1", | ||||
|       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", | ||||
|       "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" | ||||
|     }, | ||||
|     "kareem": { | ||||
|       "version": "2.4.1", | ||||
|       "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.4.1.tgz", | ||||
|       "integrity": "sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA==" | ||||
|     }, | ||||
|     "media-typer": { | ||||
|       "version": "0.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", | ||||
|       "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" | ||||
|     }, | ||||
|     "memory-pager": { | ||||
|       "version": "1.5.0", | ||||
|       "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", | ||||
|       "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", | ||||
|       "optional": true | ||||
|     }, | ||||
|     "merge-descriptors": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", | ||||
| @ -987,6 +1349,76 @@ | ||||
|         "mime-db": "1.52.0" | ||||
|       } | ||||
|     }, | ||||
|     "mongodb": { | ||||
|       "version": "4.9.1", | ||||
|       "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", | ||||
|       "integrity": "sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ==", | ||||
|       "requires": { | ||||
|         "bson": "^4.7.0", | ||||
|         "denque": "^2.1.0", | ||||
|         "mongodb-connection-string-url": "^2.5.3", | ||||
|         "saslprep": "^1.0.3", | ||||
|         "socks": "^2.7.0" | ||||
|       } | ||||
|     }, | ||||
|     "mongodb-connection-string-url": { | ||||
|       "version": "2.5.4", | ||||
|       "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz", | ||||
|       "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==", | ||||
|       "requires": { | ||||
|         "@types/whatwg-url": "^8.2.1", | ||||
|         "whatwg-url": "^11.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "mongoose": { | ||||
|       "version": "6.6.3", | ||||
|       "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.6.3.tgz", | ||||
|       "integrity": "sha512-2Ye018PNBBXJd717qhfjBGo7k8HQb/pKziO9d5wY14iZSUI7hxqL7bwNDg+poeBwnlhBYLncZkips15Blfgxbw==", | ||||
|       "requires": { | ||||
|         "bson": "^4.6.5", | ||||
|         "kareem": "2.4.1", | ||||
|         "mongodb": "4.9.1", | ||||
|         "mpath": "0.9.0", | ||||
|         "mquery": "4.0.3", | ||||
|         "ms": "2.1.3", | ||||
|         "sift": "16.0.0" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "ms": { | ||||
|           "version": "2.1.3", | ||||
|           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", | ||||
|           "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "mpath": { | ||||
|       "version": "0.9.0", | ||||
|       "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", | ||||
|       "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" | ||||
|     }, | ||||
|     "mquery": { | ||||
|       "version": "4.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", | ||||
|       "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", | ||||
|       "requires": { | ||||
|         "debug": "4.x" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "debug": { | ||||
|           "version": "4.3.4", | ||||
|           "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", | ||||
|           "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", | ||||
|           "requires": { | ||||
|             "ms": "2.1.2" | ||||
|           } | ||||
|         }, | ||||
|         "ms": { | ||||
|           "version": "2.1.2", | ||||
|           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", | ||||
|           "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "ms": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", | ||||
| @ -1029,6 +1461,11 @@ | ||||
|         "ipaddr.js": "1.9.1" | ||||
|       } | ||||
|     }, | ||||
|     "punycode": { | ||||
|       "version": "2.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", | ||||
|       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" | ||||
|     }, | ||||
|     "qs": { | ||||
|       "version": "6.10.3", | ||||
|       "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", | ||||
| @ -1063,6 +1500,15 @@ | ||||
|       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", | ||||
|       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" | ||||
|     }, | ||||
|     "saslprep": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", | ||||
|       "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", | ||||
|       "optional": true, | ||||
|       "requires": { | ||||
|         "sparse-bitfield": "^3.0.3" | ||||
|       } | ||||
|     }, | ||||
|     "send": { | ||||
|       "version": "0.18.0", | ||||
|       "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", | ||||
| @ -1116,6 +1562,34 @@ | ||||
|         "object-inspect": "^1.9.0" | ||||
|       } | ||||
|     }, | ||||
|     "sift": { | ||||
|       "version": "16.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz", | ||||
|       "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ==" | ||||
|     }, | ||||
|     "smart-buffer": { | ||||
|       "version": "4.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", | ||||
|       "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" | ||||
|     }, | ||||
|     "socks": { | ||||
|       "version": "2.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", | ||||
|       "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", | ||||
|       "requires": { | ||||
|         "ip": "^2.0.0", | ||||
|         "smart-buffer": "^4.2.0" | ||||
|       } | ||||
|     }, | ||||
|     "sparse-bitfield": { | ||||
|       "version": "3.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", | ||||
|       "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", | ||||
|       "optional": true, | ||||
|       "requires": { | ||||
|         "memory-pager": "^1.0.2" | ||||
|       } | ||||
|     }, | ||||
|     "spotify-api.js": { | ||||
|       "version": "9.2.3", | ||||
|       "resolved": "https://registry.npmjs.org/spotify-api.js/-/spotify-api.js-9.2.3.tgz", | ||||
| @ -1140,6 +1614,14 @@ | ||||
|       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", | ||||
|       "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" | ||||
|     }, | ||||
|     "tr46": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", | ||||
|       "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", | ||||
|       "requires": { | ||||
|         "punycode": "^2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "type-is": { | ||||
|       "version": "1.6.18", | ||||
|       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", | ||||
| @ -1163,6 +1645,20 @@ | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", | ||||
|       "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" | ||||
|     }, | ||||
|     "webidl-conversions": { | ||||
|       "version": "7.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", | ||||
|       "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" | ||||
|     }, | ||||
|     "whatwg-url": { | ||||
|       "version": "11.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", | ||||
|       "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", | ||||
|       "requires": { | ||||
|         "tr46": "^3.0.0", | ||||
|         "webidl-conversions": "^7.0.0" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -13,6 +13,7 @@ | ||||
|     "axios": "^0.27.2", | ||||
|     "dotenv": "^16.0.3", | ||||
|     "express": "^4.18.1", | ||||
|     "mongoose": "^6.6.3", | ||||
|     "spotify-api.js": "^9.2.3" | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -6,6 +6,7 @@ export const store = { | ||||
|   clientID: process.env.APP_SPOTIFY_CLIENT_ID, | ||||
|   clientSecret: process.env.APP_SPOTIFY_CLIENT_SECRET, | ||||
|   redirectURL: process.env.APP_SPOTIFY_REDIRECT_URI, | ||||
|   mongodbConnstring: process.env.MONGODB_CONNSTRING, | ||||
| }; | ||||
| 
 | ||||
| console.log('store:', store); | ||||
|  | ||||
							
								
								
									
										2
									
								
								frontend
									
									
									
									
									
								
							
							
								
								
								
								
								
								
							
						
						
									
										2
									
								
								frontend
									
									
									
									
									
								
							| @ -1 +1 @@ | ||||
| Subproject commit 4b26d3aeef51185f4e27ae9e8700b378cd6cec0d | ||||
| Subproject commit 2b501fdeed21fd533ae2e5968b08ec4291d288f9 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user