diff --git a/hackclub-spotify-bot/.gitignore b/hackclub-spotify-bot/.gitignore index 819e52e..1be5c96 100644 --- a/hackclub-spotify-bot/.gitignore +++ b/hackclub-spotify-bot/.gitignore @@ -1,4 +1,3 @@ node_modules .env -db.json -data/* +db.json \ No newline at end of file diff --git a/hackclub-spotify-bot/TODO.md b/hackclub-spotify-bot/TODO.md deleted file mode 100644 index 7bf6c50..0000000 --- a/hackclub-spotify-bot/TODO.md +++ /dev/null @@ -1,15 +0,0 @@ -- [ ] Slack stuff -- - ~~[ ] web api [docs](https://tools.slack.dev/node-slack-sdk/web-api/)~~ -- - [x] send messages thru zeon https://github.com/NeonGamerBot-QK/slack-zeon/blob/092d324c7c58d37e2165ecf0a6798a983c75e7d2/src/modules/slackapp.ts#L19-L53 -- - [x] oauth [docs](https://tools.slack.dev/node-slack-sdk/oauth) -- - [ ] fix the [channel](https://app.slack.com/client/T0266FRGM/C07RE4N7S4B) -- - - [x] Add ping for new-song event & send message ovs -- [ ] Spotify -- - [x] web api [docs](https://developer.spotify.com/documentation/web-api/) -- - [x] oauth [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/) -- - [x] refresh token [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/#refresh-an-access-token) -- - [x] playlist tools (creation,modifcation,deletion) -- [x] keydb (quick db or smthing) -- [x] express -- [ ] transparency of added songs -- - [ ] export db -> into csv with properties (slack_id, url, added_at) diff --git a/hackclub-spotify-bot/package.json b/hackclub-spotify-bot/package.json index 88833ad..a62b1c4 100644 --- a/hackclub-spotify-bot/package.json +++ b/hackclub-spotify-bot/package.json @@ -8,16 +8,10 @@ }, "dependencies": { "@slack/oauth": "^3.0.1", - "better-sqlite3": "^11.3.0", + "@slack/web-api": "^7.6.0", "dotenv": "^16.4.5", "ejs": "^3.1.10", "express": "^4.21.1", - "express-session": "^1.18.1", - "quick.db": "^9.1.7", - "session-file-store": "^1.5.0", - "spotify-uri": "^4.1.0" - }, - "devDependencies": { - "express-status-monitor": "^1.3.4" + "express-session": "^1.18.1" } } diff --git a/hackclub-spotify-bot/.env.example b/hackclub-spotify-bot/src/.env.example similarity index 69% rename from hackclub-spotify-bot/.env.example rename to hackclub-spotify-bot/src/.env.example index 7395f7d..0b5bff2 100644 --- a/hackclub-spotify-bot/.env.example +++ b/hackclub-spotify-bot/src/.env.example @@ -3,5 +3,4 @@ SLACK_CLIENT_SECRET= SLACK_TOKEN= SPOTIFY_CLIENT_ID= SPOTIFY_CLIENT_SECRET= -SPOTIFY_REDIRECT_URI= -SLACK_REDIRECT_URI= \ No newline at end of file +SPOTIFY_REDIRECT_URI= \ No newline at end of file diff --git a/hackclub-spotify-bot/src/TODO.md b/hackclub-spotify-bot/src/TODO.md new file mode 100644 index 0000000..0a84465 --- /dev/null +++ b/hackclub-spotify-bot/src/TODO.md @@ -0,0 +1,15 @@ +- [ ] Slack stuff +- - [ ] web api [docs](https://tools.slack.dev/node-slack-sdk/web-api/) +- - [ ] oauth [docs](https://tools.slack.dev/node-slack-sdk/oauth) +- - [ ] fix the [channel](https://app.slack.com/client/T0266FRGM/C07RE4N7S4B) +- - - [ ] Add ping for new-song event & send message ovs +- [ ] Spotify +- - [ ] web api [docs](https://developer.spotify.com/documentation/web-api/) +- - [ ] oauth [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/) +- - [ ] refresh token [docs](https://developer.spotify.com/documentation/general/guides/authorization-guide/#refresh-an-access-token) +- - [ ] playlist tools (creation,modifcation,deletion) +- [ ] keydb (quick db or smthing) +- [ ] express +- [ ] transparency of added songs +- - [ ] export db -> into csv with properties (slack_id, slack_name, spotify_id, spotify_url) + diff --git a/hackclub-spotify-bot/src/index.js b/hackclub-spotify-bot/src/index.js index 98dca8d..81b86bd 100644 --- a/hackclub-spotify-bot/src/index.js +++ b/hackclub-spotify-bot/src/index.js @@ -1,60 +1,19 @@ const path = require("path"); -require("dotenv").config(); +require("dotenv").config({ path: path.join(__dirname, ".env") }); +console.debug(process.env); const express = require("express"); const session = require("express-session"); -const FileStore = require("session-file-store")(session); -const { InstallProvider, FileInstallationStore } = require("@slack/oauth"); -const { - getLoginUrl, - refreshToken, - getCredentials, - saveCredentials, - spotifyRoutes, - addSongToPlaylist, -} = require("./spotify"); -const { QuickDB } = require("quick.db"); +const { WebClient } = require("@slack/web-api"); +const { InstallProvider } = require("@slack/oauth"); +const { getLoginUrl, refreshToken } = require("./spotify"); -const db = new QuickDB({ - filePath: "./data/songs.sqlite", -}); -let cacheDb = {}; const app = express(); -const userScopes = ["identity.avatar", "identity.basic", "identity.team"]; // Initialize +const web = new WebClient(process.env.SLACK_TOKEN); const oauth = new InstallProvider({ clientId: process.env.SLACK_CLIENT_ID, clientSecret: process.env.SLACK_CLIENT_SECRET, - stateSecret: process.env.STATE_SECRET, - stateVerification: false, - stateStore: new FileInstallationStore( - path.join(__dirname, "../data/states.json"), - ), - installationStore: new FileInstallationStore( - path.join(__dirname, "../data/installations.json"), - ), - // installationStore: { - - //} - stateStore: { - generateStateParam: (installUrlOptions, date) => { - // generate a random string to use as state in the URL - const randomState = - process.env.STATE_SECRET + Math.random().toString(36).substring(7); - // save installOptions to cache/db - cacheDb[randomState] = installUrlOptions; - // myDB.set(randomState, installUrlOptions); - // return a state string that references saved options in DB - return randomState; - }, - // verifyStateParam's first argument is a date object and the second argument is a string representing the state - // verifyStateParam is expected to return an object representing installUrlOptions - verifyStateParam: (date, state) => { - return cacheDb[state]; - // fetch saved installOptions from DB using state reference - const installUrlOptions = myDB.get(randomState); - return installUrlOptions; - }, - }, + stateSecret: Math.random().toString(36).substring(2), }); app.use(express.json()); app.use(express.static(path.join(__dirname, "public"))); @@ -63,170 +22,24 @@ app.set("views", "src/views"); app.use(express.urlencoded({ extended: true })); app.use( session({ - secret: process.env.STATE_SECRET, - resave: true, - store: new FileStore({ - path: path.join(__dirname, "../data/sessions"), - }), + secret: Math.random().toString(36).substring(2), + resave: false, saveUninitialized: true, - cookie: { secure: "auto", maxAge: 1000 * 60 * 60 * 24 * 365 }, + cookie: { secure: true }, }), ); -try { - const statusMonitor = require("express-status-monitor")({ - healthChecks: [ - { - protocol: "http", - host: "localhost", - port: 3000, - path: "/", - timeout: 1000, - interval: 1000, - }, - ], - }); - app.use(statusMonitor); - app.use((req, res, next) => { - // console.debug([req.headers, req.session]) - next(); - }); -} catch (e) { - // we can ignore since this is an optional dependency -} - -app.get("/login", async (req, res) => { - if (req.session.token) { - res.redirect("/home"); - } else { - res.redirect( - await oauth.generateInstallUrl({ - // Add the scopes your app needs - redirectUri: process.env.SLACK_REDIRECT_URI, - scopes: [], - - userScopes: userScopes, - }), - ); - } -}); -app.get("/slack/callback", (req, res) => { - // console.debug(req.headers, req.url) - oauth.handleCallback(req, res, { - success: async (install) => { - // typings - // user: { token:string , scopes: string[], id: string} - // console.log(install) - req.session.info = install; - req.session.token = install.user.token; - res.redirect("/home"); - }, - failure: (err) => { - console.log(err); - res.send( - "Failed to install!, please contact neon in the slack!, \n" + err.stack, - ); - }, - }); -}); -app.get("/logout", (req, res) => { - req.session.destroy(); - res.redirect("/"); -}); app.get("/", (req, res) => { res.render("index", { title: "Hack Club Spotify Bot", description: "Contribute to the hackclub spotify playlist!", }); }); -const errorStrings = [ - "Invalid CSRF Token!", // token = csrf token - "Song is not a track! (or not even a spotify song url)", - "Song already exists in the database! (its in the playlist or banned from the playlist)", -]; -app.get("/home", async (req, res) => { - if (!req.session.info) return res.redirect("/login"); - let onetimetoken = Math.random().toString(36).substring(7); - cacheDb[onetimetoken] = true; - res.render("home", { - title: "Hack Club Spotify Bot", - description: "Contribute to the hackclub spotify playlist!", - userinfo: req.session.info, - onetimetoken, - error: errorStrings[req.query.error], - s: req.query.s, - }); -}); -app.post("/spotify/submitsong", async (req, res) => { - if (!req.session.token) return res.redirect("/login"); - if (!cacheDb[req.query.token]) return res.redirect(`/home?error=0`); - delete cacheDb[req.query.token]; - - const songurl = req.body.songurl; - - const songuriinfo = require("spotify-uri").parse(songurl); - if (songuriinfo.type !== "track") return res.redirect(`/home?error=1`); - const alreadyExists = await db.has(songuriinfo.id); - if (alreadyExists) return res.redirect(`/home?error=2`); - const formattedURI = require("spotify-uri").formatURI(songuriinfo); - await db.set(songuriinfo.id, { - song_url: songurl, - added_by: req.session.info.user.id, - added_at: Date.now(), - }); - addSongToPlaylist(formattedURI); - fetch("https://slack.mybot.saahild.com/send-private", { - method: "POST", - body: JSON.stringify({ - channel: "C07RE4N7S4B", - text: `:new_spotify: New Song: ${songurl} - added by <@${req.session.info.user.id}>`, - }), - headers: { - Authorization: process.env.AUTH_FOR_ZEON, - "Content-Type": "application/json", - }, - }) - .then((r) => r.json()) - .then((d) => { - fetch("https://slack.mybot.saahild.com/send-private", { - method: "POST", - body: JSON.stringify({ - channel: "C07RE4N7S4B", - thread_ts: d.ts, - text: `:thread: Responses about new song here please!`, - }), - headers: { - Authorization: process.env.AUTH_FOR_ZEON, - "Content-Type": "application/json", - }, - }); - }); - if (!process.env.TESTING) { - fetch("https://slack.mybot.saahild.com/send-private", { - method: "POST", - body: JSON.stringify({ - channel: "C07RE4N7S4B", - text: ``, - }), - headers: { - Authorization: process.env.AUTH_FOR_ZEON, - "Content-Type": "application/json", - }, - }); +app.get("/login", async (req, res) => { + if (req.session.token) { } - res.redirect("/home?s=1"); -}); -app.get("/spotify/link", async (req, res) => { - if (!req.session.info) return res.redirect("/login"); - if (req.session.info.user.id !== "U07L45W79E1") - return res.status(401).end("unauthorized"); - res.redirect(getLoginUrl()); }); -spotifyRoutes(app); - -app.listen(process.env.PORT || 3000, async () => { +app.listen(process.env.PORT || 3000, () => { console.log("Example app listening on port 3000!"); - // if(!await db.has()) - if (getCredentials() !== null) refreshToken(getCredentials().refresh_token); }); diff --git a/hackclub-spotify-bot/src/public/hackclub.css b/hackclub-spotify-bot/src/public/hackclub.css index feb83cb..1816be0 100644 --- a/hackclub-spotify-bot/src/public/hackclub.css +++ b/hackclub-spotify-bot/src/public/hackclub.css @@ -1,635 +1,589 @@ -/* modified version of https://css.hackclub.com/theme.css */ -:root { - /* why are the css vars swapped with incorrect names? well im to lazy to fix it. */ - --darker: #121217; - --dark: #f9fafc; - --darkless: #e0e6ed; - --black: #fff; - --steel: #273444; - --slate: #3c4858; - --muted: #8492a6; - --smoke: #252429; - --snow: #17171d; - --white: #1f2d3d; - --red: #ec3750; - --orange: #ff8c37; - --yellow: #f1c40f; - --green: #33d6a6; - --cyan: #5bc0de; - --blue: #338eda; - --purple: #a633d6; - --text: var(--black); - --background: var(--white); - --elevated: var(--white); - --sheet: var(--snow); - --sunken: var(--smoke); - --border: var(--smoke); - --primary: #ec3750; - --secondary: #8492a6; - --accent: #5bc0de; - --twitter: #1da1f2; - --facebook: #3b5998; - --instagram: #e1306c; - --breakpoint-xs: 32em; - --breakpoint-s: 48em; - --breakpoint-m: 64em; - --breakpoint-l: 96em; - --breakpoint-xl: 128em; - --spacing-0: 0px; - --spacing-1: 4px; - --spacing-2: 8px; - --spacing-3: 16px; - --spacing-4: 32px; - --spacing-5: 64px; - --spacing-6: 128px; - --spacing-7: 256px; - --spacing-8: 512px; - --font-1: 12px; - --font-2: 16px; - --font-3: 20px; - --font-4: 24px; - --font-5: 32px; - --font-6: 48px; - --font-7: 64px; - --font-8: 96px; - --font-9: 128px; - --font-10: 160px; - --font-11: 192px; - --line-height-limit: 0.875; - --line-height-title: 1; - --line-height-heading: 1.125; - --line-height-subheading: 1.25; - --line-height-caption: 1.375; - --line-height-body: 1.5; - --font-weight-body: 400; - --font-weight-bold: 700; - --font-weight-heading: var(--font-weight-bold); - --letter-spacing-title: -0.009em; - --letter-spacing-headline: 0.009em; - --size-wide-plus: 2048px; - --size-wide: 1536px; - --size-layout-plus: 1200px; - --size-layout: 1024px; - --size-copy-ultra: 980px; - --size-copy-plus: 768px; - --size-copy: 680px; - --size-narrow-plus: 600px; - --size-narrow: 512px; - --radii-small: 4px; - --radii-default: 8px; - --radii-extra: 12px; - --radii-ultra: 16px; - --radii-circle: 99999px; - --shadow-text: 0 1px 2px rgba(0, 0, 0, 0.25), 0 2px 4px rgba(0, 0, 0, 0.125); - --shadow-small: 0 1px 2px rgba(0, 0, 0, 0.0625), - 0 2px 4px rgba(0, 0, 0, 0.0625); - --shadow-card: 0 4px 8px rgba(0, 0, 0, 0.125); - --shadow-elevated: 0 1px 2px rgba(0, 0, 0, 0.0625), - 0 8px 12px rgba(0, 0, 0, 0.125); -} - -body { - font-family: - "Phantom Sans", - system-ui, - -apple-system, - BlinkMacSystemFont, - "Segoe UI", - Roboto, - sans-serif; - line-height: var(--line-height-body); - font-weight: var(--font-weight-body); - margin: 0; - min-height: 100vh; - text-rendering: optimizeLegibility; - font-smooth: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - color: var(--text); - background-color: var(--background); - box-sizing: border-box; -} - -* { - box-sizing: border-box; -} - -.monospace { - font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; -} - -.heading { - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; -} - -.ultratitle { - font-weight: var(--font-weight-bold); - line-height: var(--line-height-limit); - letter-spacing: var(--letter-spacing-title); -} - -.title { - font-weight: var(--font-weight-bold); - line-height: var(--line-height-title); - letter-spacing: var(--letter-spacing-title); -} - -.subtitle { - margin-top: var(--spacing-3); - font-weight: var(--font-weight-body); - line-height: var(--line-height-subheading); - letter-spacing: var(--letter-spacing-headline); -} - -.headline { - margin-top: var(--spacing-3); - margin-bottom: var(--spacing-3); - font-size: var(--font-4); - line-height: var(--line-height-heading); - letter-spacing: var(--letter-spacing-headline); -} - -.subheadline { - margin-top: var(--spacing-0); - margin-bottom: var(--spacing-3); - font-size: var(--font-2); - line-height: var(--line-height-heading); - letter-spacing: var(--letter-spacing-headline); -} - -.eyebrow { - color: var(--muted); - font-weight: var(--font-weight-heading); - letter-spacing: var(--letter-spacing-headline); - line-height: var(--line-height-subheading); - text-transform: uppercase; - margin-top: var(--spacing-0); - margin-bottom: var(--spacing-2); -} - -.lead { - font-weight: var(--font-weight-body); -} - -.caption { - color: var(--muted); - font-weight: var(--font-weight-body); - letter-spacing: var(--letter-spacing-headline); - line-height: var(--line-height-caption); -} - -.pill { - border-radius: var(--radii-circle); - padding-left: var(--spacing-3); - padding-right: var(--spacing-3); - padding-top: var(--spacing-1); - padding-bottom: var(--spacing-1); - font-size: var(--font-2); - background: var(--primary); - color: var(--background); - font-weight: var(--font-weight-bold); -} - -.outline-badge { - border-radius: var(--radii-circle); - padding-left: var(--spacing-3); - padding-right: var(--spacing-3); - padding-top: var(--spacing-1); - padding-bottom: var(--spacing-1); - font-size: var(--font-2); - background: none; - color: var(--muted); - border: 1px solid currentcolor; - font-weight: var(--font-weight-body); -} - -button { - cursor: pointer; - font-family: inherit; - font-weight: var(--font-weight-bold); - border-radius: var(--radii-circle); - display: inline-flex; - align-items: center; - justify-content: center; - box-shadow: var(--shadow-card); - letter-spacing: var(--letter-spacing-headline); - -webkit-tap-highlight-color: transparent; - transition: - transform 0.125s ease-in-out, - box-shadow 0.125s ease-in-out; - box-sizing: border-box; - margin: 0; - min-width: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - text-align: center; - line-height: inherit; - -webkit-text-decoration: none; - text-decoration: none; - padding-left: 16px; - padding-right: 16px; - padding-top: 8px; - padding-bottom: 8px; - color: var(--theme-ui-colors-white, #ffffff); - background-color: var(--theme-ui-colors-primary, #ec3750); - border: 0; - font-size: var(--font-2); -} - -button:focus, -button:hover { - box-shadow: var(--shadow-elevated); - transform: scale(1.0625); -} -.button { - cursor: pointer; - font-family: inherit; - font-weight: var(--font-weight-bold); - border-radius: var(--radii-circle); - display: inline-flex; - align-items: center; - justify-content: center; - box-shadow: var(--shadow-card); - letter-spacing: var(--letter-spacing-headline); - -webkit-tap-highlight-color: transparent; - transition: - transform 0.125s ease-in-out, - box-shadow 0.125s ease-in-out; - box-sizing: border-box; - margin: 0; - min-width: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - text-align: center; - line-height: inherit; - -webkit-text-decoration: none; - text-decoration: none; - padding-left: 16px; - padding-right: 16px; - padding-top: 8px; - padding-bottom: 8px; - color: var(--theme-ui-colors-white, #ffffff); - background-color: var(--theme-ui-colors-primary, #ec3750); - border: 0; - font-size: var(--font-2); -} - -.button:focus, -.button:hover { - box-shadow: var(--shadow-elevated); - transform: scale(1.0625); -} -button.lg { - font-size: var(--font-3) !important; - line-height: var(--line-height-title); - padding-left: var(--spacing-4); - padding-right: var(--spacing-4); - padding-top: var(--spacing-3); - padding-bottom: var(--spacing-3); -} - -button.outline { - background: none; - color: var(--primary); - border: 2px solid currentcolor; -} - -button.cta { - font-size: var(--font-2); - background-image: radial-gradient( - ellipse farthest-corner at top left, - var(--orange), - var(--red) - ); -} - -.card { - background: var(--elevated); - color: var(--text); - border-radius: var(--radii-extra); - box-shadow: var(--shadow-card); - overflow: hidden; -} - -.card.sunken { - background: var(--sunken); - box-shadow: none; -} - -.card.interactive { - text-decoration: none; - -webkit-tap-highlight-color: transparent; - transition: - transform 0.125s ease-in-out, - box-shadow 0.125s ease-in-out; -} - -.card.interactive:hover, -.card.interactive:focus { - transform: scale(1.0625); - box-shadow: var(--shadow-elevated); -} - -input, -textarea, -select { - background: var(--elevated); - color: var(--text); - font-family: inherit; - border-radius: var(--radii-small); - border: 0; - font-size: inherit; - padding: var(--spacing-2); - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -input::-webkit-input-placeholder, -input::-moz-placeholder, -input:-ms-input-placeholder, -textarea::-webkit-input-placeholder, -textarea::-moz-placeholder, -textarea:-ms-input-placeholder, -select::-webkit-input-placeholder, -select::-moz-placeholder, -select:-ms-input-placeholder { - color: var(--muted); -} - -input[type="search"]::-webkit-search-decoration, -textarea[type="search"]::-webkit-search-decoration, -select[type="search"]::-webkit-search-decoration { - display: none; -} - -input[type="checkbox"] { - -webkit-appearance: checkbox; - -moz-appearance: checkbox; - appearance: checkbox; -} - -label { - color: var(--text); - display: flex; - flex-direction: column; - text-align: left; - line-height: var(--line-height-caption); - font-size: var(--font-3); -} - -label.horizontal { - display: flex; -} - -.slider { - color: var(--primary); -} - -.form-hidden { - position: absolute; - height: 1px; - width: 1px; - clip: rect(1px, 1px, 1px, 1px); - white-space: nowrap; -} - -.container { - width: 100%; - margin: auto; - padding-left: var(--spacing-3); - padding-right: var(--spacing-3); -} - -h1 { - font-size: var(--font-5); - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; -} - -h2 { - font-size: var(--font-4); - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; -} - -h3 { - font-size: var(--font-3); - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; -} - -h4 { - font-size: var(--font-2); - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; -} - -h5 { - font-size: var(--font-1); - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; -} - -h6 { - font-weight: var(--font-weight-bold); - line-height: var(--line-height-heading); - margin-top: 0; - margin-bottom: 0; -} - -p { - color: var(--text); - font-weight: var(--font-weight-body); - line-height: var(--line-height-body); - margin-top: var(--spacing-3); - margin-bottom: var(--spacing-3); -} - -img { - max-width: 100%; -} - -hr { - border: 0; - border-bottom: 1px solid var(--border); -} - -a { - color: var(--primary); - text-decoration: underline; - text-underline-position: under; -} - -a:focus, -a:hover { - text-decoration-style: wavy; - text-decoration-skip-ink: none; -} - -pre { - font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; - font-size: var(--font-1); - padding: var(--spacing-3); - color: var(--text); - background: var(--sunken); - overflow: auto; - border-radius: var(--radii-default); - white-space: inherit; -} - -pre > code { - color: inherit; - margin-left: 0; - margin-right: 0; - padding-left: 0; - padding-right: 0; -} - -code { - font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; - font-size: inherit; - color: var(--purple); - background: var(--sunken); - overflow: auto; - border-radius: var(--radii-small); - margin-left: var(--spacing-1); - margin-right: var(--spacing-1); - padding-left: var(--spacing-1); - padding-right: var(--spacing-1); -} - -p > code, -li > code { - color: var(--blue); - font-size: 0.875em; -} - -p > a > code, -li > a > code { - color: var(--blue); - font-size: 0.875em; -} - -li { - margin-top: var(--spacing-2); - margin-bottom: var(--spacing-2); -} - -table { - width: 100%; - margin-top: var(--spacing-4); - margin-bottom: var(--spacing-4); - border-collapse: separate; - border-spacing: 0; -} - -table > th, -table > td { - text-align: left; - padding: 4px; - padding-left: 0px; - border-color: var(--border); - border-bottom-style: solid; -} - -th { - vertical-align: bottom; - border-bottom-width: 2px; -} - -td { - vertical-align: top; - border-bottom-width: 1px; -} - -@media screen and (min-width: 32em) { - .ultratitle { - font-size: var(--font-5); - } - .title { - font-size: var(--font-4); - } - .subtitle { - font-size: var(--font-2); - } - .eyebrow { - font-size: var(--font-3); - } - .lead { - font-size: var(--font-2); - margin-top: var(--spacing-2); - margin-bottom: var(--spacing-2); - } - .card { - padding: var(--spacing-3); - } - .container { - max-width: var(--size-layout); - } - .container.copy { - max-width: var(--size-copy); - } - .container.narrow { - max-width: var(--size-narrow); - } -} - -@media screen and (min-width: 48em) { - .ultratitle { - font-size: var(--font-6); - } - .title { - font-size: var(--font-5); - } - .subtitle { - font-size: var(--font-3); - } - .eyebrow { - font-size: var(--font-4); - } - .lead { - font-size: var(--font-3); - margin-top: var(--spacing-3); - margin-bottom: var(--spacing-3); - } - .card { - padding: var(--spacing-4); - } -} - -@media screen and (min-width: 64em) { - .ultratitle { - font-size: var(--font-7); - } - .title { - font-size: var(--font-6); - } - .container { - max-width: var(--size-layout-plus); - } - .container.wide { - max-width: var(--size-wide); - } - .container.copy { - max-width: var(--size-copy-plus); - } - .container.narrow { - max-width: var(--size-narrow-plus); - } -} +/* modified version of https://css.hackclub.com/theme.css */ +:root { + /* why are the css vars swapped with incorrect names? well im to lazy to fix it. */ + --darker: #121217; + --dark: #f9fafc; + --darkless: #e0e6ed; + --black: #fff; + --steel: #273444; + --slate: #3c4858; + --muted: #8492a6; + --smoke: #252429; + --snow: #17171d; + --white: #1f2d3d; + --red: #ec3750; + --orange: #ff8c37; + --yellow: #f1c40f; + --green: #33d6a6; + --cyan: #5bc0de; + --blue: #338eda; + --purple: #a633d6; + --text: var(--black); + --background: var(--white); + --elevated: var(--white); + --sheet: var(--snow); + --sunken: var(--smoke); + --border: var(--smoke); + --primary: #ec3750; + --secondary: #8492a6; + --accent: #5bc0de; + --twitter: #1da1f2; + --facebook: #3b5998; + --instagram: #e1306c; + --breakpoint-xs: 32em; + --breakpoint-s: 48em; + --breakpoint-m: 64em; + --breakpoint-l: 96em; + --breakpoint-xl: 128em; + --spacing-0: 0px; + --spacing-1: 4px; + --spacing-2: 8px; + --spacing-3: 16px; + --spacing-4: 32px; + --spacing-5: 64px; + --spacing-6: 128px; + --spacing-7: 256px; + --spacing-8: 512px; + --font-1: 12px; + --font-2: 16px; + --font-3: 20px; + --font-4: 24px; + --font-5: 32px; + --font-6: 48px; + --font-7: 64px; + --font-8: 96px; + --font-9: 128px; + --font-10: 160px; + --font-11: 192px; + --line-height-limit: 0.875; + --line-height-title: 1; + --line-height-heading: 1.125; + --line-height-subheading: 1.25; + --line-height-caption: 1.375; + --line-height-body: 1.5; + --font-weight-body: 400; + --font-weight-bold: 700; + --font-weight-heading: var(--font-weight-bold); + --letter-spacing-title: -0.009em; + --letter-spacing-headline: 0.009em; + --size-wide-plus: 2048px; + --size-wide: 1536px; + --size-layout-plus: 1200px; + --size-layout: 1024px; + --size-copy-ultra: 980px; + --size-copy-plus: 768px; + --size-copy: 680px; + --size-narrow-plus: 600px; + --size-narrow: 512px; + --radii-small: 4px; + --radii-default: 8px; + --radii-extra: 12px; + --radii-ultra: 16px; + --radii-circle: 99999px; + --shadow-text: 0 1px 2px rgba(0, 0, 0, 0.25), 0 2px 4px rgba(0, 0, 0, 0.125); + --shadow-small: 0 1px 2px rgba(0, 0, 0, 0.0625), + 0 2px 4px rgba(0, 0, 0, 0.0625); + --shadow-card: 0 4px 8px rgba(0, 0, 0, 0.125); + --shadow-elevated: 0 1px 2px rgba(0, 0, 0, 0.0625), + 0 8px 12px rgba(0, 0, 0, 0.125); + } + + body { + font-family: "Phantom Sans", system-ui, -apple-system, BlinkMacSystemFont, + "Segoe UI", Roboto, sans-serif; + line-height: var(--line-height-body); + font-weight: var(--font-weight-body); + margin: 0; + min-height: 100vh; + text-rendering: optimizeLegibility; + font-smooth: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + color: var(--text); + background-color: var(--background); + box-sizing: border-box; + } + + * { + box-sizing: border-box; + } + + .monospace { + font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; + } + + .heading { + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + .ultratitle { + font-weight: var(--font-weight-bold); + line-height: var(--line-height-limit); + letter-spacing: var(--letter-spacing-title); + } + + .title { + font-weight: var(--font-weight-bold); + line-height: var(--line-height-title); + letter-spacing: var(--letter-spacing-title); + } + + .subtitle { + margin-top: var(--spacing-3); + font-weight: var(--font-weight-body); + line-height: var(--line-height-subheading); + letter-spacing: var(--letter-spacing-headline); + } + + .headline { + margin-top: var(--spacing-3); + margin-bottom: var(--spacing-3); + font-size: var(--font-4); + line-height: var(--line-height-heading); + letter-spacing: var(--letter-spacing-headline); + } + + .subheadline { + margin-top: var(--spacing-0); + margin-bottom: var(--spacing-3); + font-size: var(--font-2); + line-height: var(--line-height-heading); + letter-spacing: var(--letter-spacing-headline); + } + + .eyebrow { + color: var(--muted); + font-weight: var(--font-weight-heading); + letter-spacing: var(--letter-spacing-headline); + line-height: var(--line-height-subheading); + text-transform: uppercase; + margin-top: var(--spacing-0); + margin-bottom: var(--spacing-2); + } + + .lead { + font-weight: var(--font-weight-body); + } + + .caption { + color: var(--muted); + font-weight: var(--font-weight-body); + letter-spacing: var(--letter-spacing-headline); + line-height: var(--line-height-caption); + } + + .pill { + border-radius: var(--radii-circle); + padding-left: var(--spacing-3); + padding-right: var(--spacing-3); + padding-top: var(--spacing-1); + padding-bottom: var(--spacing-1); + font-size: var(--font-2); + background: var(--primary); + color: var(--background); + font-weight: var(--font-weight-bold); + } + + .outline-badge { + border-radius: var(--radii-circle); + padding-left: var(--spacing-3); + padding-right: var(--spacing-3); + padding-top: var(--spacing-1); + padding-bottom: var(--spacing-1); + font-size: var(--font-2); + background: none; + color: var(--muted); + border: 1px solid currentcolor; + font-weight: var(--font-weight-body); + } + + button { + cursor: pointer; + font-family: inherit; + font-weight: var(--font-weight-bold); + border-radius: var(--radii-circle); + display: inline-flex; + align-items: center; + justify-content: center; + box-shadow: var(--shadow-card); + letter-spacing: var(--letter-spacing-headline); + -webkit-tap-highlight-color: transparent; + transition: transform 0.125s ease-in-out, box-shadow 0.125s ease-in-out; + box-sizing: border-box; + margin: 0; + min-width: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + text-align: center; + line-height: inherit; + -webkit-text-decoration: none; + text-decoration: none; + padding-left: 16px; + padding-right: 16px; + padding-top: 8px; + padding-bottom: 8px; + color: var(--theme-ui-colors-white, #ffffff); + background-color: var(--theme-ui-colors-primary, #ec3750); + border: 0; + font-size: var(--font-2); + } + + button:focus, + button:hover { + box-shadow: var(--shadow-elevated); + transform: scale(1.0625); + } + + button.lg { + font-size: var(--font-3)!important; + line-height: var(--line-height-title); + padding-left: var(--spacing-4); + padding-right: var(--spacing-4); + padding-top: var(--spacing-3); + padding-bottom: var(--spacing-3); + } + + button.outline { + background: none; + color: var(--primary); + border: 2px solid currentcolor; + } + + button.cta { + font-size: var(--font-2); + background-image: radial-gradient( + ellipse farthest-corner at top left, + var(--orange), + var(--red) + ); + } + + .card { + background: var(--elevated); + color: var(--text); + border-radius: var(--radii-extra); + box-shadow: var(--shadow-card); + overflow: hidden; + } + + .card.sunken { + background: var(--sunken); + box-shadow: none; + } + + .card.interactive { + text-decoration: none; + -webkit-tap-highlight-color: transparent; + transition: transform 0.125s ease-in-out, box-shadow 0.125s ease-in-out; + } + + .card.interactive:hover, + .card.interactive:focus { + transform: scale(1.0625); + box-shadow: var(--shadow-elevated); + } + + input, + textarea, + select { + background: var(--elevated); + color: var(--text); + font-family: inherit; + border-radius: var(--radii-small); + border: 0; + font-size: inherit; + padding: var(--spacing-2); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + } + + input::-webkit-input-placeholder, + input::-moz-placeholder, + input:-ms-input-placeholder, + textarea::-webkit-input-placeholder, + textarea::-moz-placeholder, + textarea:-ms-input-placeholder, + select::-webkit-input-placeholder, + select::-moz-placeholder, + select:-ms-input-placeholder { + color: var(--muted); + } + + input[type="search"]::-webkit-search-decoration, + textarea[type="search"]::-webkit-search-decoration, + select[type="search"]::-webkit-search-decoration { + display: none; + } + + input[type="checkbox"] { + -webkit-appearance: checkbox; + -moz-appearance: checkbox; + appearance: checkbox; + } + + label { + color: var(--text); + display: flex; + flex-direction: column; + text-align: left; + line-height: var(--line-height-caption); + font-size: var(--font-3); + } + + label.horizontal { + display: flex; + } + + .slider { + color: var(--primary); + } + + .form-hidden { + position: absolute; + height: 1px; + width: 1px; + clip: rect(1px, 1px, 1px, 1px); + white-space: nowrap; + } + + .container { + width: 100%; + margin: auto; + padding-left: var(--spacing-3); + padding-right: var(--spacing-3); + } + + h1 { + font-size: var(--font-5); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + h2 { + font-size: var(--font-4); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + h3 { + font-size: var(--font-3); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + h4 { + font-size: var(--font-2); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + h5 { + font-size: var(--font-1); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + h6 { + font-weight: var(--font-weight-bold); + line-height: var(--line-height-heading); + margin-top: 0; + margin-bottom: 0; + } + + p { + color: var(--text); + font-weight: var(--font-weight-body); + line-height: var(--line-height-body); + margin-top: var(--spacing-3); + margin-bottom: var(--spacing-3); + } + + img { + max-width: 100%; + } + + hr { + border: 0; + border-bottom: 1px solid var(--border); + } + + a { + color: var(--primary); + text-decoration: underline; + text-underline-position: under; + } + + a:focus, + a:hover { + text-decoration-style: wavy; + text-decoration-skip-ink: none; + } + + pre { + font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; + font-size: var(--font-1); + padding: var(--spacing-3); + color: var(--text); + background: var(--sunken); + overflow: auto; + border-radius: var(--radii-default); + white-space: inherit; + } + + pre > code { + color: inherit; + margin-left: 0; + margin-right: 0; + padding-left: 0; + padding-right: 0; + } + + code { + font-family: "SF Mono", "Roboto Mono", Menlo, Consolas, monospace; + font-size: inherit; + color: var(--purple); + background: var(--sunken); + overflow: auto; + border-radius: var(--radii-small); + margin-left: var(--spacing-1); + margin-right: var(--spacing-1); + padding-left: var(--spacing-1); + padding-right: var(--spacing-1); + } + + p > code, + li > code { + color: var(--blue); + font-size: 0.875em; + } + + p > a > code, + li > a > code { + color: var(--blue); + font-size: 0.875em; + } + + li { + margin-top: var(--spacing-2); + margin-bottom: var(--spacing-2); + } + + table { + width: 100%; + margin-top: var(--spacing-4); + margin-bottom: var(--spacing-4); + border-collapse: separate; + border-spacing: 0; + } + + table > th, + table > td { + text-align: left; + padding: 4px; + padding-left: 0px; + border-color: var(--border); + border-bottom-style: solid; + } + + th { + vertical-align: bottom; + border-bottom-width: 2px; + } + + td { + vertical-align: top; + border-bottom-width: 1px; + } + + + @media screen and (min-width: 32em) { + .ultratitle { + font-size: var(--font-5); + } + .title { + font-size: var(--font-4); + } + .subtitle { + font-size: var(--font-2); + } + .eyebrow { + font-size: var(--font-3); + } + .lead { + font-size: var(--font-2); + margin-top: var(--spacing-2); + margin-bottom: var(--spacing-2); + } + .card { + padding: var(--spacing-3); + } + .container { + max-width: var(--size-layout); + } + .container.copy { + max-width: var(--size-copy); + } + .container.narrow { + max-width: var(--size-narrow); + } + } + + @media screen and (min-width: 48em) { + .ultratitle { + font-size: var(--font-6); + } + .title { + font-size: var(--font-5); + } + .subtitle { + font-size: var(--font-3); + } + .eyebrow { + font-size: var(--font-4); + } + .lead { + font-size: var(--font-3); + margin-top: var(--spacing-3); + margin-bottom: var(--spacing-3); + } + .card { + padding: var(--spacing-4); + } + } + + @media screen and (min-width: 64em) { + .ultratitle { + font-size: var(--font-7); + } + .title { + font-size: var(--font-6); + } + .container { + max-width: var(--size-layout-plus); + } + .container.wide { + max-width: var(--size-wide); + } + .container.copy { + max-width: var(--size-copy-plus); + } + .container.narrow { + max-width: var(--size-narrow-plus); + } + } + \ No newline at end of file diff --git a/hackclub-spotify-bot/src/spotify.js b/hackclub-spotify-bot/src/spotify.js index b444435..4caa082 100644 --- a/hackclub-spotify-bot/src/spotify.js +++ b/hackclub-spotify-bot/src/spotify.js @@ -1,199 +1,113 @@ -let token = null; -let authStuff = null; -const client_id = process.env.SPOTIFY_CLIENT_ID; -const client_secret = process.env.SPOTIFY_CLIENT_SECRET; -const redirect_uri = process.env.SPOTIFY_REDIRECT_URI; -async function fetchWebApi(endpoint, method, body) { - const res = await fetch(`https://api.spotify.com/${endpoint}`, { - headers: { - Authorization: `Bearer ${token}`, - }, - method, - body: JSON.stringify(body), - }); - const text = await res.text(); - // console.debug(text) - // abs nothing is wrong - return JSON.parse(text.trim()); -} - -function getLoginUrl() { - const state = generateRandomString(16); - const scope = [ - // "ugc-image-upload", - // "user-read-playback-state", - // "user-modify-playback-state", - // "user-read-currently-playing", - // "app-remote-control", - // "streaming", - "playlist-read-private", - "playlist-read-collaborative", - "playlist-modify-private", - "playlist-modify-public", - // "user-follow-modify", - // "user-follow-read", - // "user-read-playback-position", - // "user-top-read", - // "user-read-recently-played", - "user-library-modify", - // "user-library-read", - // "user-read-email", - "user-read-private", - ].join(" "); - - return ( - "https://accounts.spotify.com/authorize?" + - `response_type=code&grant_type=client_credentials&client_id=${client_id}&scope=${scope}&redirect_uri=${redirect_uri}&state=${state}` - ); -} - -function generateRandomString(length) { - let result = ""; - const characters = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - const charactersLength = characters.length; - let counter = 0; - while (counter < length) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - counter += 1; - } - return result; -} -async function refreshToken(refresh_token) { - try { - // var refresh_token = req.query.refresh_token; - const authOptions = { - url: "https://accounts.spotify.com/api/token", - headers: { - "content-type": "application/x-www-form-urlencoded", - Authorization: - "Basic " + - new Buffer.from(client_id + ":" + client_secret).toString("base64"), - }, - form: { - grant_type: "refresh_token", - refresh_token: refresh_token, - }, - json: true, - }; - const formdm = new URLSearchParams(); - - formdm.append("grant_type", "refresh_token"); - formdm.append("refresh_token", refresh_token); - - fetch(authOptions.url, { - body: formdm, - headers: authOptions.headers, - method: "POST", - }) - .then(async (r) => { - const text = await r.text(); - // console.log(text); - return JSON.parse(text); - }) - .then((auth) => { - if (!auth.refresh_token) auth.refresh_token = refresh_token; - // console.log(auth); - authStuff = auth; - token = auth.access_token; - saveCredentials(auth); - if (auth.expires_in) { - setTimeout(() => { - refreshToken(auth.refresh_token); - }, auth.expires_in * 1000); - } - }); - } catch (e) { - console.error(`Welp it broke`); - // try again asap because we NEED THAT TOKEN - refreshToken(refresh_token); - } -} -function saveCredentials(creds) { - require("fs").writeFileSync( - "data/credentials.json", - JSON.stringify(creds, null, 2), - ); -} -function getCredentials() { - try { - return JSON.parse( - require("fs").readFileSync("data/credentials.json", "utf8"), - ); - } catch (e) { - return null; - } -} -function spotifyRoutes(app) { - app.get("/spotify/callback", async (req, res) => { - const code = req.query.code || null; - const state = req.query.state || null; - - if (state === null) { - res.redirect( - "/#" + - querystring.stringify({ - error: "state_mismatch", - }), - ); - } else { - const authOptions = { - url: "https://accounts.spotify.com/api/token", - form: { - code: code, - redirect_uri: redirect_uri, - grant_type: "authorization_code", - }, - headers: { - "content-type": "application/x-www-form-urlencoded", - Authorization: - "Basic " + - new Buffer.from(client_id + ":" + client_secret).toString("base64"), - }, - json: true, - }; - const formdm = new URLSearchParams(); - // Object.entries(authOptions.form).forEach(([key, value]) => { - // formdm.append(key, value); - // }) - formdm.append("code", code); - formdm.append("redirect_uri", redirect_uri); - formdm.append("grant_type", "authorization_code"); - - fetch(authOptions.url, { - body: formdm, - headers: authOptions.headers, - method: "POST", - }) - .then((r) => r.json()) - .then((auth) => { - // console.log(auth); - authStuff = auth; - saveCredentials(auth); - token = auth.access_token; - if (auth.expires_in) { - setTimeout(() => { - refreshToken(auth.refresh_token); - }, auth.expires_in * 1000); - } - res.status(200).end("Successfully logged in!"); - }); - } - }); -} -function addSongToPlaylist(url) { - fetchWebApi("v1/playlists/3gRv97fvllFFLVdCH6XzsE/tracks", "POST", { - uris: [url], - position: 0, - }); -} -module.exports = { - getLoginUrl, - refreshToken, - saveCredentials, - getCredentials, - spotifyRoutes, - addSongToPlaylist, - - // getToken -}; + +let token = null; +let authStuff = null; +const client_id = process.env.SPOTIFY_CLIENT_ID; +const client_secret = process.env.SPOTIFY_CLIENT_SECRET; +const redirect_uri = process.env.SPOTIFY_REDIRECT_URI; +async function fetchWebApi(endpoint, method, body) { + const res = await fetch(`https://api.spotify.com/${endpoint}`, { + headers: { + Authorization: `Bearer ${token}`, + }, + method, + body: JSON.stringify(body), + }); + const text = await res.text(); + // console.debug(text) + // abs nothing is wrong + return JSON.parse(text.trim()); + } + + function getLoginUrl() { + const state = generateRandomString(16); + const scope = [ + "ugc-image-upload", + "user-read-playback-state", + "user-modify-playback-state", + "user-read-currently-playing", + "app-remote-control", + "streaming", + "playlist-read-private", + "playlist-read-collaborative", + "playlist-modify-private", + "playlist-modify-public", + "user-follow-modify", + "user-follow-read", + "user-read-playback-position", + "user-top-read", + "user-read-recently-played", + "user-library-modify", + "user-library-read", + "user-read-email", + "user-read-private", + ].join(" "); + + return ( + "https://accounts.spotify.com/authorize?" + + `response_type=code&grant_type=client_credentials&client_id=${client_id}&scope=${scope}&redirect_uri=${redirect_uri}&state=${state}` + ); + } + + function generateRandomString(length) { + let result = ""; + const characters = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + const charactersLength = characters.length; + let counter = 0; + while (counter < length) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + counter += 1; + } + return result; + } + async function refreshToken(refresh_token) { + try { + // var refresh_token = req.query.refresh_token; + const authOptions = { + url: "https://accounts.spotify.com/api/token", + headers: { + "content-type": "application/x-www-form-urlencoded", + Authorization: + "Basic " + + new Buffer.from(client_id + ":" + client_secret).toString("base64"), + }, + form: { + grant_type: "refresh_token", + refresh_token: refresh_token, + }, + json: true, + }; + console.log(authOptions); + const formdm = new URLSearchParams(); + + formdm.append("grant_type", "refresh_token"); + formdm.append("refresh_token", refresh_token); + + fetch(authOptions.url, { + body: formdm, + headers: authOptions.headers, + method: "POST", + }) + .then(async (r) => { + const text = await r.text(); + console.log(text); + return JSON.parse(text); + }) + .then((auth) => { + if (!auth.refresh_token) auth.refresh_token = refresh_token; + console.log(auth); + authStuff = auth; + token = auth.access_token; + if (auth.expires_in) { + setTimeout(() => { + refreshToken(auth.refresh_token); + }, auth.expires_in * 1000); + } + }); + } catch (e) { + console.error(`Welp it broke`); + // try again asap because we NEED THAT TOKEN + refreshToken(refresh_token); + } + } + \ No newline at end of file diff --git a/hackclub-spotify-bot/src/views/home.ejs b/hackclub-spotify-bot/src/views/home.ejs deleted file mode 100644 index e3d4601..0000000 --- a/hackclub-spotify-bot/src/views/home.ejs +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - <%= title %> - - - - - - - - - -
-
-
-

Hackclub spotify

- -
-
-
-

Submit Song

- -
- -
- - -
-
- - <% if (s) { %> -
-

Success!

-

Your song has been added to the playlist!

-
-
- <% } %> -<% if (error) { %> -
- <%= error %> -
-
- <% } %> -
- - -
- -
- -

-
- - -
- - \ No newline at end of file diff --git a/hackclub-spotify-bot/src/views/index.ejs b/hackclub-spotify-bot/src/views/index.ejs index 39698a6..50d229e 100644 --- a/hackclub-spotify-bot/src/views/index.ejs +++ b/hackclub-spotify-bot/src/views/index.ejs @@ -16,7 +16,7 @@

-

Hackclub spotify

+

Hackclub spotify bot

diff --git a/hackclub-spotify-bot/yarn.lock b/hackclub-spotify-bot/yarn.lock index 903ab61..88260d2 100644 --- a/hackclub-spotify-bot/yarn.lock +++ b/hackclub-spotify-bot/yarn.lock @@ -26,7 +26,7 @@ resolved "https://registry.yarnpkg.com/@slack/types/-/types-2.14.0.tgz#913946b4bcb635dad1d39ceca73699215c38cf6f" integrity sha512-n0EGm7ENQRxlXbgKSrQZL69grzg1gHLAVd+GlRVQJ1NSORo0FrApR7wql/gaKdu2n4TO83Sq/AmeUOqD60aXUA== -"@slack/web-api@^7.3.4": +"@slack/web-api@^7.3.4", "@slack/web-api@^7.6.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@slack/web-api/-/web-api-7.6.0.tgz#7bfa2e0da4fce934715b54e47305fd02e722c0aa" integrity sha512-1u9JnP12RPk8ChF8RXKKoVtlox9HlZXhf+6lvvRORKxRd4+8ZQ41KskhPO6WiD0Q+wE6k/M6U627BXzVzBcVNA== @@ -63,7 +63,7 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -accepts@~1.3.4, accepts@~1.3.8: +accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -71,11 +71,6 @@ accepts@~1.3.4, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -after@0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - integrity sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA== - ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -88,21 +83,6 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -arraybuffer.slice@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" - integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== - -asn1.js@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - async@^3.2.3: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" @@ -113,13 +93,6 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -axios@0.26.0: - version "0.26.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.0.tgz#9a318f1c69ec108f8cd5f3c3d390366635e13928" - integrity sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og== - dependencies: - follow-redirects "^1.14.8" - axios@^1.7.4: version "1.7.7" resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" @@ -129,70 +102,11 @@ axios@^1.7.4: form-data "^4.0.0" proxy-from-env "^1.1.0" -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA== - -bagpipe@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/bagpipe/-/bagpipe-0.3.5.tgz#e341d164fcb24cdf04ea7e05b765ec10c8aea6a1" - integrity sha512-42sAlmPDKes1nLm/aly+0VdaopSU9br+jkRELedhQxI5uXHgtk47I83Mpmf4zoNTRMASdLFtUkimlu/Z9zQ8+g== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-arraybuffer@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" - integrity sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base64id@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - -better-sqlite3@^11.3.0: - version "11.3.0" - resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.3.0.tgz#f10b32ddff665c33176d148e707bd1e57dfd0284" - integrity sha512-iHt9j8NPYF3oKCNOO5ZI4JwThjt3Z6J6XrcwG85VNMVzv1ByqrHWv5VILEbCMFWDsoHhXvQ7oC8vgRXFAKgl9w== - dependencies: - bindings "^1.5.0" - prebuild-install "^7.1.1" - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blob@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" - integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== - -bn.js@^4.0.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - body-parser@1.20.3: version "1.20.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" @@ -231,14 +145,6 @@ buffer-equal-constant-time@1.0.1: resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -263,11 +169,6 @@ chalk@^4.0.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -287,26 +188,6 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - integrity sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw== - -component-emitter@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA== - -component-emitter@~1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" - integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== - -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - integrity sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -344,11 +225,6 @@ cookie@0.7.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== -cookie@~0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -356,32 +232,6 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4.1.1, debug@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -406,11 +256,6 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-libc@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - dotenv@^16.4.5: version "16.4.5" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" @@ -445,53 +290,6 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -engine.io-client@~3.5.0: - version "3.5.4" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.4.tgz#5b40d7381772ba05c0881be5735a318424a07fc6" - integrity sha512-ydc8uuMMDxC5KCKNJN3zZKYJk2sgyTuTZQ7Aj1DJSsLKAcizA/PzWivw8fZMIjJVBo2CJOYzntv4FSjY/Lr//g== - dependencies: - component-emitter "~1.3.0" - component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.2.0" - has-cors "1.1.0" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - ws "~7.5.10" - xmlhttprequest-ssl "~1.6.2" - yeast "0.1.2" - -engine.io-parser@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" - integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== - dependencies: - after "0.8.2" - arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.4" - blob "0.0.5" - has-binary2 "~1.0.2" - -engine.io@~3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.6.2.tgz#b5d0fffafdd8525dbcd10b3ab5d8337271c3c36b" - integrity sha512-C4JjGQZLY3kWlIDx0BQNKizbrfpb7NahxDztGdN5jrPK2ghmXiNDN+E/t0JzDeNRZxPVaszxEng42Pmj27X/0w== - dependencies: - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - debug "~4.1.0" - engine.io-parser "~2.2.0" - ws "~7.5.10" - es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" @@ -514,13 +312,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -event-loop-stats@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/event-loop-stats/-/event-loop-stats-1.2.0.tgz#20ef06af562f13d84f00bf0f1bac2c433315e709" - integrity sha512-h/leAlXqoEf+D9w1dnFG0srR5vfIq59rLm9PHzcl3/GwFppd+UR46UMuLdp/mvJvuA+MjSd/dNShmuM2/dPFFw== - dependencies: - nan "^2.14.0" - eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -531,11 +322,6 @@ eventemitter3@^5.0.1: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - express-session@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.18.1.tgz#88d0bbd41878882840f24ec6227493fcb167e8d5" @@ -550,20 +336,6 @@ express-session@^1.18.1: safe-buffer "5.2.1" uid-safe "~2.1.5" -express-status-monitor@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/express-status-monitor/-/express-status-monitor-1.3.4.tgz#37a11aa450db2322307c28ea9c4781c8c46add45" - integrity sha512-EyqHvgX57ujN4fqfUT+x6Bv2xwRyzQdv3AJvWQxcG+jK4TcF9vhrKVqGcE0T6bhT4rstpvOKRuxHBwC/Q6AXQg== - dependencies: - axios "0.26.0" - debug "4.1.1" - handlebars "^4.7.7" - on-headers "1.0.2" - pidusage "2.0.18" - socket.io "^2.4.1" - optionalDependencies: - event-loop-stats "1.2.0" - express@^4.21.1: version "4.21.1" resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" @@ -601,11 +373,6 @@ express@^4.21.1: utils-merge "1.0.1" vary "~1.1.2" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -626,7 +393,7 @@ finalhandler@1.3.1: statuses "2.0.1" unpipe "~1.0.0" -follow-redirects@^1.14.8, follow-redirects@^1.15.6: +follow-redirects@^1.15.6: version "1.15.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== @@ -650,20 +417,6 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" @@ -680,11 +433,6 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: has-symbols "^1.0.3" hasown "^2.0.0" -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -692,35 +440,6 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -handlebars@^4.7.7: - version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.2" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -has-binary2@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" - integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== - dependencies: - isarray "2.0.1" - -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -768,31 +487,11 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg== - -inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: +inherits@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -808,16 +507,6 @@ is-stream@^2: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -isarray@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" - integrity sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ== - jake@^10.8.5: version "10.9.2" resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" @@ -828,13 +517,6 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - jsonwebtoken@^9: version "9.0.2" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" @@ -868,13 +550,6 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" -kruptein@^2.0.4: - version "2.2.3" - resolved "https://registry.yarnpkg.com/kruptein/-/kruptein-2.2.3.tgz#e09a3942b8072ac71728d10fe089293e0b5e7d42" - integrity sha512-BTwprBPTzkFT9oTugxKd3WnWrX630MqUDsnmBuoa98eQs12oD4n4TeI0GbpdGcYn/73Xueg2rfnw+oK4dovnJg== - dependencies: - asn1.js "^5.4.1" - lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -910,11 +585,6 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -947,16 +617,6 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -971,16 +631,6 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -991,38 +641,11 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nan@^2.14.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" - integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== - -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -node-abi@^3.3.0: - version "3.68.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.68.0.tgz#8f37fb02ecf4f43ebe694090dcb52e0c4cc4ba25" - integrity sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A== - dependencies: - semver "^7.3.5" - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - object-inspect@^1.13.1: version "1.13.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" @@ -1035,18 +658,11 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -on-headers@1.0.2, on-headers@~1.0.2: +on-headers@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -1075,16 +691,6 @@ p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" -parseqs@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" - integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== - -parseuri@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" - integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== - parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -1095,31 +701,6 @@ path-to-regexp@0.1.10: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== -pidusage@2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/pidusage/-/pidusage-2.0.18.tgz#9ccef35df5508a5a4b0838c712ea9b79609aff34" - integrity sha512-Y/VfKfh3poHjMEINxU+gJTeVOBjiThQeFAmzR7z56HSNiMx+etl+yBhk42nRPciPYt/VZl8DQLVXNC6P5vH11A== - dependencies: - safe-buffer "^5.1.2" - -prebuild-install@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" - integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -1133,14 +714,6 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -pump@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" - integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - qs@6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" @@ -1148,13 +721,6 @@ qs@6.13.0: dependencies: side-channel "^1.0.6" -quick.db@^9.1.7: - version "9.1.7" - resolved "https://registry.yarnpkg.com/quick.db/-/quick.db-9.1.7.tgz#65056bc2033780236855b9c7ea3b0081c387f76f" - integrity sha512-ZLPVLVFZtvFRLHqIK99iyrLDUznOTpnp5tB+QpGErT+reDSvgBELuVsMkGSSiqKT9R2YSOhO+096Wb0xTaOHMA== - dependencies: - lodash "^4.17.21" - random-bytes@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" @@ -1175,46 +741,22 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -readable-stream@^3.1.1, readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@^7.3.5, semver@^7.5.4: +semver@^7.5.4: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -1248,18 +790,6 @@ serve-static@1.16.2: parseurl "~1.3.3" send "0.19.0" -session-file-store@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/session-file-store/-/session-file-store-1.5.0.tgz#9faffc18c2e28f57fe7c4e4c84cdc92bb20833f4" - integrity sha512-60IZaJNzyu2tIeHutkYE8RiXVx3KRvacOxfLr2Mj92SIsRIroDsH0IlUUR6fJAjoTW4RQISbaOApa2IZpIwFdQ== - dependencies: - bagpipe "^0.3.5" - fs-extra "^8.0.1" - kruptein "^2.0.4" - object-assign "^4.1.1" - retry "^0.12.0" - write-file-atomic "3.0.3" - set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -1287,104 +817,11 @@ side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -socket.io-adapter@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" - integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== - -socket.io-client@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.5.0.tgz#34f486f3640dde9c2211fce885ac2746f9baf5cb" - integrity sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw== - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "~1.3.0" - debug "~3.1.0" - engine.io-client "~3.5.0" - has-binary2 "~1.0.2" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - socket.io-parser "~3.3.0" - to-array "0.1.4" - -socket.io-parser@~3.3.0: - version "3.3.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.4.tgz#ab84236b6d06eaf1fb68b179b3a7501195886cc3" - integrity sha512-z/pFQB3x+EZldRRzORYW1vwVO8m/3ILkswtnpoeU6Ve3cbMWkmHEWDAVJn4QJtchiiFTo5j7UG2QvwxvaA9vow== - dependencies: - component-emitter "~1.3.0" - debug "~3.1.0" - isarray "2.0.1" - -socket.io-parser@~3.4.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.3.tgz#b19bdaad38ed39fd68fba3f9d86768f667df0c29" - integrity sha512-1rE4dZN3kCI/E5wixd393hmbqa78vVpkKmnEJhLeWoS/C5hbFYAbcSfnWoaVH43u9ToUVtzKjguxEZq+1XZfCQ== - dependencies: - component-emitter "1.2.1" - debug "~4.1.0" - isarray "2.0.1" - -socket.io@^2.4.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.5.1.tgz#224459ecf13ab66bfc7fb6dd0c6bf760a9895e7f" - integrity sha512-eaTE4tBKRD6RFoetquMbxgvcpvoDtRyIlkIMI/SMK2bsKvbENTsDeeu4GJ/z9c90yOWxB7b/eC+yKLPbHnH6bA== - dependencies: - debug "~4.1.0" - engine.io "~3.6.0" - has-binary2 "~1.0.2" - socket.io-adapter "~1.1.0" - socket.io-client "2.5.0" - socket.io-parser "~3.4.0" - -source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spotify-uri@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/spotify-uri/-/spotify-uri-4.1.0.tgz#d1286b1922055e2b0e37b773ef2bff2c40e71010" - integrity sha512-SFpBt8pQqO7DOFBsdUjv3GxGZAKYP7UqcTflfE7h3YL1lynl/6Motq7NERoJJR8eF9kXQRSpcdMmV5ou84rbng== - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -1392,44 +829,11 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - integrity sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A== - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -1438,18 +842,6 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -uglify-js@^3.1.4: - version "3.19.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" - integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== - uid-safe@~2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" @@ -1462,21 +854,11 @@ undici-types@~6.19.2: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -1486,38 +868,3 @@ vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@~7.5.10: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - -xmlhttprequest-ssl@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" - integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== - -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==