diff --git a/boilerplates/controller.ts b/boilerplates/controller.ts index cf6436b..93ad391 100644 --- a/boilerplates/controller.ts +++ b/boilerplates/controller.ts @@ -4,11 +4,11 @@ import logger from "../utils/logger.ts"; const __controller_func: RequestHandler = async (req, res) => { try { - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("__controller_func", { error }); - return null; + return; } }; diff --git a/config/redis.ts b/config/redis.ts index a632cf7..c2b0540 100644 --- a/config/redis.ts +++ b/config/redis.ts @@ -9,7 +9,8 @@ if (!process.env["SPOTMGR_REDIS_URI"]) const redisClient: ReturnType = createClient({ url: process.env["SPOTMGR_REDIS_URI"], socket: { - keepAlive: 25 * 1000, // 25s + keepAlive: true, + keepAliveInitialDelay: 25 * 1000, // 25s connectTimeout: 15 * 1000, }, }); diff --git a/controllers/auth.ts b/controllers/auth.ts index 7f00491..64a517d 100644 --- a/controllers/auth.ts +++ b/controllers/auth.ts @@ -31,11 +31,11 @@ const login: RequestHandler = async (_req, res) => { state: state, } as Record).toString() ); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("login", { error }); - return null; + return; } }; @@ -52,11 +52,11 @@ const callback: RequestHandler = async (req, res) => { if (state === null || state !== storedState) { res.status(409).send({ message: "Invalid state" }); logger.warn("state mismatch"); - return null; + return; } else if (error) { res.status(401).send({ message: "Auth callback error" }); logger.error("callback error", { error }); - return null; + return; } else { // get auth tokens res.clearCookie(stateKey); @@ -83,14 +83,14 @@ const callback: RequestHandler = async (req, res) => { .status(tokenResponse.status) .send({ message: "Error: Login failed" }); logger.error("login failed", { statusCode: tokenResponse.status }); - return null; + return; } const { resp } = await getCurrentUsersProfile({ res, authHeaders, }); - if (!resp) return null; + if (!resp) return; req.session.user = { username: resp.data.display_name ?? "", @@ -105,14 +105,14 @@ const callback: RequestHandler = async (req, res) => { res.redirect(process.env["SPOTMGR_APP_URI"] + "?login=success"); logger.debug("New login.", { username: resp.data.display_name }); } - return null; + return; }); - return null; + return; } } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("callback", { error }); - return null; + return; } }; @@ -144,7 +144,7 @@ const refresh: RequestHandler = async (req, res) => { : "" }.` ); - return null; + return; } else { res .status(response.status) @@ -153,12 +153,12 @@ const refresh: RequestHandler = async (req, res) => { statusCode: response.status, data: response.data, }); - return null; + return; } } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("refresh", { error }); - return null; + return; } }; @@ -178,11 +178,11 @@ const logout: RequestHandler = async (req, res) => { logger.debug("Logged out.", { sessionID: delSession.id }); } }); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("logout", { error }); - return null; + return; } }; diff --git a/controllers/load.ts b/controllers/load.ts index be00162..c6f6e28 100644 --- a/controllers/load.ts +++ b/controllers/load.ts @@ -33,11 +33,11 @@ const exportData: RequestHandler = async (req, res) => { ); res.send(JSON.stringify({ currentPlaylists, currentLinks })); logger.debug("exported data"); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("exportData", { error }); - return null; + return; } }; @@ -50,7 +50,7 @@ const importData: RequestHandler = async (req, res) => { if (!req.file) { res.status(400).send({ message: "No file provided!" }); logger.debug("no file provided"); - return null; + return; } let exportedLinks: Pick[]; let exportedPls: Pick[]; @@ -62,7 +62,7 @@ const importData: RequestHandler = async (req, res) => { const message = "Could not parse data file"; res.status(400).send({ message }); logger.info(message, { error }); - return null; + return; } const delPlNum = await Playlists.destroy({ where: { userID: uID } }); @@ -100,11 +100,11 @@ const importData: RequestHandler = async (req, res) => { links: addedLinks.length, playlists: addedPls.length, }); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("exportData", { error }); - return null; + return; } }; diff --git a/controllers/operations.ts b/controllers/operations.ts index 46319dc..0368096 100644 --- a/controllers/operations.ts +++ b/controllers/operations.ts @@ -47,7 +47,7 @@ const updateUser: RequestHandler = async (req, res) => { authHeaders, res, }); - if (!resp) return null; + if (!resp) return; const respData = resp.data; currentPlaylists = respData.items.map((playlist) => { @@ -65,7 +65,7 @@ const updateUser: RequestHandler = async (req, res) => { res, nextURL, }); - if (!resp) return null; + if (!resp) return; const nextData = resp.data; currentPlaylists.push( @@ -155,7 +155,7 @@ const updateUser: RequestHandler = async (req, res) => { if (delNum !== deleted.length) { res.status(500).send({ message: "Internal Server Error" }); logger.error("Could not remove all old playlists"); - return null; + return; } } @@ -169,7 +169,7 @@ const updateUser: RequestHandler = async (req, res) => { if (addPls.length !== added.length) { res.status(500).send({ message: "Internal Server Error" }); logger.error("Could not add all new playlists"); - return null; + return; } } @@ -186,7 +186,7 @@ const updateUser: RequestHandler = async (req, res) => { } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("Could not update playlist names"); - return null; + return; } res @@ -198,11 +198,11 @@ const updateUser: RequestHandler = async (req, res) => { addPls: addPls.length, updatedPls: updateNum, }); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("updateUser", { error }); - return null; + return; } }; @@ -213,7 +213,7 @@ const fetchUser: RequestHandler = async (req, res) => { try { // if (randomBool(0.5)) { // res.status(404).send({ message: "Not Found" }); - // return null; + // return; // } if (!req.session.user) throw new ReferenceError("session does not have user object"); @@ -243,11 +243,11 @@ const fetchUser: RequestHandler = async (req, res) => { pls: currentPlaylists.length, links: currentLinks.length, }); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("fetchUser", { error }); - return null; + return; } }; @@ -268,12 +268,12 @@ const createLink: RequestHandler = async (req, res) => { if (fromPl.type !== "playlist" || toPl.type !== "playlist") { res.status(400).send({ message: "Links must be playlist links!" }); logger.debug("non-playlist link provided"); - return null; + return; } } catch (error) { res.status(400).send({ message: "Could not parse link" }); logger.info("parseSpotifyLink", { error }); - return null; + return; } const playlists = await Playlists.findAll({ @@ -287,7 +287,7 @@ const createLink: RequestHandler = async (req, res) => { if (![fromPl, toPl].every((pl) => playlistIDs.includes(pl.id))) { res.status(404).send({ message: "Unknown playlists, resync first." }); logger.debug("unknown playlists, resync"); - return null; + return; } // check if exists @@ -299,7 +299,7 @@ const createLink: RequestHandler = async (req, res) => { if (existingLink) { res.status(409).send({ message: "Link already exists!" }); logger.debug("link already exists"); - return null; + return; } const allLinks = await Links.findAll({ @@ -318,7 +318,7 @@ const createLink: RequestHandler = async (req, res) => { .status(400) .send({ message: "The link cannot cause a cycle in the graph." }); logger.debug("potential cycle detected"); - return null; + return; } const newLink = await Links.create({ @@ -329,16 +329,16 @@ const createLink: RequestHandler = async (req, res) => { if (!newLink) { res.status(500).send({ message: "Internal Server Error" }); logger.error("Could not create link"); - return null; + return; } res.status(201).send({ message: "Created link." }); logger.debug("Created link"); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("createLink", { error }); - return null; + return; } }; @@ -358,12 +358,12 @@ const removeLink: RequestHandler = async (req, res) => { if (fromPl.type !== "playlist" || toPl.type !== "playlist") { res.status(400).send({ message: "Links must be playlist links!" }); logger.debug("non-playlist link provided"); - return null; + return; } } catch (error) { res.status(400).send({ message: "Could not parse link" }); logger.info("parseSpotifyLink", { error }); - return null; + return; } // check if exists @@ -375,7 +375,7 @@ const removeLink: RequestHandler = async (req, res) => { if (!existingLink) { res.status(409).send({ message: "Link does not exist!" }); logger.debug("link does not exist"); - return null; + return; } const removedLink = await Links.destroy({ @@ -386,16 +386,16 @@ const removeLink: RequestHandler = async (req, res) => { if (!removedLink) { res.status(500).send({ message: "Internal Server Error" }); logger.error("Could not remove link"); - return null; + return; } res.status(200).send({ message: "Deleted link." }); logger.debug("Deleted link"); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("removeLink", { error }); - return null; + return; } }; @@ -409,7 +409,7 @@ interface _GetPlaylistTracks { } const _getPlaylistTracks: ( opts: _GetPlaylistTracksArgs -) => Promise<_GetPlaylistTracks | null> = async ({ +) => Promise<_GetPlaylistTracks | void> = async ({ res, authHeaders, playlistID, @@ -421,7 +421,7 @@ const _getPlaylistTracks: ( initialFields: "snapshot_id", playlistID, }); - if (!snapshotResp) return null; + if (!snapshotResp) return; const currentSnapshotID = snapshotResp.data.snapshot_id; @@ -444,7 +444,7 @@ const _getPlaylistTracks: ( initialFields: firstPageFields.join(), playlistID, }); - if (!firstResp) return null; + if (!firstResp) return; const firstRespData = firstResp.data; const pl: _GetPlaylistTracks = { @@ -472,7 +472,7 @@ const _getPlaylistTracks: ( res, nextURL, }); - if (!resp) return null; + if (!resp) return; const nextData = resp.data; pl.tracks.push( @@ -555,12 +555,12 @@ const populateSingleLink: RequestHandler = async (req, res) => { if (fromPl.type !== "playlist" || toPl.type !== "playlist") { res.status(400).send({ message: "Link is not a playlist" }); logger.debug("non-playlist link provided", { link }); - return null; + return; } } catch (error) { res.status(400).send({ message: "Could not parse link" }); logger.info("parseSpotifyLink", { error }); - return null; + return; } // check if exists @@ -572,7 +572,7 @@ const populateSingleLink: RequestHandler = async (req, res) => { if (!existingLink) { res.status(409).send({ message: "Link does not exist!" }); logger.debug("link does not exist", { link }); - return null; + return; } const editableResp = await checkPlaylistEditable({ @@ -584,7 +584,7 @@ const populateSingleLink: RequestHandler = async (req, res) => { if (!editableResp.status) { res.status(403).send({ message: editableResp.message }); logger.debug(editableResp.message, { editableResp }); - return null; + return; } const fromTracks = await _getPlaylistTracks({ @@ -592,13 +592,13 @@ const populateSingleLink: RequestHandler = async (req, res) => { authHeaders, playlistID: fromPl.id, }); - if (!fromTracks) return null; + if (!fromTracks) return; const toTracks = await _getPlaylistTracks({ res, authHeaders, playlistID: toPl.id, }); - if (!toTracks) return null; + if (!toTracks) return; const { missing, localNum } = _populateSingleLinkCore({ from: fromTracks.tracks, @@ -630,11 +630,11 @@ const populateSingleLink: RequestHandler = async (req, res) => { res.status(200).send({ message, toAddNum, addedNum, localNum }); logger.debug(message, { toAddNum, addedNum, localNum }); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("populateSingleLink", { error }); - return null; + return; } }; @@ -654,12 +654,12 @@ const populateChain: RequestHandler = async (req, res) => { if (rootPl.type !== "playlist") { res.status(400).send({ message: "Link is not a playlist" }); logger.debug("non-playlist link provided"); - return null; + return; } } catch (error) { res.status(400).send({ message: "Could not parse link" }); logger.info("parseSpotifyLink", { error }); - return null; + return; } const playlists = await Playlists.findAll({ @@ -689,7 +689,7 @@ const populateChain: RequestHandler = async (req, res) => { }); }) ); - if (res.headersSent) return null; // error, resp sent and logged in singleRequest + if (res.headersSent) return; // error, resp sent and logged in singleRequest // else, respond with the non-editable playlists const nonEditablePlaylists = editableStatuses.filter( (statusObj) => statusObj.status === false @@ -700,7 +700,7 @@ const populateChain: RequestHandler = async (req, res) => { nonEditablePlaylists.map((pl) => pl.error?.playlistName).join(", "); res.status(403).send({ message }); logger.debug(message, { nonEditablePlaylists }); - return null; + return; } const affectedPlaylistsTracks = await Promise.all( @@ -708,14 +708,14 @@ const populateChain: RequestHandler = async (req, res) => { return _getPlaylistTracks({ res, authHeaders, playlistID: pl }); }) ); - if (affectedPlaylistsTracks.some((plTracks) => !plTracks)) return null; + if (affectedPlaylistsTracks.some((plTracks) => !plTracks)) return; const rootTracks = await _getPlaylistTracks({ res, authHeaders, playlistID: rootPl.id, }); - if (!rootTracks) return null; + if (!rootTracks) return; const populateData = affectedPlaylistsTracks.map((plTracks) => { return _populateSingleLinkCore({ @@ -775,11 +775,11 @@ const populateChain: RequestHandler = async (req, res) => { res.status(200).send({ message, ...reducedResult }); logger.debug(message, { ...reducedResult }); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("populateChain", { error }); - return null; + return; } }; @@ -834,12 +834,12 @@ const pruneSingleLink: RequestHandler = async (req, res) => { if (fromPl.type !== "playlist" || toPl.type !== "playlist") { res.status(400).send({ message: "Link is not a playlist" }); logger.debug("non-playlist link provided"); - return null; + return; } } catch (error: any) { res.status(400).send({ message: error.message }); logger.info("parseSpotifyLink", { error }); - return null; + return; } // check if exists @@ -851,7 +851,7 @@ const pruneSingleLink: RequestHandler = async (req, res) => { if (!existingLink) { res.status(409).send({ message: "Link does not exist!" }); logger.warn("link does not exist", { link }); - return null; + return; } const editableResp = await checkPlaylistEditable({ @@ -863,7 +863,7 @@ const pruneSingleLink: RequestHandler = async (req, res) => { if (!editableResp.status) { res.status(403).send({ message: editableResp.message }); logger.debug(editableResp.message, { editableResp }); - return null; + return; } const fromTracks = await _getPlaylistTracks({ @@ -871,14 +871,14 @@ const pruneSingleLink: RequestHandler = async (req, res) => { authHeaders, playlistID: fromPl.id, }); - if (!fromTracks) return null; + if (!fromTracks) return; const toTracks = await _getPlaylistTracks({ res, authHeaders, playlistID: toPl.id, }); - if (!toTracks) return null; + if (!toTracks) return; const { missingPositions } = _pruneSingleLinkCore({ from: fromTracks.tracks, @@ -918,11 +918,11 @@ const pruneSingleLink: RequestHandler = async (req, res) => { res.status(200).send({ message, toDelNum, deletedNum }); logger.debug(message, { toDelNum, deletedNum }); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("pruneSingleLink", { error }); - return null; + return; } }; @@ -942,12 +942,12 @@ const pruneChain: RequestHandler = async (req, res) => { if (rootPl.type !== "playlist") { res.status(400).send({ message: "Link is not a playlist" }); logger.debug("non-playlist link provided"); - return null; + return; } } catch (error) { res.status(400).send({ message: "Could not parse link" }); logger.info("parseSpotifyLink", { error }); - return null; + return; } const playlists = await Playlists.findAll({ @@ -977,7 +977,7 @@ const pruneChain: RequestHandler = async (req, res) => { }); }) ); - if (res.headersSent) return null; // error, resp sent and logged in singleRequest + if (res.headersSent) return; // error, resp sent and logged in singleRequest // else, respond with the non-editable playlists const nonEditablePlaylists = editableStatuses.filter( (statusObj) => statusObj.status === false @@ -988,7 +988,7 @@ const pruneChain: RequestHandler = async (req, res) => { nonEditablePlaylists.map((pl) => pl.error?.playlistName).join(", "); res.status(403).send({ message }); logger.debug(message, { nonEditablePlaylists }); - return null; + return; } const rootTracks = await _getPlaylistTracks({ @@ -996,14 +996,14 @@ const pruneChain: RequestHandler = async (req, res) => { authHeaders, playlistID: rootPl.id, }); - if (!rootTracks) return null; + if (!rootTracks) return; const affectedPlaylistsTracks = await Promise.all( affectedPlaylists.map((pl) => { return _getPlaylistTracks({ res, authHeaders, playlistID: pl }); }) ); - if (affectedPlaylistsTracks.some((plTracks) => !plTracks)) return null; + if (affectedPlaylistsTracks.some((plTracks) => !plTracks)) return; const pruneData = affectedPlaylistsTracks.map((plTracks) => { return _pruneSingleLinkCore({ @@ -1060,11 +1060,11 @@ const pruneChain: RequestHandler = async (req, res) => { res.status(200).send({ message, ...reducedResult }); logger.debug(message, { ...reducedResult }); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("pruneChain", { error }); - return null; + return; } }; diff --git a/controllers/playlists.ts b/controllers/playlists.ts index 35aa932..ea3e3f3 100644 --- a/controllers/playlists.ts +++ b/controllers/playlists.ts @@ -24,7 +24,7 @@ const fetchUserPlaylists: RequestHandler = async (req, res) => { res, authHeaders, }); - if (!resp) return null; + if (!resp) return; const userPlaylists: Pick< Pagination, @@ -41,7 +41,7 @@ const fetchUserPlaylists: RequestHandler = async (req, res) => { res, nextURL, }); - if (!resp) return null; + if (!resp) return; const nextData = resp.data; userPlaylists.items.push(...nextData.items); @@ -50,11 +50,11 @@ const fetchUserPlaylists: RequestHandler = async (req, res) => { res.status(200).send(userPlaylists); logger.debug("Fetched user playlists", { num: userPlaylists.total }); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("fetchUserPlaylists", { error }); - return null; + return; } }; diff --git a/index.ts b/index.ts index b8386d7..91ce26b 100644 --- a/index.ts +++ b/index.ts @@ -84,7 +84,7 @@ app.use(express.static(import.meta.dirname + "/static")); // Healthcheck app.use("/health", (_req, res) => { res.status(200).send({ message: "OK" }); - return null; + return; }); app.use("/auth-health", isAuthenticated, async (req, res) => { try { @@ -92,13 +92,13 @@ app.use("/auth-health", isAuthenticated, async (req, res) => { if (!authHeaders) throw new ReferenceError("session does not have auth headers"); const { resp } = await getCurrentUsersProfile({ authHeaders, res }); - if (!resp) return null; + if (!resp) return; res.status(200).send({ message: "OK" }); - return null; + return; } catch (error) { res.status(500).send({ message: "Internal Server Error" }); logger.error("authHealthCheck", { error }); - return null; + return; } }); @@ -116,7 +116,7 @@ app.use((req, res) => { 'Guess the cat\'s out of the bag!' ); logger.info("404", { url: req.url }); - return null; + return; }); const port = process.env["SPOTMGR_PORT"] || 5000; diff --git a/middleware/authCheck.ts b/middleware/authCheck.ts index 25e2d9f..8cfabc3 100644 --- a/middleware/authCheck.ts +++ b/middleware/authCheck.ts @@ -15,14 +15,14 @@ const isAuthenticated: RequestHandler = (req, res, next) => { if (Object.keys(error).length) { res.status(500).send({ message: "Internal Server Error" }); logger.error("session.destroy", { error }); - return null; + return; } else { res.clearCookie(sessionName); res.status(401).send({ message: "Unauthorized" }); logger.debug("Session invalid, destroyed.", { sessionID: delSession.id, }); - return null; + return; } }); } diff --git a/package-lock.json b/package-lock.json index 3247bb2..098c2d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,35 +9,35 @@ "version": "0", "license": "MIT", "dependencies": { - "axios": "^1.8.4", + "axios": "^1.9.0", "bottleneck": "^2.19.5", - "connect-redis": "^8.0.3", + "connect-redis": "^8.1.0", "cookie-parser": "^1.4.7", "cors": "^2.8.5", - "express": "^4.21.2", + "express": "^5.1.0", "express-session": "^1.18.1", "express-validator": "^7.2.1", "helmet": "^8.1.0", - "multer": "^1.4.5-lts.2", - "pg": "^8.15.1", - "redis": "^4.7.0", + "multer": "^2.0.0", + "pg": "^8.16.0", + "redis": "^5.1.1", "reflect-metadata": "^0.2.2", "sequelize": "^6.37.7", - "sequelize-cli": "^6.6.2", + "sequelize-cli": "^6.6.3", "sequelize-typescript": "^2.1.6", - "serializr": "^3.0.4", + "serializr": "^3.0.5", "winston": "^3.17.0" }, "devDependencies": { "@types/cookie-parser": "^1.4.8", - "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", + "@types/cors": "^2.8.8", + "@types/express": "^5.0.2", "@types/express-session": "^1.18.1", "@types/multer": "^1.4.12", - "@types/node": "^22.13.11", + "@types/node": "^22.15.29", "@types/sequelize": "^4.28.20", - "@types/validator": "^13.12.2", - "typescript": "^5.8.2" + "@types/validator": "^13.15.1", + "typescript": "^5.8.3" } }, "node_modules/@colors/colors": { @@ -94,62 +94,63 @@ } }, "node_modules/@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.1.1.tgz", + "integrity": "sha512-PnMcvpL7O2DHtnSL5JtyNmraNrdHuJXi3u2isGTUuPgkbAuWQKfZdknq471ySILL+qKtLfVJqzgDFMjYmZzK6Q==", "license": "MIT", + "engines": { + "node": ">= 18" + }, "peerDependencies": { - "@redis/client": "^1.0.0" + "@redis/client": "^5.1.1" } }, "node_modules/@redis/client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", - "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.1.1.tgz", + "integrity": "sha512-vojbBqUdbkD+ylCy3+ZDXLzSmgiYH9pLrv87kF+nDgsRaHKrVVxPV9B4u6EfWRx7XGvQGZqsXVkKFhsEOsG3LA==", "license": "MIT", "dependencies": { - "cluster-key-slot": "1.1.2", - "generic-pool": "3.9.0", - "yallist": "4.0.0" + "cluster-key-slot": "1.1.2" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@redis/graph": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", - "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" + "node": ">= 18" } }, "node_modules/@redis/json": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", - "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.1.1.tgz", + "integrity": "sha512-A5M0dcgxGKq+oE6spIPBcGLDBiwoSPTs2wesVb4x30rXfG6rPtqt1Z7fCMtvTL2kHUNRKgZ78zhD+0+MENZt7g==", "license": "MIT", + "engines": { + "node": ">= 18" + }, "peerDependencies": { - "@redis/client": "^1.0.0" + "@redis/client": "^5.1.1" } }, "node_modules/@redis/search": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", - "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.1.1.tgz", + "integrity": "sha512-bChudQmcqfYUxEGMeXMkljXtwse4hzqcqRwbZDwRyYe+EEeW/lXVl3w/mS2tHnAb2yqGnfDghid8iHEtVNqjww==", "license": "MIT", + "engines": { + "node": ">= 18" + }, "peerDependencies": { - "@redis/client": "^1.0.0" + "@redis/client": "^5.1.1" } }, "node_modules/@redis/time-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", - "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.1.1.tgz", + "integrity": "sha512-HPjZLfcZxh5mBLqRgx7KCZG6JXxGnb7yJqo9qZ/KMTWK/k3SWyH47DHJbYbRNzKOEkbK/l/5kikDTm79uJuCbg==", "license": "MIT", + "engines": { + "node": ">= 18" + }, "peerDependencies": { - "@redis/client": "^1.0.0" + "@redis/client": "^5.1.1" } }, "node_modules/@types/bluebird": { @@ -201,9 +202,9 @@ } }, "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz", + "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==", "dev": true, "license": "MIT", "dependencies": { @@ -220,22 +221,21 @@ } }, "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.2.tgz", + "integrity": "sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==", "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", + "@types/express-serve-static-core": "^5.0.0", "@types/serve-static": "*" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, "license": "MIT", "dependencies": { @@ -263,9 +263,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.16", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", - "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.17.tgz", + "integrity": "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==", "dev": true, "license": "MIT" }, @@ -293,18 +293,18 @@ } }, "node_modules/@types/node": { - "version": "22.13.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.11.tgz", - "integrity": "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==", + "version": "22.15.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.29.tgz", + "integrity": "sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "dev": true, "license": "MIT" }, @@ -358,9 +358,9 @@ "license": "MIT" }, "node_modules/@types/validator": { - "version": "13.12.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", - "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==", + "version": "13.15.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.1.tgz", + "integrity": "sha512-9gG6ogYcoI2mCMLdcO0NYI0AYrbxIjv0MDmy/5Ywo6CpWWrqYayc+mmgxRsCgtcGJm9BSbXkMsmxGah1iGHAAQ==", "license": "MIT" }, "node_modules/abbrev": { @@ -373,13 +373,13 @@ } }, "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { "node": ">= 0.6" @@ -415,12 +415,6 @@ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", "license": "MIT" }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -443,9 +437,9 @@ } }, "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -466,27 +460,23 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=18" } }, "node_modules/bottleneck": { @@ -559,22 +549,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cli-color": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", - "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.64", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.15", - "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -784,9 +758,9 @@ } }, "node_modules/connect-redis": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-8.0.3.tgz", - "integrity": "sha512-wLIaRv5csDWZsODD/X1vzfF9YKAYVfjJfzxsR6er0jqikM+i4GuBv06kgB8/O3QJWj5ANhYRoym/j1rL459v7g==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-8.1.0.tgz", + "integrity": "sha512-Km0EYLDlmExF52UCss5gLGTtrukGC57G6WCC2aqEMft5Vr4xNWuM4tL+T97kWrw+vp40SXFteb6Xk/7MxgpwdA==", "license": "MIT", "engines": { "node": ">=18" @@ -796,9 +770,9 @@ } }, "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -877,26 +851,21 @@ "node": ">= 8" } }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/delayed-stream": { @@ -917,16 +886,6 @@ "node": ">= 0.8" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/dottie": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", @@ -1043,58 +1002,6 @@ "node": ">= 0.4" } }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "license": "ISC", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -1110,21 +1017,6 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1134,56 +1026,42 @@ "node": ">= 0.6" } }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 18" }, "funding": { "type": "opencollective", @@ -1215,6 +1093,21 @@ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, + "node_modules/express-session/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express-session/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/express-validator": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.2.1.tgz", @@ -1228,22 +1121,13 @@ "node": ">= 8.0.0" } }, - "node_modules/express/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "node_modules/express/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "license": "ISC", - "dependencies": { - "type": "^2.7.2" + "node": ">=6.6.0" } }, "node_modules/fecha": { @@ -1253,18 +1137,17 @@ "license": "MIT" }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { "node": ">= 0.8" @@ -1327,6 +1210,27 @@ "node": ">= 6" } }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1337,12 +1241,12 @@ } }, "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/fs-extra": { @@ -1375,15 +1279,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/generic-pool": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", - "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1548,12 +1443,12 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -1631,9 +1526,9 @@ } }, "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, "node_modules/is-stream": { @@ -1746,27 +1641,12 @@ "node": ">= 12.0.0" } }, - "node_modules/logform/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==", - "license": "MIT" - }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", - "license": "MIT", - "dependencies": { - "es5-ext": "~0.10.2" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -1777,79 +1657,42 @@ } }, "node_modules/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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memoizee": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", - "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "es5-ext": "^0.10.64", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.12" + "node": ">= 0.8" } }, "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", + "engines": { + "node": ">=18" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" @@ -1910,9 +1753,9 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.47", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.47.tgz", - "integrity": "sha512-UbNt/JAWS0m/NJOebR0QMRHBk0hu03r5dx9GK8Cs0AS3I81yDcOc9k+DytPItgVvBP7J6Mf6U2n3BPAacAV9oA==", + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz", + "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==", "license": "MIT", "dependencies": { "moment": "^2.29.4" @@ -1922,15 +1765,15 @@ } }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/multer": { - "version": "1.4.5-lts.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.2.tgz", - "integrity": "sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.0.tgz", + "integrity": "sha512-bS8rPZurbAuHGAnApbM9d4h1wSoYqrOqkE+6a64KLMK9yWU7gJXBDDVklKQ3TPi9DRb85cRs6yXaC0+cjxRtRg==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", @@ -1942,23 +1785,60 @@ "xtend": "^4.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 10.16.0" } }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/multer/node_modules/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==", "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "license": "ISC" + "node_modules/multer/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/nopt": { "version": "7.2.1", @@ -2091,28 +1971,31 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } }, "node_modules/pg": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.15.1.tgz", - "integrity": "sha512-tC0r/yaCpAcWdYyjxtiNw9PCxlPJg+XJfm+Gzz1wpPTql5LYUHmYqXFEkJwpLEMKqpnevR/fqvXEa1O5O0sWiw==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.0.tgz", + "integrity": "sha512-7SKfdvP8CTNXjMUzfcVTaI+TDzBEeaUnVwiVGZQD1Hh33Kpev7liQba9uLd4CfN8r9mCVsD0JIpq03+Unpz+kg==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.8.1", - "pg-pool": "^3.9.1", - "pg-protocol": "^1.9.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" + "pg-connection-string": "^2.9.0", + "pg-pool": "^3.10.0", + "pg-protocol": "^1.10.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" }, "engines": { "node": ">= 8.0.0" }, "optionalDependencies": { - "pg-cloudflare": "^1.2.0" + "pg-cloudflare": "^1.2.5" }, "peerDependencies": { "pg-native": ">=3.0.1" @@ -2185,6 +2068,12 @@ "split2": "^4.1.0" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -2256,12 +2145,12 @@ "license": "MIT" }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -2289,14 +2178,14 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", - "iconv-lite": "0.4.24", + "iconv-lite": "0.6.3", "unpipe": "1.0.0" }, "engines": { @@ -2325,20 +2214,19 @@ "license": "MIT" }, "node_modules/redis": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", - "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-5.1.1.tgz", + "integrity": "sha512-4t6n2Q9aFqpQnqBR/g84zsXW+U0hdSzYymqoGGZk44p+kuzzHbgukjOAca+PlQ563TbXcgv1njerllYWjAWw4g==", "license": "MIT", - "workspaces": [ - "./packages/*" - ], "dependencies": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.6.0", - "@redis/graph": "1.1.1", - "@redis/json": "1.0.7", - "@redis/search": "1.2.0", - "@redis/time-series": "1.1.0" + "@redis/bloom": "5.1.1", + "@redis/client": "5.1.1", + "@redis/json": "5.1.1", + "@redis/search": "5.1.1", + "@redis/time-series": "5.1.1" + }, + "engines": { + "node": ">= 18" } }, "node_modules/reflect-metadata": { @@ -2382,6 +2270,22 @@ "integrity": "sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw==", "license": "MIT" }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2418,9 +2322,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2430,44 +2334,27 @@ } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" } }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/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==", - "license": "MIT" - }, "node_modules/sequelize": { "version": "6.37.7", "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.7.tgz", @@ -2531,15 +2418,15 @@ } }, "node_modules/sequelize-cli": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.6.2.tgz", - "integrity": "sha512-V8Oh+XMz2+uquLZltZES6MVAD+yEnmMfwfn+gpXcDiwE3jyQygLt4xoI0zG8gKt6cRcs84hsKnXAKDQjG/JAgg==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.6.3.tgz", + "integrity": "sha512-1YYPrcSRt/bpMDDSKM5ubY1mnJ2TEwIaGZcqITw4hLtGtE64nIqaBnLtMvH8VKHg6FbWpXTiFNc2mS/BtQCXZw==", "license": "MIT", "dependencies": { - "cli-color": "^2.0.3", "fs-extra": "^9.1.0", - "js-beautify": "^1.14.5", + "js-beautify": "1.15.4", "lodash": "^4.17.21", + "picocolors": "^1.1.1", "resolve": "^1.22.1", "umzug": "^2.3.0", "yargs": "^16.2.0" @@ -2622,48 +2509,25 @@ "node": "*" } }, - "node_modules/sequelize/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/sequelize/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==", - "license": "MIT" - }, "node_modules/serializr": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/serializr/-/serializr-3.0.4.tgz", - "integrity": "sha512-c7eDG9G4GM1lU48zud3n7adtlRXGNBnIee/E+cNVVMO42eIWJAjBFhXXx8IjD4yd5GYdXMMrPlDcMBBA2+hY9w==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/serializr/-/serializr-3.0.5.tgz", + "integrity": "sha512-LURwbNKR/IlqMuYudH43dFVry8fGHoV73UNvegTWlRv92X4OxODPdzMpSdnkTK55fmbUmlxC0vXu7OrZN/x2bw==", "license": "MIT" }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" } }, "node_modules/setprototypeof": { @@ -2950,19 +2814,6 @@ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "license": "MIT" }, - "node_modules/timers-ext": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", - "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -2987,20 +2838,15 @@ "node": ">= 14.0.0" } }, - "node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "license": "ISC" - }, "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { "node": ">= 0.6" @@ -3013,9 +2859,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3051,9 +2897,9 @@ } }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/universalify": { @@ -3080,15 +2926,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -3337,12 +3174,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/package.json b/package.json index 27f591b..7790e54 100644 --- a/package.json +++ b/package.json @@ -20,34 +20,34 @@ }, "homepage": "https://api.spotify-manager.knravish.me", "dependencies": { - "axios": "^1.8.4", + "axios": "^1.9.0", "bottleneck": "^2.19.5", - "connect-redis": "^8.0.3", + "connect-redis": "^8.1.0", "cookie-parser": "^1.4.7", "cors": "^2.8.5", - "express": "^4.21.2", + "express": "^5.1.0", "express-session": "^1.18.1", "express-validator": "^7.2.1", "helmet": "^8.1.0", - "multer": "^1.4.5-lts.2", - "pg": "^8.15.1", - "redis": "^4.7.0", + "multer": "^2.0.0", + "pg": "^8.16.0", + "redis": "^5.1.1", "reflect-metadata": "^0.2.2", "sequelize": "^6.37.7", - "sequelize-cli": "^6.6.2", + "sequelize-cli": "^6.6.3", "sequelize-typescript": "^2.1.6", - "serializr": "^3.0.4", + "serializr": "^3.0.5", "winston": "^3.17.0" }, "devDependencies": { "@types/cookie-parser": "^1.4.8", - "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", + "@types/cors": "^2.8.8", + "@types/express": "^5.0.2", "@types/express-session": "^1.18.1", "@types/multer": "^1.4.12", - "@types/node": "^22.13.11", + "@types/node": "^22.15.29", "@types/sequelize": "^4.28.20", - "@types/validator": "^13.12.2", - "typescript": "^5.8.2" + "@types/validator": "^13.15.1", + "typescript": "^5.8.3" } } diff --git a/validators/index.ts b/validators/index.ts index 47298a4..179f7b0 100644 --- a/validators/index.ts +++ b/validators/index.ts @@ -32,7 +32,7 @@ const validate: RequestHandler = (req, res, next) => { errors: extractedErrors, }); logger.warn("invalid request", { extractedErrors }); - return null; + return; }; export { validate };