From 65efe2ba8553b1e16248cfe4a8323e5d163a3bb4 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Wed, 2 Oct 2024 09:52:27 -0400 Subject: [PATCH 001/267] IDK why I need to commit --- package-lock.json | 38 ++++++++++++++++++++------------------ package.json | 4 ++-- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 168425cf..4f7bfed2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "sage", - "version": "3.2.3", + "version": "3.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sage", - "version": "3.2.3", + "version": "3.3.0", "license": "MIT", "dependencies": { "@octokit/rest": "^18.3.5", "axios": "^1.4.0", - "canvas": "^2.8.0", + "canvas": "^2.11.2", "console-stamp": "^3.0.2", "discord.js": "^14.8.0", "module-alias": "^2.2.2", @@ -1008,13 +1008,14 @@ } }, "node_modules/canvas": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.8.0.tgz", - "integrity": "sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.14.0", + "nan": "^2.17.0", "simple-get": "^3.0.3" }, "engines": { @@ -2173,9 +2174,10 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==" + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -3911,12 +3913,12 @@ "dev": true }, "canvas": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.8.0.tgz", - "integrity": "sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", "requires": { "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.14.0", + "nan": "^2.17.0", "simple-get": "^3.0.3" } }, @@ -4772,9 +4774,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==" + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==" }, "natural-compare": { "version": "1.4.0", @@ -5476,4 +5478,4 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 0b443848..387df8ba 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "dependencies": { "@octokit/rest": "^18.3.5", "axios": "^1.4.0", - "canvas": "^2.8.0", + "canvas": "^2.11.2", "console-stamp": "^3.0.2", "discord.js": "^14.8.0", "module-alias": "^2.2.2", @@ -61,4 +61,4 @@ "tsc-watch": "^4.2.9", "typescript": "^4.1.3" } -} \ No newline at end of file +} From 8a9fb5ef2145690a6da23acbf258294b627b8fff Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Fri, 11 Oct 2024 12:02:36 -0400 Subject: [PATCH 002/267] added a basic embed message when the command is run --- src/commands/jobs/jobform.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/commands/jobs/jobform.ts diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts new file mode 100644 index 00000000..3a8072ed --- /dev/null +++ b/src/commands/jobs/jobform.ts @@ -0,0 +1,13 @@ +import { Command } from '@root/src/lib/types/Command'; +import { ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; + +export default class extends Command { + + description = 'Form do get your preferences for jobs to be used with the Job Alert System!'; + + run(interaction: ChatInputCommandInteraction): Promise | void> { + const responseEmbed = new EmbedBuilder().setTitle('test'); + return interaction.reply({ embeds: [responseEmbed] }); + } + +} From d126d182b7fbad88c061d552b67f5cc157d5fa10 Mon Sep 17 00:00:00 2001 From: westa Date: Sat, 12 Oct 2024 12:41:35 -0400 Subject: [PATCH 003/267] Two config files problem --- .github/workflows/documentation.yml | 2 +- .github/workflows/main.yml | 4 +- .github/workflows/node.js.yml | 5 + config.example.ts | 216 ++++++++++++++++++++++++++++ config.ts | 216 ---------------------------- 5 files changed, 224 insertions(+), 219 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index ae7295bd..8f4aa328 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -2,7 +2,7 @@ name: documentation on: push: - branches: [ "main", "Ava-branch" ] + branches: [ "main", "Ava-branch-config" ] jobs: build: diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4b0aa8f8..4fd39ff5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,9 +2,9 @@ name: Main Pipeline on: push: - branches: [ "main", "Ava-branch" ] + branches: [ "main", "Ava-branch-config" ] pull_request: - branches: [ "main", "Ava-branch" ] + branches: [ "main", "Ava-branch-config" ] env: DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 70819f48..a108ae84 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -20,6 +20,11 @@ jobs: cache: 'npm' - run: npm cache clean --force - run: npm ci + + # Add this step to copy config.example.ts to config.ts + - name: Set config file + run: cp config.example.ts config.ts + - name: build run: | npm run build 2>&1 | tee build-output.log diff --git a/config.example.ts b/config.example.ts index e69de29b..5eb2e8d7 100644 --- a/config.example.ts +++ b/config.example.ts @@ -0,0 +1,216 @@ +interface Config { + DB_CONNECTION: string; + BOT_NAME: string; + BOT_TOKEN: string; + BOT_CLIENT_ID: string; + DB_USERS: string; + DB_PVQ: string; + DB_QTAGS: string; + DB_ASSIGNABLE: string; + DB_COURSES: string; + DB_REMINDERS: string; + DB_CLIENT_DATA: string; + DB_POLLS: string; + GUILD_MAIN: string; + GUILD_GATEWAY: string; + GUILD_GATEWAY_INVITE: string; + ROLE_ADMIN: string; + ROLE_STUDENT_ADMIN: string; + ROLE_STAFF: string; + ROLE_VERIFIED: string; + ROLE_MUTED: string; + ROLE_LEVEL_ONE: string; + EMAIL_SENDER: string; + EMAIL_REPLY_TO: string; + EMAIL_REPORT_ADDRESSES: string; + CHANNEL_ERROR_LOG: string; + CHANNEL_SERVER_LOG: string; + CHANNEL_MEMBER_LOG: string; + CHANNEL_MOD_LOG: string; + CHANNEL_FEEDBACK: string; + CHANNEL_SAGE: string; + CHANNEL_ANNOUNCEMENTS: string; + CHANNEL_ARCHIVE: string; + CHANNEL_ROLE_SELECT: string; + ROLE_DROPDOWNS_COURSE_ROLES: string; + ROLE_DROPDOWNS_ASSIGN_ROLES: string; + MONGO: string; + LEVEL_TIER_ROLES: string; + FIRST_LEVEL: string; + ENV_GITHUB_TOKEN: string; + ENV_GITHUB_PROJECT: string; + PREFIX: string; + MAINTAINERS: string; + SEMESTER_ID: string; + BLACKLIST: string; +} + +function getEnvVar(name: keyof Config): string { + const value = process.env[name]; + if (value === undefined) { + throw new Error(`Environment variable ${name} is not set`); + } + return value; +} + +export const config: Config = { + DB_CONNECTION: getEnvVar('DB_CONNECTION'), + BOT_NAME: getEnvVar('BOT_NAME'), + BOT_TOKEN: getEnvVar('BOT_TOKEN'), + BOT_CLIENT_ID: getEnvVar('BOT_CLIENT_ID'), + DB_USERS: getEnvVar('DB_USERS'), + DB_PVQ: getEnvVar('DB_PVQ'), + DB_QTAGS: getEnvVar('DB_QTAGS'), + DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), + DB_COURSES: getEnvVar('DB_COURSES'), + DB_REMINDERS: getEnvVar('DB_REMINDERS'), + DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), + DB_POLLS: getEnvVar('DB_POLLS'), + GUILD_MAIN: getEnvVar('GUILD_MAIN'), + GUILD_GATEWAY: getEnvVar('GUILD_GATEWAY'), + GUILD_GATEWAY_INVITE: getEnvVar('GUILD_GATEWAY_INVITE'), + ROLE_ADMIN: getEnvVar('ROLE_ADMIN'), + ROLE_STUDENT_ADMIN: getEnvVar('ROLE_STUDENT_ADMIN'), + ROLE_STAFF: getEnvVar('ROLE_STAFF'), + ROLE_VERIFIED: getEnvVar('ROLE_VERIFIED'), + ROLE_MUTED: getEnvVar('ROLE_MUTED'), + ROLE_LEVEL_ONE: getEnvVar('ROLE_LEVEL_ONE'), + EMAIL_SENDER: getEnvVar('EMAIL_SENDER'), + EMAIL_REPLY_TO: getEnvVar('EMAIL_REPLY_TO'), + EMAIL_REPORT_ADDRESSES: getEnvVar('EMAIL_REPORT_ADDRESSES'), + CHANNEL_ERROR_LOG: getEnvVar('CHANNEL_ERROR_LOG'), + CHANNEL_SERVER_LOG: getEnvVar('CHANNEL_SERVER_LOG'), + CHANNEL_MEMBER_LOG: getEnvVar('CHANNEL_MEMBER_LOG'), + CHANNEL_MOD_LOG: getEnvVar('CHANNEL_MOD_LOG'), + CHANNEL_FEEDBACK: getEnvVar('CHANNEL_FEEDBACK'), + CHANNEL_SAGE: getEnvVar('CHANNEL_SAGE'), + CHANNEL_ANNOUNCEMENTS: getEnvVar('CHANNEL_ANNOUNCEMENTS'), + CHANNEL_ARCHIVE: getEnvVar('CHANNEL_ARCHIVE'), + CHANNEL_ROLE_SELECT: getEnvVar('CHANNEL_ROLE_SELECT'), + ROLE_DROPDOWNS_COURSE_ROLES: getEnvVar('ROLE_DROPDOWNS_COURSE_ROLES'), + ROLE_DROPDOWNS_ASSIGN_ROLES: getEnvVar('ROLE_DROPDOWNS_ASSIGN_ROLES'), + MONGO: getEnvVar('MONGO'), + LEVEL_TIER_ROLES: getEnvVar('LEVEL_TIER_ROLES'), + FIRST_LEVEL: getEnvVar('FIRST_LEVEL'), + ENV_GITHUB_TOKEN: getEnvVar('ENV_GITHUB_TOKEN'), + ENV_GITHUB_PROJECT: getEnvVar('ENV_GITHUB_PROJECT'), + PREFIX: getEnvVar('PREFIX'), + MAINTAINERS: getEnvVar('MAINTAINERS'), + SEMESTER_ID: getEnvVar('SEMESTER_ID'), + BLACKLIST: getEnvVar('BLACKLIST') +}; +/* +export const { DB_CONNECTION } = process.env.DB_CONNECTION; +export const { BOT_NAME } = process.env; +export const { BOT_TOKEN } = process.env; +export const { BOT_CLIENT_ID } = process.env; +export const { DB_USERS } = process.env; +export const { DB_PVQ } = process.env; +export const { DB_QTAGS } = process.env; +export const { DB_ASSIGNABLE } = process.env; +export const { DB_COURSES } = process.env; +export const { DB_REMINDERS } = process.env; +export const { DB_CLIENT_DATA } = process.env; +export const { DB_POLLS } = process.env; +export const { GUILD_MAIN } = process.env; +export const { GUILD_GATEWAY } = process.env; +export const { GUILD_GATEWAY_INVITE } = process.env; +export const { ROLE_ADMIN } = process.env; +export const { ROLE_STUDENT_ADMIN } = process.env; +export const { ROLE_STAFF } = process.env; +export const { ROLE_VERIFIED } = process.env; +export const { ROLE_MUTED } = process.env; +export const { ROLE_LEVEL_ONE } = process.env; +export const { EMAIL_SENDER } = process.env; +export const { EMAIL_REPLY_TO } = process.env; +export const { EMAIL_REPORT_ADDRESSES } = process.env; +export const { CHANNEL_ERROR_LOG } = process.env; +export const { CHANNEL_SERVER_LOG } = process.env; +export const { CHANNEL_MEMBER_LOG } = process.env; +export const { CHANNEL_MOD_LOG } = process.env; +export const { CHANNEL_FEEDBACK } = process.env; +export const { CHANNEL_SAGE } = process.env; +export const { CHANNEL_ANNOUNCEMENTS } = process.env; +export const { CHANNEL_ARCHIVE } = process.env; +export const { CHANNEL_ROLE_SELECT } = process.env; +export const { ROLE_DROPDOWNS_COURSE_ROLES } = process.env; +export const { ROLE_DROPDOWNS_ASSIGN_ROLES } = process.env; +*/ + +export const BOT = { + TOKEN: config.BOT_TOKEN, + CLIENT_ID: config.BOT_CLIENT_ID, + NAME: config.BOT_NAME +}; + +export const DB = { + CONNECTION: config.DB_CONNECTION, + USERS: config.DB_USERS, + PVQ: config.DB_PVQ, + QTAGS: config.DB_QTAGS, + ASSIGNABLE: config.DB_ASSIGNABLE, + COURSES: config.DB_COURSES, + REMINDERS: config.DB_REMINDERS, + CLIENT_DATA: config.DB_CLIENT_DATA, + POLLS: config.DB_POLLS +}; + +export const GUILDS = { + MAIN: config.GUILD_MAIN, + GATEWAY: config.GUILD_GATEWAY, + GATEWAY_INVITE: config.GUILD_GATEWAY_INVITE +}; + +export const ROLES = { + ADMIN: config.ROLE_ADMIN, + STUDENT_ADMIN: config.ROLE_STUDENT_ADMIN, + STAFF: config.ROLE_STAFF, + VERIFIED: config.ROLE_VERIFIED, + MUTED: config.ROLE_MUTED, + LEVEL_ONE: config.ROLE_LEVEL_ONE +}; + +export const EMAIL = { + SENDER: config.EMAIL_SENDER, + REPLY_TO: config.EMAIL_REPLY_TO, + REPORT_ADDRESSES: config.EMAIL_REPORT_ADDRESSES +}; + +export const CHANNELS = { + ERROR_LOG: config.CHANNEL_ERROR_LOG, + SERVER_LOG: config.CHANNEL_SERVER_LOG, + MEMBER_LOG: config.CHANNEL_MEMBER_LOG, + MOD_LOG: config.CHANNEL_MOD_LOG, + FEEDBACK: config.CHANNEL_FEEDBACK, + SAGE: config.CHANNEL_SAGE, + ANNOUNCEMENTS: config.CHANNEL_ANNOUNCEMENTS, + ARCHIVE: config.CHANNEL_ARCHIVE, + ROLE_SELECT: config.CHANNEL_ROLE_SELECT +}; + +export const ROLE_DROPDOWNS = { + COURSE_ROLES: config.ROLE_DROPDOWNS_COURSE_ROLES, + ASSIGN_ROLES: config.ROLE_DROPDOWNS_ASSIGN_ROLES +}; + +export const GITHUB_PROJECT = config.ENV_GITHUB_PROJECT; + +// eslint-disable-next-line prefer-destructuring +export const SEMESTER_ID = config.SEMESTER_ID; + +export const FIRST_LEVEL = 10; + +export const LEVEL_TIER_ROLES = [config.LEVEL_TIER_ROLES]; + +// eslint-disable-next-line prefer-destructuring +export const MAINTAINERS = config.MAINTAINERS; + +// eslint-disable-next-line prefer-destructuring +export const PREFIX = config.PREFIX; + +export const BLACKLIST = [config.BLACKLIST]; + +export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; + +// eslint-disable-next-line prefer-destructuring +export const MONGO = config.MONGO; diff --git a/config.ts b/config.ts index 5eb2e8d7..e69de29b 100644 --- a/config.ts +++ b/config.ts @@ -1,216 +0,0 @@ -interface Config { - DB_CONNECTION: string; - BOT_NAME: string; - BOT_TOKEN: string; - BOT_CLIENT_ID: string; - DB_USERS: string; - DB_PVQ: string; - DB_QTAGS: string; - DB_ASSIGNABLE: string; - DB_COURSES: string; - DB_REMINDERS: string; - DB_CLIENT_DATA: string; - DB_POLLS: string; - GUILD_MAIN: string; - GUILD_GATEWAY: string; - GUILD_GATEWAY_INVITE: string; - ROLE_ADMIN: string; - ROLE_STUDENT_ADMIN: string; - ROLE_STAFF: string; - ROLE_VERIFIED: string; - ROLE_MUTED: string; - ROLE_LEVEL_ONE: string; - EMAIL_SENDER: string; - EMAIL_REPLY_TO: string; - EMAIL_REPORT_ADDRESSES: string; - CHANNEL_ERROR_LOG: string; - CHANNEL_SERVER_LOG: string; - CHANNEL_MEMBER_LOG: string; - CHANNEL_MOD_LOG: string; - CHANNEL_FEEDBACK: string; - CHANNEL_SAGE: string; - CHANNEL_ANNOUNCEMENTS: string; - CHANNEL_ARCHIVE: string; - CHANNEL_ROLE_SELECT: string; - ROLE_DROPDOWNS_COURSE_ROLES: string; - ROLE_DROPDOWNS_ASSIGN_ROLES: string; - MONGO: string; - LEVEL_TIER_ROLES: string; - FIRST_LEVEL: string; - ENV_GITHUB_TOKEN: string; - ENV_GITHUB_PROJECT: string; - PREFIX: string; - MAINTAINERS: string; - SEMESTER_ID: string; - BLACKLIST: string; -} - -function getEnvVar(name: keyof Config): string { - const value = process.env[name]; - if (value === undefined) { - throw new Error(`Environment variable ${name} is not set`); - } - return value; -} - -export const config: Config = { - DB_CONNECTION: getEnvVar('DB_CONNECTION'), - BOT_NAME: getEnvVar('BOT_NAME'), - BOT_TOKEN: getEnvVar('BOT_TOKEN'), - BOT_CLIENT_ID: getEnvVar('BOT_CLIENT_ID'), - DB_USERS: getEnvVar('DB_USERS'), - DB_PVQ: getEnvVar('DB_PVQ'), - DB_QTAGS: getEnvVar('DB_QTAGS'), - DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), - DB_COURSES: getEnvVar('DB_COURSES'), - DB_REMINDERS: getEnvVar('DB_REMINDERS'), - DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), - DB_POLLS: getEnvVar('DB_POLLS'), - GUILD_MAIN: getEnvVar('GUILD_MAIN'), - GUILD_GATEWAY: getEnvVar('GUILD_GATEWAY'), - GUILD_GATEWAY_INVITE: getEnvVar('GUILD_GATEWAY_INVITE'), - ROLE_ADMIN: getEnvVar('ROLE_ADMIN'), - ROLE_STUDENT_ADMIN: getEnvVar('ROLE_STUDENT_ADMIN'), - ROLE_STAFF: getEnvVar('ROLE_STAFF'), - ROLE_VERIFIED: getEnvVar('ROLE_VERIFIED'), - ROLE_MUTED: getEnvVar('ROLE_MUTED'), - ROLE_LEVEL_ONE: getEnvVar('ROLE_LEVEL_ONE'), - EMAIL_SENDER: getEnvVar('EMAIL_SENDER'), - EMAIL_REPLY_TO: getEnvVar('EMAIL_REPLY_TO'), - EMAIL_REPORT_ADDRESSES: getEnvVar('EMAIL_REPORT_ADDRESSES'), - CHANNEL_ERROR_LOG: getEnvVar('CHANNEL_ERROR_LOG'), - CHANNEL_SERVER_LOG: getEnvVar('CHANNEL_SERVER_LOG'), - CHANNEL_MEMBER_LOG: getEnvVar('CHANNEL_MEMBER_LOG'), - CHANNEL_MOD_LOG: getEnvVar('CHANNEL_MOD_LOG'), - CHANNEL_FEEDBACK: getEnvVar('CHANNEL_FEEDBACK'), - CHANNEL_SAGE: getEnvVar('CHANNEL_SAGE'), - CHANNEL_ANNOUNCEMENTS: getEnvVar('CHANNEL_ANNOUNCEMENTS'), - CHANNEL_ARCHIVE: getEnvVar('CHANNEL_ARCHIVE'), - CHANNEL_ROLE_SELECT: getEnvVar('CHANNEL_ROLE_SELECT'), - ROLE_DROPDOWNS_COURSE_ROLES: getEnvVar('ROLE_DROPDOWNS_COURSE_ROLES'), - ROLE_DROPDOWNS_ASSIGN_ROLES: getEnvVar('ROLE_DROPDOWNS_ASSIGN_ROLES'), - MONGO: getEnvVar('MONGO'), - LEVEL_TIER_ROLES: getEnvVar('LEVEL_TIER_ROLES'), - FIRST_LEVEL: getEnvVar('FIRST_LEVEL'), - ENV_GITHUB_TOKEN: getEnvVar('ENV_GITHUB_TOKEN'), - ENV_GITHUB_PROJECT: getEnvVar('ENV_GITHUB_PROJECT'), - PREFIX: getEnvVar('PREFIX'), - MAINTAINERS: getEnvVar('MAINTAINERS'), - SEMESTER_ID: getEnvVar('SEMESTER_ID'), - BLACKLIST: getEnvVar('BLACKLIST') -}; -/* -export const { DB_CONNECTION } = process.env.DB_CONNECTION; -export const { BOT_NAME } = process.env; -export const { BOT_TOKEN } = process.env; -export const { BOT_CLIENT_ID } = process.env; -export const { DB_USERS } = process.env; -export const { DB_PVQ } = process.env; -export const { DB_QTAGS } = process.env; -export const { DB_ASSIGNABLE } = process.env; -export const { DB_COURSES } = process.env; -export const { DB_REMINDERS } = process.env; -export const { DB_CLIENT_DATA } = process.env; -export const { DB_POLLS } = process.env; -export const { GUILD_MAIN } = process.env; -export const { GUILD_GATEWAY } = process.env; -export const { GUILD_GATEWAY_INVITE } = process.env; -export const { ROLE_ADMIN } = process.env; -export const { ROLE_STUDENT_ADMIN } = process.env; -export const { ROLE_STAFF } = process.env; -export const { ROLE_VERIFIED } = process.env; -export const { ROLE_MUTED } = process.env; -export const { ROLE_LEVEL_ONE } = process.env; -export const { EMAIL_SENDER } = process.env; -export const { EMAIL_REPLY_TO } = process.env; -export const { EMAIL_REPORT_ADDRESSES } = process.env; -export const { CHANNEL_ERROR_LOG } = process.env; -export const { CHANNEL_SERVER_LOG } = process.env; -export const { CHANNEL_MEMBER_LOG } = process.env; -export const { CHANNEL_MOD_LOG } = process.env; -export const { CHANNEL_FEEDBACK } = process.env; -export const { CHANNEL_SAGE } = process.env; -export const { CHANNEL_ANNOUNCEMENTS } = process.env; -export const { CHANNEL_ARCHIVE } = process.env; -export const { CHANNEL_ROLE_SELECT } = process.env; -export const { ROLE_DROPDOWNS_COURSE_ROLES } = process.env; -export const { ROLE_DROPDOWNS_ASSIGN_ROLES } = process.env; -*/ - -export const BOT = { - TOKEN: config.BOT_TOKEN, - CLIENT_ID: config.BOT_CLIENT_ID, - NAME: config.BOT_NAME -}; - -export const DB = { - CONNECTION: config.DB_CONNECTION, - USERS: config.DB_USERS, - PVQ: config.DB_PVQ, - QTAGS: config.DB_QTAGS, - ASSIGNABLE: config.DB_ASSIGNABLE, - COURSES: config.DB_COURSES, - REMINDERS: config.DB_REMINDERS, - CLIENT_DATA: config.DB_CLIENT_DATA, - POLLS: config.DB_POLLS -}; - -export const GUILDS = { - MAIN: config.GUILD_MAIN, - GATEWAY: config.GUILD_GATEWAY, - GATEWAY_INVITE: config.GUILD_GATEWAY_INVITE -}; - -export const ROLES = { - ADMIN: config.ROLE_ADMIN, - STUDENT_ADMIN: config.ROLE_STUDENT_ADMIN, - STAFF: config.ROLE_STAFF, - VERIFIED: config.ROLE_VERIFIED, - MUTED: config.ROLE_MUTED, - LEVEL_ONE: config.ROLE_LEVEL_ONE -}; - -export const EMAIL = { - SENDER: config.EMAIL_SENDER, - REPLY_TO: config.EMAIL_REPLY_TO, - REPORT_ADDRESSES: config.EMAIL_REPORT_ADDRESSES -}; - -export const CHANNELS = { - ERROR_LOG: config.CHANNEL_ERROR_LOG, - SERVER_LOG: config.CHANNEL_SERVER_LOG, - MEMBER_LOG: config.CHANNEL_MEMBER_LOG, - MOD_LOG: config.CHANNEL_MOD_LOG, - FEEDBACK: config.CHANNEL_FEEDBACK, - SAGE: config.CHANNEL_SAGE, - ANNOUNCEMENTS: config.CHANNEL_ANNOUNCEMENTS, - ARCHIVE: config.CHANNEL_ARCHIVE, - ROLE_SELECT: config.CHANNEL_ROLE_SELECT -}; - -export const ROLE_DROPDOWNS = { - COURSE_ROLES: config.ROLE_DROPDOWNS_COURSE_ROLES, - ASSIGN_ROLES: config.ROLE_DROPDOWNS_ASSIGN_ROLES -}; - -export const GITHUB_PROJECT = config.ENV_GITHUB_PROJECT; - -// eslint-disable-next-line prefer-destructuring -export const SEMESTER_ID = config.SEMESTER_ID; - -export const FIRST_LEVEL = 10; - -export const LEVEL_TIER_ROLES = [config.LEVEL_TIER_ROLES]; - -// eslint-disable-next-line prefer-destructuring -export const MAINTAINERS = config.MAINTAINERS; - -// eslint-disable-next-line prefer-destructuring -export const PREFIX = config.PREFIX; - -export const BLACKLIST = [config.BLACKLIST]; - -export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; - -// eslint-disable-next-line prefer-destructuring -export const MONGO = config.MONGO; From a731b99e67e54d9e24f312038f7c9310958bd702 Mon Sep 17 00:00:00 2001 From: westa Date: Sat, 12 Oct 2024 12:44:16 -0400 Subject: [PATCH 004/267] config.ts cache removed --- config.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 config.ts diff --git a/config.ts b/config.ts deleted file mode 100644 index e69de29b..00000000 From 7da39b5772674274eff0b335a832563ee05f50b8 Mon Sep 17 00:00:00 2001 From: westa Date: Sat, 12 Oct 2024 12:46:16 -0400 Subject: [PATCH 005/267] .gitignore addition --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index a1785b98..23593b77 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ resources/* !resources/.exists src/commands/admin/eval.ts +config.ts + # macOS stuff .DS_Store From f305a5309f90c245043bf7800751982c66cfff65 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Sun, 13 Oct 2024 21:21:47 -0400 Subject: [PATCH 006/267] basic Embed response message --- src/commands/jobs/jobform.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 3a8072ed..328996fa 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -6,7 +6,10 @@ export default class extends Command { description = 'Form do get your preferences for jobs to be used with the Job Alert System!'; run(interaction: ChatInputCommandInteraction): Promise | void> { - const responseEmbed = new EmbedBuilder().setTitle('test'); + const responseEmbed = new EmbedBuilder() + .setTitle('Job Alert Form') + .setColor('#000000'); + return interaction.reply({ embeds: [responseEmbed] }); } From cc8b55f81591db10ebd9c44a9de8c4c2af89c81c Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Sun, 13 Oct 2024 21:38:32 -0400 Subject: [PATCH 007/267] removed newline --- src/commands/jobs/jobform.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 328996fa..a0e685de 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -9,7 +9,6 @@ export default class extends Command { const responseEmbed = new EmbedBuilder() .setTitle('Job Alert Form') .setColor('#000000'); - return interaction.reply({ embeds: [responseEmbed] }); } From 0610f83e21b4eb489a23f8cbebb17dbd93ff0754 Mon Sep 17 00:00:00 2001 From: pgsweet Date: Sun, 13 Oct 2024 23:41:16 -0400 Subject: [PATCH 008/267] Basic Embed with question array and button to go to next question --- package-lock.json | 16 +++++----- package.json | 2 +- src/commands/jobs/jobform.ts | 61 +++++++++++++++++++++++++++++++++--- 3 files changed, 66 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f8fa15e..4a017af8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "@typescript-eslint/parser": "^4.23.0", "eslint": "^7.26.0", "tsc-watch": "^4.6.2", - "typescript": "^4.9.5" + "typescript": "^5.0.2" }, "engines": { "node": ">=16.9.0" @@ -3026,16 +3026,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/tz-offset": { @@ -5351,9 +5351,9 @@ "dev": true }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", "dev": true }, "tz-offset": { diff --git a/package.json b/package.json index 4e0da389..cbf41a9e 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,6 @@ "@typescript-eslint/parser": "^4.23.0", "eslint": "^7.26.0", "tsc-watch": "^4.6.2", - "typescript": "^4.9.5" + "typescript": "^5.0.2" } } diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index a0e685de..8e2e5bd5 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,15 +1,68 @@ import { Command } from '@root/src/lib/types/Command'; -import { ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; +import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; + +const questions = ['Question 1', 'Question 2']; export default class extends Command { description = 'Form do get your preferences for jobs to be used with the Job Alert System!'; run(interaction: ChatInputCommandInteraction): Promise | void> { - const responseEmbed = new EmbedBuilder() + let questionNum = 0; + + const nextButton = new ButtonBuilder() + .setCustomId('nextQuestion') + .setLabel('Next Question') + .setStyle(ButtonStyle.Primary) + .setEmoji('▶'); + + const actionRow = new ActionRowBuilder() + .addComponents(nextButton); + + interaction.reply({ + embeds: [this.questionGetter(questionNum)], + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + components: [actionRow] + }); + + let replyId; + interaction.fetchReply().then(reply => { replyId = reply.id; }); + + const collector = interaction.channel.createMessageComponentCollector({ + filter: i => i.message.id === replyId + }); + + collector.on('collect', async (i: ButtonInteraction) => { + if (interaction.user.id !== i.user.id) { + await i.reply({ + content: 'You cannot respond to a command you did not execute', + ephemeral: true + }); + return; + } + i.deferUpdate(); + if (i.customId === 'nextQuestion') { + questionNum++; + } + interaction.editReply({ + embeds: [this.questionGetter(questionNum)], + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + components: [actionRow] + }); + }); + + return; + } + + questionGetter(questionNum: number): EmbedBuilder { + return new EmbedBuilder() .setTitle('Job Alert Form') - .setColor('#000000'); - return interaction.reply({ embeds: [responseEmbed] }); + .setColor('#000000') + .addFields( + { name: 'Question:', value: questions[questionNum] }, + { name: 'Answer', value: 'also test', inline: true }); } } From 73f4059b9bd62fb1da157892a35e4354e35510cc Mon Sep 17 00:00:00 2001 From: pgsweet Date: Mon, 14 Oct 2024 00:06:12 -0400 Subject: [PATCH 009/267] fixxed the next question button to be disabled when on the final question --- src/commands/jobs/jobform.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 8e2e5bd5..dfbbadc6 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -5,7 +5,7 @@ const questions = ['Question 1', 'Question 2']; export default class extends Command { - description = 'Form do get your preferences for jobs to be used with the Job Alert System!'; + description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; run(interaction: ChatInputCommandInteraction): Promise | void> { let questionNum = 0; @@ -16,7 +16,7 @@ export default class extends Command { .setStyle(ButtonStyle.Primary) .setEmoji('▶'); - const actionRow = new ActionRowBuilder() + let actionRow = new ActionRowBuilder() .addComponents(nextButton); interaction.reply({ @@ -44,6 +44,9 @@ export default class extends Command { i.deferUpdate(); if (i.customId === 'nextQuestion') { questionNum++; + actionRow = questionNum === (questions.length - 1) + ? new ActionRowBuilder({ components: [nextButton.setDisabled(true)] }) + : new ActionRowBuilder({ components: [nextButton] }); } interaction.editReply({ embeds: [this.questionGetter(questionNum)], From 57c97f87699da25053c9b6a6e8200e347d1326cc Mon Sep 17 00:00:00 2001 From: pgsweet Date: Mon, 14 Oct 2024 00:30:19 -0400 Subject: [PATCH 010/267] Switched to using Modals for their ease of input --- src/commands/jobs/jobform.ts | 134 ++++++++++++++++++++--------------- 1 file changed, 77 insertions(+), 57 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index dfbbadc6..0e7ef409 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,5 +1,5 @@ import { Command } from '@root/src/lib/types/Command'; -import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; +import { ActionRowBuilder, ChatInputCommandInteraction, ComponentBuilder, InteractionResponse, ModalBuilder, TextInputBuilder, TextInputStyle } from 'discord.js'; const questions = ['Question 1', 'Question 2']; @@ -7,65 +7,85 @@ export default class extends Command { description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; - run(interaction: ChatInputCommandInteraction): Promise | void> { - let questionNum = 0; - - const nextButton = new ButtonBuilder() - .setCustomId('nextQuestion') - .setLabel('Next Question') - .setStyle(ButtonStyle.Primary) - .setEmoji('▶'); - - let actionRow = new ActionRowBuilder() - .addComponents(nextButton); - - interaction.reply({ - embeds: [this.questionGetter(questionNum)], - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - components: [actionRow] - }); - - let replyId; - interaction.fetchReply().then(reply => { replyId = reply.id; }); - - const collector = interaction.channel.createMessageComponentCollector({ - filter: i => i.message.id === replyId - }); - - collector.on('collect', async (i: ButtonInteraction) => { - if (interaction.user.id !== i.user.id) { - await i.reply({ - content: 'You cannot respond to a command you did not execute', - ephemeral: true - }); - return; - } - i.deferUpdate(); - if (i.customId === 'nextQuestion') { - questionNum++; - actionRow = questionNum === (questions.length - 1) - ? new ActionRowBuilder({ components: [nextButton.setDisabled(true)] }) - : new ActionRowBuilder({ components: [nextButton] }); - } - interaction.editReply({ - embeds: [this.questionGetter(questionNum)], - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - components: [actionRow] - }); - }); + async run(interaction: ChatInputCommandInteraction): Promise | void> { + const questionNum = 0; + + const modal = new ModalBuilder() + .setTitle('Job Form') + .setCustomId('modal'); + + const AnswerInput = new TextInputBuilder() + .setCustomId('answerInput') + .setLabel(`${questions[questionNum]}`) + .setStyle(TextInputStyle.Short).setPlaceholder('Answer: '); + + const secondActionRow = new ActionRowBuilder().addComponents(AnswerInput); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + modal.addComponents(secondActionRow); + + await interaction.showModal(modal); return; - } + // let questionNum = 0; + + // const nextButton = new ButtonBuilder() + // .setCustomId('nextQuestion') + // .setLabel('Next Question') + // .setStyle(ButtonStyle.Primary) + // .setEmoji('▶'); - questionGetter(questionNum: number): EmbedBuilder { - return new EmbedBuilder() - .setTitle('Job Alert Form') - .setColor('#000000') - .addFields( - { name: 'Question:', value: questions[questionNum] }, - { name: 'Answer', value: 'also test', inline: true }); + // let actionRow = new ActionRowBuilder() + // .addComponents(nextButton); + + // interaction.reply({ + // embeds: [this.questionGetter(questionNum)], + // // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // // @ts-ignore + // components: [actionRow] + // }); + + // let replyId; + // interaction.fetchReply().then(reply => { replyId = reply.id; }); + + // const collector = interaction.channel.createMessageComponentCollector({ + // filter: i => i.message.id === replyId + // }); + + // collector.on('collect', async (i: ButtonInteraction) => { + // if (interaction.user.id !== i.user.id) { + // await i.reply({ + // content: 'You cannot respond to a command you did not execute', + // ephemeral: true + // }); + // return; + // } + // i.deferUpdate(); + // if (i.customId === 'nextQuestion') { + // questionNum++; + // actionRow = questionNum === (questions.length - 1) + // ? new ActionRowBuilder({ components: [nextButton.setDisabled(true)] }) + // : new ActionRowBuilder({ components: [nextButton] }); + // } + // interaction.editReply({ + // embeds: [this.questionGetter(questionNum)], + // // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // // @ts-ignore + // components: [actionRow] + // }); + // }); + + // return; } + // questionGetter(questionNum: number): EmbedBuilder { + // return new EmbedBuilder() + // .setTitle('Job Alert Form') + // .setColor('#000000') + // .addFields( + // { name: 'Question:', value: questions[questionNum] }, + // { name: 'Answer', value: 'also test', inline: true }); + // } + } From ac208d55a86aaebfae03f7a6fdd73ad31b8770a7 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Mon, 14 Oct 2024 12:15:51 -0400 Subject: [PATCH 011/267] went back to using modals lol --- src/commands/jobs/jobform.ts | 81 ++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 27 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 0e7ef409..65e52381 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,44 +1,64 @@ import { Command } from '@root/src/lib/types/Command'; -import { ActionRowBuilder, ChatInputCommandInteraction, ComponentBuilder, InteractionResponse, ModalBuilder, TextInputBuilder, TextInputStyle } from 'discord.js'; +import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, + ChatInputCommandInteraction, EmbedBuilder, InteractionResponse, + ModalBuilder, TextInputBuilder, TextInputStyle } from 'discord.js'; -const questions = ['Question 1', 'Question 2']; +const questions = ['Question 1', 'Question 2', 'Question 3', 'Question 4', 'Question 5']; export default class extends Command { description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; async run(interaction: ChatInputCommandInteraction): Promise | void> { - const questionNum = 0; - const modal = new ModalBuilder() - .setTitle('Job Form') - .setCustomId('modal'); - - const AnswerInput = new TextInputBuilder() - .setCustomId('answerInput') - .setLabel(`${questions[questionNum]}`) - .setStyle(TextInputStyle.Short).setPlaceholder('Answer: '); - - const secondActionRow = new ActionRowBuilder().addComponents(AnswerInput); + .setCustomId('modalInput') + .setTitle('Job Form'); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - modal.addComponents(secondActionRow); + const rows = questions.map((question) => this.getAnswerField(questions.indexOf(question))); - await interaction.showModal(modal); + for (const row of rows) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + modal.addComponents(row); + } + interaction.showModal(modal); return; + // let questionNum = 0; + // // Button to go to the next question // const nextButton = new ButtonBuilder() // .setCustomId('nextQuestion') // .setLabel('Next Question') // .setStyle(ButtonStyle.Primary) // .setEmoji('▶'); + // // Button to change the users answer + // const editAnswer = new ButtonBuilder() + // .setCustomId('editAnswer') + // .setLabel('Edit Answer') + // .setStyle(ButtonStyle.Success); + // let actionRow = new ActionRowBuilder() + // .addComponents(editAnswer) // .addComponents(nextButton); + // // The modal that gets shown to the user + // const modal = new ModalBuilder().setCustomId('answerModal').setTitle(`Question ${questionNum}`); + // const userAnswer = new TextInputBuilder() + // .setCustomId('userInput') + // .setLabel('Answer') + // .setStyle(TextInputStyle.Short) + // .setPlaceholder('Input your answer here'); + + // const modalRow = new ActionRowBuilder().addComponents(userAnswer); + + // // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // // @ts-ignore + // modal.addComponents(modalRow); + + // // Send the initial embed // interaction.reply({ // embeds: [this.questionGetter(questionNum)], // // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -46,6 +66,7 @@ export default class extends Command { // components: [actionRow] // }); + // // Get the ID of the sent message to handle buttons being pushed // let replyId; // interaction.fetchReply().then(reply => { replyId = reply.id; }); @@ -53,7 +74,10 @@ export default class extends Command { // filter: i => i.message.id === replyId // }); + // interaction.channel.send({ modal, reply: { messageReference: replyId } }); + // collector.on('collect', async (i: ButtonInteraction) => { + // // If someone else trys pushing a button, tell them no // if (interaction.user.id !== i.user.id) { // await i.reply({ // content: 'You cannot respond to a command you did not execute', @@ -62,11 +86,15 @@ export default class extends Command { // return; // } // i.deferUpdate(); + // // Next question button // if (i.customId === 'nextQuestion') { // questionNum++; // actionRow = questionNum === (questions.length - 1) - // ? new ActionRowBuilder({ components: [nextButton.setDisabled(true)] }) - // : new ActionRowBuilder({ components: [nextButton] }); + // ? new ActionRowBuilder({ components: [editAnswer, nextButton.setDisabled(true)] }) + // : new ActionRowBuilder({ components: [editAnswer, nextButton] }); + // // Edit answer button + // } else if (i.customId === 'editAnswer') { + // await modalInteraction.showModal(modal); // } // interaction.editReply({ // embeds: [this.questionGetter(questionNum)], @@ -79,13 +107,12 @@ export default class extends Command { // return; } - // questionGetter(questionNum: number): EmbedBuilder { - // return new EmbedBuilder() - // .setTitle('Job Alert Form') - // .setColor('#000000') - // .addFields( - // { name: 'Question:', value: questions[questionNum] }, - // { name: 'Answer', value: 'also test', inline: true }); - // } + getAnswerField(questionNum: number): ActionRowBuilder { + return new ActionRowBuilder({ components: [new TextInputBuilder() + .setCustomId(`question ${questionNum + 1}`) + .setLabel(`Question ${questionNum + 1}`) + .setStyle(TextInputStyle.Short) + .setPlaceholder('Input Answer Here')] }); + } } From 979842a7469def8f2b6b93ce685508a26eeeee46 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:41:28 -0400 Subject: [PATCH 012/267] Finished form just need to change questions now --- src/commands/jobs/jobform.ts | 95 +++++------------------------------- src/pieces/commandManager.ts | 11 ++++- 2 files changed, 21 insertions(+), 85 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 65e52381..ea8f7ab9 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,17 +1,16 @@ import { Command } from '@root/src/lib/types/Command'; -import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, - ChatInputCommandInteraction, EmbedBuilder, InteractionResponse, - ModalBuilder, TextInputBuilder, TextInputStyle } from 'discord.js'; +import { ActionRowBuilder, ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, TextInputBuilder, TextInputStyle } from 'discord.js'; const questions = ['Question 1', 'Question 2', 'Question 3', 'Question 4', 'Question 5']; export default class extends Command { + name = 'jobform'; description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; async run(interaction: ChatInputCommandInteraction): Promise | void> { const modal = new ModalBuilder() - .setCustomId('modalInput') + .setCustomId('jobModal') .setTitle('Job Form'); const rows = questions.map((question) => this.getAnswerField(questions.indexOf(question))); @@ -22,94 +21,22 @@ export default class extends Command { modal.addComponents(row); } - interaction.showModal(modal); - return; - - // let questionNum = 0; - - // // Button to go to the next question - // const nextButton = new ButtonBuilder() - // .setCustomId('nextQuestion') - // .setLabel('Next Question') - // .setStyle(ButtonStyle.Primary) - // .setEmoji('▶'); - - // // Button to change the users answer - // const editAnswer = new ButtonBuilder() - // .setCustomId('editAnswer') - // .setLabel('Edit Answer') - // .setStyle(ButtonStyle.Success); - - // let actionRow = new ActionRowBuilder() - // .addComponents(editAnswer) - // .addComponents(nextButton); - // // The modal that gets shown to the user - // const modal = new ModalBuilder().setCustomId('answerModal').setTitle(`Question ${questionNum}`); - - // const userAnswer = new TextInputBuilder() - // .setCustomId('userInput') - // .setLabel('Answer') - // .setStyle(TextInputStyle.Short) - // .setPlaceholder('Input your answer here'); - - // const modalRow = new ActionRowBuilder().addComponents(userAnswer); + await interaction.showModal(modal); - // // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // // @ts-ignore - // modal.addComponents(modalRow); + // Answers are handled in commandManager.ts on line 149 - // // Send the initial embed - // interaction.reply({ - // embeds: [this.questionGetter(questionNum)], - // // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // // @ts-ignore - // components: [actionRow] - // }); - - // // Get the ID of the sent message to handle buttons being pushed - // let replyId; - // interaction.fetchReply().then(reply => { replyId = reply.id; }); - - // const collector = interaction.channel.createMessageComponentCollector({ - // filter: i => i.message.id === replyId - // }); - - // interaction.channel.send({ modal, reply: { messageReference: replyId } }); + return; + } - // collector.on('collect', async (i: ButtonInteraction) => { - // // If someone else trys pushing a button, tell them no - // if (interaction.user.id !== i.user.id) { - // await i.reply({ - // content: 'You cannot respond to a command you did not execute', - // ephemeral: true - // }); - // return; - // } - // i.deferUpdate(); - // // Next question button - // if (i.customId === 'nextQuestion') { - // questionNum++; - // actionRow = questionNum === (questions.length - 1) - // ? new ActionRowBuilder({ components: [editAnswer, nextButton.setDisabled(true)] }) - // : new ActionRowBuilder({ components: [editAnswer, nextButton] }); - // // Edit answer button - // } else if (i.customId === 'editAnswer') { - // await modalInteraction.showModal(modal); - // } - // interaction.editReply({ - // embeds: [this.questionGetter(questionNum)], - // // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // // @ts-ignore - // components: [actionRow] - // }); - // }); - // return; + getAnswer(fields: ModalSubmitFields, questionNum: number): string { + return fields.getField(`question${questionNum + 1}`).value; } + getAnswerField(questionNum: number): ActionRowBuilder { return new ActionRowBuilder({ components: [new TextInputBuilder() - .setCustomId(`question ${questionNum + 1}`) + .setCustomId(`question${questionNum + 1}`) .setLabel(`Question ${questionNum + 1}`) .setStyle(TextInputStyle.Short) .setPlaceholder('Input Answer Here')] }); diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index c278b542..68bd8a89 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -3,7 +3,8 @@ import { Collection, Client, CommandInteraction, ApplicationCommand, ModalSubmitInteraction, TextChannel, GuildMemberRoleManager, ButtonInteraction, ModalBuilder, TextInputBuilder, ActionRowBuilder, ModalActionRowComponentBuilder, ApplicationCommandType, ApplicationCommandDataResolvable, ChannelType, ApplicationCommandPermissionType, TextInputStyle, - ChatInputCommandInteraction } from 'discord.js'; + ChatInputCommandInteraction, + ModalSubmitFields } from 'discord.js'; import { isCmdEqual, readdirRecursive } from '@root/src/lib/utils/generalUtils'; import { Command } from '@lib/types/Command'; import { SageData } from '@lib/types/SageData'; @@ -145,6 +146,14 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie interaction.reply({ content: `Thank you for verifying! You can now access the rest of the server. ${enrollStr}`, ephemeral: true }); break; } + case 'jobModal': { + // extracting the input from the modal + const questionIDs = [1, 2, 3, 4, 5]; + const jobAnswers = questionIDs.map((question) => interaction.fields.getTextInputValue(`question${question}`)); + console.log(jobAnswers); + interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); + break; + } } } From 7f837daed7de0cae2e9f57b2a5b9a2352080cd79 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Wed, 16 Oct 2024 09:20:32 -0400 Subject: [PATCH 013/267] almost finished with the API preferences. Has some error. --- src/commands/Jobs/APIDatabase.ts | 42 ++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/commands/Jobs/APIDatabase.ts diff --git a/src/commands/Jobs/APIDatabase.ts b/src/commands/Jobs/APIDatabase.ts new file mode 100644 index 00000000..6341f6ad --- /dev/null +++ b/src/commands/Jobs/APIDatabase.ts @@ -0,0 +1,42 @@ +import { Client, TextChannel, Role, Message, EmbedBuilder, PartialMessage, ThreadChannel, ChannelType } from 'discord.js'; +import { DatabaseError } from '@lib/types/errors'; +import { CHANNELS, DB, ROLES, GUILDS } from '@root/config'; +import { SageUser } from '@lib/types/SageUser'; +import { calcNeededExp } from '@lib/utils/generalUtils'; + + +// async function storePref(msg: Message) { +// const bot = msg.client; +// bot.mongo.collection(DB.USERS).findOneAndUpdate( +// {discordID: msg.author.id}, +// {$inc: {count: countInc, curExp: -1}}, + +// ) +// return result.ops[0]; +// } + + +async function storePref(msg: Message, preferences: Record): Promise { + const bot = msg.client; + await bot.mongo.collection(DB.USERS).findOneAndUpdate( + { discordID: msg.author.id }, + { $set: { preferences } }, + { upsert: true } + ); +} +async function reg(bot: Client): Promise { + bot.on('guildMemberAdd', async (member) => { + const defaultPref = { + jobType: 'internship', + location: 'hybrid', + keywords: ['coding'], + frequency: 'daily' + }; + const messageHolder: Partial = { + client: bot, + author: member.user + } as Message; + await storePref(messageHolder as Message, defaultPref); + }); +} +export default reg; From 13cec7944d110777fdb6b3f2010ae37e02f28fea Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Wed, 16 Oct 2024 10:05:13 -0400 Subject: [PATCH 014/267] added questions --- src/commands/jobs/jobform.ts | 31 ++++++++++++++++++++++++++----- src/pieces/commandManager.ts | 3 ++- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index ea8f7ab9..97279447 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,19 +1,40 @@ import { Command } from '@root/src/lib/types/Command'; -import { ActionRowBuilder, ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, TextInputBuilder, TextInputStyle } from 'discord.js'; +import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptionType, + ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, + TextInputBuilder, TextInputStyle } from 'discord.js'; -const questions = ['Question 1', 'Question 2', 'Question 3', 'Question 4', 'Question 5']; +const questions = [ + ['What city are you located in?', 'Are you looking for something remote or in person?', 'Are you looking for a job, internship or both?', 'How far are you willing to travel?'], + ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] +]; export default class extends Command { name = 'jobform'; description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; + options: ApplicationCommandOptionData[] = [ + { + name: 'qSet', + description: 'Which question set do you want to view (1 or 2).', + type: ApplicationCommandOptionType.Number, + required: true + } + ] + async run(interaction: ChatInputCommandInteraction): Promise | void> { + const questionSet = interaction.options.getNumber('Question Set'); + + if (questionSet === 1 || questionSet === 2) { + interaction.reply({ content: 'Please enter either 1 or 2' }); + return; + } + const modal = new ModalBuilder() - .setCustomId('jobModal') - .setTitle('Job Form'); + .setCustomId(`jobModal${questionSet}`) + .setTitle(`Job Form (${questionSet} of 2)`); - const rows = questions.map((question) => this.getAnswerField(questions.indexOf(question))); + const rows = questions[questionSet].map((question) => this.getAnswerField(questions[questionSet].indexOf(question))); for (const row of rows) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 68bd8a89..792771fb 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -109,7 +109,7 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie const guild = await bot.guilds.fetch(GUILDS.MAIN); guild.members.fetch(); - switch (customId) { + switch (customId.replace(/[0-9]/g, '')) { case 'announce': { const channel = bot.channels.cache.get(fields.getTextInputValue('channel')) as TextChannel; const content = fields.getTextInputValue('content'); @@ -150,6 +150,7 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie // extracting the input from the modal const questionIDs = [1, 2, 3, 4, 5]; const jobAnswers = questionIDs.map((question) => interaction.fields.getTextInputValue(`question${question}`)); + console.log(interaction.customId); console.log(jobAnswers); interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); break; From f92a88ebbf027f925285b06875db0865f2346e1e Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 20 Oct 2024 22:01:58 -0400 Subject: [PATCH 015/267] added Link form submission to database storage, however, I do not think it works --- src/commands/Jobs/APIDatabase.ts | 125 ++++++++++++++++++++++++++----- 1 file changed, 106 insertions(+), 19 deletions(-) diff --git a/src/commands/Jobs/APIDatabase.ts b/src/commands/Jobs/APIDatabase.ts index 6341f6ad..f560dadc 100644 --- a/src/commands/Jobs/APIDatabase.ts +++ b/src/commands/Jobs/APIDatabase.ts @@ -1,22 +1,75 @@ -import { Client, TextChannel, Role, Message, EmbedBuilder, PartialMessage, ThreadChannel, ChannelType } from 'discord.js'; -import { DatabaseError } from '@lib/types/errors'; -import { CHANNELS, DB, ROLES, GUILDS } from '@root/config'; -import { SageUser } from '@lib/types/SageUser'; -import { calcNeededExp } from '@lib/utils/generalUtils'; +// import { Client, User, TextChannel, Role, Message, EmbedBuilder, PartialMessage, ThreadChannel, ChannelType } from 'discord.js'; +// import { DatabaseError } from '@lib/types/errors'; +// import { CHANNELS, DB, ROLES, GUILDS } from '@root/config'; +// import { SageUser } from '@lib/types/SageUser'; +// import { calcNeededExp } from '@lib/utils/generalUtils'; -// async function storePref(msg: Message) { -// const bot = msg.client; -// bot.mongo.collection(DB.USERS).findOneAndUpdate( -// {discordID: msg.author.id}, -// {$inc: {count: countInc, curExp: -1}}, +// // async function storePref(msg: Message) { +// // const bot = msg.client; +// // bot.mongo.collection(DB.USERS).findOneAndUpdate( +// // {discordID: msg.author.id}, +// // {$inc: {count: countInc, curExp: -1}}, + +// // ) +// // return result.ops[0]; +// // } + +// // interface Job { +// // name: Message +// // } +// // const jobs = Message; + + +// -------------------------Code I may need-------------------Do Not Delete Yet---------------------- +// interface Jobs { +// jobType: string, +// location: string, +// keywords: [string], +// frequency: string; +// } -// ) -// return result.ops[0]; +// function createMessage(bot:Client, user: User): Message { +// return { +// client: bot, +// author: user, +// content: '', +// channel: null +// } as unknown as Message; // } +// async function storePref(msg: Message, preferences: Jobs): Promise { +// const bot = msg.client; +// await bot.mongo.collection(DB.USERS).findOneAndUpdate( +// { discordID: msg.author.id }, +// { $set: { preferences } }, +// { upsert: true } +// ); +// } +// async function reg(bot: Client): Promise { +// bot.on('guildMemberAdd', async (member) => { +// const defaultPref: Jobs = { +// jobType: 'internship', +// location: 'hybrid', +// keywords: ['coding'], +// frequency: 'daily' +// }; +// const messageHolder = createMessage(bot, member.user); +// await storePref(messageHolder, defaultPref); +// }); +// } +// export default reg; +import { Client, User, Message } from 'discord.js'; +import { DB } from '@root/config'; -async function storePref(msg: Message, preferences: Record): Promise { +interface Jobs { + jobType: string; + location: string; + keywords: string[]; + frequency: string; +} + +async function storePref(msg: Message, preferences: Jobs): Promise { const bot = msg.client; await bot.mongo.collection(DB.USERS).findOneAndUpdate( { discordID: msg.author.id }, @@ -24,19 +77,53 @@ async function storePref(msg: Message, preferences: Record): Promis { upsert: true } ); } + +async function handleFormSubmission(msg: Message) { + const args = msg.content.split(',').map(arg => arg.trim()); + if (args.length < 4) { + return msg.reply('Please provide all preferences: jobType, location, keywords (comma-separated), frequency.'); + } + + const [jobType, location, keywordsRaw, frequency] = args; + const keywords = keywordsRaw.split(' ').filter(Boolean); + + const preferences: Jobs = { + jobType, + location, + keywords, + frequency + }; + + await storePref(msg, preferences); + msg.reply('Your preferences have been updated!'); +} + async function reg(bot: Client): Promise { + bot.on('messageCreate', async (msg: Message) => { + if (msg.content.startsWith('!setPreferences')) { + await handleFormSubmission(msg); + } + }); + bot.on('guildMemberAdd', async (member) => { - const defaultPref = { + const defaultPref: Jobs = { jobType: 'internship', location: 'hybrid', keywords: ['coding'], frequency: 'daily' }; - const messageHolder: Partial = { - client: bot, - author: member.user - } as Message; - await storePref(messageHolder as Message, defaultPref); + await storePref(createMessage(bot, member.user), defaultPref); }); } + +function createMessage(bot: Client, user: User): Message { + return { + client: bot, + author: user, + content: '', + channel: null + } as unknown as Message; +} + export default reg; + From 5d4740799b3e86a325195ba1dd712f1daebf32a5 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 21 Oct 2024 00:07:35 -0400 Subject: [PATCH 016/267] added another option to the reminder command that asks for the 'reminder type' and added a conditonal to check whether the user inputted a reminder type for 'job' or 'misc', otherwise they're sent an error --- src/commands/reminders/remind.ts | 95 ++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 30 deletions(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 9dff9250..733ca607 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -1,60 +1,95 @@ -import { BOT, DB } from '@root/config'; -import { ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, InteractionResponse } from 'discord.js'; -import { Reminder } from '@lib/types/Reminder'; -import parse from 'parse-duration'; -import { reminderTime } from '@root/src/lib/utils/generalUtils'; -import { Command } from '@lib/types/Command'; +import { BOT, DB } from "@root/config"; +import { + ApplicationCommandOptionData, + ApplicationCommandOptionType, + ChatInputCommandInteraction, + InteractionResponse, +} from "discord.js"; +import { Reminder } from "@lib/types/Reminder"; +import parse from "parse-duration"; +import { reminderTime } from "@root/src/lib/utils/generalUtils"; +import { Command } from "@lib/types/Command"; export default class extends Command { - - description = `Have ${BOT.NAME} give you a reminder.`; - extendedHelp = 'Reminders can be set to repeat daily or weekly.'; + extendedHelp = "Reminders can be set to repeat daily or weekly."; options: ApplicationCommandOptionData[] = [ { - name: 'content', - description: 'What you\'d like to be reminded of', + name: "content", + description: "What you'd like to be reminded of", type: ApplicationCommandOptionType.String, - required: true + required: true, }, { - name: 'duration', - description: 'When you\'d like to be reminded', + name: "reminder-type", + description: + "What kind of reminder would you like to create? Enter 'job' or 'misc'", type: ApplicationCommandOptionType.String, - required: true + required: true, }, { - name: 'repeat', - description: 'How often you want the reminder to repeat', - choices: [{ name: 'Daily', value: 'daily' }, { name: 'Weekly', value: 'weekly' }], + name: "duration", + description: "When you'd like to be reminded", type: ApplicationCommandOptionType.String, - required: false - } - ] + required: true, + }, + { + name: "repeat", + description: "How often you want the reminder to repeat", + choices: [ + { name: "Daily", value: "daily" }, + { name: "Weekly", value: "weekly" }, + ], + type: ApplicationCommandOptionType.String, + required: false, + }, + ]; - run(interaction: ChatInputCommandInteraction): Promise | void> { - const content = interaction.options.getString('content'); - const rawDuration = interaction.options.getString('duration'); + run( + interaction: ChatInputCommandInteraction + ): Promise | void> { + const content = interaction.options.getString("content"); + const rawDuration = interaction.options.getString("duration"); + const reminderType = + (interaction.options.getString("reminder-type") as + | "job" + | "misc") || null; const duration = parse(rawDuration); - const repeat = interaction.options.getString('repeat') as 'daily' | 'weekly' || null; + const repeat = + (interaction.options.getString("repeat") as "daily" | "weekly") || + null; if (!duration) { return interaction.reply({ content: `**${rawDuration}** is not a valid duration. You can use words like hours, minutes, seconds, days, weeks, months, or years.`, - ephemeral: true + ephemeral: true, }); } + + if ( + !reminderType || + reminderType.toLowerCase() != "job" || + reminderType.toLocaleLowerCase() != "misc" + ) { + return interaction.reply({ + content: `**${reminderType}** is not a valid reminder type. You can use "job" to set a job reminder or "misc" to set a reminder for something else.`, + ephemeral: true, + }); + } + const reminder: Reminder = { owner: interaction.user.id, content, - mode: 'public', // temporary + mode: "public", // temporary expires: new Date(duration + Date.now()), - repeat + repeat, }; interaction.client.mongo.collection(DB.REMINDERS).insertOne(reminder); - return interaction.reply({ content: `I'll remind you about that at ${reminderTime(reminder)}.`, ephemeral: true }); + return interaction.reply({ + content: `I'll remind you about that at ${reminderTime(reminder)}.`, + ephemeral: true, + }); } - } From 85ac08a023c74ad4eba52b8c1f56f06873534fb0 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Mon, 21 Oct 2024 09:46:42 -0400 Subject: [PATCH 017/267] pls work --- package-lock.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package-lock.json b/package-lock.json index 4a017af8..891b3203 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3030,6 +3030,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" From 21125f97bf5761e5934f9b63813bbf8b19afbaec Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 21 Oct 2024 10:50:55 -0400 Subject: [PATCH 018/267] modified remind command so it now utilizes subcommands with one specifically for job reminders --- src/commands/reminders/remind.ts | 120 +++++++++++++++++++++---------- 1 file changed, 84 insertions(+), 36 deletions(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 733ca607..1f32ab81 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -15,64 +15,111 @@ export default class extends Command { extendedHelp = "Reminders can be set to repeat daily or weekly."; options: ApplicationCommandOptionData[] = [ { - name: "content", - description: "What you'd like to be reminded of", - type: ApplicationCommandOptionType.String, - required: true, - }, - { - name: "reminder-type", - description: - "What kind of reminder would you like to create? Enter 'job' or 'misc'", - type: ApplicationCommandOptionType.String, - required: true, - }, - { - name: "duration", - description: "When you'd like to be reminded", - type: ApplicationCommandOptionType.String, - required: true, + name: "create", + description: "Create a reminder", + type: ApplicationCommandOptionType.Subcommand, + options: [ + { + name: "content", + description: "What you'd like to be reminded of", + type: ApplicationCommandOptionType.String, + required: true, + }, + { + name: "duration", + description: "When you'd like to be reminded", + type: ApplicationCommandOptionType.String, + required: true, + }, + { + name: "repeat", + description: "How often you want the reminder to repeat", + choices: [ + { name: "Daily", value: "daily" }, + { name: "Weekly", value: "weekly" }, + ], + type: ApplicationCommandOptionType.String, + required: false, + }, + ], }, { - name: "repeat", - description: "How often you want the reminder to repeat", - choices: [ - { name: "Daily", value: "daily" }, - { name: "Weekly", value: "weekly" }, + name: "jobs", + description: "Create a reminder for a job", + type: ApplicationCommandOptionType.Subcommand, + options: [ + { + name: "duration", + description: "When you'd like to be reminded", + type: ApplicationCommandOptionType.String, + required: true, + }, + { + name: "repeat", + description: "How often you want the reminder to repeat", + choices: [ + { name: "Daily", value: "daily" }, + { name: "Weekly", value: "weekly" }, + ], + type: ApplicationCommandOptionType.String, + required: true, + }, ], - type: ApplicationCommandOptionType.String, - required: false, }, ]; + // options: ApplicationCommandOptionData[] = [ + // { + // name: "content", + // description: "What you'd like to be reminded of", + // type: ApplicationCommandOptionType.String, + // required: true, + // }, + // { + // name: "reminder-type", + // description: + // "What kind of reminder would you like to create? Enter 'job' or 'misc'", + // type: ApplicationCommandOptionType.String, + // required: true, + // }, + // { + // name: "duration", + // description: "When you'd like to be reminded", + // type: ApplicationCommandOptionType.String, + // required: true, + // }, + // { + // name: "repeat", + // description: "How often you want the reminder to repeat", + // choices: [ + // { name: "Daily", value: "daily" }, + // { name: "Weekly", value: "weekly" }, + // ], + // type: ApplicationCommandOptionType.String, + // required: false, + // }, + // ]; run( interaction: ChatInputCommandInteraction ): Promise | void> { const content = interaction.options.getString("content"); const rawDuration = interaction.options.getString("duration"); - const reminderType = - (interaction.options.getString("reminder-type") as - | "job" - | "misc") || null; + const reminderType = interaction.options.getString("reminder-type"); const duration = parse(rawDuration); const repeat = (interaction.options.getString("repeat") as "daily" | "weekly") || null; - if (!duration) { + if (!reminderType || reminderType.toLowerCase() !== "job") { return interaction.reply({ - content: `**${rawDuration}** is not a valid duration. You can use words like hours, minutes, seconds, days, weeks, months, or years.`, + content: `**${reminderType}** is not a valid reminder type. You can use "job" to set a job reminder or "misc" to set a reminder for something else.`, ephemeral: true, }); } - if ( - !reminderType || - reminderType.toLowerCase() != "job" || - reminderType.toLocaleLowerCase() != "misc" - ) { + if (!duration) { return interaction.reply({ - content: `**${reminderType}** is not a valid reminder type. You can use "job" to set a job reminder or "misc" to set a reminder for something else.`, + content: `**${rawDuration}** is not a valid duration. You can use words like hours, minutes, seconds, days, weeks, months, or years.`, ephemeral: true, }); } @@ -81,6 +128,7 @@ export default class extends Command { owner: interaction.user.id, content, mode: "public", // temporary + reminderType: reminderType, expires: new Date(duration + Date.now()), repeat, }; From 1de16dd2d64f59e1abd5af66e34188782412d731 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 21 Oct 2024 13:13:16 -0400 Subject: [PATCH 019/267] modified logic so that it checks which subcommand the user chose and based on that, handles the appropriate logic --- src/commands/reminders/remind.ts | 110 +++++++++++-------------------- 1 file changed, 40 insertions(+), 70 deletions(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 1f32ab81..5e166785 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -45,17 +45,11 @@ export default class extends Command { }, { name: "jobs", - description: "Create a reminder for a job", + description: "Create a job reminder", type: ApplicationCommandOptionType.Subcommand, options: [ { - name: "duration", - description: "When you'd like to be reminded", - type: ApplicationCommandOptionType.String, - required: true, - }, - { - name: "repeat", + name: "job-repeat", description: "How often you want the reminder to repeat", choices: [ { name: "Daily", value: "daily" }, @@ -67,77 +61,53 @@ export default class extends Command { ], }, ]; - // options: ApplicationCommandOptionData[] = [ - // { - // name: "content", - // description: "What you'd like to be reminded of", - // type: ApplicationCommandOptionType.String, - // required: true, - // }, - // { - // name: "reminder-type", - // description: - // "What kind of reminder would you like to create? Enter 'job' or 'misc'", - // type: ApplicationCommandOptionType.String, - // required: true, - // }, - // { - // name: "duration", - // description: "When you'd like to be reminded", - // type: ApplicationCommandOptionType.String, - // required: true, - // }, - // { - // name: "repeat", - // description: "How often you want the reminder to repeat", - // choices: [ - // { name: "Daily", value: "daily" }, - // { name: "Weekly", value: "weekly" }, - // ], - // type: ApplicationCommandOptionType.String, - // required: false, - // }, - // ]; run( interaction: ChatInputCommandInteraction ): Promise | void> { - const content = interaction.options.getString("content"); - const rawDuration = interaction.options.getString("duration"); - const reminderType = interaction.options.getString("reminder-type"); - const duration = parse(rawDuration); - const repeat = - (interaction.options.getString("repeat") as "daily" | "weekly") || - null; + const subcommand: string = interaction.options.getSubcommand(); - if (!reminderType || reminderType.toLowerCase() !== "job") { - return interaction.reply({ - content: `**${reminderType}** is not a valid reminder type. You can use "job" to set a job reminder or "misc" to set a reminder for something else.`, - ephemeral: true, - }); - } + if (subcommand === "jobs") { + const jobReminderRepeat = + (interaction.options.getString("job-repeat") as + | "daily" + | "weekly") || null; + console.log("----->", jobReminderRepeat); + + return; + } else { + console.log("----->", "you chose misc reminder"); - if (!duration) { + const content = interaction.options.getString("content"); + const rawDuration = interaction.options.getString("duration"); + const duration = parse(rawDuration); + const repeat = + (interaction.options.getString("repeat") as + | "daily" + | "weekly") || null; + + if (!duration) { + return interaction.reply({ + content: `**${rawDuration}** is not a valid duration. You can use words like hours, minutes, seconds, days, weeks, months, or years.`, + ephemeral: true, + }); + } + const reminder: Reminder = { + owner: interaction.user.id, + content, + mode: "public", // temporary + expires: new Date(duration + Date.now()), + repeat, + }; + interaction.client.mongo + .collection(DB.REMINDERS) + .insertOne(reminder); return interaction.reply({ - content: `**${rawDuration}** is not a valid duration. You can use words like hours, minutes, seconds, days, weeks, months, or years.`, + content: `I'll remind you about that at ${reminderTime( + reminder + )}.`, ephemeral: true, }); } - - const reminder: Reminder = { - owner: interaction.user.id, - content, - mode: "public", // temporary - reminderType: reminderType, - expires: new Date(duration + Date.now()), - repeat, - }; - - interaction.client.mongo.collection(DB.REMINDERS).insertOne(reminder); - - return interaction.reply({ - content: `I'll remind you about that at ${reminderTime(reminder)}.`, - ephemeral: true, - }); } } From a229822c702b8e0dcc396b95e2a75c79852594ca Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 21 Oct 2024 15:14:32 -0400 Subject: [PATCH 020/267] updated t ernary logic so that if the reminder is a job reminder, it wi ll say 'job reminder' instead of 'private reminder' despite i t being private as well --- src/commands/reminders/viewreminders.ts | 62 +++++++++++++++++-------- 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/src/commands/reminders/viewreminders.ts b/src/commands/reminders/viewreminders.ts index 994e5135..23b3284a 100644 --- a/src/commands/reminders/viewreminders.ts +++ b/src/commands/reminders/viewreminders.ts @@ -1,37 +1,59 @@ -import { DB } from '@root/config'; -import { Reminder } from '@lib/types/Reminder'; -import { ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; -import { reminderTime } from '@root/src/lib/utils/generalUtils'; -import { Command } from '@lib/types/Command'; +import { DB } from "@root/config"; +import { Reminder } from "@lib/types/Reminder"; +import { + ChatInputCommandInteraction, + EmbedBuilder, + InteractionResponse, +} from "discord.js"; +import { reminderTime } from "@root/src/lib/utils/generalUtils"; +import { Command } from "@lib/types/Command"; export default class extends Command { - - description = 'See your upcoming reminders.'; - extendedHelp = 'Don\'t worry, private reminders will be hidden if you use this command publicly.'; - - async run(interaction: ChatInputCommandInteraction): Promise | void> { - const reminders: Array = await interaction.client.mongo.collection(DB.REMINDERS) - .find({ owner: interaction.user.id }).toArray(); + description = "See your upcoming reminders."; + extendedHelp = + "Don't worry, private reminders will be hidden if you use this command publicly."; + + async run( + interaction: ChatInputCommandInteraction + ): Promise | void> { + const reminders: Array = await interaction.client.mongo + .collection(DB.REMINDERS) + .find({ owner: interaction.user.id }) + .toArray(); reminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); if (reminders.length < 1) { - interaction.reply({ content: 'You don\'t have any pending reminders!', ephemeral: true }); + interaction.reply({ + content: "You don't have any pending reminders!", + ephemeral: true, + }); } const embeds: Array = []; reminders.forEach((reminder, i) => { if (i % 25 === 0) { - embeds.push(new EmbedBuilder() - .setTitle('Pending reminders') - .setColor('DarkAqua')); + embeds.push( + new EmbedBuilder() + .setTitle("Pending reminders") + .setColor("DarkAqua") + ); } - const hidden = reminder.mode === 'private'; - embeds[Math.floor(i / 25)].addFields({ name: `${i + 1}. ${hidden ? 'Private reminder' : reminder.content}`, - value: hidden ? 'Some time in the future.' : reminderTime(reminder) }); + const hidden = reminder.mode === "private"; + embeds[Math.floor(i / 25)].addFields({ + name: `${i + 1}. ${ + hidden + ? reminder.content === "Job Reminder" + ? "[Job Reminder]" + : "Private reminder" + : reminder.content + }`, + value: hidden + ? "Some time in the future." + : reminderTime(reminder), + }); }); interaction.reply({ embeds }); } - } From 923b0f6b8a86fb8211fda8ce847a122249fa09b8 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 21 Oct 2024 15:17:33 -0400 Subject: [PATCH 021/267] added missing logic inside of conditional for job subcommand so now job subcommands are saved to Mongo as well --- src/commands/reminders/remind.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 5e166785..2ae15ee1 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -72,12 +72,24 @@ export default class extends Command { (interaction.options.getString("job-repeat") as | "daily" | "weekly") || null; - console.log("----->", jobReminderRepeat); - return; + const jobReminder: Reminder = { + owner: interaction.user.id, + content: "Job Reminder", + mode: "private", + expires: new Date(0 + Date.now()), + repeat: jobReminderRepeat, + }; + interaction.client.mongo + .collection(DB.REMINDERS) + .insertOne(jobReminder); + return interaction.reply({ + content: `I'll remind you about job offers at ${reminderTime( + jobReminder + )}.`, + ephemeral: true, + }); } else { - console.log("----->", "you chose misc reminder"); - const content = interaction.options.getString("content"); const rawDuration = interaction.options.getString("duration"); const duration = parse(rawDuration); From a292d49a277ad90be4f3feb043ac4ae83e331772 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 21 Oct 2024 16:00:40 -0400 Subject: [PATCH 022/267] implemented method to check whether the user already has an existing job reminder set and implemented conditionals to prevent duplicate job reminders; the user is also prompted --- src/commands/reminders/remind.ts | 45 +++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 2ae15ee1..b11093c2 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -62,7 +62,20 @@ export default class extends Command { }, ]; - run( + async checkJobReminder( + interaction: ChatInputCommandInteraction + ): Promise { + const reminders: Array = await interaction.client.mongo + .collection(DB.REMINDERS) + .find({ owner: interaction.user.id }) + .toArray(); + + return reminders.some( + (reminder: Reminder) => reminder.content === "Job Reminder" + ); + } + + async run( interaction: ChatInputCommandInteraction ): Promise | void> { const subcommand: string = interaction.options.getSubcommand(); @@ -80,15 +93,27 @@ export default class extends Command { expires: new Date(0 + Date.now()), repeat: jobReminderRepeat, }; - interaction.client.mongo - .collection(DB.REMINDERS) - .insertOne(jobReminder); - return interaction.reply({ - content: `I'll remind you about job offers at ${reminderTime( - jobReminder - )}.`, - ephemeral: true, - }); + + const reminder_exists: boolean = await this.checkJobReminder( + interaction + ); + if (reminder_exists) { + return interaction.reply({ + content: + "You currently already have a job reminder set. To clear your existing job reminder, run `/cancelreminder` and provide the reminder number.", + ephemeral: true, + }); + } else { + interaction.client.mongo + .collection(DB.REMINDERS) + .insertOne(jobReminder); + return interaction.reply({ + content: `I'll remind you about job offers at ${reminderTime( + jobReminder + )}.`, + ephemeral: true, + }); + } } else { const content = interaction.options.getString("content"); const rawDuration = interaction.options.getString("duration"); From da787ca0e3441844f700b816615cb646ae259b35 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 21 Oct 2024 17:20:04 -0400 Subject: [PATCH 023/267] moved checkJobReminder method call into conditional instead of utilizing variable --- src/commands/reminders/remind.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index b11093c2..a9d74e3d 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -94,10 +94,7 @@ export default class extends Command { repeat: jobReminderRepeat, }; - const reminder_exists: boolean = await this.checkJobReminder( - interaction - ); - if (reminder_exists) { + if (await this.checkJobReminder(interaction)) { return interaction.reply({ content: "You currently already have a job reminder set. To clear your existing job reminder, run `/cancelreminder` and provide the reminder number.", From dd2c7ec7762b37780ae30aadea657f7b8381a614 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 21 Oct 2024 17:21:12 -0400 Subject: [PATCH 024/267] reverted changes on Reminder interface --- src/lib/types/Reminder.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/types/Reminder.d.ts b/src/lib/types/Reminder.d.ts index bbc21138..06614669 100644 --- a/src/lib/types/Reminder.d.ts +++ b/src/lib/types/Reminder.d.ts @@ -2,6 +2,6 @@ export interface Reminder { owner: string; expires: Date; content: string; - repeat: null | 'daily' | 'weekly'; - mode: 'public' | 'private'; + repeat: null | "daily" | "weekly"; + mode: "public" | "private"; } From 78c0e249263520902167b539e46b749636ff71b9 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 21 Oct 2024 17:22:10 -0400 Subject: [PATCH 025/267] reformatted code with prettier --- src/commands/jobs/jobform.ts | 55 ++++++--- src/lib/utils/generalUtils.ts | 226 +++++++++++++++++++++++----------- src/pieces/tasks.ts | 140 +++++++++++++-------- 3 files changed, 281 insertions(+), 140 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index ea8f7ab9..00a07f0a 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,19 +1,37 @@ -import { Command } from '@root/src/lib/types/Command'; -import { ActionRowBuilder, ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, TextInputBuilder, TextInputStyle } from 'discord.js'; +import { Command } from "@root/src/lib/types/Command"; +import { + ActionRowBuilder, + ChatInputCommandInteraction, + InteractionResponse, + ModalBuilder, + ModalSubmitFields, + TextInputBuilder, + TextInputStyle, +} from "discord.js"; -const questions = ['Question 1', 'Question 2', 'Question 3', 'Question 4', 'Question 5']; +const questions = [ + "Question 1", + "Question 2", + "Question 3", + "Question 4", + "Question 5", +]; export default class extends Command { + name = "jobform"; + description = + "Form to get your preferences for jobs to be used with the Job Alert System!"; - name = 'jobform'; - description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; - - async run(interaction: ChatInputCommandInteraction): Promise | void> { + async run( + interaction: ChatInputCommandInteraction + ): Promise | void> { const modal = new ModalBuilder() - .setCustomId('jobModal') - .setTitle('Job Form'); + .setCustomId("jobModal") + .setTitle("Job Form"); - const rows = questions.map((question) => this.getAnswerField(questions.indexOf(question))); + const rows = questions.map((question) => + this.getAnswerField(questions.indexOf(question)) + ); for (const row of rows) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -28,18 +46,19 @@ export default class extends Command { return; } - getAnswer(fields: ModalSubmitFields, questionNum: number): string { return fields.getField(`question${questionNum + 1}`).value; } - getAnswerField(questionNum: number): ActionRowBuilder { - return new ActionRowBuilder({ components: [new TextInputBuilder() - .setCustomId(`question${questionNum + 1}`) - .setLabel(`Question ${questionNum + 1}`) - .setStyle(TextInputStyle.Short) - .setPlaceholder('Input Answer Here')] }); + return new ActionRowBuilder({ + components: [ + new TextInputBuilder() + .setCustomId(`question${questionNum + 1}`) + .setLabel(`Question ${questionNum + 1}`) + .setStyle(TextInputStyle.Short) + .setPlaceholder("Input Answer Here"), + ], + }); } - } diff --git a/src/lib/utils/generalUtils.ts b/src/lib/utils/generalUtils.ts index 1813184d..0b87b5ab 100644 --- a/src/lib/utils/generalUtils.ts +++ b/src/lib/utils/generalUtils.ts @@ -1,95 +1,143 @@ import { - ApplicationCommandOptionData, Client, CommandInteraction, AttachmentBuilder, - EmbedBuilder, TextChannel, ActionRowBuilder, ApplicationCommandPermissions, - StringSelectMenuBuilder -} from 'discord.js'; -import { Command, CompCommand } from '@lib/types/Command'; -import * as fs from 'fs'; -import { DB, CHANNELS, ROLE_DROPDOWNS, BOT } from '@root/config'; -import moment from 'moment'; -import { Reminder } from '@lib/types/Reminder'; -import { Course } from '@lib/types/Course'; + ApplicationCommandOptionData, + Client, + CommandInteraction, + AttachmentBuilder, + EmbedBuilder, + TextChannel, + ActionRowBuilder, + ApplicationCommandPermissions, + StringSelectMenuBuilder, +} from "discord.js"; +import { Command, CompCommand } from "@lib/types/Command"; +import * as fs from "fs"; +import { DB, CHANNELS, ROLE_DROPDOWNS, BOT } from "@root/config"; +import moment from "moment"; +import { Reminder } from "@lib/types/Reminder"; +import { Course } from "@lib/types/Course"; export function getCommand(bot: Client, cmd: string): Command { cmd = cmd.toLowerCase(); - return bot.commands.get(cmd) || bot.commands.find(command => command.aliases && command.aliases.includes(cmd)); + return ( + bot.commands.get(cmd) || + bot.commands.find( + (command) => command.aliases && command.aliases.includes(cmd) + ) + ); } export function isCmdEqual(cmd1: CompCommand, cmd2: CompCommand): boolean { - return cmd1.name === cmd2.name - && cmd1.description === cmd2.description - && isOptionsListEqual(cmd1.options, cmd2.options); + return ( + cmd1.name === cmd2.name && + cmd1.description === cmd2.description && + isOptionsListEqual(cmd1.options, cmd2.options) + ); } -export function isOptionsListEqual(list1: ApplicationCommandOptionData[], list2: ApplicationCommandOptionData[]): boolean { +export function isOptionsListEqual( + list1: ApplicationCommandOptionData[], + list2: ApplicationCommandOptionData[] +): boolean { if (list1.length !== list2.length) return false; - const valid = list1.every(list1Option => list2.find(list2Option => - list2Option.name === list1Option.name - && list2Option.description === list1Option.description - && checkOptions(list1Option, list2Option) - && list2Option.type === list1Option.type - )); + const valid = list1.every((list1Option) => + list2.find( + (list2Option) => + list2Option.name === list1Option.name && + list2Option.description === list1Option.description && + checkOptions(list1Option, list2Option) && + list2Option.type === list1Option.type + ) + ); return valid; } -function checkOptions(list1Option: ApplicationCommandOptionData, list2Option: ApplicationCommandOptionData): boolean { - if ('required' in list1Option && 'required' in list2Option) { // see note 1 comment block in help.ts +function checkOptions( + list1Option: ApplicationCommandOptionData, + list2Option: ApplicationCommandOptionData +): boolean { + if ("required" in list1Option && "required" in list2Option) { + // see note 1 comment block in help.ts return list2Option.required === list1Option.required; } return false; } -export function isPermissionEqual(perm1: ApplicationCommandPermissions, perm2: ApplicationCommandPermissions): boolean { - return perm1.id === perm2.id - && perm1.permission === perm2.permission - && perm1.type === perm2.type; +export function isPermissionEqual( + perm1: ApplicationCommandPermissions, + perm2: ApplicationCommandPermissions +): boolean { + return ( + perm1.id === perm2.id && + perm1.permission === perm2.permission && + perm1.type === perm2.type + ); } export function generateErrorEmbed(msg: string): EmbedBuilder { const responseEmbed = new EmbedBuilder() - .setColor('#ff0000') - .setTitle('Error') + .setColor("#ff0000") + .setTitle("Error") .setDescription(msg); return responseEmbed; } export function getMsgIdFromLink(link: string): string { let msgId: string; - if ((msgId = link.split('/').pop()) === undefined) throw 'You must call this function with a message link!'; + if ((msgId = link.split("/").pop()) === undefined) + throw "You must call this function with a message link!"; return msgId; } -export async function updateDropdowns(interaction: CommandInteraction): Promise { +export async function updateDropdowns( + interaction: CommandInteraction +): Promise { /* Here in this function lies the genius ideas of Ben Segal, the OG admin Thank you Ben for making v14 refactoring so much easier, now I'll just find some more hair having pulled all of mine out - S */ - const channel = await interaction.guild.channels.fetch(CHANNELS.ROLE_SELECT) as TextChannel; + const channel = (await interaction.guild.channels.fetch( + CHANNELS.ROLE_SELECT + )) as TextChannel; let coursesMsg, assignablesMsg; // find both dropdown messages, based on what's in the config try { coursesMsg = await channel.messages.fetch(ROLE_DROPDOWNS.COURSE_ROLES); - assignablesMsg = await channel.messages.fetch(ROLE_DROPDOWNS.ASSIGN_ROLES); + assignablesMsg = await channel.messages.fetch( + ROLE_DROPDOWNS.ASSIGN_ROLES + ); } catch (error) { const responseEmbed = new EmbedBuilder() - .setColor('#ff0000') - .setTitle('Argument error') - .setDescription(`Unknown message(s), make sure your channel and message ID are correct.`); + .setColor("#ff0000") + .setTitle("Argument error") + .setDescription( + `Unknown message(s), make sure your channel and message ID are correct.` + ); interaction.channel.send({ embeds: [responseEmbed] }); } - if (coursesMsg.author.id !== BOT.CLIENT_ID || assignablesMsg.author.id !== BOT.CLIENT_ID) { + if ( + coursesMsg.author.id !== BOT.CLIENT_ID || + assignablesMsg.author.id !== BOT.CLIENT_ID + ) { const responseEmbed = new EmbedBuilder() - .setColor('#ff0000') - .setTitle('Argument error') - .setDescription(`You must tag a message that was sent by ${BOT.NAME} (me!).`); + .setColor("#ff0000") + .setTitle("Argument error") + .setDescription( + `You must tag a message that was sent by ${BOT.NAME} (me!).` + ); interaction.channel.send({ embeds: [responseEmbed] }); } // get roles from DB - let courses: Array = await interaction.client.mongo.collection(DB.COURSES).find().toArray(); - const assignableRoles = await interaction.client.mongo.collection(DB.ASSIGNABLE).find().toArray(); + let courses: Array = await interaction.client.mongo + .collection(DB.COURSES) + .find() + .toArray(); + const assignableRoles = await interaction.client.mongo + .collection(DB.ASSIGNABLE) + .find() + .toArray(); let assignables = []; for (const role of assignableRoles) { const { name } = await interaction.guild.roles.fetch(role.id); @@ -97,16 +145,16 @@ export async function updateDropdowns(interaction: CommandInteraction): Promise< } // sort alphabetically - courses = courses.sort((a, b) => a.name > b.name ? 1 : -1); - assignables = assignables.sort((a, b) => a.name > b.name ? 1 : -1); + courses = courses.sort((a, b) => (a.name > b.name ? 1 : -1)); + assignables = assignables.sort((a, b) => (a.name > b.name ? 1 : -1)); // initialize dropdowns const coursesDropdown = new StringSelectMenuBuilder() - .setCustomId('roleselect') + .setCustomId("roleselect") .setMaxValues(courses.length) .setMinValues(0); const assignablesDropdown = new StringSelectMenuBuilder() - .setCustomId('roleselect') + .setCustomId("roleselect") .setMaxValues(assignables.length) .setMinValues(0); // these have to be here otherwise it won't add the dropdown components @@ -115,33 +163,62 @@ export async function updateDropdowns(interaction: CommandInteraction): Promise< assignablesDropdown.data.type = 3; // add options to dropdowns - coursesDropdown.addOptions(courses.map(c => ({ label: `CISC ${c.name}`, value: c.roles.student }))); - assignablesDropdown.addOptions(assignables.map(a => ({ label: a.name, value: a.id }))); + coursesDropdown.addOptions( + courses.map((c) => ({ + label: `CISC ${c.name}`, + value: c.roles.student, + })) + ); + assignablesDropdown.addOptions( + assignables.map((a) => ({ label: a.name, value: a.id })) + ); // create component rows, add to messages - const coursesRow = new ActionRowBuilder().addComponents(coursesDropdown); - const assignablesRow = new ActionRowBuilder().addComponents(assignablesDropdown); + const coursesRow = + new ActionRowBuilder().addComponents( + coursesDropdown + ); + const assignablesRow = + new ActionRowBuilder().addComponents( + assignablesDropdown + ); coursesMsg.edit({ components: [coursesRow] }); assignablesMsg.edit({ components: [assignablesRow] }); return; } -export type TimestampType = 't' | 'T' | 'd' | 'D' | 'f' | 'F' | 'R'; -export function dateToTimestamp(date: Date, type: TimestampType = 't'): string { +export type TimestampType = "t" | "T" | "d" | "D" | "f" | "F" | "R"; +export function dateToTimestamp(date: Date, type: TimestampType = "t"): string { return ``; } -export async function sendToFile(input: string, filetype = 'txt', filename: string = null, timestamp = false): Promise { - const time = moment().format('M-D-YY_HH-mm'); - filename = `${filename}${timestamp ? `_${time}` : ''}` || time; - return new AttachmentBuilder(Buffer.from(input.trim()), { name: `${filename}.${filetype}` }); +export async function sendToFile( + input: string, + filetype = "txt", + filename: string = null, + timestamp = false +): Promise { + const time = moment().format("M-D-YY_HH-mm"); + filename = `${filename}${timestamp ? `_${time}` : ""}` || time; + return new AttachmentBuilder(Buffer.from(input.trim()), { + name: `${filename}.${filetype}`, + }); } -export async function generateQuestionId(interaction: CommandInteraction, depth = 1): Promise { - const potentialId = `${interaction.user.id.slice(interaction.user.id.length - depth)}${interaction.id.slice(interaction.id.length - depth)}`; +export async function generateQuestionId( + interaction: CommandInteraction, + depth = 1 +): Promise { + const potentialId = `${interaction.user.id.slice( + interaction.user.id.length - depth + )}${interaction.id.slice(interaction.id.length - depth)}`; - if (await interaction.client.mongo.collection(DB.PVQ).countDocuments({ questionId: potentialId }) > 0) { + if ( + (await interaction.client.mongo + .collection(DB.PVQ) + .countDocuments({ questionId: potentialId })) > 0 + ) { return generateQuestionId(interaction, depth + 1); } @@ -167,26 +244,34 @@ export function readdirRecursive(dir: string): string[] { export function reminderTime({ expires: date, repeat }: Reminder): string { const now = new Date(); - let prettyDateTime = ''; + let prettyDateTime = ""; const hour = date.getHours() % 12 === 0 ? 12 : date.getHours() % 12; const mins = date.getMinutes(); - const amPm = date.getHours() < 12 ? 'AM' : 'PM'; - prettyDateTime += `${hour}:${mins.toString().padStart(2, '0')} ${amPm} `; + const amPm = date.getHours() < 12 ? "AM" : "PM"; + prettyDateTime += `${hour}:${mins.toString().padStart(2, "0")} ${amPm} `; - if (repeat === 'daily') { - prettyDateTime += 'every day'; + if (repeat === "daily") { + prettyDateTime += "every day"; return prettyDateTime; } - if (!(now.getDate() === date.getDate() && now.getMonth() === date.getMonth() && now.getFullYear() === date.getFullYear())) { - prettyDateTime += `on ${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}`; + if ( + !( + now.getDate() === date.getDate() && + now.getMonth() === date.getMonth() && + now.getFullYear() === date.getFullYear() + ) + ) { + prettyDateTime += `on ${ + date.getMonth() + 1 + }/${date.getDate()}/${date.getFullYear()}`; } else { - prettyDateTime += 'Today'; + prettyDateTime += "Today"; } - if (repeat === 'weekly') { - prettyDateTime += ' and every week'; + if (repeat === "weekly") { + prettyDateTime += " and every week"; } return prettyDateTime; @@ -194,7 +279,8 @@ export function reminderTime({ expires: date, repeat }: Reminder): string { export function calcNeededExp(levelExp: number, direction: string): number { const xpRatio = 1.31; // Ren and I had an argument over whether it should be 1.3 or 1.33, we agreed on 1.31 because haha :) - if (direction === '+') { // calculate exp for next level + if (direction === "+") { + // calculate exp for next level return Math.floor(levelExp * xpRatio); } return Math.ceil(levelExp / xpRatio); // calculate exp for previous level diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index a3850612..02ba0d8e 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -1,13 +1,12 @@ -import { CHANNELS, DB } from '@root/config'; -import { ChannelType, Client, EmbedBuilder, TextChannel } from 'discord.js'; -import { schedule } from 'node-cron'; -import { Reminder } from '@lib/types/Reminder'; -import { Poll, PollResult } from '@lib/types/Poll'; +import { CHANNELS, DB } from "@root/config"; +import { ChannelType, Client, EmbedBuilder, TextChannel } from "discord.js"; +import { schedule } from "node-cron"; +import { Reminder } from "@lib/types/Reminder"; +import { Poll, PollResult } from "@lib/types/Poll"; async function register(bot: Client): Promise { - schedule('0/30 * * * * *', () => { - handleCron(bot) - .catch(async error => bot.emit('error', error)); + schedule("0/30 * * * * *", () => { + handleCron(bot).catch(async (error) => bot.emit("error", error)); }); } @@ -17,25 +16,30 @@ async function handleCron(bot: Client): Promise { } async function checkPolls(bot: Client): Promise { - const polls: Poll[] = await bot.mongo.collection(DB.POLLS).find({ - expires: { $lte: new Date() } - }).toArray(); - const emotes = ['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟']; - - polls.forEach(async poll => { + const polls: Poll[] = await bot.mongo + .collection(DB.POLLS) + .find({ + expires: { $lte: new Date() }, + }) + .toArray(); + const emotes = ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣", "🔟"]; + + polls.forEach(async (poll) => { const mdTimestamp = ``; // figure out the winner and also put the results in a map for ease of use const resultMap = new Map(); let winners: PollResult[] = []; - poll.results.forEach(res => { + poll.results.forEach((res) => { resultMap.set(res.option, res.users.length); if (!winners[0]) { winners = [res]; return; } - if (winners[0] && res.users.length > winners[0].users.length) winners = [res]; - else if (res.users.length === winners[0].users.length) winners.push(res); + if (winners[0] && res.users.length > winners[0].users.length) + winners = [res]; + else if (res.users.length === winners[0].users.length) + winners.push(res); }); // build up the win string @@ -44,64 +48,92 @@ async function checkPolls(bot: Client): Promise { if (winCount === 0) { winMessage = `It looks like no one has voted!`; } else if (winners.length === 1) { - winMessage = `**${winners[0].option}** has won the poll with ${winCount} vote${winCount === 1 ? '' : 's'}!`; - } else { winMessage = `**${ - winners.slice(0, -1).map(win => win.option).join(', ') - } and ${ + winners[0].option + }** has won the poll with ${winCount} vote${ + winCount === 1 ? "" : "s" + }!`; + } else { + winMessage = `**${winners + .slice(0, -1) + .map((win) => win.option) + .join(", ")} and ${ winners.slice(-1)[0].option - }** have won the poll with ${winners[0].users.length} vote${winCount === 1 ? '' : 's'} each!`; + }** have won the poll with ${winners[0].users.length} vote${ + winCount === 1 ? "" : "s" + } each!`; } // build up the text that is on the final poll embed - let choiceText = ''; + let choiceText = ""; let count = 0; resultMap.forEach((value, key) => { - choiceText += `${emotes[count++]} ${key}: ${value} vote${value === 1 ? '' : 's'}\n`; + choiceText += `${emotes[count++]} ${key}: ${value} vote${ + value === 1 ? "" : "s" + }\n`; }); const pollChannel = await bot.channels.fetch(poll.channel); - if (pollChannel.type !== ChannelType.GuildText) throw 'something went wrong fetching the poll\'s channel'; + if (pollChannel.type !== ChannelType.GuildText) + throw "something went wrong fetching the poll's channel"; const pollMsg = await pollChannel.messages.fetch(poll.message); const owner = await pollMsg.guild.members.fetch(poll.owner); const pollEmbed = new EmbedBuilder() .setTitle(poll.question) - .setDescription(`This poll was created by ${owner.displayName} and ended **${mdTimestamp}**`) - .addFields({ name: `Winner${winners.length === 1 ? '' : 's'}`, value: winMessage }) - .addFields({ name: 'Choices', value: choiceText }) - .setColor('Random'); + .setDescription( + `This poll was created by ${owner.displayName} and ended **${mdTimestamp}**` + ) + .addFields({ + name: `Winner${winners.length === 1 ? "" : "s"}`, + value: winMessage, + }) + .addFields({ name: "Choices", value: choiceText }) + .setColor("Random"); pollMsg.edit({ embeds: [pollEmbed], components: [] }); - - pollMsg.channel.send({ embeds: [new EmbedBuilder() - .setTitle(poll.question) - .setDescription(`${owner}'s poll has ended!`) - .addFields({ name: `Winner${winners.length === 1 ? '' : 's'}`, value: winMessage }) - .addFields({ name: 'Original poll', value: `Click [here](${pollMsg.url}) to see the original poll.` }) - .setColor('Random') - ] }); + pollMsg.channel.send({ + embeds: [ + new EmbedBuilder() + .setTitle(poll.question) + .setDescription(`${owner}'s poll has ended!`) + .addFields({ + name: `Winner${winners.length === 1 ? "" : "s"}`, + value: winMessage, + }) + .addFields({ + name: "Original poll", + value: `Click [here](${pollMsg.url}) to see the original poll.`, + }) + .setColor("Random"), + ], + }); await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); }); } async function checkReminders(bot: Client): Promise { - const reminders: Array = await bot.mongo.collection(DB.REMINDERS).find({ - expires: { $lte: new Date() } - }).toArray(); - const pubChan = await bot.channels.fetch(CHANNELS.SAGE) as TextChannel; - - reminders.forEach(reminder => { + const reminders: Array = await bot.mongo + .collection(DB.REMINDERS) + .find({ + expires: { $lte: new Date() }, + }) + .toArray(); + const pubChan = (await bot.channels.fetch(CHANNELS.SAGE)) as TextChannel; + + reminders.forEach((reminder) => { const message = `<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`; - if (reminder.mode === 'public') { + if (reminder.mode === "public") { pubChan.send(message); } else { - bot.users.fetch(reminder.owner).then(user => user.send(message).catch(() => { - pubChan.send(`<@${reminder.owner}>, I tried to send you a DM about your private reminder but it looks like you have + bot.users.fetch(reminder.owner).then((user) => + user.send(message).catch(() => { + pubChan.send(`<@${reminder.owner}>, I tried to send you a DM about your private reminder but it looks like you have DMs closed. Please enable DMs in the future if you'd like to get private reminders.`); - })); + }) + ); } // copied value by value for several reasons, change it and I take no responsibility for it breaking. @@ -110,15 +142,19 @@ DMs closed. Please enable DMs in the future if you'd like to get private reminde expires: new Date(reminder.expires), mode: reminder.mode, repeat: reminder.repeat, - owner: reminder.owner + owner: reminder.owner, }; - if (reminder.repeat === 'daily') { + if (reminder.repeat === "daily") { newReminder.expires.setDate(reminder.expires.getDate() + 1); - bot.mongo.collection(DB.REMINDERS).findOneAndReplace(reminder, newReminder); - } else if (reminder.repeat === 'weekly') { + bot.mongo + .collection(DB.REMINDERS) + .findOneAndReplace(reminder, newReminder); + } else if (reminder.repeat === "weekly") { newReminder.expires.setDate(reminder.expires.getDate() + 7); - bot.mongo.collection(DB.REMINDERS).findOneAndReplace(reminder, newReminder); + bot.mongo + .collection(DB.REMINDERS) + .findOneAndReplace(reminder, newReminder); } else { bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); } From 3054f693a74b6288e3229c4ef587f1c6fceae3e4 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:36:22 -0400 Subject: [PATCH 026/267] finished the task --- src/commands/jobs/jobform.ts | 21 +++++++++++---------- src/pieces/commandManager.ts | 11 +++++++---- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 97279447..a370bb3a 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -4,18 +4,18 @@ import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptio TextInputBuilder, TextInputStyle } from 'discord.js'; const questions = [ - ['What city are you located in?', 'Are you looking for something remote or in person?', 'Are you looking for a job, internship or both?', 'How far are you willing to travel?'], + ['What city are you located in?', 'Are you looking for remote or in person?', 'Job, internship or both?', 'How far are you willing to travel?'], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; export default class extends Command { - name = 'jobform'; + name: 'jobform' description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; options: ApplicationCommandOptionData[] = [ { - name: 'qSet', + name: 'qset', description: 'Which question set do you want to view (1 or 2).', type: ApplicationCommandOptionType.Number, required: true @@ -23,18 +23,19 @@ export default class extends Command { ] async run(interaction: ChatInputCommandInteraction): Promise | void> { - const questionSet = interaction.options.getNumber('Question Set'); + const questionSet = interaction.options.getNumber('qset') - 1; - if (questionSet === 1 || questionSet === 2) { + if (questionSet !== 0 && questionSet !== 1) { interaction.reply({ content: 'Please enter either 1 or 2' }); return; } const modal = new ModalBuilder() .setCustomId(`jobModal${questionSet}`) - .setTitle(`Job Form (${questionSet} of 2)`); + .setTitle(`Job Form (${questionSet + 1} of 2)`); - const rows = questions[questionSet].map((question) => this.getAnswerField(questions[questionSet].indexOf(question))); + const askedQuestions = questions[questionSet]; + const rows = askedQuestions.map((question) => this.getAnswerField(question, askedQuestions.indexOf(question))); for (const row of rows) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -44,7 +45,7 @@ export default class extends Command { await interaction.showModal(modal); - // Answers are handled in commandManager.ts on line 149 + // Answers are handled in src/pieces/commandManager.ts on line 149 return; } @@ -55,10 +56,10 @@ export default class extends Command { } - getAnswerField(questionNum: number): ActionRowBuilder { + getAnswerField(question: string, questionNum: number): ActionRowBuilder { return new ActionRowBuilder({ components: [new TextInputBuilder() .setCustomId(`question${questionNum + 1}`) - .setLabel(`Question ${questionNum + 1}`) + .setLabel(`${question}`) .setStyle(TextInputStyle.Short) .setPlaceholder('Input Answer Here')] }); } diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 792771fb..0813e7ff 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -148,10 +148,13 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie } case 'jobModal': { // extracting the input from the modal - const questionIDs = [1, 2, 3, 4, 5]; - const jobAnswers = questionIDs.map((question) => interaction.fields.getTextInputValue(`question${question}`)); - console.log(interaction.customId); - console.log(jobAnswers); + const qSet = customId.slice(-1); + const questionIDs = [[1, 2, 3, 4], [1, 2, 3, 4, 5]]; + + const jobAnswers = questionIDs[qSet].map((question) => interaction.fields.getTextInputValue(`question${question}`)); + + // qSet contains either 0 or 1 depending if it is the first or second set of questions + // the array of answers is stored in jobAnswers interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); break; } From 1ff4127c48b7cab0f39bca327fa87b200213cf0e Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 20 Oct 2024 23:28:15 -0400 Subject: [PATCH 027/267] idk --- .gitignore | 2 + config.example.ts | 216 +++++++++++++ config.ts | 216 ------------- package-lock.json | 749 +++++++++++++++++++++++----------------------- package.json | 4 +- 5 files changed, 593 insertions(+), 594 deletions(-) delete mode 100644 config.ts diff --git a/.gitignore b/.gitignore index a1785b98..2af78e03 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ src/commands/admin/eval.ts # macOS stuff .DS_Store +config.ts + # Logs logs !src/pieces/logs diff --git a/config.example.ts b/config.example.ts index e69de29b..5eb2e8d7 100644 --- a/config.example.ts +++ b/config.example.ts @@ -0,0 +1,216 @@ +interface Config { + DB_CONNECTION: string; + BOT_NAME: string; + BOT_TOKEN: string; + BOT_CLIENT_ID: string; + DB_USERS: string; + DB_PVQ: string; + DB_QTAGS: string; + DB_ASSIGNABLE: string; + DB_COURSES: string; + DB_REMINDERS: string; + DB_CLIENT_DATA: string; + DB_POLLS: string; + GUILD_MAIN: string; + GUILD_GATEWAY: string; + GUILD_GATEWAY_INVITE: string; + ROLE_ADMIN: string; + ROLE_STUDENT_ADMIN: string; + ROLE_STAFF: string; + ROLE_VERIFIED: string; + ROLE_MUTED: string; + ROLE_LEVEL_ONE: string; + EMAIL_SENDER: string; + EMAIL_REPLY_TO: string; + EMAIL_REPORT_ADDRESSES: string; + CHANNEL_ERROR_LOG: string; + CHANNEL_SERVER_LOG: string; + CHANNEL_MEMBER_LOG: string; + CHANNEL_MOD_LOG: string; + CHANNEL_FEEDBACK: string; + CHANNEL_SAGE: string; + CHANNEL_ANNOUNCEMENTS: string; + CHANNEL_ARCHIVE: string; + CHANNEL_ROLE_SELECT: string; + ROLE_DROPDOWNS_COURSE_ROLES: string; + ROLE_DROPDOWNS_ASSIGN_ROLES: string; + MONGO: string; + LEVEL_TIER_ROLES: string; + FIRST_LEVEL: string; + ENV_GITHUB_TOKEN: string; + ENV_GITHUB_PROJECT: string; + PREFIX: string; + MAINTAINERS: string; + SEMESTER_ID: string; + BLACKLIST: string; +} + +function getEnvVar(name: keyof Config): string { + const value = process.env[name]; + if (value === undefined) { + throw new Error(`Environment variable ${name} is not set`); + } + return value; +} + +export const config: Config = { + DB_CONNECTION: getEnvVar('DB_CONNECTION'), + BOT_NAME: getEnvVar('BOT_NAME'), + BOT_TOKEN: getEnvVar('BOT_TOKEN'), + BOT_CLIENT_ID: getEnvVar('BOT_CLIENT_ID'), + DB_USERS: getEnvVar('DB_USERS'), + DB_PVQ: getEnvVar('DB_PVQ'), + DB_QTAGS: getEnvVar('DB_QTAGS'), + DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), + DB_COURSES: getEnvVar('DB_COURSES'), + DB_REMINDERS: getEnvVar('DB_REMINDERS'), + DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), + DB_POLLS: getEnvVar('DB_POLLS'), + GUILD_MAIN: getEnvVar('GUILD_MAIN'), + GUILD_GATEWAY: getEnvVar('GUILD_GATEWAY'), + GUILD_GATEWAY_INVITE: getEnvVar('GUILD_GATEWAY_INVITE'), + ROLE_ADMIN: getEnvVar('ROLE_ADMIN'), + ROLE_STUDENT_ADMIN: getEnvVar('ROLE_STUDENT_ADMIN'), + ROLE_STAFF: getEnvVar('ROLE_STAFF'), + ROLE_VERIFIED: getEnvVar('ROLE_VERIFIED'), + ROLE_MUTED: getEnvVar('ROLE_MUTED'), + ROLE_LEVEL_ONE: getEnvVar('ROLE_LEVEL_ONE'), + EMAIL_SENDER: getEnvVar('EMAIL_SENDER'), + EMAIL_REPLY_TO: getEnvVar('EMAIL_REPLY_TO'), + EMAIL_REPORT_ADDRESSES: getEnvVar('EMAIL_REPORT_ADDRESSES'), + CHANNEL_ERROR_LOG: getEnvVar('CHANNEL_ERROR_LOG'), + CHANNEL_SERVER_LOG: getEnvVar('CHANNEL_SERVER_LOG'), + CHANNEL_MEMBER_LOG: getEnvVar('CHANNEL_MEMBER_LOG'), + CHANNEL_MOD_LOG: getEnvVar('CHANNEL_MOD_LOG'), + CHANNEL_FEEDBACK: getEnvVar('CHANNEL_FEEDBACK'), + CHANNEL_SAGE: getEnvVar('CHANNEL_SAGE'), + CHANNEL_ANNOUNCEMENTS: getEnvVar('CHANNEL_ANNOUNCEMENTS'), + CHANNEL_ARCHIVE: getEnvVar('CHANNEL_ARCHIVE'), + CHANNEL_ROLE_SELECT: getEnvVar('CHANNEL_ROLE_SELECT'), + ROLE_DROPDOWNS_COURSE_ROLES: getEnvVar('ROLE_DROPDOWNS_COURSE_ROLES'), + ROLE_DROPDOWNS_ASSIGN_ROLES: getEnvVar('ROLE_DROPDOWNS_ASSIGN_ROLES'), + MONGO: getEnvVar('MONGO'), + LEVEL_TIER_ROLES: getEnvVar('LEVEL_TIER_ROLES'), + FIRST_LEVEL: getEnvVar('FIRST_LEVEL'), + ENV_GITHUB_TOKEN: getEnvVar('ENV_GITHUB_TOKEN'), + ENV_GITHUB_PROJECT: getEnvVar('ENV_GITHUB_PROJECT'), + PREFIX: getEnvVar('PREFIX'), + MAINTAINERS: getEnvVar('MAINTAINERS'), + SEMESTER_ID: getEnvVar('SEMESTER_ID'), + BLACKLIST: getEnvVar('BLACKLIST') +}; +/* +export const { DB_CONNECTION } = process.env.DB_CONNECTION; +export const { BOT_NAME } = process.env; +export const { BOT_TOKEN } = process.env; +export const { BOT_CLIENT_ID } = process.env; +export const { DB_USERS } = process.env; +export const { DB_PVQ } = process.env; +export const { DB_QTAGS } = process.env; +export const { DB_ASSIGNABLE } = process.env; +export const { DB_COURSES } = process.env; +export const { DB_REMINDERS } = process.env; +export const { DB_CLIENT_DATA } = process.env; +export const { DB_POLLS } = process.env; +export const { GUILD_MAIN } = process.env; +export const { GUILD_GATEWAY } = process.env; +export const { GUILD_GATEWAY_INVITE } = process.env; +export const { ROLE_ADMIN } = process.env; +export const { ROLE_STUDENT_ADMIN } = process.env; +export const { ROLE_STAFF } = process.env; +export const { ROLE_VERIFIED } = process.env; +export const { ROLE_MUTED } = process.env; +export const { ROLE_LEVEL_ONE } = process.env; +export const { EMAIL_SENDER } = process.env; +export const { EMAIL_REPLY_TO } = process.env; +export const { EMAIL_REPORT_ADDRESSES } = process.env; +export const { CHANNEL_ERROR_LOG } = process.env; +export const { CHANNEL_SERVER_LOG } = process.env; +export const { CHANNEL_MEMBER_LOG } = process.env; +export const { CHANNEL_MOD_LOG } = process.env; +export const { CHANNEL_FEEDBACK } = process.env; +export const { CHANNEL_SAGE } = process.env; +export const { CHANNEL_ANNOUNCEMENTS } = process.env; +export const { CHANNEL_ARCHIVE } = process.env; +export const { CHANNEL_ROLE_SELECT } = process.env; +export const { ROLE_DROPDOWNS_COURSE_ROLES } = process.env; +export const { ROLE_DROPDOWNS_ASSIGN_ROLES } = process.env; +*/ + +export const BOT = { + TOKEN: config.BOT_TOKEN, + CLIENT_ID: config.BOT_CLIENT_ID, + NAME: config.BOT_NAME +}; + +export const DB = { + CONNECTION: config.DB_CONNECTION, + USERS: config.DB_USERS, + PVQ: config.DB_PVQ, + QTAGS: config.DB_QTAGS, + ASSIGNABLE: config.DB_ASSIGNABLE, + COURSES: config.DB_COURSES, + REMINDERS: config.DB_REMINDERS, + CLIENT_DATA: config.DB_CLIENT_DATA, + POLLS: config.DB_POLLS +}; + +export const GUILDS = { + MAIN: config.GUILD_MAIN, + GATEWAY: config.GUILD_GATEWAY, + GATEWAY_INVITE: config.GUILD_GATEWAY_INVITE +}; + +export const ROLES = { + ADMIN: config.ROLE_ADMIN, + STUDENT_ADMIN: config.ROLE_STUDENT_ADMIN, + STAFF: config.ROLE_STAFF, + VERIFIED: config.ROLE_VERIFIED, + MUTED: config.ROLE_MUTED, + LEVEL_ONE: config.ROLE_LEVEL_ONE +}; + +export const EMAIL = { + SENDER: config.EMAIL_SENDER, + REPLY_TO: config.EMAIL_REPLY_TO, + REPORT_ADDRESSES: config.EMAIL_REPORT_ADDRESSES +}; + +export const CHANNELS = { + ERROR_LOG: config.CHANNEL_ERROR_LOG, + SERVER_LOG: config.CHANNEL_SERVER_LOG, + MEMBER_LOG: config.CHANNEL_MEMBER_LOG, + MOD_LOG: config.CHANNEL_MOD_LOG, + FEEDBACK: config.CHANNEL_FEEDBACK, + SAGE: config.CHANNEL_SAGE, + ANNOUNCEMENTS: config.CHANNEL_ANNOUNCEMENTS, + ARCHIVE: config.CHANNEL_ARCHIVE, + ROLE_SELECT: config.CHANNEL_ROLE_SELECT +}; + +export const ROLE_DROPDOWNS = { + COURSE_ROLES: config.ROLE_DROPDOWNS_COURSE_ROLES, + ASSIGN_ROLES: config.ROLE_DROPDOWNS_ASSIGN_ROLES +}; + +export const GITHUB_PROJECT = config.ENV_GITHUB_PROJECT; + +// eslint-disable-next-line prefer-destructuring +export const SEMESTER_ID = config.SEMESTER_ID; + +export const FIRST_LEVEL = 10; + +export const LEVEL_TIER_ROLES = [config.LEVEL_TIER_ROLES]; + +// eslint-disable-next-line prefer-destructuring +export const MAINTAINERS = config.MAINTAINERS; + +// eslint-disable-next-line prefer-destructuring +export const PREFIX = config.PREFIX; + +export const BLACKLIST = [config.BLACKLIST]; + +export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; + +// eslint-disable-next-line prefer-destructuring +export const MONGO = config.MONGO; diff --git a/config.ts b/config.ts deleted file mode 100644 index 5eb2e8d7..00000000 --- a/config.ts +++ /dev/null @@ -1,216 +0,0 @@ -interface Config { - DB_CONNECTION: string; - BOT_NAME: string; - BOT_TOKEN: string; - BOT_CLIENT_ID: string; - DB_USERS: string; - DB_PVQ: string; - DB_QTAGS: string; - DB_ASSIGNABLE: string; - DB_COURSES: string; - DB_REMINDERS: string; - DB_CLIENT_DATA: string; - DB_POLLS: string; - GUILD_MAIN: string; - GUILD_GATEWAY: string; - GUILD_GATEWAY_INVITE: string; - ROLE_ADMIN: string; - ROLE_STUDENT_ADMIN: string; - ROLE_STAFF: string; - ROLE_VERIFIED: string; - ROLE_MUTED: string; - ROLE_LEVEL_ONE: string; - EMAIL_SENDER: string; - EMAIL_REPLY_TO: string; - EMAIL_REPORT_ADDRESSES: string; - CHANNEL_ERROR_LOG: string; - CHANNEL_SERVER_LOG: string; - CHANNEL_MEMBER_LOG: string; - CHANNEL_MOD_LOG: string; - CHANNEL_FEEDBACK: string; - CHANNEL_SAGE: string; - CHANNEL_ANNOUNCEMENTS: string; - CHANNEL_ARCHIVE: string; - CHANNEL_ROLE_SELECT: string; - ROLE_DROPDOWNS_COURSE_ROLES: string; - ROLE_DROPDOWNS_ASSIGN_ROLES: string; - MONGO: string; - LEVEL_TIER_ROLES: string; - FIRST_LEVEL: string; - ENV_GITHUB_TOKEN: string; - ENV_GITHUB_PROJECT: string; - PREFIX: string; - MAINTAINERS: string; - SEMESTER_ID: string; - BLACKLIST: string; -} - -function getEnvVar(name: keyof Config): string { - const value = process.env[name]; - if (value === undefined) { - throw new Error(`Environment variable ${name} is not set`); - } - return value; -} - -export const config: Config = { - DB_CONNECTION: getEnvVar('DB_CONNECTION'), - BOT_NAME: getEnvVar('BOT_NAME'), - BOT_TOKEN: getEnvVar('BOT_TOKEN'), - BOT_CLIENT_ID: getEnvVar('BOT_CLIENT_ID'), - DB_USERS: getEnvVar('DB_USERS'), - DB_PVQ: getEnvVar('DB_PVQ'), - DB_QTAGS: getEnvVar('DB_QTAGS'), - DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), - DB_COURSES: getEnvVar('DB_COURSES'), - DB_REMINDERS: getEnvVar('DB_REMINDERS'), - DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), - DB_POLLS: getEnvVar('DB_POLLS'), - GUILD_MAIN: getEnvVar('GUILD_MAIN'), - GUILD_GATEWAY: getEnvVar('GUILD_GATEWAY'), - GUILD_GATEWAY_INVITE: getEnvVar('GUILD_GATEWAY_INVITE'), - ROLE_ADMIN: getEnvVar('ROLE_ADMIN'), - ROLE_STUDENT_ADMIN: getEnvVar('ROLE_STUDENT_ADMIN'), - ROLE_STAFF: getEnvVar('ROLE_STAFF'), - ROLE_VERIFIED: getEnvVar('ROLE_VERIFIED'), - ROLE_MUTED: getEnvVar('ROLE_MUTED'), - ROLE_LEVEL_ONE: getEnvVar('ROLE_LEVEL_ONE'), - EMAIL_SENDER: getEnvVar('EMAIL_SENDER'), - EMAIL_REPLY_TO: getEnvVar('EMAIL_REPLY_TO'), - EMAIL_REPORT_ADDRESSES: getEnvVar('EMAIL_REPORT_ADDRESSES'), - CHANNEL_ERROR_LOG: getEnvVar('CHANNEL_ERROR_LOG'), - CHANNEL_SERVER_LOG: getEnvVar('CHANNEL_SERVER_LOG'), - CHANNEL_MEMBER_LOG: getEnvVar('CHANNEL_MEMBER_LOG'), - CHANNEL_MOD_LOG: getEnvVar('CHANNEL_MOD_LOG'), - CHANNEL_FEEDBACK: getEnvVar('CHANNEL_FEEDBACK'), - CHANNEL_SAGE: getEnvVar('CHANNEL_SAGE'), - CHANNEL_ANNOUNCEMENTS: getEnvVar('CHANNEL_ANNOUNCEMENTS'), - CHANNEL_ARCHIVE: getEnvVar('CHANNEL_ARCHIVE'), - CHANNEL_ROLE_SELECT: getEnvVar('CHANNEL_ROLE_SELECT'), - ROLE_DROPDOWNS_COURSE_ROLES: getEnvVar('ROLE_DROPDOWNS_COURSE_ROLES'), - ROLE_DROPDOWNS_ASSIGN_ROLES: getEnvVar('ROLE_DROPDOWNS_ASSIGN_ROLES'), - MONGO: getEnvVar('MONGO'), - LEVEL_TIER_ROLES: getEnvVar('LEVEL_TIER_ROLES'), - FIRST_LEVEL: getEnvVar('FIRST_LEVEL'), - ENV_GITHUB_TOKEN: getEnvVar('ENV_GITHUB_TOKEN'), - ENV_GITHUB_PROJECT: getEnvVar('ENV_GITHUB_PROJECT'), - PREFIX: getEnvVar('PREFIX'), - MAINTAINERS: getEnvVar('MAINTAINERS'), - SEMESTER_ID: getEnvVar('SEMESTER_ID'), - BLACKLIST: getEnvVar('BLACKLIST') -}; -/* -export const { DB_CONNECTION } = process.env.DB_CONNECTION; -export const { BOT_NAME } = process.env; -export const { BOT_TOKEN } = process.env; -export const { BOT_CLIENT_ID } = process.env; -export const { DB_USERS } = process.env; -export const { DB_PVQ } = process.env; -export const { DB_QTAGS } = process.env; -export const { DB_ASSIGNABLE } = process.env; -export const { DB_COURSES } = process.env; -export const { DB_REMINDERS } = process.env; -export const { DB_CLIENT_DATA } = process.env; -export const { DB_POLLS } = process.env; -export const { GUILD_MAIN } = process.env; -export const { GUILD_GATEWAY } = process.env; -export const { GUILD_GATEWAY_INVITE } = process.env; -export const { ROLE_ADMIN } = process.env; -export const { ROLE_STUDENT_ADMIN } = process.env; -export const { ROLE_STAFF } = process.env; -export const { ROLE_VERIFIED } = process.env; -export const { ROLE_MUTED } = process.env; -export const { ROLE_LEVEL_ONE } = process.env; -export const { EMAIL_SENDER } = process.env; -export const { EMAIL_REPLY_TO } = process.env; -export const { EMAIL_REPORT_ADDRESSES } = process.env; -export const { CHANNEL_ERROR_LOG } = process.env; -export const { CHANNEL_SERVER_LOG } = process.env; -export const { CHANNEL_MEMBER_LOG } = process.env; -export const { CHANNEL_MOD_LOG } = process.env; -export const { CHANNEL_FEEDBACK } = process.env; -export const { CHANNEL_SAGE } = process.env; -export const { CHANNEL_ANNOUNCEMENTS } = process.env; -export const { CHANNEL_ARCHIVE } = process.env; -export const { CHANNEL_ROLE_SELECT } = process.env; -export const { ROLE_DROPDOWNS_COURSE_ROLES } = process.env; -export const { ROLE_DROPDOWNS_ASSIGN_ROLES } = process.env; -*/ - -export const BOT = { - TOKEN: config.BOT_TOKEN, - CLIENT_ID: config.BOT_CLIENT_ID, - NAME: config.BOT_NAME -}; - -export const DB = { - CONNECTION: config.DB_CONNECTION, - USERS: config.DB_USERS, - PVQ: config.DB_PVQ, - QTAGS: config.DB_QTAGS, - ASSIGNABLE: config.DB_ASSIGNABLE, - COURSES: config.DB_COURSES, - REMINDERS: config.DB_REMINDERS, - CLIENT_DATA: config.DB_CLIENT_DATA, - POLLS: config.DB_POLLS -}; - -export const GUILDS = { - MAIN: config.GUILD_MAIN, - GATEWAY: config.GUILD_GATEWAY, - GATEWAY_INVITE: config.GUILD_GATEWAY_INVITE -}; - -export const ROLES = { - ADMIN: config.ROLE_ADMIN, - STUDENT_ADMIN: config.ROLE_STUDENT_ADMIN, - STAFF: config.ROLE_STAFF, - VERIFIED: config.ROLE_VERIFIED, - MUTED: config.ROLE_MUTED, - LEVEL_ONE: config.ROLE_LEVEL_ONE -}; - -export const EMAIL = { - SENDER: config.EMAIL_SENDER, - REPLY_TO: config.EMAIL_REPLY_TO, - REPORT_ADDRESSES: config.EMAIL_REPORT_ADDRESSES -}; - -export const CHANNELS = { - ERROR_LOG: config.CHANNEL_ERROR_LOG, - SERVER_LOG: config.CHANNEL_SERVER_LOG, - MEMBER_LOG: config.CHANNEL_MEMBER_LOG, - MOD_LOG: config.CHANNEL_MOD_LOG, - FEEDBACK: config.CHANNEL_FEEDBACK, - SAGE: config.CHANNEL_SAGE, - ANNOUNCEMENTS: config.CHANNEL_ANNOUNCEMENTS, - ARCHIVE: config.CHANNEL_ARCHIVE, - ROLE_SELECT: config.CHANNEL_ROLE_SELECT -}; - -export const ROLE_DROPDOWNS = { - COURSE_ROLES: config.ROLE_DROPDOWNS_COURSE_ROLES, - ASSIGN_ROLES: config.ROLE_DROPDOWNS_ASSIGN_ROLES -}; - -export const GITHUB_PROJECT = config.ENV_GITHUB_PROJECT; - -// eslint-disable-next-line prefer-destructuring -export const SEMESTER_ID = config.SEMESTER_ID; - -export const FIRST_LEVEL = 10; - -export const LEVEL_TIER_ROLES = [config.LEVEL_TIER_ROLES]; - -// eslint-disable-next-line prefer-destructuring -export const MAINTAINERS = config.MAINTAINERS; - -// eslint-disable-next-line prefer-destructuring -export const PREFIX = config.PREFIX; - -export const BLACKLIST = [config.BLACKLIST]; - -export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; - -// eslint-disable-next-line prefer-destructuring -export const MONGO = config.MONGO; diff --git a/package-lock.json b/package-lock.json index 4f7bfed2..6e190be6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,10 +13,10 @@ "axios": "^1.4.0", "canvas": "^2.11.2", "console-stamp": "^3.0.2", - "discord.js": "^14.8.0", + "discord.js": "^14.16.3", "module-alias": "^2.2.2", "moment": "^2.29.1", - "mongodb": "^3.6.3", + "mongodb": "^3.7.4", "node-cron": "^2.0.3", "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", @@ -26,15 +26,15 @@ "devDependencies": { "@types/console-stamp": "^0.2.33", "@types/mongodb": "^3.6.3", - "@types/node": "^14.14.20", + "@types/node": "^14.18.63", "@types/node-cron": "^2.0.3", "@types/node-fetch": "^2.5.7", "@types/nodemailer": "^6.4.0", "@typescript-eslint/eslint-plugin": "^4.23.0", "@typescript-eslint/parser": "^4.23.0", "eslint": "^7.26.0", - "tsc-watch": "^4.2.9", - "typescript": "^4.1.3" + "tsc-watch": "^4.6.2", + "typescript": "^5.0.2" }, "engines": { "node": ">=16.9.0" @@ -144,67 +144,156 @@ } }, "node_modules/@discordjs/builders": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.5.0.tgz", - "integrity": "sha512-7XxT78mnNBPigHn2y6KAXkicxIBFtZREGWaRZ249EC1l6gBUEP8IyVY5JTciIjJArxkF+tg675aZvsTNTKBpmA==", - "dependencies": { - "@discordjs/formatters": "^0.2.0", - "@discordjs/util": "^0.2.0", - "@sapphire/shapeshift": "^3.8.1", - "discord-api-types": "^0.37.35", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.9.0.tgz", + "integrity": "sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/formatters": "^0.5.0", + "@discordjs/util": "^1.1.1", + "@sapphire/shapeshift": "^4.0.0", + "discord-api-types": "0.37.97", "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.3", - "tslib": "^2.5.0" + "ts-mixer": "^6.0.4", + "tslib": "^2.6.3" }, "engines": { - "node": ">=16.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", + "license": "MIT" + }, "node_modules/@discordjs/collection": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.4.0.tgz", - "integrity": "sha512-hiOJyk2CPFf1+FL3a4VKCuu1f448LlROVuu8nLz1+jCOAPokUcdFAV+l4pd3B3h6uJlJQSASoZzrdyNdjdtfzQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==", + "license": "Apache-2.0", "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" } }, "node_modules/@discordjs/formatters": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.2.0.tgz", - "integrity": "sha512-vn4oMSXuMZUm8ITqVOtvE7/fMMISj4cI5oLsR09PEQXHKeKDAMLltG/DWeeIs7Idfy6V8Fk3rn1e69h7NfzuNA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.5.0.tgz", + "integrity": "sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g==", + "license": "Apache-2.0", "dependencies": { - "discord-api-types": "^0.37.35" + "discord-api-types": "0.37.97" }, "engines": { - "node": ">=16.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, + "node_modules/@discordjs/formatters/node_modules/discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", + "license": "MIT" + }, "node_modules/@discordjs/rest": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.6.0.tgz", - "integrity": "sha512-HGvqNCZ5Z5j0tQHjmT1lFvE5ETO4hvomJ1r0cbnpC1zM23XhCpZ9wgTCiEmaxKz05cyf2CI9p39+9LL+6Yz1bA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.0.tgz", + "integrity": "sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw==", + "license": "Apache-2.0", "dependencies": { - "@discordjs/collection": "^1.4.0", - "@discordjs/util": "^0.2.0", - "@sapphire/async-queue": "^1.5.0", - "@sapphire/snowflake": "^3.4.0", - "discord-api-types": "^0.37.35", - "file-type": "^18.2.1", - "tslib": "^2.5.0", - "undici": "^5.20.0" + "@discordjs/collection": "^2.1.1", + "@discordjs/util": "^1.1.1", + "@sapphire/async-queue": "^1.5.3", + "@sapphire/snowflake": "^3.5.3", + "@vladfrangu/async_event_emitter": "^2.4.6", + "discord-api-types": "0.37.97", + "magic-bytes.js": "^1.10.0", + "tslib": "^2.6.3", + "undici": "6.19.8" }, "engines": { - "node": ">=16.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, + "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/rest/node_modules/discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", + "license": "MIT" + }, "node_modules/@discordjs/util": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.2.0.tgz", - "integrity": "sha512-/8qNbebFzLWKOOg+UV+RB8itp4SmU5jw0tBUD3ifElW6rYNOj1Ku5JaSW7lLl/WgjjxF01l/1uQPCzkwr110vg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz", + "integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==", + "license": "Apache-2.0", "engines": { - "node": ">=16.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", + "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/collection": "^2.1.0", + "@discordjs/rest": "^2.3.0", + "@discordjs/util": "^1.1.0", + "@sapphire/async-queue": "^1.5.2", + "@types/ws": "^8.5.10", + "@vladfrangu/async_event_emitter": "^2.2.4", + "discord-api-types": "0.37.83", + "tslib": "^2.6.2", + "ws": "^8.16.0" + }, + "engines": { + "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws/node_modules/@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, + "node_modules/@discordjs/ws/node_modules/discord-api-types": { + "version": "0.37.83", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", + "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==", + "license": "MIT" + }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -429,41 +518,38 @@ } }, "node_modules/@sapphire/async-queue": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", - "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.3.tgz", + "integrity": "sha512-x7zadcfJGxFka1Q3f8gCts1F0xMwCKbZweM85xECGI0hBTeIZJGGCrHgLggihBoprlQ/hBmDR5LKfIPqnmHM3w==", + "license": "MIT", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, "node_modules/@sapphire/shapeshift": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.8.1.tgz", - "integrity": "sha512-xG1oXXBhCjPKbxrRTlox9ddaZTvVpOhYLmKmApD/vIWOV1xEYXnpoFs68zHIZBGbqztq6FrUPNPerIrO1Hqeaw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz", + "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" }, "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" + "node": ">=v16" } }, "node_modules/@sapphire/snowflake": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.0.tgz", - "integrity": "sha512-zZxymtVO6zeXVMPds+6d7gv/OfnCc25M1Z+7ZLB0oPmeMTPeRWVPQSS16oDJy5ZsyCOLj7M6mbZml5gWXcVRNw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", + "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==", + "license": "MIT", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" - }, "node_modules/@types/bson": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz", @@ -500,9 +586,10 @@ } }, "node_modules/@types/node": { - "version": "14.18.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz", - "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q==" + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", + "license": "MIT" }, "node_modules/@types/node-cron": { "version": "2.0.5", @@ -553,9 +640,10 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -735,6 +823,16 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vladfrangu/async_event_emitter": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz", + "integrity": "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==", + "license": "MIT", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -987,17 +1085,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1209,31 +1296,35 @@ } }, "node_modules/discord-api-types": { - "version": "0.37.88", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.88.tgz", - "integrity": "sha512-Yrj5S3JXzouPc6WLA8svgXCw3Q7IkNdW/Y/IfkJF+CsgUBsgECQ8qVoOaseJJ8Atj2TEvabut4rGmzq6PRi1/Q==" + "version": "0.37.100", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.100.tgz", + "integrity": "sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==", + "license": "MIT" }, "node_modules/discord.js": { - "version": "14.8.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.8.0.tgz", - "integrity": "sha512-UOxYtc/YnV7jAJ2gISluJyYeBw4e+j8gWn+IoqG8unaHAVuvZ13DdYN0M1f9fbUgUvSarV798inIrYFtDNDjwQ==", - "dependencies": { - "@discordjs/builders": "^1.5.0", - "@discordjs/collection": "^1.4.0", - "@discordjs/formatters": "^0.2.0", - "@discordjs/rest": "^1.6.0", - "@discordjs/util": "^0.2.0", - "@sapphire/snowflake": "^3.4.0", - "@types/ws": "^8.5.4", - "discord-api-types": "^0.37.35", - "fast-deep-equal": "^3.1.3", - "lodash.snakecase": "^4.1.1", - "tslib": "^2.5.0", - "undici": "^5.20.0", - "ws": "^8.12.1" + "version": "14.16.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.16.3.tgz", + "integrity": "sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/builders": "^1.9.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.5.0", + "@discordjs/rest": "^2.4.0", + "@discordjs/util": "^1.1.1", + "@discordjs/ws": "1.1.1", + "@sapphire/snowflake": "3.5.3", + "discord-api-types": "0.37.100", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "tslib": "^2.6.3", + "undici": "6.19.8" + }, + "engines": { + "node": ">=18" }, - "engines": { - "node": ">=16.9.0" + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/doctrine": { @@ -1560,22 +1651,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-type": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz", - "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==", - "dependencies": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0", - "token-types": "^5.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1781,6 +1856,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -1948,7 +2024,8 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -1978,6 +2055,12 @@ "node": ">=10" } }, + "node_modules/magic-bytes.js": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", + "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==", + "license": "MIT" + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2123,9 +2206,10 @@ } }, "node_modules/mongodb": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", - "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "license": "Apache-2.0", "dependencies": { "bl": "^2.2.1", "bson": "^1.1.4", @@ -2368,18 +2452,6 @@ "through": "~2.3" } }, - "node_modules/peek-readable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2497,34 +2569,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -2777,14 +2821,6 @@ "duplexer": "~0.1.1" } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -2843,22 +2879,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strtok3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2948,31 +2968,16 @@ "node": ">=8.0" } }, - "node_modules/token-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/ts-mixer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", - "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", + "license": "MIT" }, "node_modules/tsc-watch": { "version": "4.6.2", @@ -2997,9 +3002,10 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", @@ -3047,16 +3053,17 @@ } }, "node_modules/typescript": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", - "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/tz-offset": { @@ -3065,14 +3072,12 @@ "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==" }, "node_modules/undici": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", - "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", - "dependencies": { - "busboy": "^1.6.0" - }, + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "license": "MIT", "engines": { - "node": ">=12.18" + "node": ">=18.17" } }, "node_modules/universal-user-agent": { @@ -3152,9 +3157,10 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -3263,51 +3269,106 @@ } }, "@discordjs/builders": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.5.0.tgz", - "integrity": "sha512-7XxT78mnNBPigHn2y6KAXkicxIBFtZREGWaRZ249EC1l6gBUEP8IyVY5JTciIjJArxkF+tg675aZvsTNTKBpmA==", - "requires": { - "@discordjs/formatters": "^0.2.0", - "@discordjs/util": "^0.2.0", - "@sapphire/shapeshift": "^3.8.1", - "discord-api-types": "^0.37.35", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.9.0.tgz", + "integrity": "sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg==", + "requires": { + "@discordjs/formatters": "^0.5.0", + "@discordjs/util": "^1.1.1", + "@sapphire/shapeshift": "^4.0.0", + "discord-api-types": "0.37.97", "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.3", - "tslib": "^2.5.0" + "ts-mixer": "^6.0.4", + "tslib": "^2.6.3" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" + } } }, "@discordjs/collection": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.4.0.tgz", - "integrity": "sha512-hiOJyk2CPFf1+FL3a4VKCuu1f448LlROVuu8nLz1+jCOAPokUcdFAV+l4pd3B3h6uJlJQSASoZzrdyNdjdtfzQ==" + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==" }, "@discordjs/formatters": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.2.0.tgz", - "integrity": "sha512-vn4oMSXuMZUm8ITqVOtvE7/fMMISj4cI5oLsR09PEQXHKeKDAMLltG/DWeeIs7Idfy6V8Fk3rn1e69h7NfzuNA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.5.0.tgz", + "integrity": "sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g==", "requires": { - "discord-api-types": "^0.37.35" + "discord-api-types": "0.37.97" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" + } } }, "@discordjs/rest": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.6.0.tgz", - "integrity": "sha512-HGvqNCZ5Z5j0tQHjmT1lFvE5ETO4hvomJ1r0cbnpC1zM23XhCpZ9wgTCiEmaxKz05cyf2CI9p39+9LL+6Yz1bA==", - "requires": { - "@discordjs/collection": "^1.4.0", - "@discordjs/util": "^0.2.0", - "@sapphire/async-queue": "^1.5.0", - "@sapphire/snowflake": "^3.4.0", - "discord-api-types": "^0.37.35", - "file-type": "^18.2.1", - "tslib": "^2.5.0", - "undici": "^5.20.0" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.0.tgz", + "integrity": "sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw==", + "requires": { + "@discordjs/collection": "^2.1.1", + "@discordjs/util": "^1.1.1", + "@sapphire/async-queue": "^1.5.3", + "@sapphire/snowflake": "^3.5.3", + "@vladfrangu/async_event_emitter": "^2.4.6", + "discord-api-types": "0.37.97", + "magic-bytes.js": "^1.10.0", + "tslib": "^2.6.3", + "undici": "6.19.8" + }, + "dependencies": { + "@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==" + }, + "discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" + } } }, "@discordjs/util": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.2.0.tgz", - "integrity": "sha512-/8qNbebFzLWKOOg+UV+RB8itp4SmU5jw0tBUD3ifElW6rYNOj1Ku5JaSW7lLl/WgjjxF01l/1uQPCzkwr110vg==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz", + "integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==" + }, + "@discordjs/ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", + "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", + "requires": { + "@discordjs/collection": "^2.1.0", + "@discordjs/rest": "^2.3.0", + "@discordjs/util": "^1.1.0", + "@sapphire/async-queue": "^1.5.2", + "@types/ws": "^8.5.10", + "@vladfrangu/async_event_emitter": "^2.2.4", + "discord-api-types": "0.37.83", + "tslib": "^2.6.2", + "ws": "^8.16.0" + }, + "dependencies": { + "@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==" + }, + "discord-api-types": { + "version": "0.37.83", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", + "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==" + } + } }, "@eslint/eslintrc": { "version": "0.4.3", @@ -3506,28 +3567,23 @@ } }, "@sapphire/async-queue": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", - "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==" + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.3.tgz", + "integrity": "sha512-x7zadcfJGxFka1Q3f8gCts1F0xMwCKbZweM85xECGI0hBTeIZJGGCrHgLggihBoprlQ/hBmDR5LKfIPqnmHM3w==" }, "@sapphire/shapeshift": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.8.1.tgz", - "integrity": "sha512-xG1oXXBhCjPKbxrRTlox9ddaZTvVpOhYLmKmApD/vIWOV1xEYXnpoFs68zHIZBGbqztq6FrUPNPerIrO1Hqeaw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz", + "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==", "requires": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" } }, "@sapphire/snowflake": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.0.tgz", - "integrity": "sha512-zZxymtVO6zeXVMPds+6d7gv/OfnCc25M1Z+7ZLB0oPmeMTPeRWVPQSS16oDJy5ZsyCOLj7M6mbZml5gWXcVRNw==" - }, - "@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", + "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==" }, "@types/bson": { "version": "4.2.0", @@ -3564,9 +3620,9 @@ } }, "@types/node": { - "version": "14.18.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz", - "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q==" + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" }, "@types/node-cron": { "version": "2.0.5", @@ -3616,9 +3672,9 @@ "dev": true }, "@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "requires": { "@types/node": "*" } @@ -3717,6 +3773,11 @@ "eslint-visitor-keys": "^2.0.0" } }, + "@vladfrangu/async_event_emitter": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz", + "integrity": "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==" + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -3898,14 +3959,6 @@ "ieee754": "^1.1.13" } }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "requires": { - "streamsearch": "^1.1.0" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4059,28 +4112,27 @@ } }, "discord-api-types": { - "version": "0.37.88", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.88.tgz", - "integrity": "sha512-Yrj5S3JXzouPc6WLA8svgXCw3Q7IkNdW/Y/IfkJF+CsgUBsgECQ8qVoOaseJJ8Atj2TEvabut4rGmzq6PRi1/Q==" + "version": "0.37.100", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.100.tgz", + "integrity": "sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==" }, "discord.js": { - "version": "14.8.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.8.0.tgz", - "integrity": "sha512-UOxYtc/YnV7jAJ2gISluJyYeBw4e+j8gWn+IoqG8unaHAVuvZ13DdYN0M1f9fbUgUvSarV798inIrYFtDNDjwQ==", - "requires": { - "@discordjs/builders": "^1.5.0", - "@discordjs/collection": "^1.4.0", - "@discordjs/formatters": "^0.2.0", - "@discordjs/rest": "^1.6.0", - "@discordjs/util": "^0.2.0", - "@sapphire/snowflake": "^3.4.0", - "@types/ws": "^8.5.4", - "discord-api-types": "^0.37.35", - "fast-deep-equal": "^3.1.3", - "lodash.snakecase": "^4.1.1", - "tslib": "^2.5.0", - "undici": "^5.20.0", - "ws": "^8.12.1" + "version": "14.16.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.16.3.tgz", + "integrity": "sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==", + "requires": { + "@discordjs/builders": "^1.9.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.5.0", + "@discordjs/rest": "^2.4.0", + "@discordjs/util": "^1.1.1", + "@discordjs/ws": "1.1.1", + "@sapphire/snowflake": "3.5.3", + "discord-api-types": "0.37.100", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "tslib": "^2.6.3", + "undici": "6.19.8" } }, "doctrine": { @@ -4341,16 +4393,6 @@ "flat-cache": "^3.0.4" } }, - "file-type": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz", - "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==", - "requires": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0", - "token-types": "^5.0.1" - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4499,7 +4541,8 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true }, "ignore": { "version": "5.2.0", @@ -4647,6 +4690,11 @@ "yallist": "^4.0.0" } }, + "magic-bytes.js": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", + "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==" + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -4749,9 +4797,9 @@ "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "mongodb": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", - "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", "requires": { "bl": "^2.2.1", "bson": "^1.1.4", @@ -4916,11 +4964,6 @@ "through": "~2.3" } }, - "peek-readable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==" - }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -4999,26 +5042,6 @@ } } }, - "readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "requires": { - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -5177,11 +5200,6 @@ "duplexer": "~0.1.1" } }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -5227,15 +5245,6 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "strtok3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", - "requires": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5311,24 +5320,15 @@ "is-number": "^7.0.0" } }, - "token-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", - "requires": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - } - }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "ts-mixer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", - "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" }, "tsc-watch": { "version": "4.6.2", @@ -5344,9 +5344,9 @@ } }, "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "tsutils": { "version": "3.21.0", @@ -5381,9 +5381,9 @@ "dev": true }, "typescript": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", - "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", "dev": true }, "tz-offset": { @@ -5392,12 +5392,9 @@ "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==" }, "undici": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", - "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", - "requires": { - "busboy": "^1.6.0" - } + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==" }, "universal-user-agent": { "version": "6.0.0", @@ -5467,9 +5464,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "requires": {} }, "yallist": { diff --git a/package.json b/package.json index 4e0da389..9d2a2144 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "discord.js": "^14.16.3", "module-alias": "^2.2.2", "moment": "^2.29.1", - "mongodb": "^3.6.3", + "mongodb": "^3.7.4", "node-cron": "^2.0.3", "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", @@ -59,6 +59,6 @@ "@typescript-eslint/parser": "^4.23.0", "eslint": "^7.26.0", "tsc-watch": "^4.6.2", - "typescript": "^4.9.5" + "typescript": "^5.0.2" } } From aa3cfb03b37b3f9f86e885550f808fae5f894ddd Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Fri, 11 Oct 2024 12:02:36 -0400 Subject: [PATCH 028/267] added a basic embed message when the command is run --- src/commands/jobs/jobform.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/commands/jobs/jobform.ts diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts new file mode 100644 index 00000000..3a8072ed --- /dev/null +++ b/src/commands/jobs/jobform.ts @@ -0,0 +1,13 @@ +import { Command } from '@root/src/lib/types/Command'; +import { ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; + +export default class extends Command { + + description = 'Form do get your preferences for jobs to be used with the Job Alert System!'; + + run(interaction: ChatInputCommandInteraction): Promise | void> { + const responseEmbed = new EmbedBuilder().setTitle('test'); + return interaction.reply({ embeds: [responseEmbed] }); + } + +} From 6feebb932de5bbcbdcfa5c2e54a3b22eef06f2eb Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Sun, 13 Oct 2024 21:21:47 -0400 Subject: [PATCH 029/267] basic Embed response message --- src/commands/jobs/jobform.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 3a8072ed..328996fa 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -6,7 +6,10 @@ export default class extends Command { description = 'Form do get your preferences for jobs to be used with the Job Alert System!'; run(interaction: ChatInputCommandInteraction): Promise | void> { - const responseEmbed = new EmbedBuilder().setTitle('test'); + const responseEmbed = new EmbedBuilder() + .setTitle('Job Alert Form') + .setColor('#000000'); + return interaction.reply({ embeds: [responseEmbed] }); } From da938100b9111fcfd78597af713f50bc7e53f566 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Sun, 13 Oct 2024 21:38:32 -0400 Subject: [PATCH 030/267] removed newline --- src/commands/jobs/jobform.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 328996fa..a0e685de 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -9,7 +9,6 @@ export default class extends Command { const responseEmbed = new EmbedBuilder() .setTitle('Job Alert Form') .setColor('#000000'); - return interaction.reply({ embeds: [responseEmbed] }); } From a715b5f4dc42841252f5851f247e858f42cebdd0 Mon Sep 17 00:00:00 2001 From: pgsweet Date: Sun, 13 Oct 2024 23:41:16 -0400 Subject: [PATCH 031/267] Basic Embed with question array and button to go to next question --- src/commands/jobs/jobform.ts | 61 +++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index a0e685de..8e2e5bd5 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,15 +1,68 @@ import { Command } from '@root/src/lib/types/Command'; -import { ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; +import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; + +const questions = ['Question 1', 'Question 2']; export default class extends Command { description = 'Form do get your preferences for jobs to be used with the Job Alert System!'; run(interaction: ChatInputCommandInteraction): Promise | void> { - const responseEmbed = new EmbedBuilder() + let questionNum = 0; + + const nextButton = new ButtonBuilder() + .setCustomId('nextQuestion') + .setLabel('Next Question') + .setStyle(ButtonStyle.Primary) + .setEmoji('▶'); + + const actionRow = new ActionRowBuilder() + .addComponents(nextButton); + + interaction.reply({ + embeds: [this.questionGetter(questionNum)], + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + components: [actionRow] + }); + + let replyId; + interaction.fetchReply().then(reply => { replyId = reply.id; }); + + const collector = interaction.channel.createMessageComponentCollector({ + filter: i => i.message.id === replyId + }); + + collector.on('collect', async (i: ButtonInteraction) => { + if (interaction.user.id !== i.user.id) { + await i.reply({ + content: 'You cannot respond to a command you did not execute', + ephemeral: true + }); + return; + } + i.deferUpdate(); + if (i.customId === 'nextQuestion') { + questionNum++; + } + interaction.editReply({ + embeds: [this.questionGetter(questionNum)], + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + components: [actionRow] + }); + }); + + return; + } + + questionGetter(questionNum: number): EmbedBuilder { + return new EmbedBuilder() .setTitle('Job Alert Form') - .setColor('#000000'); - return interaction.reply({ embeds: [responseEmbed] }); + .setColor('#000000') + .addFields( + { name: 'Question:', value: questions[questionNum] }, + { name: 'Answer', value: 'also test', inline: true }); } } From 20209ce1cd6e28333870729d9e2838602bb90eb0 Mon Sep 17 00:00:00 2001 From: pgsweet Date: Mon, 14 Oct 2024 00:06:12 -0400 Subject: [PATCH 032/267] fixxed the next question button to be disabled when on the final question --- src/commands/jobs/jobform.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 8e2e5bd5..dfbbadc6 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -5,7 +5,7 @@ const questions = ['Question 1', 'Question 2']; export default class extends Command { - description = 'Form do get your preferences for jobs to be used with the Job Alert System!'; + description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; run(interaction: ChatInputCommandInteraction): Promise | void> { let questionNum = 0; @@ -16,7 +16,7 @@ export default class extends Command { .setStyle(ButtonStyle.Primary) .setEmoji('▶'); - const actionRow = new ActionRowBuilder() + let actionRow = new ActionRowBuilder() .addComponents(nextButton); interaction.reply({ @@ -44,6 +44,9 @@ export default class extends Command { i.deferUpdate(); if (i.customId === 'nextQuestion') { questionNum++; + actionRow = questionNum === (questions.length - 1) + ? new ActionRowBuilder({ components: [nextButton.setDisabled(true)] }) + : new ActionRowBuilder({ components: [nextButton] }); } interaction.editReply({ embeds: [this.questionGetter(questionNum)], From b82d405fe64fe59f6541f20242bac91518e98228 Mon Sep 17 00:00:00 2001 From: pgsweet Date: Mon, 14 Oct 2024 00:30:19 -0400 Subject: [PATCH 033/267] Switched to using Modals for their ease of input --- src/commands/jobs/jobform.ts | 134 ++++++++++++++++++++--------------- 1 file changed, 77 insertions(+), 57 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index dfbbadc6..0e7ef409 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,5 +1,5 @@ import { Command } from '@root/src/lib/types/Command'; -import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; +import { ActionRowBuilder, ChatInputCommandInteraction, ComponentBuilder, InteractionResponse, ModalBuilder, TextInputBuilder, TextInputStyle } from 'discord.js'; const questions = ['Question 1', 'Question 2']; @@ -7,65 +7,85 @@ export default class extends Command { description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; - run(interaction: ChatInputCommandInteraction): Promise | void> { - let questionNum = 0; - - const nextButton = new ButtonBuilder() - .setCustomId('nextQuestion') - .setLabel('Next Question') - .setStyle(ButtonStyle.Primary) - .setEmoji('▶'); - - let actionRow = new ActionRowBuilder() - .addComponents(nextButton); - - interaction.reply({ - embeds: [this.questionGetter(questionNum)], - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - components: [actionRow] - }); - - let replyId; - interaction.fetchReply().then(reply => { replyId = reply.id; }); - - const collector = interaction.channel.createMessageComponentCollector({ - filter: i => i.message.id === replyId - }); - - collector.on('collect', async (i: ButtonInteraction) => { - if (interaction.user.id !== i.user.id) { - await i.reply({ - content: 'You cannot respond to a command you did not execute', - ephemeral: true - }); - return; - } - i.deferUpdate(); - if (i.customId === 'nextQuestion') { - questionNum++; - actionRow = questionNum === (questions.length - 1) - ? new ActionRowBuilder({ components: [nextButton.setDisabled(true)] }) - : new ActionRowBuilder({ components: [nextButton] }); - } - interaction.editReply({ - embeds: [this.questionGetter(questionNum)], - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - components: [actionRow] - }); - }); + async run(interaction: ChatInputCommandInteraction): Promise | void> { + const questionNum = 0; + + const modal = new ModalBuilder() + .setTitle('Job Form') + .setCustomId('modal'); + + const AnswerInput = new TextInputBuilder() + .setCustomId('answerInput') + .setLabel(`${questions[questionNum]}`) + .setStyle(TextInputStyle.Short).setPlaceholder('Answer: '); + + const secondActionRow = new ActionRowBuilder().addComponents(AnswerInput); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + modal.addComponents(secondActionRow); + + await interaction.showModal(modal); return; - } + // let questionNum = 0; + + // const nextButton = new ButtonBuilder() + // .setCustomId('nextQuestion') + // .setLabel('Next Question') + // .setStyle(ButtonStyle.Primary) + // .setEmoji('▶'); - questionGetter(questionNum: number): EmbedBuilder { - return new EmbedBuilder() - .setTitle('Job Alert Form') - .setColor('#000000') - .addFields( - { name: 'Question:', value: questions[questionNum] }, - { name: 'Answer', value: 'also test', inline: true }); + // let actionRow = new ActionRowBuilder() + // .addComponents(nextButton); + + // interaction.reply({ + // embeds: [this.questionGetter(questionNum)], + // // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // // @ts-ignore + // components: [actionRow] + // }); + + // let replyId; + // interaction.fetchReply().then(reply => { replyId = reply.id; }); + + // const collector = interaction.channel.createMessageComponentCollector({ + // filter: i => i.message.id === replyId + // }); + + // collector.on('collect', async (i: ButtonInteraction) => { + // if (interaction.user.id !== i.user.id) { + // await i.reply({ + // content: 'You cannot respond to a command you did not execute', + // ephemeral: true + // }); + // return; + // } + // i.deferUpdate(); + // if (i.customId === 'nextQuestion') { + // questionNum++; + // actionRow = questionNum === (questions.length - 1) + // ? new ActionRowBuilder({ components: [nextButton.setDisabled(true)] }) + // : new ActionRowBuilder({ components: [nextButton] }); + // } + // interaction.editReply({ + // embeds: [this.questionGetter(questionNum)], + // // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // // @ts-ignore + // components: [actionRow] + // }); + // }); + + // return; } + // questionGetter(questionNum: number): EmbedBuilder { + // return new EmbedBuilder() + // .setTitle('Job Alert Form') + // .setColor('#000000') + // .addFields( + // { name: 'Question:', value: questions[questionNum] }, + // { name: 'Answer', value: 'also test', inline: true }); + // } + } From e3144cc0f9800ff0e11bdca669aad01bc8e549c3 Mon Sep 17 00:00:00 2001 From: westa Date: Sat, 12 Oct 2024 12:41:35 -0400 Subject: [PATCH 034/267] Two config files problem --- .github/workflows/documentation.yml | 2 +- .github/workflows/main.yml | 4 ++-- .github/workflows/node.js.yml | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index ae7295bd..8f4aa328 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -2,7 +2,7 @@ name: documentation on: push: - branches: [ "main", "Ava-branch" ] + branches: [ "main", "Ava-branch-config" ] jobs: build: diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4b0aa8f8..4fd39ff5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,9 +2,9 @@ name: Main Pipeline on: push: - branches: [ "main", "Ava-branch" ] + branches: [ "main", "Ava-branch-config" ] pull_request: - branches: [ "main", "Ava-branch" ] + branches: [ "main", "Ava-branch-config" ] env: DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 70819f48..a108ae84 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -20,6 +20,11 @@ jobs: cache: 'npm' - run: npm cache clean --force - run: npm ci + + # Add this step to copy config.example.ts to config.ts + - name: Set config file + run: cp config.example.ts config.ts + - name: build run: | npm run build 2>&1 | tee build-output.log From 9ac887263a8ac3ae9bf4eb7cd2026a65ef8caf87 Mon Sep 17 00:00:00 2001 From: westa Date: Sat, 12 Oct 2024 12:46:16 -0400 Subject: [PATCH 035/267] .gitignore addition --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 2af78e03..54c5e0b3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ resources/* !resources/.exists src/commands/admin/eval.ts +config.ts + # macOS stuff .DS_Store From 76295846ecdd0049d35e6e981e6946e9a89113ce Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Mon, 14 Oct 2024 12:15:51 -0400 Subject: [PATCH 036/267] went back to using modals lol --- src/commands/jobs/jobform.ts | 81 ++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 27 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 0e7ef409..65e52381 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,44 +1,64 @@ import { Command } from '@root/src/lib/types/Command'; -import { ActionRowBuilder, ChatInputCommandInteraction, ComponentBuilder, InteractionResponse, ModalBuilder, TextInputBuilder, TextInputStyle } from 'discord.js'; +import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, + ChatInputCommandInteraction, EmbedBuilder, InteractionResponse, + ModalBuilder, TextInputBuilder, TextInputStyle } from 'discord.js'; -const questions = ['Question 1', 'Question 2']; +const questions = ['Question 1', 'Question 2', 'Question 3', 'Question 4', 'Question 5']; export default class extends Command { description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; async run(interaction: ChatInputCommandInteraction): Promise | void> { - const questionNum = 0; - const modal = new ModalBuilder() - .setTitle('Job Form') - .setCustomId('modal'); - - const AnswerInput = new TextInputBuilder() - .setCustomId('answerInput') - .setLabel(`${questions[questionNum]}`) - .setStyle(TextInputStyle.Short).setPlaceholder('Answer: '); - - const secondActionRow = new ActionRowBuilder().addComponents(AnswerInput); + .setCustomId('modalInput') + .setTitle('Job Form'); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - modal.addComponents(secondActionRow); + const rows = questions.map((question) => this.getAnswerField(questions.indexOf(question))); - await interaction.showModal(modal); + for (const row of rows) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + modal.addComponents(row); + } + interaction.showModal(modal); return; + // let questionNum = 0; + // // Button to go to the next question // const nextButton = new ButtonBuilder() // .setCustomId('nextQuestion') // .setLabel('Next Question') // .setStyle(ButtonStyle.Primary) // .setEmoji('▶'); + // // Button to change the users answer + // const editAnswer = new ButtonBuilder() + // .setCustomId('editAnswer') + // .setLabel('Edit Answer') + // .setStyle(ButtonStyle.Success); + // let actionRow = new ActionRowBuilder() + // .addComponents(editAnswer) // .addComponents(nextButton); + // // The modal that gets shown to the user + // const modal = new ModalBuilder().setCustomId('answerModal').setTitle(`Question ${questionNum}`); + // const userAnswer = new TextInputBuilder() + // .setCustomId('userInput') + // .setLabel('Answer') + // .setStyle(TextInputStyle.Short) + // .setPlaceholder('Input your answer here'); + + // const modalRow = new ActionRowBuilder().addComponents(userAnswer); + + // // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // // @ts-ignore + // modal.addComponents(modalRow); + + // // Send the initial embed // interaction.reply({ // embeds: [this.questionGetter(questionNum)], // // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -46,6 +66,7 @@ export default class extends Command { // components: [actionRow] // }); + // // Get the ID of the sent message to handle buttons being pushed // let replyId; // interaction.fetchReply().then(reply => { replyId = reply.id; }); @@ -53,7 +74,10 @@ export default class extends Command { // filter: i => i.message.id === replyId // }); + // interaction.channel.send({ modal, reply: { messageReference: replyId } }); + // collector.on('collect', async (i: ButtonInteraction) => { + // // If someone else trys pushing a button, tell them no // if (interaction.user.id !== i.user.id) { // await i.reply({ // content: 'You cannot respond to a command you did not execute', @@ -62,11 +86,15 @@ export default class extends Command { // return; // } // i.deferUpdate(); + // // Next question button // if (i.customId === 'nextQuestion') { // questionNum++; // actionRow = questionNum === (questions.length - 1) - // ? new ActionRowBuilder({ components: [nextButton.setDisabled(true)] }) - // : new ActionRowBuilder({ components: [nextButton] }); + // ? new ActionRowBuilder({ components: [editAnswer, nextButton.setDisabled(true)] }) + // : new ActionRowBuilder({ components: [editAnswer, nextButton] }); + // // Edit answer button + // } else if (i.customId === 'editAnswer') { + // await modalInteraction.showModal(modal); // } // interaction.editReply({ // embeds: [this.questionGetter(questionNum)], @@ -79,13 +107,12 @@ export default class extends Command { // return; } - // questionGetter(questionNum: number): EmbedBuilder { - // return new EmbedBuilder() - // .setTitle('Job Alert Form') - // .setColor('#000000') - // .addFields( - // { name: 'Question:', value: questions[questionNum] }, - // { name: 'Answer', value: 'also test', inline: true }); - // } + getAnswerField(questionNum: number): ActionRowBuilder { + return new ActionRowBuilder({ components: [new TextInputBuilder() + .setCustomId(`question ${questionNum + 1}`) + .setLabel(`Question ${questionNum + 1}`) + .setStyle(TextInputStyle.Short) + .setPlaceholder('Input Answer Here')] }); + } } From 85abf4d9d19178e4ef2a3bf334b504d6024158ff Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:41:28 -0400 Subject: [PATCH 037/267] Finished form just need to change questions now --- src/commands/jobs/jobform.ts | 95 +++++------------------------------- src/pieces/commandManager.ts | 11 ++++- 2 files changed, 21 insertions(+), 85 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 65e52381..ea8f7ab9 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,17 +1,16 @@ import { Command } from '@root/src/lib/types/Command'; -import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, - ChatInputCommandInteraction, EmbedBuilder, InteractionResponse, - ModalBuilder, TextInputBuilder, TextInputStyle } from 'discord.js'; +import { ActionRowBuilder, ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, TextInputBuilder, TextInputStyle } from 'discord.js'; const questions = ['Question 1', 'Question 2', 'Question 3', 'Question 4', 'Question 5']; export default class extends Command { + name = 'jobform'; description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; async run(interaction: ChatInputCommandInteraction): Promise | void> { const modal = new ModalBuilder() - .setCustomId('modalInput') + .setCustomId('jobModal') .setTitle('Job Form'); const rows = questions.map((question) => this.getAnswerField(questions.indexOf(question))); @@ -22,94 +21,22 @@ export default class extends Command { modal.addComponents(row); } - interaction.showModal(modal); - return; - - // let questionNum = 0; - - // // Button to go to the next question - // const nextButton = new ButtonBuilder() - // .setCustomId('nextQuestion') - // .setLabel('Next Question') - // .setStyle(ButtonStyle.Primary) - // .setEmoji('▶'); - - // // Button to change the users answer - // const editAnswer = new ButtonBuilder() - // .setCustomId('editAnswer') - // .setLabel('Edit Answer') - // .setStyle(ButtonStyle.Success); - - // let actionRow = new ActionRowBuilder() - // .addComponents(editAnswer) - // .addComponents(nextButton); - // // The modal that gets shown to the user - // const modal = new ModalBuilder().setCustomId('answerModal').setTitle(`Question ${questionNum}`); - - // const userAnswer = new TextInputBuilder() - // .setCustomId('userInput') - // .setLabel('Answer') - // .setStyle(TextInputStyle.Short) - // .setPlaceholder('Input your answer here'); - - // const modalRow = new ActionRowBuilder().addComponents(userAnswer); + await interaction.showModal(modal); - // // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // // @ts-ignore - // modal.addComponents(modalRow); + // Answers are handled in commandManager.ts on line 149 - // // Send the initial embed - // interaction.reply({ - // embeds: [this.questionGetter(questionNum)], - // // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // // @ts-ignore - // components: [actionRow] - // }); - - // // Get the ID of the sent message to handle buttons being pushed - // let replyId; - // interaction.fetchReply().then(reply => { replyId = reply.id; }); - - // const collector = interaction.channel.createMessageComponentCollector({ - // filter: i => i.message.id === replyId - // }); - - // interaction.channel.send({ modal, reply: { messageReference: replyId } }); + return; + } - // collector.on('collect', async (i: ButtonInteraction) => { - // // If someone else trys pushing a button, tell them no - // if (interaction.user.id !== i.user.id) { - // await i.reply({ - // content: 'You cannot respond to a command you did not execute', - // ephemeral: true - // }); - // return; - // } - // i.deferUpdate(); - // // Next question button - // if (i.customId === 'nextQuestion') { - // questionNum++; - // actionRow = questionNum === (questions.length - 1) - // ? new ActionRowBuilder({ components: [editAnswer, nextButton.setDisabled(true)] }) - // : new ActionRowBuilder({ components: [editAnswer, nextButton] }); - // // Edit answer button - // } else if (i.customId === 'editAnswer') { - // await modalInteraction.showModal(modal); - // } - // interaction.editReply({ - // embeds: [this.questionGetter(questionNum)], - // // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // // @ts-ignore - // components: [actionRow] - // }); - // }); - // return; + getAnswer(fields: ModalSubmitFields, questionNum: number): string { + return fields.getField(`question${questionNum + 1}`).value; } + getAnswerField(questionNum: number): ActionRowBuilder { return new ActionRowBuilder({ components: [new TextInputBuilder() - .setCustomId(`question ${questionNum + 1}`) + .setCustomId(`question${questionNum + 1}`) .setLabel(`Question ${questionNum + 1}`) .setStyle(TextInputStyle.Short) .setPlaceholder('Input Answer Here')] }); diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index c278b542..68bd8a89 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -3,7 +3,8 @@ import { Collection, Client, CommandInteraction, ApplicationCommand, ModalSubmitInteraction, TextChannel, GuildMemberRoleManager, ButtonInteraction, ModalBuilder, TextInputBuilder, ActionRowBuilder, ModalActionRowComponentBuilder, ApplicationCommandType, ApplicationCommandDataResolvable, ChannelType, ApplicationCommandPermissionType, TextInputStyle, - ChatInputCommandInteraction } from 'discord.js'; + ChatInputCommandInteraction, + ModalSubmitFields } from 'discord.js'; import { isCmdEqual, readdirRecursive } from '@root/src/lib/utils/generalUtils'; import { Command } from '@lib/types/Command'; import { SageData } from '@lib/types/SageData'; @@ -145,6 +146,14 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie interaction.reply({ content: `Thank you for verifying! You can now access the rest of the server. ${enrollStr}`, ephemeral: true }); break; } + case 'jobModal': { + // extracting the input from the modal + const questionIDs = [1, 2, 3, 4, 5]; + const jobAnswers = questionIDs.map((question) => interaction.fields.getTextInputValue(`question${question}`)); + console.log(jobAnswers); + interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); + break; + } } } From ed2b09485da13fed82436bc9bbc95fa8ce94e4e9 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Mon, 21 Oct 2024 10:03:30 -0400 Subject: [PATCH 038/267] added new ways to implement task 2.3 and 2.4, however, I just learned that we can add code to already existing files, so that may be why my code is not working --- src/commands/Jobs/APIDatabase.ts | 197 +++++++++++++++++++++++++------ 1 file changed, 164 insertions(+), 33 deletions(-) diff --git a/src/commands/Jobs/APIDatabase.ts b/src/commands/Jobs/APIDatabase.ts index f560dadc..a66e3a1a 100644 --- a/src/commands/Jobs/APIDatabase.ts +++ b/src/commands/Jobs/APIDatabase.ts @@ -58,6 +58,76 @@ // }); // } // export default reg; +// --------------------------------------Second attempt--------------------------------------------- +// import { Client, User, Message } from 'discord.js'; +// import { DB } from '@root/config'; + +// interface Jobs { +// jobType: string; +// location: string; +// keywords: string[]; +// frequency: string; +// } + +// async function storePref(msg: Message, preferences: Jobs): Promise { +// const bot = msg.client; +// await bot.mongo.collection(DB.USERS).findOneAndUpdate( +// { discordID: msg.author.id }, +// { $set: { preferences } }, +// { upsert: true } +// ); +// } + +// async function handleFormSubmission(msg: Message) { +// const args = msg.content.split(',').map(arg => arg.trim()); +// if (args.length < 4) { +// return msg.reply('Please provide all preferences: jobType, location, keywords (comma-separated), frequency.'); +// } + +// const [jobType, location, keywordsRaw, frequency] = args; +// const keywords = keywordsRaw.split(' ').filter(Boolean); + +// const preferences: Jobs = { +// jobType, +// location, +// keywords, +// frequency +// }; + +// await storePref(msg, preferences); +// msg.reply('Your preferences have been updated!'); +// } + +// async function reg(bot: Client): Promise { +// bot.on('messageCreate', async (msg: Message) => { +// if (msg.content.startsWith('!setPreferences')) { +// await handleFormSubmission(msg); +// } +// }); + +// bot.on('guildMemberAdd', async (member) => { +// const defaultPref: Jobs = { +// jobType: 'internship', +// location: 'hybrid', +// keywords: ['coding'], +// frequency: 'daily' +// }; +// await storePref(createMessage(bot, member.user), defaultPref); +// }); +// } + +// function createMessage(bot: Client, user: User): Message { +// return { +// client: bot, +// author: user, +// content: '', +// channel: null +// } as unknown as Message; +// } + +// export default reg; + +// --------------------------------third attempt--------------------------------------- import { Client, User, Message } from 'discord.js'; import { DB } from '@root/config'; @@ -69,61 +139,122 @@ interface Jobs { frequency: string; } +// interface DatabaseResponse { +// acknowledged: boolean; +// modifiedCount: number; +// upsertedId: string | null; +// upsertedCount: number; +// matchedCount: number; +// } + async function storePref(msg: Message, preferences: Jobs): Promise { - const bot = msg.client; - await bot.mongo.collection(DB.USERS).findOneAndUpdate( - { discordID: msg.author.id }, - { $set: { preferences } }, - { upsert: true } - ); + try { + const bot = msg.client; + const result = await bot.mongo.collection(DB.USERS).findOneAndUpdate( + { discordID: msg.author.id }, + { + $set: { preferences }, + $setOnInsert: { createdAt: new Date() } + }, + { + upsert: true, + returnDocument: 'after' + } + ); + + if (!result) { + throw new Error('Failed to update preferences'); + } + } catch (error) { + console.error('Error storing preferences:', error); + throw new Error('Failed to save preferences to database'); + } } -async function handleFormSubmission(msg: Message) { - const args = msg.content.split(',').map(arg => arg.trim()); +function validatePreferences(args: string[]): Jobs | null { if (args.length < 4) { - return msg.reply('Please provide all preferences: jobType, location, keywords (comma-separated), frequency.'); + return null; } const [jobType, location, keywordsRaw, frequency] = args; - const keywords = keywordsRaw.split(' ').filter(Boolean); - const preferences: Jobs = { - jobType, - location, + // Basic validation + if (!jobType || !location || !keywordsRaw || !frequency) { + return null; + } + + // Convert keywords string to array and filter empty strings + const keywords = keywordsRaw.split(' ') + .filter(keyword => keyword.trim().length > 0); + + return { + jobType: jobType.toLowerCase(), + location: location.toLowerCase(), keywords, - frequency + frequency: frequency.toLowerCase() }; +} + +async function handleFormSubmission(msg: Message): Promise { + try { + const args = msg.content.replace('!setPreferences', '') + .split(',') + .map(arg => arg.trim()); + + const preferences = validatePreferences(args); - await storePref(msg, preferences); - msg.reply('Your preferences have been updated!'); + if (!preferences) { + await msg.reply('Please provide all preferences in the format: !setPreferences jobType, location, keywords (space-separated), frequency'); + return; + } + + await storePref(msg, preferences); + await msg.reply('Your preferences have been successfully updated! 👍'); + } catch (error) { + console.error('Error in form submission:', error); + await msg.reply('Sorry, there was an error saving your preferences. Please try again later.'); + } } async function reg(bot: Client): Promise { + if (!bot.mongo) { + throw new Error('MongoDB connection not initialized'); + } + bot.on('messageCreate', async (msg: Message) => { + if (msg.author.bot) return; // Ignore bot messages if (msg.content.startsWith('!setPreferences')) { await handleFormSubmission(msg); } }); bot.on('guildMemberAdd', async (member) => { - const defaultPref: Jobs = { - jobType: 'internship', - location: 'hybrid', - keywords: ['coding'], - frequency: 'daily' - }; - await storePref(createMessage(bot, member.user), defaultPref); - }); -} + try { + const defaultPref: Jobs = { + jobType: 'internship', + location: 'hybrid', + keywords: ['coding'], + frequency: 'daily' + }; -function createMessage(bot: Client, user: User): Message { - return { - client: bot, - author: user, - content: '', - channel: null - } as unknown as Message; + const message = { + client: bot, + author: member.user, + content: '', + channel: member.guild.systemChannel, + reply: async (content: string) => { + if (member.guild.systemChannel) { + await member.guild.systemChannel.send(`${member.user}: ${content}`); + } + } + } as unknown as Message; + + await storePref(message, defaultPref); + await message.reply('Welcome! Default job preferences have been set. Use !setPreferences to customize them.'); + } catch (error) { + console.error('Error setting default preferences:', error); + } + }); } export default reg; - From 2ca66992d391693ad9554d97c1633ceaf1311131 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 22 Oct 2024 16:14:04 -0400 Subject: [PATCH 039/267] changed all of APIDatabase to somewhat follow along jobForm, and now there are no errors when I run npm run dev --- src/commands/Jobs/APIDatabase.ts | 299 ++++++------------------------- 1 file changed, 53 insertions(+), 246 deletions(-) diff --git a/src/commands/Jobs/APIDatabase.ts b/src/commands/Jobs/APIDatabase.ts index a66e3a1a..9c2c52ee 100644 --- a/src/commands/Jobs/APIDatabase.ts +++ b/src/commands/Jobs/APIDatabase.ts @@ -1,260 +1,67 @@ -// import { Client, User, TextChannel, Role, Message, EmbedBuilder, PartialMessage, ThreadChannel, ChannelType } from 'discord.js'; -// import { DatabaseError } from '@lib/types/errors'; -// import { CHANNELS, DB, ROLES, GUILDS } from '@root/config'; -// import { SageUser } from '@lib/types/SageUser'; -// import { calcNeededExp } from '@lib/utils/generalUtils'; - - -// // async function storePref(msg: Message) { -// // const bot = msg.client; -// // bot.mongo.collection(DB.USERS).findOneAndUpdate( -// // {discordID: msg.author.id}, -// // {$inc: {count: countInc, curExp: -1}}, - -// // ) -// // return result.ops[0]; -// // } - -// // interface Job { -// // name: Message -// // } -// // const jobs = Message; - - -// -------------------------Code I may need-------------------Do Not Delete Yet---------------------- -// interface Jobs { -// jobType: string, -// location: string, -// keywords: [string], -// frequency: string; -// } - -// function createMessage(bot:Client, user: User): Message { -// return { -// client: bot, -// author: user, -// content: '', -// channel: null -// } as unknown as Message; -// } -// async function storePref(msg: Message, preferences: Jobs): Promise { -// const bot = msg.client; -// await bot.mongo.collection(DB.USERS).findOneAndUpdate( -// { discordID: msg.author.id }, -// { $set: { preferences } }, -// { upsert: true } -// ); -// } -// async function reg(bot: Client): Promise { -// bot.on('guildMemberAdd', async (member) => { -// const defaultPref: Jobs = { -// jobType: 'internship', -// location: 'hybrid', -// keywords: ['coding'], -// frequency: 'daily' -// }; -// const messageHolder = createMessage(bot, member.user); -// await storePref(messageHolder, defaultPref); -// }); -// } -// export default reg; -// --------------------------------------Second attempt--------------------------------------------- -// import { Client, User, Message } from 'discord.js'; -// import { DB } from '@root/config'; - -// interface Jobs { -// jobType: string; -// location: string; -// keywords: string[]; -// frequency: string; -// } - -// async function storePref(msg: Message, preferences: Jobs): Promise { -// const bot = msg.client; -// await bot.mongo.collection(DB.USERS).findOneAndUpdate( -// { discordID: msg.author.id }, -// { $set: { preferences } }, -// { upsert: true } -// ); -// } - -// async function handleFormSubmission(msg: Message) { -// const args = msg.content.split(',').map(arg => arg.trim()); -// if (args.length < 4) { -// return msg.reply('Please provide all preferences: jobType, location, keywords (comma-separated), frequency.'); -// } - -// const [jobType, location, keywordsRaw, frequency] = args; -// const keywords = keywordsRaw.split(' ').filter(Boolean); - -// const preferences: Jobs = { -// jobType, -// location, -// keywords, -// frequency -// }; - -// await storePref(msg, preferences); -// msg.reply('Your preferences have been updated!'); -// } - -// async function reg(bot: Client): Promise { -// bot.on('messageCreate', async (msg: Message) => { -// if (msg.content.startsWith('!setPreferences')) { -// await handleFormSubmission(msg); -// } -// }); - -// bot.on('guildMemberAdd', async (member) => { -// const defaultPref: Jobs = { -// jobType: 'internship', -// location: 'hybrid', -// keywords: ['coding'], -// frequency: 'daily' -// }; -// await storePref(createMessage(bot, member.user), defaultPref); -// }); -// } - -// function createMessage(bot: Client, user: User): Message { -// return { -// client: bot, -// author: user, -// content: '', -// channel: null -// } as unknown as Message; -// } - -// export default reg; - -// --------------------------------third attempt--------------------------------------- - -import { Client, User, Message } from 'discord.js'; +import { Collection, MongoClient } from 'mongodb'; import { DB } from '@root/config'; - -interface Jobs { - jobType: string; - location: string; - keywords: string[]; - frequency: string; -} - -// interface DatabaseResponse { -// acknowledged: boolean; -// modifiedCount: number; -// upsertedId: string | null; -// upsertedCount: number; -// matchedCount: number; -// } - -async function storePref(msg: Message, preferences: Jobs): Promise { - try { - const bot = msg.client; - const result = await bot.mongo.collection(DB.USERS).findOneAndUpdate( - { discordID: msg.author.id }, - { - $set: { preferences }, - $setOnInsert: { createdAt: new Date() } - }, - { - upsert: true, - returnDocument: 'after' - } - ); - - if (!result) { - throw new Error('Failed to update preferences'); - } - } catch (error) { - console.error('Error storing preferences:', error); - throw new Error('Failed to save preferences to database'); - } -} - -function validatePreferences(args: string[]): Jobs | null { - if (args.length < 4) { - return null; - } - - const [jobType, location, keywordsRaw, frequency] = args; - - // Basic validation - if (!jobType || !location || !keywordsRaw || !frequency) { - return null; - } - - // Convert keywords string to array and filter empty strings - const keywords = keywordsRaw.split(' ') - .filter(keyword => keyword.trim().length > 0); - - return { - jobType: jobType.toLowerCase(), - location: location.toLowerCase(), - keywords, - frequency: frequency.toLowerCase() +interface JobPreferences { + userID: string; + answers: { + jobType: string; + location: string; + keywords: string[]; + experience: string; + interests: string; }; + lastUpdated: Date; } -async function handleFormSubmission(msg: Message): Promise { - try { - const args = msg.content.replace('!setPreferences', '') - .split(',') - .map(arg => arg.trim()); - - const preferences = validatePreferences(args); - - if (!preferences) { - await msg.reply('Please provide all preferences in the format: !setPreferences jobType, location, keywords (space-separated), frequency'); - return; - } +export class JobPreferenceAPI { - await storePref(msg, preferences); - await msg.reply('Your preferences have been successfully updated! 👍'); - } catch (error) { - console.error('Error in form submission:', error); - await msg.reply('Sorry, there was an error saving your preferences. Please try again later.'); - } -} + private collection: Collection; -async function reg(bot: Client): Promise { - if (!bot.mongo) { - throw new Error('MongoDB connection not initialized'); + constructor(mongo: MongoClient) { + this.collection = mongo.db().collection(DB.USERS); } - - bot.on('messageCreate', async (msg: Message) => { - if (msg.author.bot) return; // Ignore bot messages - if (msg.content.startsWith('!setPreferences')) { - await handleFormSubmission(msg); - } - }); - - bot.on('guildMemberAdd', async (member) => { + async storeFormResponses(userID: string, answers: string[]): Promise { try { - const defaultPref: Jobs = { - jobType: 'internship', - location: 'hybrid', - keywords: ['coding'], - frequency: 'daily' + const formattedAnswers = { + jobType: answers[0], + location: answers[1], + keywords: answers[2].split(',').map(keyword => keyword.trim()), + experience: answers[3], + interests: answers[4] }; - - const message = { - client: bot, - author: member.user, - content: '', - channel: member.guild.systemChannel, - reply: async (content: string) => { - if (member.guild.systemChannel) { - await member.guild.systemChannel.send(`${member.user}: ${content}`); + await this.collection.updateOne( + { discordId: userID }, + { + $set: { + jobPreferences: { + userID, + answers: formattedAnswers, + lastUpdated: new Date() + } } - } - } as unknown as Message; + }, + { upsert: true } + ); + return true; + } catch (error) { + console.error('Error storing job form responses', error); + return false; + } + } + async getPreference(userID:string, answers: string[]): Promise { + return this.storeFormResponses(userID, answers); + } - await storePref(message, defaultPref); - await message.reply('Welcome! Default job preferences have been set. Use !setPreferences to customize them.'); + async deletePreference(userID: string): Promise { + try { + const result = await this.collection.updateOne( + { discordId: userID }, + { $unset: { jobPreferences: '' } } + ); + return result.modifiedCount > 0; } catch (error) { - console.error('Error setting default preferences:', error); + console.error('Error deleting job preference', error); + return false; } - }); -} + } -export default reg; +} From ffb297bdcd0921e53e9392a524b74fb4b2c90833 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 22 Oct 2024 18:58:13 -0400 Subject: [PATCH 040/267] idk what I am commiting, only commiting to pull --- src/pieces/commandManager.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 68bd8a89..5f3b0e67 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -13,6 +13,7 @@ import { Course } from '../lib/types/Course'; import { SageUser } from '../lib/types/SageUser'; import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; +import { JobPreferenceAPI } from '../commands/Jobs/APIDatabase'; const DELETE_DELAY = 10000; @@ -152,6 +153,9 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie const jobAnswers = questionIDs.map((question) => interaction.fields.getTextInputValue(`question${question}`)); console.log(jobAnswers); interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); + // try{ + // const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); + // } break; } } From e24fdac50ae27f04e5916b4261ea955a71d510c0 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Wed, 16 Oct 2024 10:05:13 -0400 Subject: [PATCH 041/267] added questions --- src/commands/jobs/jobform.ts | 31 ++++++++++++++++++++++++++----- src/pieces/commandManager.ts | 3 ++- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index ea8f7ab9..97279447 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,19 +1,40 @@ import { Command } from '@root/src/lib/types/Command'; -import { ActionRowBuilder, ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, TextInputBuilder, TextInputStyle } from 'discord.js'; +import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptionType, + ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, + TextInputBuilder, TextInputStyle } from 'discord.js'; -const questions = ['Question 1', 'Question 2', 'Question 3', 'Question 4', 'Question 5']; +const questions = [ + ['What city are you located in?', 'Are you looking for something remote or in person?', 'Are you looking for a job, internship or both?', 'How far are you willing to travel?'], + ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] +]; export default class extends Command { name = 'jobform'; description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; + options: ApplicationCommandOptionData[] = [ + { + name: 'qSet', + description: 'Which question set do you want to view (1 or 2).', + type: ApplicationCommandOptionType.Number, + required: true + } + ] + async run(interaction: ChatInputCommandInteraction): Promise | void> { + const questionSet = interaction.options.getNumber('Question Set'); + + if (questionSet === 1 || questionSet === 2) { + interaction.reply({ content: 'Please enter either 1 or 2' }); + return; + } + const modal = new ModalBuilder() - .setCustomId('jobModal') - .setTitle('Job Form'); + .setCustomId(`jobModal${questionSet}`) + .setTitle(`Job Form (${questionSet} of 2)`); - const rows = questions.map((question) => this.getAnswerField(questions.indexOf(question))); + const rows = questions[questionSet].map((question) => this.getAnswerField(questions[questionSet].indexOf(question))); for (const row of rows) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 5f3b0e67..ab03b564 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -110,7 +110,7 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie const guild = await bot.guilds.fetch(GUILDS.MAIN); guild.members.fetch(); - switch (customId) { + switch (customId.replace(/[0-9]/g, '')) { case 'announce': { const channel = bot.channels.cache.get(fields.getTextInputValue('channel')) as TextChannel; const content = fields.getTextInputValue('content'); @@ -151,6 +151,7 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie // extracting the input from the modal const questionIDs = [1, 2, 3, 4, 5]; const jobAnswers = questionIDs.map((question) => interaction.fields.getTextInputValue(`question${question}`)); + console.log(interaction.customId); console.log(jobAnswers); interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); // try{ From 38a230f9c9fbf720af85622cfce27c575d8e3c72 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:36:22 -0400 Subject: [PATCH 042/267] finished the task --- src/commands/jobs/jobform.ts | 21 +++++++++++---------- src/pieces/commandManager.ts | 11 +++++++---- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 97279447..a370bb3a 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -4,18 +4,18 @@ import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptio TextInputBuilder, TextInputStyle } from 'discord.js'; const questions = [ - ['What city are you located in?', 'Are you looking for something remote or in person?', 'Are you looking for a job, internship or both?', 'How far are you willing to travel?'], + ['What city are you located in?', 'Are you looking for remote or in person?', 'Job, internship or both?', 'How far are you willing to travel?'], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; export default class extends Command { - name = 'jobform'; + name: 'jobform' description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; options: ApplicationCommandOptionData[] = [ { - name: 'qSet', + name: 'qset', description: 'Which question set do you want to view (1 or 2).', type: ApplicationCommandOptionType.Number, required: true @@ -23,18 +23,19 @@ export default class extends Command { ] async run(interaction: ChatInputCommandInteraction): Promise | void> { - const questionSet = interaction.options.getNumber('Question Set'); + const questionSet = interaction.options.getNumber('qset') - 1; - if (questionSet === 1 || questionSet === 2) { + if (questionSet !== 0 && questionSet !== 1) { interaction.reply({ content: 'Please enter either 1 or 2' }); return; } const modal = new ModalBuilder() .setCustomId(`jobModal${questionSet}`) - .setTitle(`Job Form (${questionSet} of 2)`); + .setTitle(`Job Form (${questionSet + 1} of 2)`); - const rows = questions[questionSet].map((question) => this.getAnswerField(questions[questionSet].indexOf(question))); + const askedQuestions = questions[questionSet]; + const rows = askedQuestions.map((question) => this.getAnswerField(question, askedQuestions.indexOf(question))); for (const row of rows) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -44,7 +45,7 @@ export default class extends Command { await interaction.showModal(modal); - // Answers are handled in commandManager.ts on line 149 + // Answers are handled in src/pieces/commandManager.ts on line 149 return; } @@ -55,10 +56,10 @@ export default class extends Command { } - getAnswerField(questionNum: number): ActionRowBuilder { + getAnswerField(question: string, questionNum: number): ActionRowBuilder { return new ActionRowBuilder({ components: [new TextInputBuilder() .setCustomId(`question${questionNum + 1}`) - .setLabel(`Question ${questionNum + 1}`) + .setLabel(`${question}`) .setStyle(TextInputStyle.Short) .setPlaceholder('Input Answer Here')] }); } diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index ab03b564..d9e04cb4 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -149,10 +149,13 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie } case 'jobModal': { // extracting the input from the modal - const questionIDs = [1, 2, 3, 4, 5]; - const jobAnswers = questionIDs.map((question) => interaction.fields.getTextInputValue(`question${question}`)); - console.log(interaction.customId); - console.log(jobAnswers); + const qSet = customId.slice(-1); + const questionIDs = [[1, 2, 3, 4], [1, 2, 3, 4, 5]]; + + const jobAnswers = questionIDs[qSet].map((question) => interaction.fields.getTextInputValue(`question${question}`)); + + // qSet contains either 0 or 1 depending if it is the first or second set of questions + // the array of answers is stored in jobAnswers interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); // try{ // const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); From b5e39e9749cda0bd764562083862304970460ac8 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 22 Oct 2024 21:35:29 -0400 Subject: [PATCH 043/267] Changed the questions and added interests to match JobForm --- src/commands/Jobs/APIDatabase.ts | 59 +++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/src/commands/Jobs/APIDatabase.ts b/src/commands/Jobs/APIDatabase.ts index 9c2c52ee..81e2290f 100644 --- a/src/commands/Jobs/APIDatabase.ts +++ b/src/commands/Jobs/APIDatabase.ts @@ -1,13 +1,20 @@ import { Collection, MongoClient } from 'mongodb'; import { DB } from '@root/config'; + interface JobPreferences { userID: string; answers: { - jobType: string; - location: string; - keywords: string[]; - experience: string; - interests: string; + // First question set + city: string; + workType: string; + employmentType: string; + travelDistance: string; + // Second question set + interest1: string; + interest2: string; + interest3: string; + interest4: string; + interest5: string; }; lastUpdated: Date; } @@ -19,24 +26,35 @@ export class JobPreferenceAPI { constructor(mongo: MongoClient) { this.collection = mongo.db().collection(DB.USERS); } - async storeFormResponses(userID: string, answers: string[]): Promise { + + async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise { try { - const formattedAnswers = { - jobType: answers[0], - location: answers[1], - keywords: answers[2].split(',').map(keyword => keyword.trim()), - experience: answers[3], - interests: answers[4] - }; + let updateObject = {}; + + if (questionSet === 0) { + updateObject = { + 'jobPreferences.answers.city': answers[0], + 'jobPreferences.answers.workType': answers[1], + 'jobPreferences.answers.employmentType': answers[2], + 'jobPreferences.answers.travelDistance': answers[3] + }; + } else if (questionSet === 1) { + updateObject = { + 'jobPreferences.answers.interest1': answers[0], + 'jobPreferences.answers.interest2': answers[1], + 'jobPreferences.answers.interest3': answers[2], + 'jobPreferences.answers.interest4': answers[3], + 'jobPreferences.answers.interest5': answers[4] + }; + } + await this.collection.updateOne( { discordId: userID }, { $set: { - jobPreferences: { - userID, - answers: formattedAnswers, - lastUpdated: new Date() - } + ...updateObject, + 'jobPreferences.userID': userID, + 'jobPreferences.lastUpdated': new Date() } }, { upsert: true } @@ -47,8 +65,9 @@ export class JobPreferenceAPI { return false; } } - async getPreference(userID:string, answers: string[]): Promise { - return this.storeFormResponses(userID, answers); + + async getPreference(userID: string, answers: string[], questionSet: number): Promise { + return this.storeFormResponses(userID, answers, questionSet); } async deletePreference(userID: string): Promise { From a1e9e917317e29a444c78de83d3302aac4ad1cef Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 22 Oct 2024 22:18:24 -0400 Subject: [PATCH 044/267] finished maing task 2.4 --- src/commands/Jobs/APIDatabase.ts | 9 ++++--- src/pieces/commandManager.ts | 44 +++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/commands/Jobs/APIDatabase.ts b/src/commands/Jobs/APIDatabase.ts index 81e2290f..91f19e6b 100644 --- a/src/commands/Jobs/APIDatabase.ts +++ b/src/commands/Jobs/APIDatabase.ts @@ -1,4 +1,4 @@ -import { Collection, MongoClient } from 'mongodb'; +import { Collection, Db, MongoClient } from 'mongodb'; import { DB } from '@root/config'; interface JobPreferences { @@ -23,9 +23,12 @@ export class JobPreferenceAPI { private collection: Collection; - constructor(mongo: MongoClient) { - this.collection = mongo.db().collection(DB.USERS); + constructor(db: Db) { + this.collection = db.collection(DB.USERS); } + // constructor(mongo: MongoClient) { + // this.collection = mongo.db().collection(DB.USERS); + // } async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise { try { diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index d9e04cb4..811d0355 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -147,19 +147,39 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie interaction.reply({ content: `Thank you for verifying! You can now access the rest of the server. ${enrollStr}`, ephemeral: true }); break; } + // case 'jobModal': { + // // extracting the input from the modal + // const qSet = customId.slice(-1); + // const questionIDs = [[1, 2, 3, 4], [1, 2, 3, 4, 5]]; + + // const jobAnswers = questionIDs[qSet].map((question) => interaction.fields.getTextInputValue(`question${question}`)); + + // // qSet contains either 0 or 1 depending if it is the first or second set of questions + // // the array of answers is stored in jobAnswers + // interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); + // break; + // } case 'jobModal': { - // extracting the input from the modal - const qSet = customId.slice(-1); - const questionIDs = [[1, 2, 3, 4], [1, 2, 3, 4, 5]]; - - const jobAnswers = questionIDs[qSet].map((question) => interaction.fields.getTextInputValue(`question${question}`)); - - // qSet contains either 0 or 1 depending if it is the first or second set of questions - // the array of answers is stored in jobAnswers - interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); - // try{ - // const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); - // } + try { + // extracting the input from the modal + const formNumber = parseInt(customId.slice(-1)); + const answers = [1, 2, 3, 4, 5].slice(0, formNumber === 0 ? 4 : 5).map(num => fields.getTextInputValue(`question${num}`)); + + // Create API instance with the database instance directly + const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); + const success = await jobPreferenceAPI.storeFormResponses(interaction.user.id, answers, formNumber); + + // Takes user to questions, then interests. If submitted correctly, the answers will be stored. + await interaction.reply({ + content: success + ? `Form ${formNumber + 1} submitted successfully! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}` + : 'Error saving preferences. Please try again.', + ephemeral: true + }); + } catch (error) { + console.error('Job form error:', error); + await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); + } break; } } From 86b6d9cd963c6e92cbcbd3227018f74736ff65f4 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 22 Oct 2024 22:37:06 -0400 Subject: [PATCH 045/267] Changed one thing in APIDatabase --- src/commands/Jobs/APIDatabase.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/Jobs/APIDatabase.ts b/src/commands/Jobs/APIDatabase.ts index 91f19e6b..f29efe48 100644 --- a/src/commands/Jobs/APIDatabase.ts +++ b/src/commands/Jobs/APIDatabase.ts @@ -4,12 +4,12 @@ import { DB } from '@root/config'; interface JobPreferences { userID: string; answers: { - // First question set + // Questions city: string; workType: string; employmentType: string; travelDistance: string; - // Second question set + // Interests interest1: string; interest2: string; interest3: string; From eda1b78d812d88b14e0bcb0362d707a16c0ce1c7 Mon Sep 17 00:00:00 2001 From: westa3 <111154660+westa3@users.noreply.github.com> Date: Sat, 12 Oct 2024 11:20:22 -0400 Subject: [PATCH 046/267] Update node.js.yml - two config file problem --- .github/workflows/node.js.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index a108ae84..40858c86 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -24,7 +24,7 @@ jobs: # Add this step to copy config.example.ts to config.ts - name: Set config file run: cp config.example.ts config.ts - + - name: build run: | npm run build 2>&1 | tee build-output.log @@ -45,4 +45,4 @@ jobs: - run: npm test # - name: Start Development - # run: npm run dev \ No newline at end of file + # run: npm run dev From 3cc3354c8eedc5573c2056faed1caad832051ed9 Mon Sep 17 00:00:00 2001 From: westa3 <111154660+westa3@users.noreply.github.com> Date: Sat, 12 Oct 2024 11:23:11 -0400 Subject: [PATCH 047/267] Update config.example.ts --- config.example.ts | 217 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) diff --git a/config.example.ts b/config.example.ts index 5eb2e8d7..c3abcb96 100644 --- a/config.example.ts +++ b/config.example.ts @@ -214,3 +214,220 @@ export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; // eslint-disable-next-line prefer-destructuring export const MONGO = config.MONGO; + +interface Config { + DB_CONNECTION: string; + BOT_NAME: string; + BOT_TOKEN: string; + BOT_CLIENT_ID: string; + DB_USERS: string; + DB_PVQ: string; + DB_QTAGS: string; + DB_ASSIGNABLE: string; + DB_COURSES: string; + DB_REMINDERS: string; + DB_CLIENT_DATA: string; + DB_POLLS: string; + GUILD_MAIN: string; + GUILD_GATEWAY: string; + GUILD_GATEWAY_INVITE: string; + ROLE_ADMIN: string; + ROLE_STUDENT_ADMIN: string; + ROLE_STAFF: string; + ROLE_VERIFIED: string; + ROLE_MUTED: string; + ROLE_LEVEL_ONE: string; + EMAIL_SENDER: string; + EMAIL_REPLY_TO: string; + EMAIL_REPORT_ADDRESSES: string; + CHANNEL_ERROR_LOG: string; + CHANNEL_SERVER_LOG: string; + CHANNEL_MEMBER_LOG: string; + CHANNEL_MOD_LOG: string; + CHANNEL_FEEDBACK: string; + CHANNEL_SAGE: string; + CHANNEL_ANNOUNCEMENTS: string; + CHANNEL_ARCHIVE: string; + CHANNEL_ROLE_SELECT: string; + ROLE_DROPDOWNS_COURSE_ROLES: string; + ROLE_DROPDOWNS_ASSIGN_ROLES: string; + MONGO: string; + LEVEL_TIER_ROLES: string; + FIRST_LEVEL: string; + ENV_GITHUB_TOKEN: string; + ENV_GITHUB_PROJECT: string; + PREFIX: string; + MAINTAINERS: string; + SEMESTER_ID: string; + BLACKLIST: string; +} + +function getEnvVar(name: keyof Config): string { + const value = process.env[name]; + if (value === undefined) { + throw new Error(`Environment variable ${name} is not set`); + } + return value; +} + +export const config: Config = { + DB_CONNECTION: getEnvVar('DB_CONNECTION'), + BOT_NAME: getEnvVar('BOT_NAME'), + BOT_TOKEN: getEnvVar('BOT_TOKEN'), + BOT_CLIENT_ID: getEnvVar('BOT_CLIENT_ID'), + DB_USERS: getEnvVar('DB_USERS'), + DB_PVQ: getEnvVar('DB_PVQ'), + DB_QTAGS: getEnvVar('DB_QTAGS'), + DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), + DB_COURSES: getEnvVar('DB_COURSES'), + DB_REMINDERS: getEnvVar('DB_REMINDERS'), + DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), + DB_POLLS: getEnvVar('DB_POLLS'), + GUILD_MAIN: getEnvVar('GUILD_MAIN'), + GUILD_GATEWAY: getEnvVar('GUILD_GATEWAY'), + GUILD_GATEWAY_INVITE: getEnvVar('GUILD_GATEWAY_INVITE'), + ROLE_ADMIN: getEnvVar('ROLE_ADMIN'), + ROLE_STUDENT_ADMIN: getEnvVar('ROLE_STUDENT_ADMIN'), + ROLE_STAFF: getEnvVar('ROLE_STAFF'), + ROLE_VERIFIED: getEnvVar('ROLE_VERIFIED'), + ROLE_MUTED: getEnvVar('ROLE_MUTED'), + ROLE_LEVEL_ONE: getEnvVar('ROLE_LEVEL_ONE'), + EMAIL_SENDER: getEnvVar('EMAIL_SENDER'), + EMAIL_REPLY_TO: getEnvVar('EMAIL_REPLY_TO'), + EMAIL_REPORT_ADDRESSES: getEnvVar('EMAIL_REPORT_ADDRESSES'), + CHANNEL_ERROR_LOG: getEnvVar('CHANNEL_ERROR_LOG'), + CHANNEL_SERVER_LOG: getEnvVar('CHANNEL_SERVER_LOG'), + CHANNEL_MEMBER_LOG: getEnvVar('CHANNEL_MEMBER_LOG'), + CHANNEL_MOD_LOG: getEnvVar('CHANNEL_MOD_LOG'), + CHANNEL_FEEDBACK: getEnvVar('CHANNEL_FEEDBACK'), + CHANNEL_SAGE: getEnvVar('CHANNEL_SAGE'), + CHANNEL_ANNOUNCEMENTS: getEnvVar('CHANNEL_ANNOUNCEMENTS'), + CHANNEL_ARCHIVE: getEnvVar('CHANNEL_ARCHIVE'), + CHANNEL_ROLE_SELECT: getEnvVar('CHANNEL_ROLE_SELECT'), + ROLE_DROPDOWNS_COURSE_ROLES: getEnvVar('ROLE_DROPDOWNS_COURSE_ROLES'), + ROLE_DROPDOWNS_ASSIGN_ROLES: getEnvVar('ROLE_DROPDOWNS_ASSIGN_ROLES'), + MONGO: getEnvVar('MONGO'), + LEVEL_TIER_ROLES: getEnvVar('LEVEL_TIER_ROLES'), + FIRST_LEVEL: getEnvVar('FIRST_LEVEL'), + ENV_GITHUB_TOKEN: getEnvVar('ENV_GITHUB_TOKEN'), + ENV_GITHUB_PROJECT: getEnvVar('ENV_GITHUB_PROJECT'), + PREFIX: getEnvVar('PREFIX'), + MAINTAINERS: getEnvVar('MAINTAINERS'), + SEMESTER_ID: getEnvVar('SEMESTER_ID'), + BLACKLIST: getEnvVar('BLACKLIST') +}; +/* +export const { DB_CONNECTION } = process.env.DB_CONNECTION; +export const { BOT_NAME } = process.env; +export const { BOT_TOKEN } = process.env; +export const { BOT_CLIENT_ID } = process.env; +export const { DB_USERS } = process.env; +export const { DB_PVQ } = process.env; +export const { DB_QTAGS } = process.env; +export const { DB_ASSIGNABLE } = process.env; +export const { DB_COURSES } = process.env; +export const { DB_REMINDERS } = process.env; +export const { DB_CLIENT_DATA } = process.env; +export const { DB_POLLS } = process.env; +export const { GUILD_MAIN } = process.env; +export const { GUILD_GATEWAY } = process.env; +export const { GUILD_GATEWAY_INVITE } = process.env; +export const { ROLE_ADMIN } = process.env; +export const { ROLE_STUDENT_ADMIN } = process.env; +export const { ROLE_STAFF } = process.env; +export const { ROLE_VERIFIED } = process.env; +export const { ROLE_MUTED } = process.env; +export const { ROLE_LEVEL_ONE } = process.env; +export const { EMAIL_SENDER } = process.env; +export const { EMAIL_REPLY_TO } = process.env; +export const { EMAIL_REPORT_ADDRESSES } = process.env; +export const { CHANNEL_ERROR_LOG } = process.env; +export const { CHANNEL_SERVER_LOG } = process.env; +export const { CHANNEL_MEMBER_LOG } = process.env; +export const { CHANNEL_MOD_LOG } = process.env; +export const { CHANNEL_FEEDBACK } = process.env; +export const { CHANNEL_SAGE } = process.env; +export const { CHANNEL_ANNOUNCEMENTS } = process.env; +export const { CHANNEL_ARCHIVE } = process.env; +export const { CHANNEL_ROLE_SELECT } = process.env; +export const { ROLE_DROPDOWNS_COURSE_ROLES } = process.env; +export const { ROLE_DROPDOWNS_ASSIGN_ROLES } = process.env; +*/ + +export const BOT = { + TOKEN: config.BOT_TOKEN, + CLIENT_ID: config.BOT_CLIENT_ID, + NAME: config.BOT_NAME +}; + +export const DB = { + CONNECTION: config.DB_CONNECTION, + USERS: config.DB_USERS, + PVQ: config.DB_PVQ, + QTAGS: config.DB_QTAGS, + ASSIGNABLE: config.DB_ASSIGNABLE, + COURSES: config.DB_COURSES, + REMINDERS: config.DB_REMINDERS, + CLIENT_DATA: config.DB_CLIENT_DATA, + POLLS: config.DB_POLLS +}; + +export const GUILDS = { + MAIN: config.GUILD_MAIN, + GATEWAY: config.GUILD_GATEWAY, + GATEWAY_INVITE: config.GUILD_GATEWAY_INVITE +}; + +export const ROLES = { + ADMIN: config.ROLE_ADMIN, + STUDENT_ADMIN: config.ROLE_STUDENT_ADMIN, + STAFF: config.ROLE_STAFF, + VERIFIED: config.ROLE_VERIFIED, + MUTED: config.ROLE_MUTED, + LEVEL_ONE: config.ROLE_LEVEL_ONE +}; + +export const EMAIL = { + SENDER: config.EMAIL_SENDER, + REPLY_TO: config.EMAIL_REPLY_TO, + REPORT_ADDRESSES: config.EMAIL_REPORT_ADDRESSES +}; + +export const CHANNELS = { + ERROR_LOG: config.CHANNEL_ERROR_LOG, + SERVER_LOG: config.CHANNEL_SERVER_LOG, + MEMBER_LOG: config.CHANNEL_MEMBER_LOG, + MOD_LOG: config.CHANNEL_MOD_LOG, + FEEDBACK: config.CHANNEL_FEEDBACK, + SAGE: config.CHANNEL_SAGE, + ANNOUNCEMENTS: config.CHANNEL_ANNOUNCEMENTS, + ARCHIVE: config.CHANNEL_ARCHIVE, + ROLE_SELECT: config.CHANNEL_ROLE_SELECT +}; + +export const ROLE_DROPDOWNS = { + COURSE_ROLES: config.ROLE_DROPDOWNS_COURSE_ROLES, + ASSIGN_ROLES: config.ROLE_DROPDOWNS_ASSIGN_ROLES +}; + +export const GITHUB_PROJECT = config.ENV_GITHUB_PROJECT; + +// eslint-disable-next-line prefer-destructuring +export const SEMESTER_ID = config.SEMESTER_ID; + +export const FIRST_LEVEL = 10; + +export const LEVEL_TIER_ROLES = [config.LEVEL_TIER_ROLES]; + +// eslint-disable-next-line prefer-destructuring +export const MAINTAINERS = config.MAINTAINERS; + +// eslint-disable-next-line prefer-destructuring +export const PREFIX = config.PREFIX; + +export const BLACKLIST = [config.BLACKLIST]; + +export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; + +// eslint-disable-next-line prefer-destructuring +export const MONGO = config.MONGO; From 77e468e30b54cf09eb2b9574c9f7eebeca1239ef Mon Sep 17 00:00:00 2001 From: westa3 <111154660+westa3@users.noreply.github.com> Date: Sat, 12 Oct 2024 11:23:29 -0400 Subject: [PATCH 048/267] Update config.ts --- config.ts | 1 + 1 file changed, 1 insertion(+) create mode 100644 config.ts diff --git a/config.ts b/config.ts new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/config.ts @@ -0,0 +1 @@ + From 857e4e14b006c3d144f45bd649ec20f97e3ee68c Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Wed, 23 Oct 2024 13:07:49 -0400 Subject: [PATCH 049/267] trying to push so I deleted everything in config --- config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/config.ts b/config.ts index 8b137891..e69de29b 100644 --- a/config.ts +++ b/config.ts @@ -1 +0,0 @@ - From d45887b925d9630bd03340708da9e9c3e2270214 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Wed, 23 Oct 2024 13:18:49 -0400 Subject: [PATCH 050/267] def messing something up --- config.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 config.ts diff --git a/config.ts b/config.ts deleted file mode 100644 index e69de29b..00000000 From c08d54e3e8a56cfbd869e844a66ff607f75e2c57 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Wed, 23 Oct 2024 15:43:11 -0400 Subject: [PATCH 051/267] hopefully I did not mess anything hope --- config.example.ts | 866 +++++++++++++++++++++++----------------------- 1 file changed, 433 insertions(+), 433 deletions(-) diff --git a/config.example.ts b/config.example.ts index c3abcb96..6ede9a95 100644 --- a/config.example.ts +++ b/config.example.ts @@ -1,433 +1,433 @@ -interface Config { - DB_CONNECTION: string; - BOT_NAME: string; - BOT_TOKEN: string; - BOT_CLIENT_ID: string; - DB_USERS: string; - DB_PVQ: string; - DB_QTAGS: string; - DB_ASSIGNABLE: string; - DB_COURSES: string; - DB_REMINDERS: string; - DB_CLIENT_DATA: string; - DB_POLLS: string; - GUILD_MAIN: string; - GUILD_GATEWAY: string; - GUILD_GATEWAY_INVITE: string; - ROLE_ADMIN: string; - ROLE_STUDENT_ADMIN: string; - ROLE_STAFF: string; - ROLE_VERIFIED: string; - ROLE_MUTED: string; - ROLE_LEVEL_ONE: string; - EMAIL_SENDER: string; - EMAIL_REPLY_TO: string; - EMAIL_REPORT_ADDRESSES: string; - CHANNEL_ERROR_LOG: string; - CHANNEL_SERVER_LOG: string; - CHANNEL_MEMBER_LOG: string; - CHANNEL_MOD_LOG: string; - CHANNEL_FEEDBACK: string; - CHANNEL_SAGE: string; - CHANNEL_ANNOUNCEMENTS: string; - CHANNEL_ARCHIVE: string; - CHANNEL_ROLE_SELECT: string; - ROLE_DROPDOWNS_COURSE_ROLES: string; - ROLE_DROPDOWNS_ASSIGN_ROLES: string; - MONGO: string; - LEVEL_TIER_ROLES: string; - FIRST_LEVEL: string; - ENV_GITHUB_TOKEN: string; - ENV_GITHUB_PROJECT: string; - PREFIX: string; - MAINTAINERS: string; - SEMESTER_ID: string; - BLACKLIST: string; -} - -function getEnvVar(name: keyof Config): string { - const value = process.env[name]; - if (value === undefined) { - throw new Error(`Environment variable ${name} is not set`); - } - return value; -} - -export const config: Config = { - DB_CONNECTION: getEnvVar('DB_CONNECTION'), - BOT_NAME: getEnvVar('BOT_NAME'), - BOT_TOKEN: getEnvVar('BOT_TOKEN'), - BOT_CLIENT_ID: getEnvVar('BOT_CLIENT_ID'), - DB_USERS: getEnvVar('DB_USERS'), - DB_PVQ: getEnvVar('DB_PVQ'), - DB_QTAGS: getEnvVar('DB_QTAGS'), - DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), - DB_COURSES: getEnvVar('DB_COURSES'), - DB_REMINDERS: getEnvVar('DB_REMINDERS'), - DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), - DB_POLLS: getEnvVar('DB_POLLS'), - GUILD_MAIN: getEnvVar('GUILD_MAIN'), - GUILD_GATEWAY: getEnvVar('GUILD_GATEWAY'), - GUILD_GATEWAY_INVITE: getEnvVar('GUILD_GATEWAY_INVITE'), - ROLE_ADMIN: getEnvVar('ROLE_ADMIN'), - ROLE_STUDENT_ADMIN: getEnvVar('ROLE_STUDENT_ADMIN'), - ROLE_STAFF: getEnvVar('ROLE_STAFF'), - ROLE_VERIFIED: getEnvVar('ROLE_VERIFIED'), - ROLE_MUTED: getEnvVar('ROLE_MUTED'), - ROLE_LEVEL_ONE: getEnvVar('ROLE_LEVEL_ONE'), - EMAIL_SENDER: getEnvVar('EMAIL_SENDER'), - EMAIL_REPLY_TO: getEnvVar('EMAIL_REPLY_TO'), - EMAIL_REPORT_ADDRESSES: getEnvVar('EMAIL_REPORT_ADDRESSES'), - CHANNEL_ERROR_LOG: getEnvVar('CHANNEL_ERROR_LOG'), - CHANNEL_SERVER_LOG: getEnvVar('CHANNEL_SERVER_LOG'), - CHANNEL_MEMBER_LOG: getEnvVar('CHANNEL_MEMBER_LOG'), - CHANNEL_MOD_LOG: getEnvVar('CHANNEL_MOD_LOG'), - CHANNEL_FEEDBACK: getEnvVar('CHANNEL_FEEDBACK'), - CHANNEL_SAGE: getEnvVar('CHANNEL_SAGE'), - CHANNEL_ANNOUNCEMENTS: getEnvVar('CHANNEL_ANNOUNCEMENTS'), - CHANNEL_ARCHIVE: getEnvVar('CHANNEL_ARCHIVE'), - CHANNEL_ROLE_SELECT: getEnvVar('CHANNEL_ROLE_SELECT'), - ROLE_DROPDOWNS_COURSE_ROLES: getEnvVar('ROLE_DROPDOWNS_COURSE_ROLES'), - ROLE_DROPDOWNS_ASSIGN_ROLES: getEnvVar('ROLE_DROPDOWNS_ASSIGN_ROLES'), - MONGO: getEnvVar('MONGO'), - LEVEL_TIER_ROLES: getEnvVar('LEVEL_TIER_ROLES'), - FIRST_LEVEL: getEnvVar('FIRST_LEVEL'), - ENV_GITHUB_TOKEN: getEnvVar('ENV_GITHUB_TOKEN'), - ENV_GITHUB_PROJECT: getEnvVar('ENV_GITHUB_PROJECT'), - PREFIX: getEnvVar('PREFIX'), - MAINTAINERS: getEnvVar('MAINTAINERS'), - SEMESTER_ID: getEnvVar('SEMESTER_ID'), - BLACKLIST: getEnvVar('BLACKLIST') -}; -/* -export const { DB_CONNECTION } = process.env.DB_CONNECTION; -export const { BOT_NAME } = process.env; -export const { BOT_TOKEN } = process.env; -export const { BOT_CLIENT_ID } = process.env; -export const { DB_USERS } = process.env; -export const { DB_PVQ } = process.env; -export const { DB_QTAGS } = process.env; -export const { DB_ASSIGNABLE } = process.env; -export const { DB_COURSES } = process.env; -export const { DB_REMINDERS } = process.env; -export const { DB_CLIENT_DATA } = process.env; -export const { DB_POLLS } = process.env; -export const { GUILD_MAIN } = process.env; -export const { GUILD_GATEWAY } = process.env; -export const { GUILD_GATEWAY_INVITE } = process.env; -export const { ROLE_ADMIN } = process.env; -export const { ROLE_STUDENT_ADMIN } = process.env; -export const { ROLE_STAFF } = process.env; -export const { ROLE_VERIFIED } = process.env; -export const { ROLE_MUTED } = process.env; -export const { ROLE_LEVEL_ONE } = process.env; -export const { EMAIL_SENDER } = process.env; -export const { EMAIL_REPLY_TO } = process.env; -export const { EMAIL_REPORT_ADDRESSES } = process.env; -export const { CHANNEL_ERROR_LOG } = process.env; -export const { CHANNEL_SERVER_LOG } = process.env; -export const { CHANNEL_MEMBER_LOG } = process.env; -export const { CHANNEL_MOD_LOG } = process.env; -export const { CHANNEL_FEEDBACK } = process.env; -export const { CHANNEL_SAGE } = process.env; -export const { CHANNEL_ANNOUNCEMENTS } = process.env; -export const { CHANNEL_ARCHIVE } = process.env; -export const { CHANNEL_ROLE_SELECT } = process.env; -export const { ROLE_DROPDOWNS_COURSE_ROLES } = process.env; -export const { ROLE_DROPDOWNS_ASSIGN_ROLES } = process.env; -*/ - -export const BOT = { - TOKEN: config.BOT_TOKEN, - CLIENT_ID: config.BOT_CLIENT_ID, - NAME: config.BOT_NAME -}; - -export const DB = { - CONNECTION: config.DB_CONNECTION, - USERS: config.DB_USERS, - PVQ: config.DB_PVQ, - QTAGS: config.DB_QTAGS, - ASSIGNABLE: config.DB_ASSIGNABLE, - COURSES: config.DB_COURSES, - REMINDERS: config.DB_REMINDERS, - CLIENT_DATA: config.DB_CLIENT_DATA, - POLLS: config.DB_POLLS -}; - -export const GUILDS = { - MAIN: config.GUILD_MAIN, - GATEWAY: config.GUILD_GATEWAY, - GATEWAY_INVITE: config.GUILD_GATEWAY_INVITE -}; - -export const ROLES = { - ADMIN: config.ROLE_ADMIN, - STUDENT_ADMIN: config.ROLE_STUDENT_ADMIN, - STAFF: config.ROLE_STAFF, - VERIFIED: config.ROLE_VERIFIED, - MUTED: config.ROLE_MUTED, - LEVEL_ONE: config.ROLE_LEVEL_ONE -}; - -export const EMAIL = { - SENDER: config.EMAIL_SENDER, - REPLY_TO: config.EMAIL_REPLY_TO, - REPORT_ADDRESSES: config.EMAIL_REPORT_ADDRESSES -}; - -export const CHANNELS = { - ERROR_LOG: config.CHANNEL_ERROR_LOG, - SERVER_LOG: config.CHANNEL_SERVER_LOG, - MEMBER_LOG: config.CHANNEL_MEMBER_LOG, - MOD_LOG: config.CHANNEL_MOD_LOG, - FEEDBACK: config.CHANNEL_FEEDBACK, - SAGE: config.CHANNEL_SAGE, - ANNOUNCEMENTS: config.CHANNEL_ANNOUNCEMENTS, - ARCHIVE: config.CHANNEL_ARCHIVE, - ROLE_SELECT: config.CHANNEL_ROLE_SELECT -}; - -export const ROLE_DROPDOWNS = { - COURSE_ROLES: config.ROLE_DROPDOWNS_COURSE_ROLES, - ASSIGN_ROLES: config.ROLE_DROPDOWNS_ASSIGN_ROLES -}; - -export const GITHUB_PROJECT = config.ENV_GITHUB_PROJECT; - -// eslint-disable-next-line prefer-destructuring -export const SEMESTER_ID = config.SEMESTER_ID; - -export const FIRST_LEVEL = 10; - -export const LEVEL_TIER_ROLES = [config.LEVEL_TIER_ROLES]; - -// eslint-disable-next-line prefer-destructuring -export const MAINTAINERS = config.MAINTAINERS; - -// eslint-disable-next-line prefer-destructuring -export const PREFIX = config.PREFIX; - -export const BLACKLIST = [config.BLACKLIST]; - -export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; - -// eslint-disable-next-line prefer-destructuring -export const MONGO = config.MONGO; - -interface Config { - DB_CONNECTION: string; - BOT_NAME: string; - BOT_TOKEN: string; - BOT_CLIENT_ID: string; - DB_USERS: string; - DB_PVQ: string; - DB_QTAGS: string; - DB_ASSIGNABLE: string; - DB_COURSES: string; - DB_REMINDERS: string; - DB_CLIENT_DATA: string; - DB_POLLS: string; - GUILD_MAIN: string; - GUILD_GATEWAY: string; - GUILD_GATEWAY_INVITE: string; - ROLE_ADMIN: string; - ROLE_STUDENT_ADMIN: string; - ROLE_STAFF: string; - ROLE_VERIFIED: string; - ROLE_MUTED: string; - ROLE_LEVEL_ONE: string; - EMAIL_SENDER: string; - EMAIL_REPLY_TO: string; - EMAIL_REPORT_ADDRESSES: string; - CHANNEL_ERROR_LOG: string; - CHANNEL_SERVER_LOG: string; - CHANNEL_MEMBER_LOG: string; - CHANNEL_MOD_LOG: string; - CHANNEL_FEEDBACK: string; - CHANNEL_SAGE: string; - CHANNEL_ANNOUNCEMENTS: string; - CHANNEL_ARCHIVE: string; - CHANNEL_ROLE_SELECT: string; - ROLE_DROPDOWNS_COURSE_ROLES: string; - ROLE_DROPDOWNS_ASSIGN_ROLES: string; - MONGO: string; - LEVEL_TIER_ROLES: string; - FIRST_LEVEL: string; - ENV_GITHUB_TOKEN: string; - ENV_GITHUB_PROJECT: string; - PREFIX: string; - MAINTAINERS: string; - SEMESTER_ID: string; - BLACKLIST: string; -} - -function getEnvVar(name: keyof Config): string { - const value = process.env[name]; - if (value === undefined) { - throw new Error(`Environment variable ${name} is not set`); - } - return value; -} - -export const config: Config = { - DB_CONNECTION: getEnvVar('DB_CONNECTION'), - BOT_NAME: getEnvVar('BOT_NAME'), - BOT_TOKEN: getEnvVar('BOT_TOKEN'), - BOT_CLIENT_ID: getEnvVar('BOT_CLIENT_ID'), - DB_USERS: getEnvVar('DB_USERS'), - DB_PVQ: getEnvVar('DB_PVQ'), - DB_QTAGS: getEnvVar('DB_QTAGS'), - DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), - DB_COURSES: getEnvVar('DB_COURSES'), - DB_REMINDERS: getEnvVar('DB_REMINDERS'), - DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), - DB_POLLS: getEnvVar('DB_POLLS'), - GUILD_MAIN: getEnvVar('GUILD_MAIN'), - GUILD_GATEWAY: getEnvVar('GUILD_GATEWAY'), - GUILD_GATEWAY_INVITE: getEnvVar('GUILD_GATEWAY_INVITE'), - ROLE_ADMIN: getEnvVar('ROLE_ADMIN'), - ROLE_STUDENT_ADMIN: getEnvVar('ROLE_STUDENT_ADMIN'), - ROLE_STAFF: getEnvVar('ROLE_STAFF'), - ROLE_VERIFIED: getEnvVar('ROLE_VERIFIED'), - ROLE_MUTED: getEnvVar('ROLE_MUTED'), - ROLE_LEVEL_ONE: getEnvVar('ROLE_LEVEL_ONE'), - EMAIL_SENDER: getEnvVar('EMAIL_SENDER'), - EMAIL_REPLY_TO: getEnvVar('EMAIL_REPLY_TO'), - EMAIL_REPORT_ADDRESSES: getEnvVar('EMAIL_REPORT_ADDRESSES'), - CHANNEL_ERROR_LOG: getEnvVar('CHANNEL_ERROR_LOG'), - CHANNEL_SERVER_LOG: getEnvVar('CHANNEL_SERVER_LOG'), - CHANNEL_MEMBER_LOG: getEnvVar('CHANNEL_MEMBER_LOG'), - CHANNEL_MOD_LOG: getEnvVar('CHANNEL_MOD_LOG'), - CHANNEL_FEEDBACK: getEnvVar('CHANNEL_FEEDBACK'), - CHANNEL_SAGE: getEnvVar('CHANNEL_SAGE'), - CHANNEL_ANNOUNCEMENTS: getEnvVar('CHANNEL_ANNOUNCEMENTS'), - CHANNEL_ARCHIVE: getEnvVar('CHANNEL_ARCHIVE'), - CHANNEL_ROLE_SELECT: getEnvVar('CHANNEL_ROLE_SELECT'), - ROLE_DROPDOWNS_COURSE_ROLES: getEnvVar('ROLE_DROPDOWNS_COURSE_ROLES'), - ROLE_DROPDOWNS_ASSIGN_ROLES: getEnvVar('ROLE_DROPDOWNS_ASSIGN_ROLES'), - MONGO: getEnvVar('MONGO'), - LEVEL_TIER_ROLES: getEnvVar('LEVEL_TIER_ROLES'), - FIRST_LEVEL: getEnvVar('FIRST_LEVEL'), - ENV_GITHUB_TOKEN: getEnvVar('ENV_GITHUB_TOKEN'), - ENV_GITHUB_PROJECT: getEnvVar('ENV_GITHUB_PROJECT'), - PREFIX: getEnvVar('PREFIX'), - MAINTAINERS: getEnvVar('MAINTAINERS'), - SEMESTER_ID: getEnvVar('SEMESTER_ID'), - BLACKLIST: getEnvVar('BLACKLIST') -}; -/* -export const { DB_CONNECTION } = process.env.DB_CONNECTION; -export const { BOT_NAME } = process.env; -export const { BOT_TOKEN } = process.env; -export const { BOT_CLIENT_ID } = process.env; -export const { DB_USERS } = process.env; -export const { DB_PVQ } = process.env; -export const { DB_QTAGS } = process.env; -export const { DB_ASSIGNABLE } = process.env; -export const { DB_COURSES } = process.env; -export const { DB_REMINDERS } = process.env; -export const { DB_CLIENT_DATA } = process.env; -export const { DB_POLLS } = process.env; -export const { GUILD_MAIN } = process.env; -export const { GUILD_GATEWAY } = process.env; -export const { GUILD_GATEWAY_INVITE } = process.env; -export const { ROLE_ADMIN } = process.env; -export const { ROLE_STUDENT_ADMIN } = process.env; -export const { ROLE_STAFF } = process.env; -export const { ROLE_VERIFIED } = process.env; -export const { ROLE_MUTED } = process.env; -export const { ROLE_LEVEL_ONE } = process.env; -export const { EMAIL_SENDER } = process.env; -export const { EMAIL_REPLY_TO } = process.env; -export const { EMAIL_REPORT_ADDRESSES } = process.env; -export const { CHANNEL_ERROR_LOG } = process.env; -export const { CHANNEL_SERVER_LOG } = process.env; -export const { CHANNEL_MEMBER_LOG } = process.env; -export const { CHANNEL_MOD_LOG } = process.env; -export const { CHANNEL_FEEDBACK } = process.env; -export const { CHANNEL_SAGE } = process.env; -export const { CHANNEL_ANNOUNCEMENTS } = process.env; -export const { CHANNEL_ARCHIVE } = process.env; -export const { CHANNEL_ROLE_SELECT } = process.env; -export const { ROLE_DROPDOWNS_COURSE_ROLES } = process.env; -export const { ROLE_DROPDOWNS_ASSIGN_ROLES } = process.env; -*/ - -export const BOT = { - TOKEN: config.BOT_TOKEN, - CLIENT_ID: config.BOT_CLIENT_ID, - NAME: config.BOT_NAME -}; - -export const DB = { - CONNECTION: config.DB_CONNECTION, - USERS: config.DB_USERS, - PVQ: config.DB_PVQ, - QTAGS: config.DB_QTAGS, - ASSIGNABLE: config.DB_ASSIGNABLE, - COURSES: config.DB_COURSES, - REMINDERS: config.DB_REMINDERS, - CLIENT_DATA: config.DB_CLIENT_DATA, - POLLS: config.DB_POLLS -}; - -export const GUILDS = { - MAIN: config.GUILD_MAIN, - GATEWAY: config.GUILD_GATEWAY, - GATEWAY_INVITE: config.GUILD_GATEWAY_INVITE -}; - -export const ROLES = { - ADMIN: config.ROLE_ADMIN, - STUDENT_ADMIN: config.ROLE_STUDENT_ADMIN, - STAFF: config.ROLE_STAFF, - VERIFIED: config.ROLE_VERIFIED, - MUTED: config.ROLE_MUTED, - LEVEL_ONE: config.ROLE_LEVEL_ONE -}; - -export const EMAIL = { - SENDER: config.EMAIL_SENDER, - REPLY_TO: config.EMAIL_REPLY_TO, - REPORT_ADDRESSES: config.EMAIL_REPORT_ADDRESSES -}; - -export const CHANNELS = { - ERROR_LOG: config.CHANNEL_ERROR_LOG, - SERVER_LOG: config.CHANNEL_SERVER_LOG, - MEMBER_LOG: config.CHANNEL_MEMBER_LOG, - MOD_LOG: config.CHANNEL_MOD_LOG, - FEEDBACK: config.CHANNEL_FEEDBACK, - SAGE: config.CHANNEL_SAGE, - ANNOUNCEMENTS: config.CHANNEL_ANNOUNCEMENTS, - ARCHIVE: config.CHANNEL_ARCHIVE, - ROLE_SELECT: config.CHANNEL_ROLE_SELECT -}; - -export const ROLE_DROPDOWNS = { - COURSE_ROLES: config.ROLE_DROPDOWNS_COURSE_ROLES, - ASSIGN_ROLES: config.ROLE_DROPDOWNS_ASSIGN_ROLES -}; - -export const GITHUB_PROJECT = config.ENV_GITHUB_PROJECT; - -// eslint-disable-next-line prefer-destructuring -export const SEMESTER_ID = config.SEMESTER_ID; - -export const FIRST_LEVEL = 10; - -export const LEVEL_TIER_ROLES = [config.LEVEL_TIER_ROLES]; - -// eslint-disable-next-line prefer-destructuring -export const MAINTAINERS = config.MAINTAINERS; - -// eslint-disable-next-line prefer-destructuring -export const PREFIX = config.PREFIX; - -export const BLACKLIST = [config.BLACKLIST]; - -export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; - -// eslint-disable-next-line prefer-destructuring -export const MONGO = config.MONGO; +// interface Config { +// DB_CONNECTION: string; +// BOT_NAME: string; +// BOT_TOKEN: string; +// BOT_CLIENT_ID: string; +// DB_USERS: string; +// DB_PVQ: string; +// DB_QTAGS: string; +// DB_ASSIGNABLE: string; +// DB_COURSES: string; +// DB_REMINDERS: string; +// DB_CLIENT_DATA: string; +// DB_POLLS: string; +// GUILD_MAIN: string; +// GUILD_GATEWAY: string; +// GUILD_GATEWAY_INVITE: string; +// ROLE_ADMIN: string; +// ROLE_STUDENT_ADMIN: string; +// ROLE_STAFF: string; +// ROLE_VERIFIED: string; +// ROLE_MUTED: string; +// ROLE_LEVEL_ONE: string; +// EMAIL_SENDER: string; +// EMAIL_REPLY_TO: string; +// EMAIL_REPORT_ADDRESSES: string; +// CHANNEL_ERROR_LOG: string; +// CHANNEL_SERVER_LOG: string; +// CHANNEL_MEMBER_LOG: string; +// CHANNEL_MOD_LOG: string; +// CHANNEL_FEEDBACK: string; +// CHANNEL_SAGE: string; +// CHANNEL_ANNOUNCEMENTS: string; +// CHANNEL_ARCHIVE: string; +// CHANNEL_ROLE_SELECT: string; +// ROLE_DROPDOWNS_COURSE_ROLES: string; +// ROLE_DROPDOWNS_ASSIGN_ROLES: string; +// MONGO: string; +// LEVEL_TIER_ROLES: string; +// FIRST_LEVEL: string; +// ENV_GITHUB_TOKEN: string; +// ENV_GITHUB_PROJECT: string; +// PREFIX: string; +// MAINTAINERS: string; +// SEMESTER_ID: string; +// BLACKLIST: string; +// } + +// function getEnvVar(name: keyof Config): string { +// const value = process.env[name]; +// if (value === undefined) { +// throw new Error(`Environment variable ${name} is not set`); +// } +// return value; +// } + +// export const config: Config = { +// DB_CONNECTION: getEnvVar('DB_CONNECTION'), +// BOT_NAME: getEnvVar('BOT_NAME'), +// BOT_TOKEN: getEnvVar('BOT_TOKEN'), +// BOT_CLIENT_ID: getEnvVar('BOT_CLIENT_ID'), +// DB_USERS: getEnvVar('DB_USERS'), +// DB_PVQ: getEnvVar('DB_PVQ'), +// DB_QTAGS: getEnvVar('DB_QTAGS'), +// DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), +// DB_COURSES: getEnvVar('DB_COURSES'), +// DB_REMINDERS: getEnvVar('DB_REMINDERS'), +// DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), +// DB_POLLS: getEnvVar('DB_POLLS'), +// GUILD_MAIN: getEnvVar('GUILD_MAIN'), +// GUILD_GATEWAY: getEnvVar('GUILD_GATEWAY'), +// GUILD_GATEWAY_INVITE: getEnvVar('GUILD_GATEWAY_INVITE'), +// ROLE_ADMIN: getEnvVar('ROLE_ADMIN'), +// ROLE_STUDENT_ADMIN: getEnvVar('ROLE_STUDENT_ADMIN'), +// ROLE_STAFF: getEnvVar('ROLE_STAFF'), +// ROLE_VERIFIED: getEnvVar('ROLE_VERIFIED'), +// ROLE_MUTED: getEnvVar('ROLE_MUTED'), +// ROLE_LEVEL_ONE: getEnvVar('ROLE_LEVEL_ONE'), +// EMAIL_SENDER: getEnvVar('EMAIL_SENDER'), +// EMAIL_REPLY_TO: getEnvVar('EMAIL_REPLY_TO'), +// EMAIL_REPORT_ADDRESSES: getEnvVar('EMAIL_REPORT_ADDRESSES'), +// CHANNEL_ERROR_LOG: getEnvVar('CHANNEL_ERROR_LOG'), +// CHANNEL_SERVER_LOG: getEnvVar('CHANNEL_SERVER_LOG'), +// CHANNEL_MEMBER_LOG: getEnvVar('CHANNEL_MEMBER_LOG'), +// CHANNEL_MOD_LOG: getEnvVar('CHANNEL_MOD_LOG'), +// CHANNEL_FEEDBACK: getEnvVar('CHANNEL_FEEDBACK'), +// CHANNEL_SAGE: getEnvVar('CHANNEL_SAGE'), +// CHANNEL_ANNOUNCEMENTS: getEnvVar('CHANNEL_ANNOUNCEMENTS'), +// CHANNEL_ARCHIVE: getEnvVar('CHANNEL_ARCHIVE'), +// CHANNEL_ROLE_SELECT: getEnvVar('CHANNEL_ROLE_SELECT'), +// ROLE_DROPDOWNS_COURSE_ROLES: getEnvVar('ROLE_DROPDOWNS_COURSE_ROLES'), +// ROLE_DROPDOWNS_ASSIGN_ROLES: getEnvVar('ROLE_DROPDOWNS_ASSIGN_ROLES'), +// MONGO: getEnvVar('MONGO'), +// LEVEL_TIER_ROLES: getEnvVar('LEVEL_TIER_ROLES'), +// FIRST_LEVEL: getEnvVar('FIRST_LEVEL'), +// ENV_GITHUB_TOKEN: getEnvVar('ENV_GITHUB_TOKEN'), +// ENV_GITHUB_PROJECT: getEnvVar('ENV_GITHUB_PROJECT'), +// PREFIX: getEnvVar('PREFIX'), +// MAINTAINERS: getEnvVar('MAINTAINERS'), +// SEMESTER_ID: getEnvVar('SEMESTER_ID'), +// BLACKLIST: getEnvVar('BLACKLIST') +// }; +// /* +// export const { DB_CONNECTION } = process.env.DB_CONNECTION; +// export const { BOT_NAME } = process.env; +// export const { BOT_TOKEN } = process.env; +// export const { BOT_CLIENT_ID } = process.env; +// export const { DB_USERS } = process.env; +// export const { DB_PVQ } = process.env; +// export const { DB_QTAGS } = process.env; +// export const { DB_ASSIGNABLE } = process.env; +// export const { DB_COURSES } = process.env; +// export const { DB_REMINDERS } = process.env; +// export const { DB_CLIENT_DATA } = process.env; +// export const { DB_POLLS } = process.env; +// export const { GUILD_MAIN } = process.env; +// export const { GUILD_GATEWAY } = process.env; +// export const { GUILD_GATEWAY_INVITE } = process.env; +// export const { ROLE_ADMIN } = process.env; +// export const { ROLE_STUDENT_ADMIN } = process.env; +// export const { ROLE_STAFF } = process.env; +// export const { ROLE_VERIFIED } = process.env; +// export const { ROLE_MUTED } = process.env; +// export const { ROLE_LEVEL_ONE } = process.env; +// export const { EMAIL_SENDER } = process.env; +// export const { EMAIL_REPLY_TO } = process.env; +// export const { EMAIL_REPORT_ADDRESSES } = process.env; +// export const { CHANNEL_ERROR_LOG } = process.env; +// export const { CHANNEL_SERVER_LOG } = process.env; +// export const { CHANNEL_MEMBER_LOG } = process.env; +// export const { CHANNEL_MOD_LOG } = process.env; +// export const { CHANNEL_FEEDBACK } = process.env; +// export const { CHANNEL_SAGE } = process.env; +// export const { CHANNEL_ANNOUNCEMENTS } = process.env; +// export const { CHANNEL_ARCHIVE } = process.env; +// export const { CHANNEL_ROLE_SELECT } = process.env; +// export const { ROLE_DROPDOWNS_COURSE_ROLES } = process.env; +// export const { ROLE_DROPDOWNS_ASSIGN_ROLES } = process.env; +// */ + +// export const BOT = { +// TOKEN: config.BOT_TOKEN, +// CLIENT_ID: config.BOT_CLIENT_ID, +// NAME: config.BOT_NAME +// }; + +// export const DB = { +// CONNECTION: config.DB_CONNECTION, +// USERS: config.DB_USERS, +// PVQ: config.DB_PVQ, +// QTAGS: config.DB_QTAGS, +// ASSIGNABLE: config.DB_ASSIGNABLE, +// COURSES: config.DB_COURSES, +// REMINDERS: config.DB_REMINDERS, +// CLIENT_DATA: config.DB_CLIENT_DATA, +// POLLS: config.DB_POLLS +// }; + +// export const GUILDS = { +// MAIN: config.GUILD_MAIN, +// GATEWAY: config.GUILD_GATEWAY, +// GATEWAY_INVITE: config.GUILD_GATEWAY_INVITE +// }; + +// export const ROLES = { +// ADMIN: config.ROLE_ADMIN, +// STUDENT_ADMIN: config.ROLE_STUDENT_ADMIN, +// STAFF: config.ROLE_STAFF, +// VERIFIED: config.ROLE_VERIFIED, +// MUTED: config.ROLE_MUTED, +// LEVEL_ONE: config.ROLE_LEVEL_ONE +// }; + +// export const EMAIL = { +// SENDER: config.EMAIL_SENDER, +// REPLY_TO: config.EMAIL_REPLY_TO, +// REPORT_ADDRESSES: config.EMAIL_REPORT_ADDRESSES +// }; + +// export const CHANNELS = { +// ERROR_LOG: config.CHANNEL_ERROR_LOG, +// SERVER_LOG: config.CHANNEL_SERVER_LOG, +// MEMBER_LOG: config.CHANNEL_MEMBER_LOG, +// MOD_LOG: config.CHANNEL_MOD_LOG, +// FEEDBACK: config.CHANNEL_FEEDBACK, +// SAGE: config.CHANNEL_SAGE, +// ANNOUNCEMENTS: config.CHANNEL_ANNOUNCEMENTS, +// ARCHIVE: config.CHANNEL_ARCHIVE, +// ROLE_SELECT: config.CHANNEL_ROLE_SELECT +// }; + +// export const ROLE_DROPDOWNS = { +// COURSE_ROLES: config.ROLE_DROPDOWNS_COURSE_ROLES, +// ASSIGN_ROLES: config.ROLE_DROPDOWNS_ASSIGN_ROLES +// }; + +// export const GITHUB_PROJECT = config.ENV_GITHUB_PROJECT; + +// // eslint-disable-next-line prefer-destructuring +// export const SEMESTER_ID = config.SEMESTER_ID; + +// export const FIRST_LEVEL = 10; + +// export const LEVEL_TIER_ROLES = [config.LEVEL_TIER_ROLES]; + +// // eslint-disable-next-line prefer-destructuring +// export const MAINTAINERS = config.MAINTAINERS; + +// // eslint-disable-next-line prefer-destructuring +// export const PREFIX = config.PREFIX; + +// export const BLACKLIST = [config.BLACKLIST]; + +// export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; + +// // eslint-disable-next-line prefer-destructuring +// export const MONGO = config.MONGO; + +// interface Config { +// DB_CONNECTION: string; +// BOT_NAME: string; +// BOT_TOKEN: string; +// BOT_CLIENT_ID: string; +// DB_USERS: string; +// DB_PVQ: string; +// DB_QTAGS: string; +// DB_ASSIGNABLE: string; +// DB_COURSES: string; +// DB_REMINDERS: string; +// DB_CLIENT_DATA: string; +// DB_POLLS: string; +// GUILD_MAIN: string; +// GUILD_GATEWAY: string; +// GUILD_GATEWAY_INVITE: string; +// ROLE_ADMIN: string; +// ROLE_STUDENT_ADMIN: string; +// ROLE_STAFF: string; +// ROLE_VERIFIED: string; +// ROLE_MUTED: string; +// ROLE_LEVEL_ONE: string; +// EMAIL_SENDER: string; +// EMAIL_REPLY_TO: string; +// EMAIL_REPORT_ADDRESSES: string; +// CHANNEL_ERROR_LOG: string; +// CHANNEL_SERVER_LOG: string; +// CHANNEL_MEMBER_LOG: string; +// CHANNEL_MOD_LOG: string; +// CHANNEL_FEEDBACK: string; +// CHANNEL_SAGE: string; +// CHANNEL_ANNOUNCEMENTS: string; +// CHANNEL_ARCHIVE: string; +// CHANNEL_ROLE_SELECT: string; +// ROLE_DROPDOWNS_COURSE_ROLES: string; +// ROLE_DROPDOWNS_ASSIGN_ROLES: string; +// MONGO: string; +// LEVEL_TIER_ROLES: string; +// FIRST_LEVEL: string; +// ENV_GITHUB_TOKEN: string; +// ENV_GITHUB_PROJECT: string; +// PREFIX: string; +// MAINTAINERS: string; +// SEMESTER_ID: string; +// BLACKLIST: string; +// } + +// function getEnvVar(name: keyof Config): string { +// const value = process.env[name]; +// if (value === undefined) { +// throw new Error(`Environment variable ${name} is not set`); +// } +// return value; +// } + +// export const config: Config = { +// DB_CONNECTION: getEnvVar('DB_CONNECTION'), +// BOT_NAME: getEnvVar('BOT_NAME'), +// BOT_TOKEN: getEnvVar('BOT_TOKEN'), +// BOT_CLIENT_ID: getEnvVar('BOT_CLIENT_ID'), +// DB_USERS: getEnvVar('DB_USERS'), +// DB_PVQ: getEnvVar('DB_PVQ'), +// DB_QTAGS: getEnvVar('DB_QTAGS'), +// DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), +// DB_COURSES: getEnvVar('DB_COURSES'), +// DB_REMINDERS: getEnvVar('DB_REMINDERS'), +// DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), +// DB_POLLS: getEnvVar('DB_POLLS'), +// GUILD_MAIN: getEnvVar('GUILD_MAIN'), +// GUILD_GATEWAY: getEnvVar('GUILD_GATEWAY'), +// GUILD_GATEWAY_INVITE: getEnvVar('GUILD_GATEWAY_INVITE'), +// ROLE_ADMIN: getEnvVar('ROLE_ADMIN'), +// ROLE_STUDENT_ADMIN: getEnvVar('ROLE_STUDENT_ADMIN'), +// ROLE_STAFF: getEnvVar('ROLE_STAFF'), +// ROLE_VERIFIED: getEnvVar('ROLE_VERIFIED'), +// ROLE_MUTED: getEnvVar('ROLE_MUTED'), +// ROLE_LEVEL_ONE: getEnvVar('ROLE_LEVEL_ONE'), +// EMAIL_SENDER: getEnvVar('EMAIL_SENDER'), +// EMAIL_REPLY_TO: getEnvVar('EMAIL_REPLY_TO'), +// EMAIL_REPORT_ADDRESSES: getEnvVar('EMAIL_REPORT_ADDRESSES'), +// CHANNEL_ERROR_LOG: getEnvVar('CHANNEL_ERROR_LOG'), +// CHANNEL_SERVER_LOG: getEnvVar('CHANNEL_SERVER_LOG'), +// CHANNEL_MEMBER_LOG: getEnvVar('CHANNEL_MEMBER_LOG'), +// CHANNEL_MOD_LOG: getEnvVar('CHANNEL_MOD_LOG'), +// CHANNEL_FEEDBACK: getEnvVar('CHANNEL_FEEDBACK'), +// CHANNEL_SAGE: getEnvVar('CHANNEL_SAGE'), +// CHANNEL_ANNOUNCEMENTS: getEnvVar('CHANNEL_ANNOUNCEMENTS'), +// CHANNEL_ARCHIVE: getEnvVar('CHANNEL_ARCHIVE'), +// CHANNEL_ROLE_SELECT: getEnvVar('CHANNEL_ROLE_SELECT'), +// ROLE_DROPDOWNS_COURSE_ROLES: getEnvVar('ROLE_DROPDOWNS_COURSE_ROLES'), +// ROLE_DROPDOWNS_ASSIGN_ROLES: getEnvVar('ROLE_DROPDOWNS_ASSIGN_ROLES'), +// MONGO: getEnvVar('MONGO'), +// LEVEL_TIER_ROLES: getEnvVar('LEVEL_TIER_ROLES'), +// FIRST_LEVEL: getEnvVar('FIRST_LEVEL'), +// ENV_GITHUB_TOKEN: getEnvVar('ENV_GITHUB_TOKEN'), +// ENV_GITHUB_PROJECT: getEnvVar('ENV_GITHUB_PROJECT'), +// PREFIX: getEnvVar('PREFIX'), +// MAINTAINERS: getEnvVar('MAINTAINERS'), +// SEMESTER_ID: getEnvVar('SEMESTER_ID'), +// BLACKLIST: getEnvVar('BLACKLIST') +// }; +// /* +// export const { DB_CONNECTION } = process.env.DB_CONNECTION; +// export const { BOT_NAME } = process.env; +// export const { BOT_TOKEN } = process.env; +// export const { BOT_CLIENT_ID } = process.env; +// export const { DB_USERS } = process.env; +// export const { DB_PVQ } = process.env; +// export const { DB_QTAGS } = process.env; +// export const { DB_ASSIGNABLE } = process.env; +// export const { DB_COURSES } = process.env; +// export const { DB_REMINDERS } = process.env; +// export const { DB_CLIENT_DATA } = process.env; +// export const { DB_POLLS } = process.env; +// export const { GUILD_MAIN } = process.env; +// export const { GUILD_GATEWAY } = process.env; +// export const { GUILD_GATEWAY_INVITE } = process.env; +// export const { ROLE_ADMIN } = process.env; +// export const { ROLE_STUDENT_ADMIN } = process.env; +// export const { ROLE_STAFF } = process.env; +// export const { ROLE_VERIFIED } = process.env; +// export const { ROLE_MUTED } = process.env; +// export const { ROLE_LEVEL_ONE } = process.env; +// export const { EMAIL_SENDER } = process.env; +// export const { EMAIL_REPLY_TO } = process.env; +// export const { EMAIL_REPORT_ADDRESSES } = process.env; +// export const { CHANNEL_ERROR_LOG } = process.env; +// export const { CHANNEL_SERVER_LOG } = process.env; +// export const { CHANNEL_MEMBER_LOG } = process.env; +// export const { CHANNEL_MOD_LOG } = process.env; +// export const { CHANNEL_FEEDBACK } = process.env; +// export const { CHANNEL_SAGE } = process.env; +// export const { CHANNEL_ANNOUNCEMENTS } = process.env; +// export const { CHANNEL_ARCHIVE } = process.env; +// export const { CHANNEL_ROLE_SELECT } = process.env; +// export const { ROLE_DROPDOWNS_COURSE_ROLES } = process.env; +// export const { ROLE_DROPDOWNS_ASSIGN_ROLES } = process.env; +// */ + +// export const BOT = { +// TOKEN: config.BOT_TOKEN, +// CLIENT_ID: config.BOT_CLIENT_ID, +// NAME: config.BOT_NAME +// }; + +// export const DB = { +// CONNECTION: config.DB_CONNECTION, +// USERS: config.DB_USERS, +// PVQ: config.DB_PVQ, +// QTAGS: config.DB_QTAGS, +// ASSIGNABLE: config.DB_ASSIGNABLE, +// COURSES: config.DB_COURSES, +// REMINDERS: config.DB_REMINDERS, +// CLIENT_DATA: config.DB_CLIENT_DATA, +// POLLS: config.DB_POLLS +// }; + +// export const GUILDS = { +// MAIN: config.GUILD_MAIN, +// GATEWAY: config.GUILD_GATEWAY, +// GATEWAY_INVITE: config.GUILD_GATEWAY_INVITE +// }; + +// export const ROLES = { +// ADMIN: config.ROLE_ADMIN, +// STUDENT_ADMIN: config.ROLE_STUDENT_ADMIN, +// STAFF: config.ROLE_STAFF, +// VERIFIED: config.ROLE_VERIFIED, +// MUTED: config.ROLE_MUTED, +// LEVEL_ONE: config.ROLE_LEVEL_ONE +// }; + +// export const EMAIL = { +// SENDER: config.EMAIL_SENDER, +// REPLY_TO: config.EMAIL_REPLY_TO, +// REPORT_ADDRESSES: config.EMAIL_REPORT_ADDRESSES +// }; + +// export const CHANNELS = { +// ERROR_LOG: config.CHANNEL_ERROR_LOG, +// SERVER_LOG: config.CHANNEL_SERVER_LOG, +// MEMBER_LOG: config.CHANNEL_MEMBER_LOG, +// MOD_LOG: config.CHANNEL_MOD_LOG, +// FEEDBACK: config.CHANNEL_FEEDBACK, +// SAGE: config.CHANNEL_SAGE, +// ANNOUNCEMENTS: config.CHANNEL_ANNOUNCEMENTS, +// ARCHIVE: config.CHANNEL_ARCHIVE, +// ROLE_SELECT: config.CHANNEL_ROLE_SELECT +// }; + +// export const ROLE_DROPDOWNS = { +// COURSE_ROLES: config.ROLE_DROPDOWNS_COURSE_ROLES, +// ASSIGN_ROLES: config.ROLE_DROPDOWNS_ASSIGN_ROLES +// }; + +// export const GITHUB_PROJECT = config.ENV_GITHUB_PROJECT; + +// // eslint-disable-next-line prefer-destructuring +// export const SEMESTER_ID = config.SEMESTER_ID; + +// export const FIRST_LEVEL = 10; + +// export const LEVEL_TIER_ROLES = [config.LEVEL_TIER_ROLES]; + +// // eslint-disable-next-line prefer-destructuring +// export const MAINTAINERS = config.MAINTAINERS; + +// // eslint-disable-next-line prefer-destructuring +// export const PREFIX = config.PREFIX; + +// export const BLACKLIST = [config.BLACKLIST]; + +// export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; + +// // eslint-disable-next-line prefer-destructuring +// export const MONGO = config.MONGO; From 49b224e4d5c0f32acb4e3ac84e7f20613546fe09 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Thu, 24 Oct 2024 14:32:50 -0400 Subject: [PATCH 052/267] Trying to fix git push --- config.example.ts | 649 +++++++++++++++------------------------------- 1 file changed, 216 insertions(+), 433 deletions(-) diff --git a/config.example.ts b/config.example.ts index 6ede9a95..5eb2e8d7 100644 --- a/config.example.ts +++ b/config.example.ts @@ -1,433 +1,216 @@ -// interface Config { -// DB_CONNECTION: string; -// BOT_NAME: string; -// BOT_TOKEN: string; -// BOT_CLIENT_ID: string; -// DB_USERS: string; -// DB_PVQ: string; -// DB_QTAGS: string; -// DB_ASSIGNABLE: string; -// DB_COURSES: string; -// DB_REMINDERS: string; -// DB_CLIENT_DATA: string; -// DB_POLLS: string; -// GUILD_MAIN: string; -// GUILD_GATEWAY: string; -// GUILD_GATEWAY_INVITE: string; -// ROLE_ADMIN: string; -// ROLE_STUDENT_ADMIN: string; -// ROLE_STAFF: string; -// ROLE_VERIFIED: string; -// ROLE_MUTED: string; -// ROLE_LEVEL_ONE: string; -// EMAIL_SENDER: string; -// EMAIL_REPLY_TO: string; -// EMAIL_REPORT_ADDRESSES: string; -// CHANNEL_ERROR_LOG: string; -// CHANNEL_SERVER_LOG: string; -// CHANNEL_MEMBER_LOG: string; -// CHANNEL_MOD_LOG: string; -// CHANNEL_FEEDBACK: string; -// CHANNEL_SAGE: string; -// CHANNEL_ANNOUNCEMENTS: string; -// CHANNEL_ARCHIVE: string; -// CHANNEL_ROLE_SELECT: string; -// ROLE_DROPDOWNS_COURSE_ROLES: string; -// ROLE_DROPDOWNS_ASSIGN_ROLES: string; -// MONGO: string; -// LEVEL_TIER_ROLES: string; -// FIRST_LEVEL: string; -// ENV_GITHUB_TOKEN: string; -// ENV_GITHUB_PROJECT: string; -// PREFIX: string; -// MAINTAINERS: string; -// SEMESTER_ID: string; -// BLACKLIST: string; -// } - -// function getEnvVar(name: keyof Config): string { -// const value = process.env[name]; -// if (value === undefined) { -// throw new Error(`Environment variable ${name} is not set`); -// } -// return value; -// } - -// export const config: Config = { -// DB_CONNECTION: getEnvVar('DB_CONNECTION'), -// BOT_NAME: getEnvVar('BOT_NAME'), -// BOT_TOKEN: getEnvVar('BOT_TOKEN'), -// BOT_CLIENT_ID: getEnvVar('BOT_CLIENT_ID'), -// DB_USERS: getEnvVar('DB_USERS'), -// DB_PVQ: getEnvVar('DB_PVQ'), -// DB_QTAGS: getEnvVar('DB_QTAGS'), -// DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), -// DB_COURSES: getEnvVar('DB_COURSES'), -// DB_REMINDERS: getEnvVar('DB_REMINDERS'), -// DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), -// DB_POLLS: getEnvVar('DB_POLLS'), -// GUILD_MAIN: getEnvVar('GUILD_MAIN'), -// GUILD_GATEWAY: getEnvVar('GUILD_GATEWAY'), -// GUILD_GATEWAY_INVITE: getEnvVar('GUILD_GATEWAY_INVITE'), -// ROLE_ADMIN: getEnvVar('ROLE_ADMIN'), -// ROLE_STUDENT_ADMIN: getEnvVar('ROLE_STUDENT_ADMIN'), -// ROLE_STAFF: getEnvVar('ROLE_STAFF'), -// ROLE_VERIFIED: getEnvVar('ROLE_VERIFIED'), -// ROLE_MUTED: getEnvVar('ROLE_MUTED'), -// ROLE_LEVEL_ONE: getEnvVar('ROLE_LEVEL_ONE'), -// EMAIL_SENDER: getEnvVar('EMAIL_SENDER'), -// EMAIL_REPLY_TO: getEnvVar('EMAIL_REPLY_TO'), -// EMAIL_REPORT_ADDRESSES: getEnvVar('EMAIL_REPORT_ADDRESSES'), -// CHANNEL_ERROR_LOG: getEnvVar('CHANNEL_ERROR_LOG'), -// CHANNEL_SERVER_LOG: getEnvVar('CHANNEL_SERVER_LOG'), -// CHANNEL_MEMBER_LOG: getEnvVar('CHANNEL_MEMBER_LOG'), -// CHANNEL_MOD_LOG: getEnvVar('CHANNEL_MOD_LOG'), -// CHANNEL_FEEDBACK: getEnvVar('CHANNEL_FEEDBACK'), -// CHANNEL_SAGE: getEnvVar('CHANNEL_SAGE'), -// CHANNEL_ANNOUNCEMENTS: getEnvVar('CHANNEL_ANNOUNCEMENTS'), -// CHANNEL_ARCHIVE: getEnvVar('CHANNEL_ARCHIVE'), -// CHANNEL_ROLE_SELECT: getEnvVar('CHANNEL_ROLE_SELECT'), -// ROLE_DROPDOWNS_COURSE_ROLES: getEnvVar('ROLE_DROPDOWNS_COURSE_ROLES'), -// ROLE_DROPDOWNS_ASSIGN_ROLES: getEnvVar('ROLE_DROPDOWNS_ASSIGN_ROLES'), -// MONGO: getEnvVar('MONGO'), -// LEVEL_TIER_ROLES: getEnvVar('LEVEL_TIER_ROLES'), -// FIRST_LEVEL: getEnvVar('FIRST_LEVEL'), -// ENV_GITHUB_TOKEN: getEnvVar('ENV_GITHUB_TOKEN'), -// ENV_GITHUB_PROJECT: getEnvVar('ENV_GITHUB_PROJECT'), -// PREFIX: getEnvVar('PREFIX'), -// MAINTAINERS: getEnvVar('MAINTAINERS'), -// SEMESTER_ID: getEnvVar('SEMESTER_ID'), -// BLACKLIST: getEnvVar('BLACKLIST') -// }; -// /* -// export const { DB_CONNECTION } = process.env.DB_CONNECTION; -// export const { BOT_NAME } = process.env; -// export const { BOT_TOKEN } = process.env; -// export const { BOT_CLIENT_ID } = process.env; -// export const { DB_USERS } = process.env; -// export const { DB_PVQ } = process.env; -// export const { DB_QTAGS } = process.env; -// export const { DB_ASSIGNABLE } = process.env; -// export const { DB_COURSES } = process.env; -// export const { DB_REMINDERS } = process.env; -// export const { DB_CLIENT_DATA } = process.env; -// export const { DB_POLLS } = process.env; -// export const { GUILD_MAIN } = process.env; -// export const { GUILD_GATEWAY } = process.env; -// export const { GUILD_GATEWAY_INVITE } = process.env; -// export const { ROLE_ADMIN } = process.env; -// export const { ROLE_STUDENT_ADMIN } = process.env; -// export const { ROLE_STAFF } = process.env; -// export const { ROLE_VERIFIED } = process.env; -// export const { ROLE_MUTED } = process.env; -// export const { ROLE_LEVEL_ONE } = process.env; -// export const { EMAIL_SENDER } = process.env; -// export const { EMAIL_REPLY_TO } = process.env; -// export const { EMAIL_REPORT_ADDRESSES } = process.env; -// export const { CHANNEL_ERROR_LOG } = process.env; -// export const { CHANNEL_SERVER_LOG } = process.env; -// export const { CHANNEL_MEMBER_LOG } = process.env; -// export const { CHANNEL_MOD_LOG } = process.env; -// export const { CHANNEL_FEEDBACK } = process.env; -// export const { CHANNEL_SAGE } = process.env; -// export const { CHANNEL_ANNOUNCEMENTS } = process.env; -// export const { CHANNEL_ARCHIVE } = process.env; -// export const { CHANNEL_ROLE_SELECT } = process.env; -// export const { ROLE_DROPDOWNS_COURSE_ROLES } = process.env; -// export const { ROLE_DROPDOWNS_ASSIGN_ROLES } = process.env; -// */ - -// export const BOT = { -// TOKEN: config.BOT_TOKEN, -// CLIENT_ID: config.BOT_CLIENT_ID, -// NAME: config.BOT_NAME -// }; - -// export const DB = { -// CONNECTION: config.DB_CONNECTION, -// USERS: config.DB_USERS, -// PVQ: config.DB_PVQ, -// QTAGS: config.DB_QTAGS, -// ASSIGNABLE: config.DB_ASSIGNABLE, -// COURSES: config.DB_COURSES, -// REMINDERS: config.DB_REMINDERS, -// CLIENT_DATA: config.DB_CLIENT_DATA, -// POLLS: config.DB_POLLS -// }; - -// export const GUILDS = { -// MAIN: config.GUILD_MAIN, -// GATEWAY: config.GUILD_GATEWAY, -// GATEWAY_INVITE: config.GUILD_GATEWAY_INVITE -// }; - -// export const ROLES = { -// ADMIN: config.ROLE_ADMIN, -// STUDENT_ADMIN: config.ROLE_STUDENT_ADMIN, -// STAFF: config.ROLE_STAFF, -// VERIFIED: config.ROLE_VERIFIED, -// MUTED: config.ROLE_MUTED, -// LEVEL_ONE: config.ROLE_LEVEL_ONE -// }; - -// export const EMAIL = { -// SENDER: config.EMAIL_SENDER, -// REPLY_TO: config.EMAIL_REPLY_TO, -// REPORT_ADDRESSES: config.EMAIL_REPORT_ADDRESSES -// }; - -// export const CHANNELS = { -// ERROR_LOG: config.CHANNEL_ERROR_LOG, -// SERVER_LOG: config.CHANNEL_SERVER_LOG, -// MEMBER_LOG: config.CHANNEL_MEMBER_LOG, -// MOD_LOG: config.CHANNEL_MOD_LOG, -// FEEDBACK: config.CHANNEL_FEEDBACK, -// SAGE: config.CHANNEL_SAGE, -// ANNOUNCEMENTS: config.CHANNEL_ANNOUNCEMENTS, -// ARCHIVE: config.CHANNEL_ARCHIVE, -// ROLE_SELECT: config.CHANNEL_ROLE_SELECT -// }; - -// export const ROLE_DROPDOWNS = { -// COURSE_ROLES: config.ROLE_DROPDOWNS_COURSE_ROLES, -// ASSIGN_ROLES: config.ROLE_DROPDOWNS_ASSIGN_ROLES -// }; - -// export const GITHUB_PROJECT = config.ENV_GITHUB_PROJECT; - -// // eslint-disable-next-line prefer-destructuring -// export const SEMESTER_ID = config.SEMESTER_ID; - -// export const FIRST_LEVEL = 10; - -// export const LEVEL_TIER_ROLES = [config.LEVEL_TIER_ROLES]; - -// // eslint-disable-next-line prefer-destructuring -// export const MAINTAINERS = config.MAINTAINERS; - -// // eslint-disable-next-line prefer-destructuring -// export const PREFIX = config.PREFIX; - -// export const BLACKLIST = [config.BLACKLIST]; - -// export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; - -// // eslint-disable-next-line prefer-destructuring -// export const MONGO = config.MONGO; - -// interface Config { -// DB_CONNECTION: string; -// BOT_NAME: string; -// BOT_TOKEN: string; -// BOT_CLIENT_ID: string; -// DB_USERS: string; -// DB_PVQ: string; -// DB_QTAGS: string; -// DB_ASSIGNABLE: string; -// DB_COURSES: string; -// DB_REMINDERS: string; -// DB_CLIENT_DATA: string; -// DB_POLLS: string; -// GUILD_MAIN: string; -// GUILD_GATEWAY: string; -// GUILD_GATEWAY_INVITE: string; -// ROLE_ADMIN: string; -// ROLE_STUDENT_ADMIN: string; -// ROLE_STAFF: string; -// ROLE_VERIFIED: string; -// ROLE_MUTED: string; -// ROLE_LEVEL_ONE: string; -// EMAIL_SENDER: string; -// EMAIL_REPLY_TO: string; -// EMAIL_REPORT_ADDRESSES: string; -// CHANNEL_ERROR_LOG: string; -// CHANNEL_SERVER_LOG: string; -// CHANNEL_MEMBER_LOG: string; -// CHANNEL_MOD_LOG: string; -// CHANNEL_FEEDBACK: string; -// CHANNEL_SAGE: string; -// CHANNEL_ANNOUNCEMENTS: string; -// CHANNEL_ARCHIVE: string; -// CHANNEL_ROLE_SELECT: string; -// ROLE_DROPDOWNS_COURSE_ROLES: string; -// ROLE_DROPDOWNS_ASSIGN_ROLES: string; -// MONGO: string; -// LEVEL_TIER_ROLES: string; -// FIRST_LEVEL: string; -// ENV_GITHUB_TOKEN: string; -// ENV_GITHUB_PROJECT: string; -// PREFIX: string; -// MAINTAINERS: string; -// SEMESTER_ID: string; -// BLACKLIST: string; -// } - -// function getEnvVar(name: keyof Config): string { -// const value = process.env[name]; -// if (value === undefined) { -// throw new Error(`Environment variable ${name} is not set`); -// } -// return value; -// } - -// export const config: Config = { -// DB_CONNECTION: getEnvVar('DB_CONNECTION'), -// BOT_NAME: getEnvVar('BOT_NAME'), -// BOT_TOKEN: getEnvVar('BOT_TOKEN'), -// BOT_CLIENT_ID: getEnvVar('BOT_CLIENT_ID'), -// DB_USERS: getEnvVar('DB_USERS'), -// DB_PVQ: getEnvVar('DB_PVQ'), -// DB_QTAGS: getEnvVar('DB_QTAGS'), -// DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), -// DB_COURSES: getEnvVar('DB_COURSES'), -// DB_REMINDERS: getEnvVar('DB_REMINDERS'), -// DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), -// DB_POLLS: getEnvVar('DB_POLLS'), -// GUILD_MAIN: getEnvVar('GUILD_MAIN'), -// GUILD_GATEWAY: getEnvVar('GUILD_GATEWAY'), -// GUILD_GATEWAY_INVITE: getEnvVar('GUILD_GATEWAY_INVITE'), -// ROLE_ADMIN: getEnvVar('ROLE_ADMIN'), -// ROLE_STUDENT_ADMIN: getEnvVar('ROLE_STUDENT_ADMIN'), -// ROLE_STAFF: getEnvVar('ROLE_STAFF'), -// ROLE_VERIFIED: getEnvVar('ROLE_VERIFIED'), -// ROLE_MUTED: getEnvVar('ROLE_MUTED'), -// ROLE_LEVEL_ONE: getEnvVar('ROLE_LEVEL_ONE'), -// EMAIL_SENDER: getEnvVar('EMAIL_SENDER'), -// EMAIL_REPLY_TO: getEnvVar('EMAIL_REPLY_TO'), -// EMAIL_REPORT_ADDRESSES: getEnvVar('EMAIL_REPORT_ADDRESSES'), -// CHANNEL_ERROR_LOG: getEnvVar('CHANNEL_ERROR_LOG'), -// CHANNEL_SERVER_LOG: getEnvVar('CHANNEL_SERVER_LOG'), -// CHANNEL_MEMBER_LOG: getEnvVar('CHANNEL_MEMBER_LOG'), -// CHANNEL_MOD_LOG: getEnvVar('CHANNEL_MOD_LOG'), -// CHANNEL_FEEDBACK: getEnvVar('CHANNEL_FEEDBACK'), -// CHANNEL_SAGE: getEnvVar('CHANNEL_SAGE'), -// CHANNEL_ANNOUNCEMENTS: getEnvVar('CHANNEL_ANNOUNCEMENTS'), -// CHANNEL_ARCHIVE: getEnvVar('CHANNEL_ARCHIVE'), -// CHANNEL_ROLE_SELECT: getEnvVar('CHANNEL_ROLE_SELECT'), -// ROLE_DROPDOWNS_COURSE_ROLES: getEnvVar('ROLE_DROPDOWNS_COURSE_ROLES'), -// ROLE_DROPDOWNS_ASSIGN_ROLES: getEnvVar('ROLE_DROPDOWNS_ASSIGN_ROLES'), -// MONGO: getEnvVar('MONGO'), -// LEVEL_TIER_ROLES: getEnvVar('LEVEL_TIER_ROLES'), -// FIRST_LEVEL: getEnvVar('FIRST_LEVEL'), -// ENV_GITHUB_TOKEN: getEnvVar('ENV_GITHUB_TOKEN'), -// ENV_GITHUB_PROJECT: getEnvVar('ENV_GITHUB_PROJECT'), -// PREFIX: getEnvVar('PREFIX'), -// MAINTAINERS: getEnvVar('MAINTAINERS'), -// SEMESTER_ID: getEnvVar('SEMESTER_ID'), -// BLACKLIST: getEnvVar('BLACKLIST') -// }; -// /* -// export const { DB_CONNECTION } = process.env.DB_CONNECTION; -// export const { BOT_NAME } = process.env; -// export const { BOT_TOKEN } = process.env; -// export const { BOT_CLIENT_ID } = process.env; -// export const { DB_USERS } = process.env; -// export const { DB_PVQ } = process.env; -// export const { DB_QTAGS } = process.env; -// export const { DB_ASSIGNABLE } = process.env; -// export const { DB_COURSES } = process.env; -// export const { DB_REMINDERS } = process.env; -// export const { DB_CLIENT_DATA } = process.env; -// export const { DB_POLLS } = process.env; -// export const { GUILD_MAIN } = process.env; -// export const { GUILD_GATEWAY } = process.env; -// export const { GUILD_GATEWAY_INVITE } = process.env; -// export const { ROLE_ADMIN } = process.env; -// export const { ROLE_STUDENT_ADMIN } = process.env; -// export const { ROLE_STAFF } = process.env; -// export const { ROLE_VERIFIED } = process.env; -// export const { ROLE_MUTED } = process.env; -// export const { ROLE_LEVEL_ONE } = process.env; -// export const { EMAIL_SENDER } = process.env; -// export const { EMAIL_REPLY_TO } = process.env; -// export const { EMAIL_REPORT_ADDRESSES } = process.env; -// export const { CHANNEL_ERROR_LOG } = process.env; -// export const { CHANNEL_SERVER_LOG } = process.env; -// export const { CHANNEL_MEMBER_LOG } = process.env; -// export const { CHANNEL_MOD_LOG } = process.env; -// export const { CHANNEL_FEEDBACK } = process.env; -// export const { CHANNEL_SAGE } = process.env; -// export const { CHANNEL_ANNOUNCEMENTS } = process.env; -// export const { CHANNEL_ARCHIVE } = process.env; -// export const { CHANNEL_ROLE_SELECT } = process.env; -// export const { ROLE_DROPDOWNS_COURSE_ROLES } = process.env; -// export const { ROLE_DROPDOWNS_ASSIGN_ROLES } = process.env; -// */ - -// export const BOT = { -// TOKEN: config.BOT_TOKEN, -// CLIENT_ID: config.BOT_CLIENT_ID, -// NAME: config.BOT_NAME -// }; - -// export const DB = { -// CONNECTION: config.DB_CONNECTION, -// USERS: config.DB_USERS, -// PVQ: config.DB_PVQ, -// QTAGS: config.DB_QTAGS, -// ASSIGNABLE: config.DB_ASSIGNABLE, -// COURSES: config.DB_COURSES, -// REMINDERS: config.DB_REMINDERS, -// CLIENT_DATA: config.DB_CLIENT_DATA, -// POLLS: config.DB_POLLS -// }; - -// export const GUILDS = { -// MAIN: config.GUILD_MAIN, -// GATEWAY: config.GUILD_GATEWAY, -// GATEWAY_INVITE: config.GUILD_GATEWAY_INVITE -// }; - -// export const ROLES = { -// ADMIN: config.ROLE_ADMIN, -// STUDENT_ADMIN: config.ROLE_STUDENT_ADMIN, -// STAFF: config.ROLE_STAFF, -// VERIFIED: config.ROLE_VERIFIED, -// MUTED: config.ROLE_MUTED, -// LEVEL_ONE: config.ROLE_LEVEL_ONE -// }; - -// export const EMAIL = { -// SENDER: config.EMAIL_SENDER, -// REPLY_TO: config.EMAIL_REPLY_TO, -// REPORT_ADDRESSES: config.EMAIL_REPORT_ADDRESSES -// }; - -// export const CHANNELS = { -// ERROR_LOG: config.CHANNEL_ERROR_LOG, -// SERVER_LOG: config.CHANNEL_SERVER_LOG, -// MEMBER_LOG: config.CHANNEL_MEMBER_LOG, -// MOD_LOG: config.CHANNEL_MOD_LOG, -// FEEDBACK: config.CHANNEL_FEEDBACK, -// SAGE: config.CHANNEL_SAGE, -// ANNOUNCEMENTS: config.CHANNEL_ANNOUNCEMENTS, -// ARCHIVE: config.CHANNEL_ARCHIVE, -// ROLE_SELECT: config.CHANNEL_ROLE_SELECT -// }; - -// export const ROLE_DROPDOWNS = { -// COURSE_ROLES: config.ROLE_DROPDOWNS_COURSE_ROLES, -// ASSIGN_ROLES: config.ROLE_DROPDOWNS_ASSIGN_ROLES -// }; - -// export const GITHUB_PROJECT = config.ENV_GITHUB_PROJECT; - -// // eslint-disable-next-line prefer-destructuring -// export const SEMESTER_ID = config.SEMESTER_ID; - -// export const FIRST_LEVEL = 10; - -// export const LEVEL_TIER_ROLES = [config.LEVEL_TIER_ROLES]; - -// // eslint-disable-next-line prefer-destructuring -// export const MAINTAINERS = config.MAINTAINERS; - -// // eslint-disable-next-line prefer-destructuring -// export const PREFIX = config.PREFIX; - -// export const BLACKLIST = [config.BLACKLIST]; - -// export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; - -// // eslint-disable-next-line prefer-destructuring -// export const MONGO = config.MONGO; +interface Config { + DB_CONNECTION: string; + BOT_NAME: string; + BOT_TOKEN: string; + BOT_CLIENT_ID: string; + DB_USERS: string; + DB_PVQ: string; + DB_QTAGS: string; + DB_ASSIGNABLE: string; + DB_COURSES: string; + DB_REMINDERS: string; + DB_CLIENT_DATA: string; + DB_POLLS: string; + GUILD_MAIN: string; + GUILD_GATEWAY: string; + GUILD_GATEWAY_INVITE: string; + ROLE_ADMIN: string; + ROLE_STUDENT_ADMIN: string; + ROLE_STAFF: string; + ROLE_VERIFIED: string; + ROLE_MUTED: string; + ROLE_LEVEL_ONE: string; + EMAIL_SENDER: string; + EMAIL_REPLY_TO: string; + EMAIL_REPORT_ADDRESSES: string; + CHANNEL_ERROR_LOG: string; + CHANNEL_SERVER_LOG: string; + CHANNEL_MEMBER_LOG: string; + CHANNEL_MOD_LOG: string; + CHANNEL_FEEDBACK: string; + CHANNEL_SAGE: string; + CHANNEL_ANNOUNCEMENTS: string; + CHANNEL_ARCHIVE: string; + CHANNEL_ROLE_SELECT: string; + ROLE_DROPDOWNS_COURSE_ROLES: string; + ROLE_DROPDOWNS_ASSIGN_ROLES: string; + MONGO: string; + LEVEL_TIER_ROLES: string; + FIRST_LEVEL: string; + ENV_GITHUB_TOKEN: string; + ENV_GITHUB_PROJECT: string; + PREFIX: string; + MAINTAINERS: string; + SEMESTER_ID: string; + BLACKLIST: string; +} + +function getEnvVar(name: keyof Config): string { + const value = process.env[name]; + if (value === undefined) { + throw new Error(`Environment variable ${name} is not set`); + } + return value; +} + +export const config: Config = { + DB_CONNECTION: getEnvVar('DB_CONNECTION'), + BOT_NAME: getEnvVar('BOT_NAME'), + BOT_TOKEN: getEnvVar('BOT_TOKEN'), + BOT_CLIENT_ID: getEnvVar('BOT_CLIENT_ID'), + DB_USERS: getEnvVar('DB_USERS'), + DB_PVQ: getEnvVar('DB_PVQ'), + DB_QTAGS: getEnvVar('DB_QTAGS'), + DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), + DB_COURSES: getEnvVar('DB_COURSES'), + DB_REMINDERS: getEnvVar('DB_REMINDERS'), + DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), + DB_POLLS: getEnvVar('DB_POLLS'), + GUILD_MAIN: getEnvVar('GUILD_MAIN'), + GUILD_GATEWAY: getEnvVar('GUILD_GATEWAY'), + GUILD_GATEWAY_INVITE: getEnvVar('GUILD_GATEWAY_INVITE'), + ROLE_ADMIN: getEnvVar('ROLE_ADMIN'), + ROLE_STUDENT_ADMIN: getEnvVar('ROLE_STUDENT_ADMIN'), + ROLE_STAFF: getEnvVar('ROLE_STAFF'), + ROLE_VERIFIED: getEnvVar('ROLE_VERIFIED'), + ROLE_MUTED: getEnvVar('ROLE_MUTED'), + ROLE_LEVEL_ONE: getEnvVar('ROLE_LEVEL_ONE'), + EMAIL_SENDER: getEnvVar('EMAIL_SENDER'), + EMAIL_REPLY_TO: getEnvVar('EMAIL_REPLY_TO'), + EMAIL_REPORT_ADDRESSES: getEnvVar('EMAIL_REPORT_ADDRESSES'), + CHANNEL_ERROR_LOG: getEnvVar('CHANNEL_ERROR_LOG'), + CHANNEL_SERVER_LOG: getEnvVar('CHANNEL_SERVER_LOG'), + CHANNEL_MEMBER_LOG: getEnvVar('CHANNEL_MEMBER_LOG'), + CHANNEL_MOD_LOG: getEnvVar('CHANNEL_MOD_LOG'), + CHANNEL_FEEDBACK: getEnvVar('CHANNEL_FEEDBACK'), + CHANNEL_SAGE: getEnvVar('CHANNEL_SAGE'), + CHANNEL_ANNOUNCEMENTS: getEnvVar('CHANNEL_ANNOUNCEMENTS'), + CHANNEL_ARCHIVE: getEnvVar('CHANNEL_ARCHIVE'), + CHANNEL_ROLE_SELECT: getEnvVar('CHANNEL_ROLE_SELECT'), + ROLE_DROPDOWNS_COURSE_ROLES: getEnvVar('ROLE_DROPDOWNS_COURSE_ROLES'), + ROLE_DROPDOWNS_ASSIGN_ROLES: getEnvVar('ROLE_DROPDOWNS_ASSIGN_ROLES'), + MONGO: getEnvVar('MONGO'), + LEVEL_TIER_ROLES: getEnvVar('LEVEL_TIER_ROLES'), + FIRST_LEVEL: getEnvVar('FIRST_LEVEL'), + ENV_GITHUB_TOKEN: getEnvVar('ENV_GITHUB_TOKEN'), + ENV_GITHUB_PROJECT: getEnvVar('ENV_GITHUB_PROJECT'), + PREFIX: getEnvVar('PREFIX'), + MAINTAINERS: getEnvVar('MAINTAINERS'), + SEMESTER_ID: getEnvVar('SEMESTER_ID'), + BLACKLIST: getEnvVar('BLACKLIST') +}; +/* +export const { DB_CONNECTION } = process.env.DB_CONNECTION; +export const { BOT_NAME } = process.env; +export const { BOT_TOKEN } = process.env; +export const { BOT_CLIENT_ID } = process.env; +export const { DB_USERS } = process.env; +export const { DB_PVQ } = process.env; +export const { DB_QTAGS } = process.env; +export const { DB_ASSIGNABLE } = process.env; +export const { DB_COURSES } = process.env; +export const { DB_REMINDERS } = process.env; +export const { DB_CLIENT_DATA } = process.env; +export const { DB_POLLS } = process.env; +export const { GUILD_MAIN } = process.env; +export const { GUILD_GATEWAY } = process.env; +export const { GUILD_GATEWAY_INVITE } = process.env; +export const { ROLE_ADMIN } = process.env; +export const { ROLE_STUDENT_ADMIN } = process.env; +export const { ROLE_STAFF } = process.env; +export const { ROLE_VERIFIED } = process.env; +export const { ROLE_MUTED } = process.env; +export const { ROLE_LEVEL_ONE } = process.env; +export const { EMAIL_SENDER } = process.env; +export const { EMAIL_REPLY_TO } = process.env; +export const { EMAIL_REPORT_ADDRESSES } = process.env; +export const { CHANNEL_ERROR_LOG } = process.env; +export const { CHANNEL_SERVER_LOG } = process.env; +export const { CHANNEL_MEMBER_LOG } = process.env; +export const { CHANNEL_MOD_LOG } = process.env; +export const { CHANNEL_FEEDBACK } = process.env; +export const { CHANNEL_SAGE } = process.env; +export const { CHANNEL_ANNOUNCEMENTS } = process.env; +export const { CHANNEL_ARCHIVE } = process.env; +export const { CHANNEL_ROLE_SELECT } = process.env; +export const { ROLE_DROPDOWNS_COURSE_ROLES } = process.env; +export const { ROLE_DROPDOWNS_ASSIGN_ROLES } = process.env; +*/ + +export const BOT = { + TOKEN: config.BOT_TOKEN, + CLIENT_ID: config.BOT_CLIENT_ID, + NAME: config.BOT_NAME +}; + +export const DB = { + CONNECTION: config.DB_CONNECTION, + USERS: config.DB_USERS, + PVQ: config.DB_PVQ, + QTAGS: config.DB_QTAGS, + ASSIGNABLE: config.DB_ASSIGNABLE, + COURSES: config.DB_COURSES, + REMINDERS: config.DB_REMINDERS, + CLIENT_DATA: config.DB_CLIENT_DATA, + POLLS: config.DB_POLLS +}; + +export const GUILDS = { + MAIN: config.GUILD_MAIN, + GATEWAY: config.GUILD_GATEWAY, + GATEWAY_INVITE: config.GUILD_GATEWAY_INVITE +}; + +export const ROLES = { + ADMIN: config.ROLE_ADMIN, + STUDENT_ADMIN: config.ROLE_STUDENT_ADMIN, + STAFF: config.ROLE_STAFF, + VERIFIED: config.ROLE_VERIFIED, + MUTED: config.ROLE_MUTED, + LEVEL_ONE: config.ROLE_LEVEL_ONE +}; + +export const EMAIL = { + SENDER: config.EMAIL_SENDER, + REPLY_TO: config.EMAIL_REPLY_TO, + REPORT_ADDRESSES: config.EMAIL_REPORT_ADDRESSES +}; + +export const CHANNELS = { + ERROR_LOG: config.CHANNEL_ERROR_LOG, + SERVER_LOG: config.CHANNEL_SERVER_LOG, + MEMBER_LOG: config.CHANNEL_MEMBER_LOG, + MOD_LOG: config.CHANNEL_MOD_LOG, + FEEDBACK: config.CHANNEL_FEEDBACK, + SAGE: config.CHANNEL_SAGE, + ANNOUNCEMENTS: config.CHANNEL_ANNOUNCEMENTS, + ARCHIVE: config.CHANNEL_ARCHIVE, + ROLE_SELECT: config.CHANNEL_ROLE_SELECT +}; + +export const ROLE_DROPDOWNS = { + COURSE_ROLES: config.ROLE_DROPDOWNS_COURSE_ROLES, + ASSIGN_ROLES: config.ROLE_DROPDOWNS_ASSIGN_ROLES +}; + +export const GITHUB_PROJECT = config.ENV_GITHUB_PROJECT; + +// eslint-disable-next-line prefer-destructuring +export const SEMESTER_ID = config.SEMESTER_ID; + +export const FIRST_LEVEL = 10; + +export const LEVEL_TIER_ROLES = [config.LEVEL_TIER_ROLES]; + +// eslint-disable-next-line prefer-destructuring +export const MAINTAINERS = config.MAINTAINERS; + +// eslint-disable-next-line prefer-destructuring +export const PREFIX = config.PREFIX; + +export const BLACKLIST = [config.BLACKLIST]; + +export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; + +// eslint-disable-next-line prefer-destructuring +export const MONGO = config.MONGO; From f0cce44b6d5b08f0d504388b50a779f8e8439867 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Thu, 24 Oct 2024 15:08:59 -0400 Subject: [PATCH 053/267] Yaayyy, this might commit, config.ts is now gray --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index 54c5e0b3..23593b77 100644 --- a/.gitignore +++ b/.gitignore @@ -8,8 +8,6 @@ config.ts # macOS stuff .DS_Store -config.ts - # Logs logs !src/pieces/logs From b1a75e837d9e37761d9c4e6d241d77868bda660e Mon Sep 17 00:00:00 2001 From: Saieda Ali Zada <143635010+SaiedaJN@users.noreply.github.com> Date: Thu, 24 Oct 2024 21:21:00 -0400 Subject: [PATCH 054/267] code to call the API and fetch job listings based on keywords and filters is done. --- src/commands/jobs/Adzuna_job_search.ts | 29 ++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/commands/jobs/Adzuna_job_search.ts diff --git a/src/commands/jobs/Adzuna_job_search.ts b/src/commands/jobs/Adzuna_job_search.ts new file mode 100644 index 00000000..e4070fd9 --- /dev/null +++ b/src/commands/jobs/Adzuna_job_search.ts @@ -0,0 +1,29 @@ +import { APP_ID, APP_KEY } from '@root/config'; +import axios from 'axios'; + + +// Questions: how to pull it? Do I need to pull it? +// how to work on the next part of the project? +// Task 3.5: Store fetched job listings temporarily for job matching +// Create a local cache or temporary storage to hold job listings for processing. + +const JOB_TITLE = 'software engineer'; +const LOCATION = 'us'; +const SALARY_MIN = 50000; + +const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} +&results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; + +fetch(URL) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error ${response.status}`); + } + return response.json(); + }) + .then((responseData) => { + console.log(responseData); + }) + .catch((error) => { + console.error('Fetch error:', error); + }); From 6de429f9daab52bacf13eac833940a7a0d618053 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 24 Oct 2024 22:38:40 -0400 Subject: [PATCH 055/267] removed trailing commas by prettier --- src/commands/reminders/remind.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index a9d74e3d..0f19739f 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -10,6 +10,7 @@ import parse from "parse-duration"; import { reminderTime } from "@root/src/lib/utils/generalUtils"; import { Command } from "@lib/types/Command"; +// prettier-ignore export default class extends Command { description = `Have ${BOT.NAME} give you a reminder.`; extendedHelp = "Reminders can be set to repeat daily or weekly."; @@ -39,9 +40,9 @@ export default class extends Command { { name: "Weekly", value: "weekly" }, ], type: ApplicationCommandOptionType.String, - required: false, - }, - ], + required: false + } + ] }, { name: "jobs", @@ -56,10 +57,10 @@ export default class extends Command { { name: "Weekly", value: "weekly" }, ], type: ApplicationCommandOptionType.String, - required: true, - }, - ], - }, + required: true + } + ] + } ]; async checkJobReminder( From 671511001afe88bc28c5d4e66e89ee9138077635 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 24 Oct 2024 22:42:27 -0400 Subject: [PATCH 056/267] removed trailing commas by prettier --- src/commands/jobs/jobform.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index b2baca40..6f76817a 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -11,6 +11,7 @@ import { TextInputStyle, } from "discord.js"; +// prettier-ignore const questions = [ [ "What city are you located in?", @@ -18,9 +19,10 @@ const questions = [ "Job, internship or both?", "How far are you willing to travel?", ], - ["Interest 1", "Interest 2", "Interest 3", "Interest 4", "Interest 5"], + ["Interest 1", "Interest 2", "Interest 3", "Interest 4", "Interest 5"] ]; +// prettier-ignore export default class extends Command { name: "jobform"; description = @@ -31,8 +33,8 @@ export default class extends Command { name: "qset", description: "Which question set do you want to view (1 or 2).", type: ApplicationCommandOptionType.Number, - required: true, - }, + required: true + } ]; async run( @@ -78,8 +80,8 @@ export default class extends Command { .setCustomId(`question${questionNum + 1}`) .setLabel(`${question}`) .setStyle(TextInputStyle.Short) - .setPlaceholder("Input Answer Here"), - ], + .setPlaceholder("Input Answer Here") + ] }); } } From 297e76254afdb59eb4203f4c80facff933bcdaec Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 24 Oct 2024 22:47:43 -0400 Subject: [PATCH 057/267] replaced all strings' double quotes with single quotes --- src/commands/jobs/jobform.ts | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 6f76817a..8b6f15dd 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,4 +1,4 @@ -import { Command } from "@root/src/lib/types/Command"; +import { Command } from '@root/src/lib/types/Command'; import { ActionRowBuilder, ApplicationCommandOptionData, @@ -9,29 +9,29 @@ import { ModalSubmitFields, TextInputBuilder, TextInputStyle, -} from "discord.js"; +} from 'discord.js'; // prettier-ignore const questions = [ [ - "What city are you located in?", - "Are you looking for remote or in person?", - "Job, internship or both?", - "How far are you willing to travel?", + 'What city are you located in?', + 'Are you looking for remote or in person?', + 'Job, internship or both?', + 'How far are you willing to travel?', ], - ["Interest 1", "Interest 2", "Interest 3", "Interest 4", "Interest 5"] + ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; // prettier-ignore export default class extends Command { - name: "jobform"; + name: 'jobform'; description = - "Form to get your preferences for jobs to be used with the Job Alert System!"; + 'Form to get your preferences for jobs to be used with the Job Alert System!'; options: ApplicationCommandOptionData[] = [ { - name: "qset", - description: "Which question set do you want to view (1 or 2).", + name: 'qset', + description: 'Which question set do you want to view (1 or 2).', type: ApplicationCommandOptionType.Number, required: true } @@ -40,10 +40,10 @@ export default class extends Command { async run( interaction: ChatInputCommandInteraction ): Promise | void> { - const questionSet = interaction.options.getNumber("qset") - 1; + const questionSet = interaction.options.getNumber('qset') - 1; if (questionSet !== 0 && questionSet !== 1) { - interaction.reply({ content: "Please enter either 1 or 2" }); + interaction.reply({ content: 'Please enter either 1 or 2' }); return; } @@ -80,7 +80,7 @@ export default class extends Command { .setCustomId(`question${questionNum + 1}`) .setLabel(`${question}`) .setStyle(TextInputStyle.Short) - .setPlaceholder("Input Answer Here") + .setPlaceholder('Input Answer Here') ] }); } From 7562fa2bde21572ccce22c02d61adb227c299370 Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Sat, 26 Oct 2024 16:45:08 -0400 Subject: [PATCH 058/267] added jobForms database, have commandManager adding raw data to database with no formatting --- src/lib/types/Job.d.ts | 7 ++++++ src/pieces/commandManager.ts | 11 +++++++++ testing_JOB_FORMS.js | 43 ++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 src/lib/types/Job.d.ts create mode 100644 testing_JOB_FORMS.js diff --git a/src/lib/types/Job.d.ts b/src/lib/types/Job.d.ts new file mode 100644 index 00000000..09315785 --- /dev/null +++ b/src/lib/types/Job.d.ts @@ -0,0 +1,7 @@ +export interface Job { + owner: string; + content: string; + location: string; + answers: string[]; + mode: 'public' | 'private'; +} diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 68bd8a89..e8bcef68 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -13,6 +13,7 @@ import { Course } from '../lib/types/Course'; import { SageUser } from '../lib/types/SageUser'; import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; +import { Job } from '../lib/types/Job'; const DELETE_DELAY = 10000; @@ -152,6 +153,16 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie const jobAnswers = questionIDs.map((question) => interaction.fields.getTextInputValue(`question${question}`)); console.log(jobAnswers); interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); + + const answerResponse: Job = { + owner: interaction.user.id, + content: '', + location: '', + answers: jobAnswers, + mode: 'public' // temporary + }; + + interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); break; } } diff --git a/testing_JOB_FORMS.js b/testing_JOB_FORMS.js new file mode 100644 index 00000000..3b6575fa --- /dev/null +++ b/testing_JOB_FORMS.js @@ -0,0 +1,43 @@ +/* global use, db */ +// MongoDB Playground +// Use Ctrl+Space inside a snippet or a string literal to trigger completions. + +const database = 'Jess_Test'; +const collection = 'JOB_FORMS'; + +// The current database to use. +use(database); + +// Create a new collection. +db.createCollection(collection); + +// The prototype form to create a collection: +/* db.createCollection( , + { + capped: , + autoIndexId: , + size: , + max: , + storageEngine: , + validator: , + validationLevel: , + validationAction: , + indexOptionDefaults: , + viewOn: , + pipeline: , + collation: , + writeConcern: , + timeseries: { // Added in MongoDB 5.0 + timeField: , // required for time series collections + metaField: , + granularity: , + bucketMaxSpanSeconds: , // Added in MongoDB 6.3 + bucketRoundingSeconds: , // Added in MongoDB 6.3 + }, + expireAfterSeconds: , + clusteredIndex: , // Added in MongoDB 5.3 + } +)*/ + +// More information on the `createCollection` command can be found at: +// https://www.mongodb.com/docs/manual/reference/method/db.createCollection/ From ac017443b82c88f02430719af79858485df87f48 Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Sat, 26 Oct 2024 18:27:06 -0400 Subject: [PATCH 059/267] updated to work with both question sets --- src/lib/types/Job.d.ts | 1 + src/pieces/commandManager.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/lib/types/Job.d.ts b/src/lib/types/Job.d.ts index 09315785..eeecbc9c 100644 --- a/src/lib/types/Job.d.ts +++ b/src/lib/types/Job.d.ts @@ -2,6 +2,7 @@ export interface Job { owner: string; content: string; location: string; + questionSet: int; answers: string[]; mode: 'public' | 'private'; } diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 414e1ce1..92e1268f 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -162,6 +162,7 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie owner: interaction.user.id, content: '', location: '', + questionSet: qSet, answers: jobAnswers, mode: 'public' // temporary }; From ef2b57d3bf7f74fdddb5fa84a8afa21df610a16b Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Mon, 28 Oct 2024 09:35:12 -0400 Subject: [PATCH 060/267] I am having issues with code pulled --- src/pieces/commandManager.ts | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index c66b409e..811d0355 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -147,7 +147,6 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie interaction.reply({ content: `Thank you for verifying! You can now access the rest of the server. ${enrollStr}`, ephemeral: true }); break; } -<<<<<<< HEAD // case 'jobModal': { // // extracting the input from the modal // const qSet = customId.slice(-1); @@ -181,18 +180,6 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie console.error('Job form error:', error); await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); } -======= - case 'jobModal': { - // extracting the input from the modal - const qSet = customId.slice(-1); - const questionIDs = [[1, 2, 3, 4], [1, 2, 3, 4, 5]]; - - const jobAnswers = questionIDs[qSet].map((question) => interaction.fields.getTextInputValue(`question${question}`)); - - // qSet contains either 0 or 1 depending if it is the first or second set of questions - // the array of answers is stored in jobAnswers - interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); ->>>>>>> 2fc35a1b74bdadac6dcbbd192883384abe8e81e7 break; } } From 1d609b80eadc1313a902c217e127b67df40f81ea Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Mon, 28 Oct 2024 09:47:26 -0400 Subject: [PATCH 061/267] Pushing now after adding code APP_ID into config.ts --- src/commands/jobs/Adzuna_job_search.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/jobs/Adzuna_job_search.ts b/src/commands/jobs/Adzuna_job_search.ts index e4070fd9..eb70c35a 100644 --- a/src/commands/jobs/Adzuna_job_search.ts +++ b/src/commands/jobs/Adzuna_job_search.ts @@ -1,5 +1,5 @@ import { APP_ID, APP_KEY } from '@root/config'; -import axios from 'axios'; +// import axios from 'axios'; // Questions: how to pull it? Do I need to pull it? @@ -9,7 +9,7 @@ import axios from 'axios'; const JOB_TITLE = 'software engineer'; const LOCATION = 'us'; -const SALARY_MIN = 50000; +// const SALARY_MIN = 50000; const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; From e0bef352985bfa90dc81f8145f3e42ebd03645ab Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 30 Oct 2024 09:32:35 -0400 Subject: [PATCH 062/267] resolved JobReferenceAPI import --- src/pieces/commandManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 811d0355..f2fabb1b 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -13,7 +13,7 @@ import { Course } from '../lib/types/Course'; import { SageUser } from '../lib/types/SageUser'; import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; -import { JobPreferenceAPI } from '../commands/Jobs/APIDatabase'; +import { JobPreferenceAPI } from '../commands/jobs/APIDatabase'; const DELETE_DELAY = 10000; From 77b28744dc17e456372610ead4077f3751bd7388 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Wed, 30 Oct 2024 09:33:28 -0400 Subject: [PATCH 063/267] added comments to APIDatabase --- src/commands/Jobs/APIDatabase.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/commands/Jobs/APIDatabase.ts b/src/commands/Jobs/APIDatabase.ts index f9bda6c3..d7244ce5 100644 --- a/src/commands/Jobs/APIDatabase.ts +++ b/src/commands/Jobs/APIDatabase.ts @@ -28,14 +28,11 @@ export class JobPreferenceAPI { constructor(db: Db) { this.collection = db.collection(DB.USERS); } - // constructor(mongo: MongoClient) { - // this.collection = mongo.db().collection(DB.USERS); - // } async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise { try { let updateObject = {}; - + // Adds answers to questions. if (questionSet === 0) { updateObject = { 'jobPreferences.answers.city': answers[0], @@ -43,6 +40,7 @@ export class JobPreferenceAPI { 'jobPreferences.answers.employmentType': answers[2], 'jobPreferences.answers.travelDistance': answers[3] }; + // Adds answers to interests. } else if (questionSet === 1) { updateObject = { 'jobPreferences.answers.interest1': answers[0], @@ -52,7 +50,7 @@ export class JobPreferenceAPI { 'jobPreferences.answers.interest5': answers[4] }; } - + // Updates preferences with new answers and the new date inputted. await this.collection.updateOne( { discordId: userID }, { @@ -74,7 +72,7 @@ export class JobPreferenceAPI { async getPreference(userID: string, answers: string[], questionSet: number): Promise { return this.storeFormResponses(userID, answers, questionSet); } - + // Deletes the preferences answers to an empty string. async deletePreference(userID: string): Promise { try { const result = await this.collection.updateOne( From 76cf3eb8362082e00fd42f2fc0da32d4f4981fbe Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Wed, 30 Oct 2024 09:49:43 -0400 Subject: [PATCH 064/267] changed APIDatabase to jobDatabase --- src/commands/Jobs/{APIDatabase.ts => jobDatabase.ts} | 0 src/pieces/commandManager.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/commands/Jobs/{APIDatabase.ts => jobDatabase.ts} (100%) diff --git a/src/commands/Jobs/APIDatabase.ts b/src/commands/Jobs/jobDatabase.ts similarity index 100% rename from src/commands/Jobs/APIDatabase.ts rename to src/commands/Jobs/jobDatabase.ts diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 811d0355..ce48c935 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -13,7 +13,7 @@ import { Course } from '../lib/types/Course'; import { SageUser } from '../lib/types/SageUser'; import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; -import { JobPreferenceAPI } from '../commands/Jobs/APIDatabase'; +import { JobPreferenceAPI } from '../commands/Jobs/jobDatabase'; const DELETE_DELAY = 10000; From f848cf9aef6bf653dae4d08cb7692985d8068e57 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Wed, 30 Oct 2024 09:55:10 -0400 Subject: [PATCH 065/267] changed APIDatabase to jobDatabase --- src/pieces/commandManager.ts | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index ce48c935..9d07efea 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -13,7 +13,7 @@ import { Course } from '../lib/types/Course'; import { SageUser } from '../lib/types/SageUser'; import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; -import { JobPreferenceAPI } from '../commands/Jobs/jobDatabase'; +import { JobPreferenceAPI } from '../commands/jobs/jobDatabase'; const DELETE_DELAY = 10000; @@ -147,18 +147,6 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie interaction.reply({ content: `Thank you for verifying! You can now access the rest of the server. ${enrollStr}`, ephemeral: true }); break; } - // case 'jobModal': { - // // extracting the input from the modal - // const qSet = customId.slice(-1); - // const questionIDs = [[1, 2, 3, 4], [1, 2, 3, 4, 5]]; - - // const jobAnswers = questionIDs[qSet].map((question) => interaction.fields.getTextInputValue(`question${question}`)); - - // // qSet contains either 0 or 1 depending if it is the first or second set of questions - // // the array of answers is stored in jobAnswers - // interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); - // break; - // } case 'jobModal': { try { // extracting the input from the modal From e6e37e422dfe91d9f315d0e9afec39982ca104a5 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 30 Oct 2024 14:44:15 -0400 Subject: [PATCH 066/267] resolved ESLint errors --- src/pieces/tasks.ts | 122 ++++++++++++++------------------------------ 1 file changed, 39 insertions(+), 83 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 02ba0d8e..02113302 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -1,12 +1,12 @@ -import { CHANNELS, DB } from "@root/config"; -import { ChannelType, Client, EmbedBuilder, TextChannel } from "discord.js"; -import { schedule } from "node-cron"; -import { Reminder } from "@lib/types/Reminder"; -import { Poll, PollResult } from "@lib/types/Poll"; +import { CHANNELS, DB } from '@root/config'; +import { ChannelType, Client, EmbedBuilder, TextChannel } from 'discord.js'; +import { schedule } from 'node-cron'; +import { Reminder } from '@lib/types/Reminder'; +import { Poll, PollResult } from '@lib/types/Poll'; async function register(bot: Client): Promise { - schedule("0/30 * * * * *", () => { - handleCron(bot).catch(async (error) => bot.emit("error", error)); + schedule('0/30 * * * * *', () => { + handleCron(bot).catch(async (error) => bot.emit('error', error)); }); } @@ -16,97 +16,61 @@ async function handleCron(bot: Client): Promise { } async function checkPolls(bot: Client): Promise { - const polls: Poll[] = await bot.mongo - .collection(DB.POLLS) - .find({ - expires: { $lte: new Date() }, - }) - .toArray(); - const emotes = ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣", "🔟"]; - + const polls: Poll[] = await bot.mongo.collection(DB.POLLS).find({ expires: { $lte: new Date() } }).toArray(); + const emotes = ['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟']; polls.forEach(async (poll) => { const mdTimestamp = ``; - - // figure out the winner and also put the results in a map for ease of use const resultMap = new Map(); let winners: PollResult[] = []; + poll.results.forEach((res) => { resultMap.set(res.option, res.users.length); if (!winners[0]) { winners = [res]; return; } - if (winners[0] && res.users.length > winners[0].users.length) + if (winners[0] && res.users.length > winners[0].users.length) { winners = [res]; - else if (res.users.length === winners[0].users.length) + } else if (res.users.length === winners[0].users.length) { winners.push(res); + } }); - // build up the win string let winMessage: string; const winCount = winners[0].users.length; if (winCount === 0) { - winMessage = `It looks like no one has voted!`; + winMessage = 'It looks like no one has voted!'; } else if (winners.length === 1) { - winMessage = `**${ - winners[0].option - }** has won the poll with ${winCount} vote${ - winCount === 1 ? "" : "s" - }!`; + winMessage = `**${winners[0].option}** has won the poll with ${winCount} vote${winCount === 1 ? '' : 's'}!`; } else { - winMessage = `**${winners - .slice(0, -1) - .map((win) => win.option) - .join(", ")} and ${ + winMessage = `**${winners.slice(0, -1).map((win) => win.option).join(', ')} and ${ winners.slice(-1)[0].option - }** have won the poll with ${winners[0].users.length} vote${ - winCount === 1 ? "" : "s" - } each!`; + }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; } - // build up the text that is on the final poll embed - let choiceText = ""; + let choiceText = ''; let count = 0; resultMap.forEach((value, key) => { - choiceText += `${emotes[count++]} ${key}: ${value} vote${ - value === 1 ? "" : "s" - }\n`; + choiceText += `${emotes[count++]} ${key}: ${value} vote${value === 1 ? '' : 's'}\n`; }); const pollChannel = await bot.channels.fetch(poll.channel); - if (pollChannel.type !== ChannelType.GuildText) - throw "something went wrong fetching the poll's channel"; + if (pollChannel.type !== ChannelType.GuildText) { + throw 'something went wrong fetching the poll\'s channel'; + } + const pollMsg = await pollChannel.messages.fetch(poll.message); const owner = await pollMsg.guild.members.fetch(poll.owner); - const pollEmbed = new EmbedBuilder() - .setTitle(poll.question) - .setDescription( - `This poll was created by ${owner.displayName} and ended **${mdTimestamp}**` - ) - .addFields({ - name: `Winner${winners.length === 1 ? "" : "s"}`, - value: winMessage, - }) - .addFields({ name: "Choices", value: choiceText }) - .setColor("Random"); + const pollEmbed = new EmbedBuilder().setTitle(poll.question).setDescription(`This poll was created by ${owner.displayName} and ended **${mdTimestamp}**`).addFields({ name: `Winner${winners.length + === 1 ? '' : 's'}`, value: winMessage }).addFields({ name: 'Choices', value: choiceText }).setColor('Random'); pollMsg.edit({ embeds: [pollEmbed], components: [] }); pollMsg.channel.send({ embeds: [ - new EmbedBuilder() - .setTitle(poll.question) - .setDescription(`${owner}'s poll has ended!`) - .addFields({ - name: `Winner${winners.length === 1 ? "" : "s"}`, - value: winMessage, - }) - .addFields({ - name: "Original poll", - value: `Click [here](${pollMsg.url}) to see the original poll.`, - }) - .setColor("Random"), - ], + new EmbedBuilder().setTitle(poll.question).setDescription(`${owner}'s poll has ended!`).addFields({ name: `Winner${winners.length === 1 ? '' : 's'}`, value: winMessage }).addFields({ name: + 'Original poll', value: `Click [here](${pollMsg.url}) to see the original poll.` }).setColor('Random') + ] }); await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); @@ -114,47 +78,39 @@ async function checkPolls(bot: Client): Promise { } async function checkReminders(bot: Client): Promise { - const reminders: Array = await bot.mongo - .collection(DB.REMINDERS) - .find({ - expires: { $lte: new Date() }, - }) - .toArray(); + const reminders: Reminder[] = await bot.mongo.collection(DB.REMINDERS).find({ expires: { $lte: new Date() } }).toArray(); + const pubChan = (await bot.channels.fetch(CHANNELS.SAGE)) as TextChannel; reminders.forEach((reminder) => { const message = `<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`; - if (reminder.mode === "public") { + if (reminder.mode === 'public') { pubChan.send(message); } else { bot.users.fetch(reminder.owner).then((user) => user.send(message).catch(() => { - pubChan.send(`<@${reminder.owner}>, I tried to send you a DM about your private reminder but it looks like you have -DMs closed. Please enable DMs in the future if you'd like to get private reminders.`); + pubChan.send( + `<@${reminder.owner}>, I tried to send you a DM about your private reminder but it looks like you have DMs closed. Please enable DMs in the future if you'd like to get private reminders.` + ); }) ); } - // copied value by value for several reasons, change it and I take no responsibility for it breaking. const newReminder: Reminder = { content: reminder.content, expires: new Date(reminder.expires), mode: reminder.mode, repeat: reminder.repeat, - owner: reminder.owner, + owner: reminder.owner }; - if (reminder.repeat === "daily") { + if (reminder.repeat === 'daily') { newReminder.expires.setDate(reminder.expires.getDate() + 1); - bot.mongo - .collection(DB.REMINDERS) - .findOneAndReplace(reminder, newReminder); - } else if (reminder.repeat === "weekly") { + bot.mongo.collection(DB.REMINDERS).findOneAndReplace(reminder, newReminder); + } else if (reminder.repeat === 'weekly') { newReminder.expires.setDate(reminder.expires.getDate() + 7); - bot.mongo - .collection(DB.REMINDERS) - .findOneAndReplace(reminder, newReminder); + bot.mongo.collection(DB.REMINDERS).findOneAndReplace(reminder, newReminder); } else { bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); } From f9d270d85bff323449bc65444e8c6523c1f9e44b Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 30 Oct 2024 14:45:09 -0400 Subject: [PATCH 067/267] resolved ESLint errors by replacing double quotes with single quotes --- src/lib/types/Reminder.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/types/Reminder.d.ts b/src/lib/types/Reminder.d.ts index 06614669..bbc21138 100644 --- a/src/lib/types/Reminder.d.ts +++ b/src/lib/types/Reminder.d.ts @@ -2,6 +2,6 @@ export interface Reminder { owner: string; expires: Date; content: string; - repeat: null | "daily" | "weekly"; - mode: "public" | "private"; + repeat: null | 'daily' | 'weekly'; + mode: 'public' | 'private'; } From 8c3a11453377c1825db124b0397798a491aafdfa Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 30 Oct 2024 15:36:56 -0400 Subject: [PATCH 068/267] updated 'expires' property for job reminder so it now expires in a year from when it first was created --- src/commands/reminders/remind.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 3417e172..b281487e 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -89,7 +89,7 @@ export default class extends Command { owner: interaction.user.id, content: 'Job Reminder', mode: 'private', - expires: new Date(0 + Date.now()), + expires: new Date(), repeat: jobReminderRepeat }; From 70661e83cc97d300c27ea7e1ce5e495c46935b74 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 30 Oct 2024 15:37:15 -0400 Subject: [PATCH 069/267] updated 'expires' property for job reminder so it now expires in a year from when it first was created --- src/commands/reminders/remind.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index b281487e..6787094a 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -85,11 +85,12 @@ export default class extends Command { | 'daily' | 'weekly') || null; + const currentDate = new Date(); const jobReminder: Reminder = { owner: interaction.user.id, content: 'Job Reminder', mode: 'private', - expires: new Date(), + expires: new Date(currentDate.setFullYear(currentDate.getFullYear() + 1)), // expires a year from now repeat: jobReminderRepeat }; From a32903413811af1e5a79ed1500d2ecdf658ea3f0 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 30 Oct 2024 15:44:16 -0400 Subject: [PATCH 070/267] updated 'expires' property for job reminder so it now expires in a year from when it first was created --- src/commands/reminders/remind.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 6787094a..bcf669a9 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -90,7 +90,8 @@ export default class extends Command { owner: interaction.user.id, content: 'Job Reminder', mode: 'private', - expires: new Date(currentDate.setFullYear(currentDate.getFullYear() + 1)), // expires a year from now + expires: new Date(currentDate.setFullYear(currentDate.getFullYear() + 1) + ), // expires a year from now repeat: jobReminderRepeat }; From dc95027922b250dbd0fe303c2a0b3d776e0e1f73 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 30 Oct 2024 15:49:32 -0400 Subject: [PATCH 071/267] added conditional logic that displays a message to the user (either public or private) depending on reminder mode and added formatting to job reminder message --- src/pieces/tasks.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 02113302..34fff46a 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -83,7 +83,12 @@ async function checkReminders(bot: Client): Promise { const pubChan = (await bot.channels.fetch(CHANNELS.SAGE)) as TextChannel; reminders.forEach((reminder) => { - const message = `<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`; + // eslint-disable-next-line no-warning-comments + // TODO - need to find a way to check if the user has set their job preferences. If they haven't, find a way to check it and display the message advising them where in order to get + // personalized job recommendations, they'll need to fill out the job form (by default they're getting a list of jobs from anywhere) + + const message = reminder.mode === 'private' ? `## Hey <@${reminder.owner}>! \n ## Here's your list of job recommendations! \n 1. A \n 2. B \n 3. C` + : `<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`; if (reminder.mode === 'public') { pubChan.send(message); From ec6bae6c1d6890b2934a827c9e46c7d1a976592a Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Thu, 31 Oct 2024 11:47:56 -0400 Subject: [PATCH 072/267] Copied over jobForm to updatePrefences.ts and changed some of the code to create the command to update job preferences --- src/commands/Jobs/updatePreferences.ts | 67 ++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/commands/Jobs/updatePreferences.ts b/src/commands/Jobs/updatePreferences.ts index e69de29b..832f553e 100644 --- a/src/commands/Jobs/updatePreferences.ts +++ b/src/commands/Jobs/updatePreferences.ts @@ -0,0 +1,67 @@ +import { Command } from '@root/src/lib/types/Command'; +import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptionType, + ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, + TextInputBuilder, TextInputStyle } from 'discord.js'; + +const questions = [ + ['What city are you located in?', 'Are you looking for remote or in person?', 'Job, internship or both?', 'How far are you willing to travel?'], + ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] +]; + +export default class extends Command { + + name: 'updateJobPreferences' + description = 'Update your preferences for jobs to be used with the Job Alert System!'; + + options: ApplicationCommandOptionData[] = [ + { + name: 'qset', + description: 'Which question set do you want to view (1 or 2).', + type: ApplicationCommandOptionType.Number, + required: true + } + ] + + async run(interaction: ChatInputCommandInteraction): Promise | void> { + const questionSet = interaction.options.getNumber('qset') - 1; + + if (questionSet !== 0 && questionSet !== 1) { + interaction.reply({ content: 'Please enter either 1 or 2' }); + return; + } + + const modal = new ModalBuilder() + .setCustomId(`updateJobModal${questionSet}`) + .setTitle(`Update Job Preferences (${questionSet + 1} of 2)`); + + const askedQuestions = questions[questionSet]; + const rows = askedQuestions.map((question) => this.getAnswerField(question, askedQuestions.indexOf(question))); + + for (const row of rows) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + modal.addComponents(row); + } + + await interaction.showModal(modal); + + // Answers are handled in src/pieces/commandManager.ts on line 149 + + return; + } + + + getAnswer(fields: ModalSubmitFields, questionNum: number): string { + return fields.getField(`question${questionNum + 1}`).value; + } + + + getAnswerField(question: string, questionNum: number): ActionRowBuilder { + return new ActionRowBuilder({ components: [new TextInputBuilder() + .setCustomId(`question${questionNum + 1}`) + .setLabel(`${question}`) + .setStyle(TextInputStyle.Short) + .setPlaceholder('Input Updated Answer Here')] }); + } + +} From 5ba4302d99d94651df7496128442b1c0995ba442 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 31 Oct 2024 12:05:13 -0400 Subject: [PATCH 073/267] replaced 'expires' property for job reminder to 'new Date()' which solved issue where job reminder would not be sent to user's DMs --- src/commands/reminders/remind.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index bcf669a9..83e93f34 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -85,13 +85,11 @@ export default class extends Command { | 'daily' | 'weekly') || null; - const currentDate = new Date(); const jobReminder: Reminder = { owner: interaction.user.id, content: 'Job Reminder', mode: 'private', - expires: new Date(currentDate.setFullYear(currentDate.getFullYear() + 1) - ), // expires a year from now + expires: new Date(), repeat: jobReminderRepeat }; @@ -106,7 +104,7 @@ export default class extends Command { .collection(DB.REMINDERS) .insertOne(jobReminder); return interaction.reply({ - content: `I'll remind you about job offers at ${reminderTime( + content: `I'll remind you about job offers ${jobReminderRepeat} at ${reminderTime( jobReminder )}.`, ephemeral: true From 9a9b276d56f598608699223198c7f586b9ae4258 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Thu, 31 Oct 2024 12:06:55 -0400 Subject: [PATCH 074/267] added modal in commandManager by using jobModal case, however, it feels like the answers will autaumatically be stored which means that we have already done Task6.1 and the new modal and updatePreferences command is useless? --- src/commands/Jobs/updatePreferences.ts | 2 +- src/pieces/commandManager.ts | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/commands/Jobs/updatePreferences.ts b/src/commands/Jobs/updatePreferences.ts index 832f553e..812668ee 100644 --- a/src/commands/Jobs/updatePreferences.ts +++ b/src/commands/Jobs/updatePreferences.ts @@ -10,7 +10,7 @@ const questions = [ export default class extends Command { - name: 'updateJobPreferences' + name: 'updateJobForm' description = 'Update your preferences for jobs to be used with the Job Alert System!'; options: ApplicationCommandOptionData[] = [ diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 9d07efea..e1e353f8 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -170,6 +170,29 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie } break; } + case 'updateJobModal': { + try { + // extracting the input from the modal + const formNumber = parseInt(customId.slice(-1)); + const answers = [1, 2, 3, 4, 5].slice(0, formNumber === 0 ? 4 : 5).map(num => fields.getTextInputValue(`question${num}`)); + + // Create API instance with the database instance directly + const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); + const success = await jobPreferenceAPI.storeFormResponses(interaction.user.id, answers, formNumber); + + // Takes user to questions, then interests. If submitted correctly, the answers will be stored. + await interaction.reply({ + content: success + ? `Form ${formNumber + 1} submitted successfully! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}` + : 'Error saving preferences. Please try again.', + ephemeral: true + }); + } catch (error) { + console.error('Job form error:', error); + await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); + } + break; + } } } From 8fc9412e8abd81e588d084ae8b229791eb8979f2 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 31 Oct 2024 12:08:31 -0400 Subject: [PATCH 075/267] removed debug console log statement and reverted changes to DM 'message' variable --- src/pieces/tasks.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 02113302..d0449e18 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -79,7 +79,6 @@ async function checkPolls(bot: Client): Promise { async function checkReminders(bot: Client): Promise { const reminders: Reminder[] = await bot.mongo.collection(DB.REMINDERS).find({ expires: { $lte: new Date() } }).toArray(); - const pubChan = (await bot.channels.fetch(CHANNELS.SAGE)) as TextChannel; reminders.forEach((reminder) => { From 11b56a8f04e0ef2a12048df38ce35a18d888ee0e Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 31 Oct 2024 12:11:03 -0400 Subject: [PATCH 076/267] reverted changes to the 'expires' property so now users are able to get DMs for their job reminders --- src/commands/reminders/remind.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index bcf669a9..83e93f34 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -85,13 +85,11 @@ export default class extends Command { | 'daily' | 'weekly') || null; - const currentDate = new Date(); const jobReminder: Reminder = { owner: interaction.user.id, content: 'Job Reminder', mode: 'private', - expires: new Date(currentDate.setFullYear(currentDate.getFullYear() + 1) - ), // expires a year from now + expires: new Date(), repeat: jobReminderRepeat }; @@ -106,7 +104,7 @@ export default class extends Command { .collection(DB.REMINDERS) .insertOne(jobReminder); return interaction.reply({ - content: `I'll remind you about job offers at ${reminderTime( + content: `I'll remind you about job offers ${jobReminderRepeat} at ${reminderTime( jobReminder )}.`, ephemeral: true From 6d2aa922451d7fe8dee2b96cd9d12d1c8bfd75c2 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 31 Oct 2024 12:21:15 -0400 Subject: [PATCH 077/267] implemented formatting to job search DM message --- src/pieces/tasks.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 34fff46a..be4409c5 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -87,7 +87,15 @@ async function checkReminders(bot: Client): Promise { // TODO - need to find a way to check if the user has set their job preferences. If they haven't, find a way to check it and display the message advising them where in order to get // personalized job recommendations, they'll need to fill out the job form (by default they're getting a list of jobs from anywhere) - const message = reminder.mode === 'private' ? `## Hey <@${reminder.owner}>! \n ## Here's your list of job recommendations! \n 1. A \n 2. B \n 3. C` + const message = reminder.mode === 'private' + ? `## Hey <@${reminder.owner}>! \n` + + `### Here's your list of job recommendations! \n` + + `1. A \n` + + `2. B \n` + + `3. C \n` + + `-# Please note that if you would like a more personalized job recommendations ` + + `(i.e. local computer science internships/jobs with more personal preferences), please fill out the jobform ` + + `(use the command: \`/jobform\`).` : `<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`; if (reminder.mode === 'public') { From 1490c69d863f4cd74880154f7dafb8c034050dbd Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Thu, 31 Oct 2024 12:32:42 -0400 Subject: [PATCH 078/267] created a mew file in types for jobPreferences --- src/commands/Jobs/viewJobForm.ts | 0 src/lib/types/jobPreference.d.ts | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/commands/Jobs/viewJobForm.ts create mode 100644 src/lib/types/jobPreference.d.ts diff --git a/src/commands/Jobs/viewJobForm.ts b/src/commands/Jobs/viewJobForm.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/lib/types/jobPreference.d.ts b/src/lib/types/jobPreference.d.ts new file mode 100644 index 00000000..1367c301 --- /dev/null +++ b/src/lib/types/jobPreference.d.ts @@ -0,0 +1,18 @@ +export interface JobPreferences { + userID: string; + answers: { + // Questions + city: string; + workType: string; + employmentType: string; + travelDistance: string; + // Interests + interest1: string; + interest2: string; + interest3: string; + interest4: string; + interest5: string; + }; + lastUpdated: Date; + mode: 'public' | 'private' +} From 5145551d82f8399cd2910f93621065833ad50d02 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Thu, 31 Oct 2024 13:09:29 -0400 Subject: [PATCH 079/267] still trying to view the answers submitted - sigh --- src/commands/Jobs/jobDatabase.ts | 1 + src/commands/Jobs/viewJobForm.ts | 35 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/commands/Jobs/jobDatabase.ts b/src/commands/Jobs/jobDatabase.ts index d7244ce5..fb50d085 100644 --- a/src/commands/Jobs/jobDatabase.ts +++ b/src/commands/Jobs/jobDatabase.ts @@ -24,6 +24,7 @@ interface JobPreferences { export class JobPreferenceAPI { private collection: Collection; + mode: string; constructor(db: Db) { this.collection = db.collection(DB.USERS); diff --git a/src/commands/Jobs/viewJobForm.ts b/src/commands/Jobs/viewJobForm.ts index e69de29b..c1e0e453 100644 --- a/src/commands/Jobs/viewJobForm.ts +++ b/src/commands/Jobs/viewJobForm.ts @@ -0,0 +1,35 @@ +import { DB } from '@root/config'; +import { ChatInputCommandInteraction, Embed, EmbedBuilder, InteractionResponse } from 'discord.js'; +import { reminderTime } from '@root/src/lib/utils/generalUtils'; +import { Command } from '@lib/types/Command'; +import jobform from './jobform'; +import { JobPreferenceAPI, JobPreferences } from './jobDatabase'; + +export default class extends Command { + + description = 'See your answers and interests inserted into job form.'; + extendedHelp = 'Don\'t worry, answers and interests will be hidden if you use this command publicly.'; + + async run(interaction: ChatInputCommandInteraction): Promise | void> { + const jobAnswers = await interaction.client.mongo.collection(DB.USERS) + .findOne({ owner: interaction.user.id, jobPreferences: { $exists: true } }); + + if (!jobAnswers) { + interaction.reply({ content: 'You don\'t have any submitted anwers to the job form!', ephemeral: true }); + } + + const embeds = new EmbedBuilder() + .setTitle('Your Job Preferences') + .setColor('DarkAqua'); + const preferences = jobAnswers.jobPreferences.answers; + if (preferences) { + embeds.addFields( + { name: 'Preffered City', value: preferences.city }, + { name: 'Preffered Job Type', value: preferences.jobType }, + { name: 'Preffered Job Title', value: preferences.jobTitle }, + { name: 'Preffered Job Description', value: preferences.jobDescription }, + ) + } + } + +} From 4ffa575d2c2c114d86a73b114da682593c19bfd6 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 31 Oct 2024 19:04:30 -0400 Subject: [PATCH 080/267] added better wording to DM job postings message --- src/pieces/tasks.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index be4409c5..57006c9d 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -93,9 +93,9 @@ async function checkReminders(bot: Client): Promise { `1. A \n` + `2. B \n` + `3. C \n` + - `-# Please note that if you would like a more personalized job recommendations ` + + `-# Please note that if you would like more personalized job recommendations ` + `(i.e. local computer science internships/jobs with more personal preferences), please fill out the jobform ` + - `(use the command: \`/jobform\`).` + `(use the command: \`/jobform\` in the server).` : `<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`; if (reminder.mode === 'public') { From ded10c3c4721b80c837c9af69b03798c9aa3f257 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Fri, 1 Nov 2024 09:44:42 -0400 Subject: [PATCH 081/267] modified description for job reminder when user views their reminders; now lets them know if it's weekly/daily --- src/commands/reminders/viewreminders.ts | 37 +++++++++++++------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/commands/reminders/viewreminders.ts b/src/commands/reminders/viewreminders.ts index 23b3284a..b4592f69 100644 --- a/src/commands/reminders/viewreminders.ts +++ b/src/commands/reminders/viewreminders.ts @@ -1,17 +1,18 @@ -import { DB } from "@root/config"; -import { Reminder } from "@lib/types/Reminder"; +import { DB } from '@root/config'; +import { Reminder } from '@lib/types/Reminder'; import { ChatInputCommandInteraction, EmbedBuilder, - InteractionResponse, -} from "discord.js"; -import { reminderTime } from "@root/src/lib/utils/generalUtils"; -import { Command } from "@lib/types/Command"; + InteractionResponse +} from 'discord.js'; +import { reminderTime } from '@root/src/lib/utils/generalUtils'; +import { Command } from '@lib/types/Command'; export default class extends Command { - description = "See your upcoming reminders."; + + description = 'See your upcoming reminders.'; extendedHelp = - "Don't worry, private reminders will be hidden if you use this command publicly."; + 'Don\'t worry, private reminders will be hidden if you use this command publicly.'; async run( interaction: ChatInputCommandInteraction @@ -24,8 +25,8 @@ export default class extends Command { if (reminders.length < 1) { interaction.reply({ - content: "You don't have any pending reminders!", - ephemeral: true, + content: 'You don\'t have any pending reminders!', + ephemeral: true }); } @@ -35,22 +36,22 @@ export default class extends Command { if (i % 25 === 0) { embeds.push( new EmbedBuilder() - .setTitle("Pending reminders") - .setColor("DarkAqua") + .setTitle('Pending reminders') + .setColor('DarkAqua') ); } - const hidden = reminder.mode === "private"; + const hidden = reminder.mode === 'private'; embeds[Math.floor(i / 25)].addFields({ name: `${i + 1}. ${ hidden - ? reminder.content === "Job Reminder" - ? "[Job Reminder]" - : "Private reminder" + ? reminder.content === 'Job Reminder' + ? '[Job Reminder]' + : 'Private reminder' : reminder.content }`, value: hidden - ? "Some time in the future." - : reminderTime(reminder), + ? `This is a **${reminder.repeat}** job reminder` + : reminderTime(reminder) }); }); From c46e2ffd82a9595cf8fbf9279785c1c02462d76e Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Fri, 1 Nov 2024 09:44:51 -0400 Subject: [PATCH 082/267] added questionSet to answer schema --- src/lib/types/Job.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/types/Job.d.ts b/src/lib/types/Job.d.ts index eeecbc9c..fe7adc18 100644 --- a/src/lib/types/Job.d.ts +++ b/src/lib/types/Job.d.ts @@ -1,5 +1,6 @@ export interface Job { owner: string; + questionSet: int; content: string; location: string; questionSet: int; From e5eea9acab943307942bd07f90ceba00124b248b Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Fri, 1 Nov 2024 09:54:18 -0400 Subject: [PATCH 083/267] fixed spelling in command manager --- src/pieces/commandManager.ts | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 811d0355..443cff28 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -13,7 +13,7 @@ import { Course } from '../lib/types/Course'; import { SageUser } from '../lib/types/SageUser'; import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; -import { JobPreferenceAPI } from '../commands/Jobs/APIDatabase'; +import { JobPreferenceAPI } from '../commands/jobs/APIDatabase'; const DELETE_DELAY = 10000; @@ -147,18 +147,6 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie interaction.reply({ content: `Thank you for verifying! You can now access the rest of the server. ${enrollStr}`, ephemeral: true }); break; } - // case 'jobModal': { - // // extracting the input from the modal - // const qSet = customId.slice(-1); - // const questionIDs = [[1, 2, 3, 4], [1, 2, 3, 4, 5]]; - - // const jobAnswers = questionIDs[qSet].map((question) => interaction.fields.getTextInputValue(`question${question}`)); - - // // qSet contains either 0 or 1 depending if it is the first or second set of questions - // // the array of answers is stored in jobAnswers - // interaction.reply({ content: `Submission successful with answers of {${jobAnswers}}` }); - // break; - // } case 'jobModal': { try { // extracting the input from the modal From 22d44ac74804385525ea354535cbb3a51148b872 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Fri, 1 Nov 2024 10:20:49 -0400 Subject: [PATCH 084/267] added description to job reminder so it lets users know whether it's a daily or weekly reminder --- src/commands/reminders/viewreminders.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/commands/reminders/viewreminders.ts b/src/commands/reminders/viewreminders.ts index b4592f69..5152df69 100644 --- a/src/commands/reminders/viewreminders.ts +++ b/src/commands/reminders/viewreminders.ts @@ -57,4 +57,5 @@ export default class extends Command { interaction.reply({ embeds }); } + } From 8942e9af3bc8597625b104528084e10f97956051 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 2 Nov 2024 11:51:52 -0400 Subject: [PATCH 085/267] added existig_Answers to check if existed preferences exist --- src/commands/Jobs/viewJobForm.ts | 6 ++--- src/pieces/commandManager.ts | 46 ++++++++++++++++---------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/commands/Jobs/viewJobForm.ts b/src/commands/Jobs/viewJobForm.ts index c1e0e453..ac16190d 100644 --- a/src/commands/Jobs/viewJobForm.ts +++ b/src/commands/Jobs/viewJobForm.ts @@ -3,7 +3,7 @@ import { ChatInputCommandInteraction, Embed, EmbedBuilder, InteractionResponse } import { reminderTime } from '@root/src/lib/utils/generalUtils'; import { Command } from '@lib/types/Command'; import jobform from './jobform'; -import { JobPreferenceAPI, JobPreferences } from './jobDatabase'; +import { JobPreferenceAPI } from './jobDatabase'; export default class extends Command { @@ -27,8 +27,8 @@ export default class extends Command { { name: 'Preffered City', value: preferences.city }, { name: 'Preffered Job Type', value: preferences.jobType }, { name: 'Preffered Job Title', value: preferences.jobTitle }, - { name: 'Preffered Job Description', value: preferences.jobDescription }, - ) + { name: 'Preffered Job Description', value: preferences.jobDescription } + ); } } diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index e1e353f8..262bd4f7 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -170,29 +170,29 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie } break; } - case 'updateJobModal': { - try { - // extracting the input from the modal - const formNumber = parseInt(customId.slice(-1)); - const answers = [1, 2, 3, 4, 5].slice(0, formNumber === 0 ? 4 : 5).map(num => fields.getTextInputValue(`question${num}`)); - - // Create API instance with the database instance directly - const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); - const success = await jobPreferenceAPI.storeFormResponses(interaction.user.id, answers, formNumber); - - // Takes user to questions, then interests. If submitted correctly, the answers will be stored. - await interaction.reply({ - content: success - ? `Form ${formNumber + 1} submitted successfully! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}` - : 'Error saving preferences. Please try again.', - ephemeral: true - }); - } catch (error) { - console.error('Job form error:', error); - await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); - } - break; - } + // case 'updateJobModal': { + // try { + // // extracting the input from the modal + // const formNumber = parseInt(customId.slice(-1)); + // const answers = [1, 2, 3, 4, 5].slice(0, formNumber === 0 ? 4 : 5).map(num => fields.getTextInputValue(`question${num}`)); + + // // Create API instance with the database instance directly + // const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); + // const success = await jobPreferenceAPI.storeFormResponses(interaction.user.id, answers, formNumber); + + // // Takes user to questions, then interests. If submitted correctly, the answers will be stored. + // await interaction.reply({ + // content: success + // ? `Form ${formNumber + 1} submitted successfully! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}` + // : 'Error saving preferences. Please try again.', + // ephemeral: true + // }); + // } catch (error) { + // console.error('Job form error:', error); + // await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); + // } + // break; + // } } } From 8f40cb12b909a5e0e48f768f473214ed96be4d23 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 2 Nov 2024 11:52:16 -0400 Subject: [PATCH 086/267] minor adjustments --- src/commands/Jobs/updatePreferences.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/commands/Jobs/updatePreferences.ts b/src/commands/Jobs/updatePreferences.ts index 812668ee..e5c9bf0a 100644 --- a/src/commands/Jobs/updatePreferences.ts +++ b/src/commands/Jobs/updatePreferences.ts @@ -10,13 +10,13 @@ const questions = [ export default class extends Command { - name: 'updateJobForm' - description = 'Update your preferences for jobs to be used with the Job Alert System!'; + name: 'update_prefereces' + description = 'View and update your preferences for jobs to be used with the Job Alert System!'; options: ApplicationCommandOptionData[] = [ { name: 'qset', - description: 'Which question set do you want to view (1 or 2).', + description: 'Which question set do you want to view and update(1 or 2)?', type: ApplicationCommandOptionType.Number, required: true } @@ -30,6 +30,19 @@ export default class extends Command { return; } + const existingAnswers = await interaction.client.mongo.collection(DB.USERS).findOne({ + discordId: interaction.user.id, + jobPreferences: { $exists: true } + }); + + if (!existingAnswers) { + interaction.reply({ + content: 'No preferences found, enter preferences by using the command /jobform', + ephemeral: true + }); + return; + } + const modal = new ModalBuilder() .setCustomId(`updateJobModal${questionSet}`) .setTitle(`Update Job Preferences (${questionSet + 1} of 2)`); From e0346cbbc09064598ed810a2b3441224d7bc46d9 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 2 Nov 2024 16:27:34 -0400 Subject: [PATCH 087/267] I do not remember what I changed --- src/commands/Jobs/updatePreferences.ts | 5 +++-- src/pieces/commandManager.ts | 7 ++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/commands/Jobs/updatePreferences.ts b/src/commands/Jobs/updatePreferences.ts index e5c9bf0a..2ed96567 100644 --- a/src/commands/Jobs/updatePreferences.ts +++ b/src/commands/Jobs/updatePreferences.ts @@ -1,3 +1,4 @@ +import { DB } from '@root/config'; import { Command } from '@root/src/lib/types/Command'; import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, @@ -29,7 +30,7 @@ export default class extends Command { interaction.reply({ content: 'Please enter either 1 or 2' }); return; } - + // Checks if ansers already exists. const existingAnswers = await interaction.client.mongo.collection(DB.USERS).findOne({ discordId: interaction.user.id, jobPreferences: { $exists: true } @@ -44,7 +45,7 @@ export default class extends Command { } const modal = new ModalBuilder() - .setCustomId(`updateJobModal${questionSet}`) + .setCustomId(`jobModal${questionSet}`) .setTitle(`Update Job Preferences (${questionSet + 1} of 2)`); const askedQuestions = questions[questionSet]; diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 262bd4f7..c2a28679 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -157,6 +157,11 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); const success = await jobPreferenceAPI.storeFormResponses(interaction.user.id, answers, formNumber); + const existingPref = await interaction.client.mongo.collection(DB.USERS).findOne({ + discordId: interaction.user.id, + jobPreferences: { $exists: true } + }); + const mess = existingPref ? // Takes user to questions, then interests. If submitted correctly, the answers will be stored. await interaction.reply({ content: success @@ -165,7 +170,7 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie ephemeral: true }); } catch (error) { - console.error('Job form error:', error); + console.error('update form error:', error); await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); } break; From 9b900f9e9e31420a96707b0f6e0068b33c17999c Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 2 Nov 2024 16:37:57 -0400 Subject: [PATCH 088/267] Added a new message in command Managager --- src/pieces/commandManager.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index c2a28679..ba5ed765 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -161,14 +161,19 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie discordId: interaction.user.id, jobPreferences: { $exists: true } }); - const mess = existingPref ? + const mess = existingPref ? `Success: Your preferences have been updated! ${formNumber === 0 + ? 'Please use /updateform qset:2 to complete your interests.' : ''}` + : `Success: Form ${formNumber + 1} submitted! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}`; // Takes user to questions, then interests. If submitted correctly, the answers will be stored. + // await interaction.reply({ + // content: success + // ? `Form ${formNumber + 1} submitted successfully! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}` + // : 'Error saving preferences. Please try again.', + // ephemeral: true + // }); await interaction.reply({ - content: success - ? `Form ${formNumber + 1} submitted successfully! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}` - : 'Error saving preferences. Please try again.', - ephemeral: true - }); + + }) } catch (error) { console.error('update form error:', error); await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); From b20f6ba89469edc9988738366bb542ca7cd00192 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 2 Nov 2024 16:40:42 -0400 Subject: [PATCH 089/267] Changed the ontent of the interaction.repy to match mess --- src/pieces/commandManager.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index ba5ed765..d1aa7692 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -172,8 +172,8 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie // ephemeral: true // }); await interaction.reply({ - - }) + content: success ? mess : 'Error saving preferences. Please try again' + }); } catch (error) { console.error('update form error:', error); await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); From ddcdf297a57de88f1df0cedd1b89cb366125d076 Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Sat, 2 Nov 2024 16:47:43 -0400 Subject: [PATCH 090/267] updated to check which question set is being added, not inserting initial correctly --- src/pieces/commandManager.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 92e1268f..292a0e13 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -167,7 +167,14 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie mode: 'public' // temporary }; - interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); + // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); + if (answerResponse.questionSet === '0') { + interaction.client.mongo.collection(DB.JOB_FORMS).update( + { questionSet: 0 }, answerResponse, { upsert: true }); + } else if (answerResponse.questionSet === '1') { + interaction.client.mongo.collection(DB.JOB_FORMS).update( + { questionSet: 1 }, answerResponse, { upsert: true }); + } break; } } From c847f87fa2366d57ce0b45f0f405cc2ad4e042ad Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Sat, 2 Nov 2024 16:50:12 -0400 Subject: [PATCH 091/267] update changed to updateOne since update is deprecated --- src/pieces/commandManager.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 292a0e13..b49c2500 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -169,10 +169,10 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); if (answerResponse.questionSet === '0') { - interaction.client.mongo.collection(DB.JOB_FORMS).update( + interaction.client.mongo.collection(DB.JOB_FORMS).updateOne( { questionSet: 0 }, answerResponse, { upsert: true }); } else if (answerResponse.questionSet === '1') { - interaction.client.mongo.collection(DB.JOB_FORMS).update( + interaction.client.mongo.collection(DB.JOB_FORMS).updateOne( { questionSet: 1 }, answerResponse, { upsert: true }); } break; From 082308a5add328553d2b40de721a111bbfa30237 Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Sat, 2 Nov 2024 17:22:13 -0400 Subject: [PATCH 092/267] changed to replace since update is moreso fields, not actually replacing yet --- src/pieces/commandManager.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index b49c2500..d5e85b87 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -169,10 +169,10 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); if (answerResponse.questionSet === '0') { - interaction.client.mongo.collection(DB.JOB_FORMS).updateOne( + interaction.client.mongo.collection(DB.JOB_FORMS).replaceOne( { questionSet: 0 }, answerResponse, { upsert: true }); } else if (answerResponse.questionSet === '1') { - interaction.client.mongo.collection(DB.JOB_FORMS).updateOne( + interaction.client.mongo.collection(DB.JOB_FORMS).replaceOne( { questionSet: 1 }, answerResponse, { upsert: true }); } break; From 781ca649e5b2e7cf9f5ef58aa5e4ca03693b2c71 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 3 Nov 2024 17:13:11 -0500 Subject: [PATCH 093/267] added updateModal --- src/pieces/commandManager.ts | 38 ++++++++---------------------------- 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index d1aa7692..301c9f04 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -147,7 +147,8 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie interaction.reply({ content: `Thank you for verifying! You can now access the rest of the server. ${enrollStr}`, ephemeral: true }); break; } - case 'jobModal': { + case 'jobModal': + case 'updateModal': { try { // extracting the input from the modal const formNumber = parseInt(customId.slice(-1)); @@ -156,12 +157,12 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie // Create API instance with the database instance directly const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); const success = await jobPreferenceAPI.storeFormResponses(interaction.user.id, answers, formNumber); - - const existingPref = await interaction.client.mongo.collection(DB.USERS).findOne({ - discordId: interaction.user.id, - jobPreferences: { $exists: true } - }); - const mess = existingPref ? `Success: Your preferences have been updated! ${formNumber === 0 + const isUpdate = customId.replace(/[0-9]/g, '') === 'updateModal'; + // const existingPref = await interaction.client.mongo.collection(DB.USERS).findOne({ + // discordId: interaction.user.id, + // jobPreferences: { $exists: true } + // }); + const mess = isUpdate ? `Success: Your preferences have been updated! ${formNumber === 0 ? 'Please use /updateform qset:2 to complete your interests.' : ''}` : `Success: Form ${formNumber + 1} submitted! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}`; // Takes user to questions, then interests. If submitted correctly, the answers will be stored. @@ -180,29 +181,6 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie } break; } - // case 'updateJobModal': { - // try { - // // extracting the input from the modal - // const formNumber = parseInt(customId.slice(-1)); - // const answers = [1, 2, 3, 4, 5].slice(0, formNumber === 0 ? 4 : 5).map(num => fields.getTextInputValue(`question${num}`)); - - // // Create API instance with the database instance directly - // const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); - // const success = await jobPreferenceAPI.storeFormResponses(interaction.user.id, answers, formNumber); - - // // Takes user to questions, then interests. If submitted correctly, the answers will be stored. - // await interaction.reply({ - // content: success - // ? `Form ${formNumber + 1} submitted successfully! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}` - // : 'Error saving preferences. Please try again.', - // ephemeral: true - // }); - // } catch (error) { - // console.error('Job form error:', error); - // await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); - // } - // break; - // } } } From 0089797853f551c3d58bb21541158d755022dfa1 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 3 Nov 2024 17:25:03 -0500 Subject: [PATCH 094/267] Fixed a misspelling --- src/commands/Jobs/updatePreferences.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/Jobs/updatePreferences.ts b/src/commands/Jobs/updatePreferences.ts index 2ed96567..f9bb132f 100644 --- a/src/commands/Jobs/updatePreferences.ts +++ b/src/commands/Jobs/updatePreferences.ts @@ -11,7 +11,7 @@ const questions = [ export default class extends Command { - name: 'update_prefereces' + name: 'update_preferences' description = 'View and update your preferences for jobs to be used with the Job Alert System!'; options: ApplicationCommandOptionData[] = [ @@ -45,7 +45,7 @@ export default class extends Command { } const modal = new ModalBuilder() - .setCustomId(`jobModal${questionSet}`) + .setCustomId(`updateModal${questionSet}`) .setTitle(`Update Job Preferences (${questionSet + 1} of 2)`); const askedQuestions = questions[questionSet]; From d1b579966acbbb91a9e68aba5b0ca9d6328a1eee Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 3 Nov 2024 17:48:28 -0500 Subject: [PATCH 095/267] added choices in ApplicationCommandOptionData[] --- src/commands/Jobs/updatePreferences.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/commands/Jobs/updatePreferences.ts b/src/commands/Jobs/updatePreferences.ts index f9bb132f..42167c76 100644 --- a/src/commands/Jobs/updatePreferences.ts +++ b/src/commands/Jobs/updatePreferences.ts @@ -11,7 +11,7 @@ const questions = [ export default class extends Command { - name: 'update_preferences' + name: 'updatePreferences' description = 'View and update your preferences for jobs to be used with the Job Alert System!'; options: ApplicationCommandOptionData[] = [ @@ -19,7 +19,11 @@ export default class extends Command { name: 'qset', description: 'Which question set do you want to view and update(1 or 2)?', type: ApplicationCommandOptionType.Number, - required: true + required: true, + choices: [ + { name: 'qset 1', value: 1 }, + { name: 'qset 2', value: 2 } + ] } ] From ee2784e442055aeeb513e352d20d5f918b3d2089 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 3 Nov 2024 18:03:07 -0500 Subject: [PATCH 096/267] deleted a file and rename updatePreferences.ts to updatepreferences.ts --- src/commands/Jobs/updatePreferences.ts | 2 +- src/lib/types/jobPreference.d.ts | 18 ------------------ 2 files changed, 1 insertion(+), 19 deletions(-) delete mode 100644 src/lib/types/jobPreference.d.ts diff --git a/src/commands/Jobs/updatePreferences.ts b/src/commands/Jobs/updatePreferences.ts index 42167c76..fd9aa300 100644 --- a/src/commands/Jobs/updatePreferences.ts +++ b/src/commands/Jobs/updatePreferences.ts @@ -11,7 +11,7 @@ const questions = [ export default class extends Command { - name: 'updatePreferences' + name: 'updatepreferences' description = 'View and update your preferences for jobs to be used with the Job Alert System!'; options: ApplicationCommandOptionData[] = [ diff --git a/src/lib/types/jobPreference.d.ts b/src/lib/types/jobPreference.d.ts deleted file mode 100644 index 1367c301..00000000 --- a/src/lib/types/jobPreference.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -export interface JobPreferences { - userID: string; - answers: { - // Questions - city: string; - workType: string; - employmentType: string; - travelDistance: string; - // Interests - interest1: string; - interest2: string; - interest3: string; - interest4: string; - interest5: string; - }; - lastUpdated: Date; - mode: 'public' | 'private' -} From 4c6d1becfcf2be3d153dcdbe803a1e990180d3d9 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 3 Nov 2024 19:20:23 -0500 Subject: [PATCH 097/267] added choices to jobform.ts --- src/commands/Jobs/updatePreferences.ts | 2 +- src/commands/jobs/jobform.ts | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/commands/Jobs/updatePreferences.ts b/src/commands/Jobs/updatePreferences.ts index fd9aa300..97a0e969 100644 --- a/src/commands/Jobs/updatePreferences.ts +++ b/src/commands/Jobs/updatePreferences.ts @@ -11,7 +11,7 @@ const questions = [ export default class extends Command { - name: 'updatepreferences' + name: 'update preferences' description = 'View and update your preferences for jobs to be used with the Job Alert System!'; options: ApplicationCommandOptionData[] = [ diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index a370bb3a..e4f10ba2 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -18,7 +18,11 @@ export default class extends Command { name: 'qset', description: 'Which question set do you want to view (1 or 2).', type: ApplicationCommandOptionType.Number, - required: true + required: true, + choices: [ + { name: 'qset 1', value: 1 }, + { name: 'qset 2', value: 2 } + ] } ] From 310960d27d041597827554561750b123f6e37706 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Mon, 4 Nov 2024 09:45:23 -0500 Subject: [PATCH 098/267] pushing so that othe people can use the code --- .../Jobs/{updatePreferences.ts => update_preferences.ts} | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) rename src/commands/Jobs/{updatePreferences.ts => update_preferences.ts} (93%) diff --git a/src/commands/Jobs/updatePreferences.ts b/src/commands/Jobs/update_preferences.ts similarity index 93% rename from src/commands/Jobs/updatePreferences.ts rename to src/commands/Jobs/update_preferences.ts index 97a0e969..3f095782 100644 --- a/src/commands/Jobs/updatePreferences.ts +++ b/src/commands/Jobs/update_preferences.ts @@ -3,6 +3,7 @@ import { Command } from '@root/src/lib/types/Command'; import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, TextInputBuilder, TextInputStyle } from 'discord.js'; +import { JobPreferenceAPI } from './jobDatabase'; const questions = [ ['What city are you located in?', 'Are you looking for remote or in person?', 'Job, internship or both?', 'How far are you willing to travel?'], @@ -11,7 +12,7 @@ const questions = [ export default class extends Command { - name: 'update preferences' + name: 'update_preferences' description = 'View and update your preferences for jobs to be used with the Job Alert System!'; options: ApplicationCommandOptionData[] = [ @@ -48,6 +49,9 @@ export default class extends Command { return; } + // const currentAnswers = existingAnswers.jobPreferences[questionSet]; + // let prefDisplay = + const modal = new ModalBuilder() .setCustomId(`updateModal${questionSet}`) .setTitle(`Update Job Preferences (${questionSet + 1} of 2)`); From 5e439798158f3f5564ba96938cb5c48d28cbd317 Mon Sep 17 00:00:00 2001 From: Saieda Ali Zada <143635010+SaiedaJN@users.noreply.github.com> Date: Mon, 4 Nov 2024 09:47:09 -0500 Subject: [PATCH 099/267] just commented out something in Adzuna_job_search --- src/commands/jobs/Adzuna_job_search.ts | 7 ++----- src/pieces/commandManager.ts | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/commands/jobs/Adzuna_job_search.ts b/src/commands/jobs/Adzuna_job_search.ts index eb70c35a..d03d9f95 100644 --- a/src/commands/jobs/Adzuna_job_search.ts +++ b/src/commands/jobs/Adzuna_job_search.ts @@ -2,11 +2,6 @@ import { APP_ID, APP_KEY } from '@root/config'; // import axios from 'axios'; -// Questions: how to pull it? Do I need to pull it? -// how to work on the next part of the project? -// Task 3.5: Store fetched job listings temporarily for job matching -// Create a local cache or temporary storage to hold job listings for processing. - const JOB_TITLE = 'software engineer'; const LOCATION = 'us'; // const SALARY_MIN = 50000; @@ -27,3 +22,5 @@ fetch(URL) .catch((error) => { console.error('Fetch error:', error); }); + //interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(responseData); + //const jobAnswers = questionIDs[qSet].map((question) => interaction.fields.getTextInputValue(`question${question}`)); diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 811d0355..f2fabb1b 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -13,7 +13,7 @@ import { Course } from '../lib/types/Course'; import { SageUser } from '../lib/types/SageUser'; import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; -import { JobPreferenceAPI } from '../commands/Jobs/APIDatabase'; +import { JobPreferenceAPI } from '../commands/jobs/APIDatabase'; const DELETE_DELAY = 10000; From 8924e66dd7814abc8c1e6de42371a62d50f05e58 Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Mon, 4 Nov 2024 10:02:23 -0500 Subject: [PATCH 100/267] merge conflicts resolved --- .github/workflows/node.js.yml | 4 ---- src/pieces/commandManager.ts | 39 ++++++++++++++++++----------------- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index d4e2c0ad..af54dd53 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -24,11 +24,7 @@ jobs: # Add this step to copy config.example.ts to config.ts - name: Set config file run: cp config.example.ts config.ts -<<<<<<< HEAD - -======= ->>>>>>> 2fc35a1b74bdadac6dcbbd192883384abe8e81e7 - name: build run: | npm run build 2>&1 | tee build-output.log diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 5f53ed77..fc943fed 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -177,29 +177,30 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie : 'Error saving preferences. Please try again.', ephemeral: true }); + + const answerResponse: Job = { + owner: interaction.user.id, + content: '', + location: '', + questionSet: formNumber, + answers: answers, + mode: 'public' // temporary + }; + + + // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); + if (answerResponse.questionSet === '0') { + interaction.client.mongo.collection(DB.JOB_FORMS).replaceOne( + { questionSet: 0 }, answerResponse, { upsert: true }); + } else if (answerResponse.questionSet === '1') { + interaction.client.mongo.collection(DB.JOB_FORMS).replaceOne( + { questionSet: 1 }, answerResponse, { upsert: true }); + } + break; } catch (error) { console.error('Job form error:', error); await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); } - - const answerResponse: Job = { - owner: interaction.user.id, - content: '', - location: '', - questionSet: qSet, - answers: jobAnswers, - mode: 'public' // temporary - }; - - // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); - if (answerResponse.questionSet === '0') { - interaction.client.mongo.collection(DB.JOB_FORMS).replaceOne( - { questionSet: 0 }, answerResponse, { upsert: true }); - } else if (answerResponse.questionSet === '1') { - interaction.client.mongo.collection(DB.JOB_FORMS).replaceOne( - { questionSet: 1 }, answerResponse, { upsert: true }); - } - break; } } } From 18d8d4a49d8abd06e0420931bf6d852933aaaf97 Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Tue, 5 Nov 2024 16:21:03 -0500 Subject: [PATCH 101/267] changed public to private, replacing correctly experiencing modal issue --- src/pieces/commandManager.ts | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index fc943fed..4f12040c 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -14,7 +14,7 @@ import { SageUser } from '../lib/types/SageUser'; import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; import { Job } from '../lib/types/Job'; -import { JobPreferenceAPI } from '../commands/Jobs/APIDatabase'; +import { JobPreferenceAPI } from '../commands/jobs/APIDatabase'; const DELETE_DELAY = 10000; @@ -170,13 +170,7 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); const success = await jobPreferenceAPI.storeFormResponses(interaction.user.id, answers, formNumber); - // Takes user to questions, then interests. If submitted correctly, the answers will be stored. - await interaction.reply({ - content: success - ? `Form ${formNumber + 1} submitted successfully! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}` - : 'Error saving preferences. Please try again.', - ephemeral: true - }); + console.log('before answerResponse'); const answerResponse: Job = { owner: interaction.user.id, @@ -184,19 +178,32 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie location: '', questionSet: formNumber, answers: answers, - mode: 'public' // temporary + mode: 'private' // temporary - switch to private before final submission }; + console.log('after answerResponse, before mongo handling'); // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); - if (answerResponse.questionSet === '0') { - interaction.client.mongo.collection(DB.JOB_FORMS).replaceOne( + if (answerResponse.questionSet === 0) { + console.log('in qset 1 branch, before mongo insertion'); + interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( { questionSet: 0 }, answerResponse, { upsert: true }); - } else if (answerResponse.questionSet === '1') { - interaction.client.mongo.collection(DB.JOB_FORMS).replaceOne( + console.log('after mongo insertion'); + } else if (answerResponse.questionSet === 1) { + console.log('before mongodb'); + interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( { questionSet: 1 }, answerResponse, { upsert: true }); + console.log('after mongodb'); } break; + + // Takes user to questions, then interests. If submitted correctly, the answers will be stored. + await interaction.reply({ + content: success + ? `Form ${formNumber + 1} submitted successfully! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}` + : 'Error saving preferences. Please try again.', + ephemeral: true + }); } catch (error) { console.error('Job form error:', error); await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); From dafad77d4ee1588def7105b757c84ab7a86031d6 Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Tue, 5 Nov 2024 16:26:29 -0500 Subject: [PATCH 102/267] fix modal issue :D, inserts and updates correctly --- src/pieces/commandManager.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 4f12040c..00f106d0 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -195,7 +195,8 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie { questionSet: 1 }, answerResponse, { upsert: true }); console.log('after mongodb'); } - break; + + console.log('out of question set branches'); // Takes user to questions, then interests. If submitted correctly, the answers will be stored. await interaction.reply({ From e2b90e772e1b82c59256ee5284eb6117a3399d28 Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Tue, 5 Nov 2024 16:27:41 -0500 Subject: [PATCH 103/267] removed debugging console statements --- src/pieces/commandManager.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 00f106d0..1b98d795 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -181,23 +181,15 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie mode: 'private' // temporary - switch to private before final submission }; - console.log('after answerResponse, before mongo handling'); - // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); if (answerResponse.questionSet === 0) { - console.log('in qset 1 branch, before mongo insertion'); interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( { questionSet: 0 }, answerResponse, { upsert: true }); - console.log('after mongo insertion'); } else if (answerResponse.questionSet === 1) { - console.log('before mongodb'); interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( { questionSet: 1 }, answerResponse, { upsert: true }); - console.log('after mongodb'); } - console.log('out of question set branches'); - // Takes user to questions, then interests. If submitted correctly, the answers will be stored. await interaction.reply({ content: success From 920c2d09d05892113f06e5505c3e1fa40465888a Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Tue, 5 Nov 2024 17:10:26 -0500 Subject: [PATCH 104/267] currently not recognizing command, need to prob merge again --- src/commands/Jobs/updatePreferences.ts | 89 ++++++++++++++++++++++++++ src/pieces/commandManager.ts | 3 +- 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/src/commands/Jobs/updatePreferences.ts b/src/commands/Jobs/updatePreferences.ts index e69de29b..ecb8c4f2 100644 --- a/src/commands/Jobs/updatePreferences.ts +++ b/src/commands/Jobs/updatePreferences.ts @@ -0,0 +1,89 @@ +import { DB } from '@root/config'; +import { Command } from '@root/src/lib/types/Command'; +import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptionType, + ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, + TextInputBuilder, TextInputStyle } from 'discord.js'; +// import { JobPreferenceAPI } from './jobDatabase'; + +const questions = [ + ['What city are you located in?', 'Are you looking for remote or in person?', 'Job, internship or both?', 'How far are you willing to travel?'], + ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] +]; + +export default class extends Command { + + name: 'update_preferences' + description = 'View and update your preferences for jobs to be used with the Job Alert System!'; + + options: ApplicationCommandOptionData[] = [ + { + name: 'qset', + description: 'Which question set do you want to view and update(1 or 2)?', + type: ApplicationCommandOptionType.Number, + required: true, + choices: [ + { name: 'qset 1', value: 0 }, + { name: 'qset 2', value: 1 } + ] + } + ] + + async run(interaction: ChatInputCommandInteraction): Promise | void> { + const questionSet = interaction.options.getNumber('qset'); + + if (questionSet !== 0 && questionSet !== 1) { + interaction.reply({ content: 'Please enter either 1 or 2' }); + return; + } + // Checks if answers already exists. + const existingAnswers = await interaction.client.mongo.collection(DB.USERS).findOne({ + discordId: interaction.user.id, + jobPreferences: { $exists: true } + }); + + if (!existingAnswers) { + interaction.reply({ + content: 'No preferences found, enter preferences by using the command /jobform', + ephemeral: true + }); + return; + } + + // const currentAnswers = existingAnswers.jobPreferences[questionSet]; + // let prefDisplay = + + const modal = new ModalBuilder() + .setCustomId(`updateModal${questionSet}`) + .setTitle(`Update Job Preferences (${questionSet + 1} of 2)`); + + const askedQuestions = questions[questionSet]; + const rows = askedQuestions.map((question) => this.getAnswerField(question, askedQuestions.indexOf(question))); + + for (const row of rows) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + modal.addComponents(row); + } + + await interaction.showModal(modal); + + // Answers are handled in src/pieces/commandManager.ts on line 149 + + return; + } + + + getAnswer(fields: ModalSubmitFields, questionNum: number): string { + return fields.getField(`question${questionNum + 1}`).value; + } + + + getAnswerField(question: string, questionNum: number): ActionRowBuilder { + return new ActionRowBuilder({ components: [new TextInputBuilder() + .setCustomId(`question${questionNum + 1}`) + .setLabel(`${question}`) + .setStyle(TextInputStyle.Short) + .setPlaceholder('Input Updated Answer Here')] }); + } + +} diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 1b98d795..184cefcd 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -193,7 +193,8 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie // Takes user to questions, then interests. If submitted correctly, the answers will be stored. await interaction.reply({ content: success - ? `Form ${formNumber + 1} submitted successfully! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}` + ? `Form ${formNumber + 1} submitted successfully! Your answers are {${answers}}.' ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''} + To change your answers do /update_preferences.` : 'Error saving preferences. Please try again.', ephemeral: true }); From 611d8bac7d4fabea0e24e59232198d0d2e2e7443 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 5 Nov 2024 21:04:50 -0500 Subject: [PATCH 105/267] added filterAnswers in jobDatabase.ts --- src/commands/Jobs/jobDatabase.ts | 5 +++++ src/commands/Jobs/update_preferences.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/commands/Jobs/jobDatabase.ts b/src/commands/Jobs/jobDatabase.ts index fb50d085..38f1597d 100644 --- a/src/commands/Jobs/jobDatabase.ts +++ b/src/commands/Jobs/jobDatabase.ts @@ -33,6 +33,11 @@ export class JobPreferenceAPI { async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise { try { let updateObject = {}; + const filterAnswers = answers.map(answer => answer.trim()).map((answer, index) => ({ + index, + answer + })).filter(item => item.answer !== ''); + // Adds answers to questions. if (questionSet === 0) { updateObject = { diff --git a/src/commands/Jobs/update_preferences.ts b/src/commands/Jobs/update_preferences.ts index 3f095782..f3cdb356 100644 --- a/src/commands/Jobs/update_preferences.ts +++ b/src/commands/Jobs/update_preferences.ts @@ -3,7 +3,7 @@ import { Command } from '@root/src/lib/types/Command'; import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, TextInputBuilder, TextInputStyle } from 'discord.js'; -import { JobPreferenceAPI } from './jobDatabase'; + const questions = [ ['What city are you located in?', 'Are you looking for remote or in person?', 'Job, internship or both?', 'How far are you willing to travel?'], @@ -38,7 +38,7 @@ export default class extends Command { // Checks if ansers already exists. const existingAnswers = await interaction.client.mongo.collection(DB.USERS).findOne({ discordId: interaction.user.id, - jobPreferences: { $exists: true } + jobPreference: { $exists: true } }); if (!existingAnswers) { From 5c39d36827419e137103373dc6cc83ac50540a5a Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 5 Nov 2024 21:55:25 -0500 Subject: [PATCH 106/267] Made it so that the data would update only if new data is inserted --- src/commands/Jobs/jobDatabase.ts | 70 +++++++++++++++++++------------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/src/commands/Jobs/jobDatabase.ts b/src/commands/Jobs/jobDatabase.ts index 38f1597d..b81e8fb2 100644 --- a/src/commands/Jobs/jobDatabase.ts +++ b/src/commands/Jobs/jobDatabase.ts @@ -1,6 +1,7 @@ import { Collection, Db, MongoClient } from 'mongodb'; import { DB } from '@root/config'; import { Command } from '@root/src/lib/types/Command'; +import { Emoji } from 'discord.js'; interface JobPreferences { userID: string; @@ -33,41 +34,54 @@ export class JobPreferenceAPI { async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise { try { let updateObject = {}; - const filterAnswers = answers.map(answer => answer.trim()).map((answer, index) => ({ - index, - answer - })).filter(item => item.answer !== ''); + // const filterAnswers = answers.map(answer => answer.trim()).map((answer, index) => ({ + // index, + // answer + // })).filter(item => item.answer !== ''); // Adds answers to questions. if (questionSet === 0) { - updateObject = { - 'jobPreferences.answers.city': answers[0], - 'jobPreferences.answers.workType': answers[1], - 'jobPreferences.answers.employmentType': answers[2], - 'jobPreferences.answers.travelDistance': answers[3] - }; + // updateObject = { + // 'jobPreferences.answers.city': answers[0], + // 'jobPreferences.answers.workType': answers[1], + // 'jobPreferences.answers.employmentType': answers[2], + // 'jobPreferences.answers.travelDistance': answers[3] + // }; + const [city, workType, employmentType, travelDistance] = answers; + if (city?.trim()) updateObject['jobPreferences.answers.city'] = city; + if (workType?.trim()) updateObject['jobPreferences.answers.workType'] = workType; + if (employmentType?.trim()) updateObject['jobPreferences.answers.employmentType'] = employmentType; + if (travelDistance?.trim()) updateObject['jobPreferences.answers.travelDistance'] = travelDistance; // Adds answers to interests. } else if (questionSet === 1) { - updateObject = { - 'jobPreferences.answers.interest1': answers[0], - 'jobPreferences.answers.interest2': answers[1], - 'jobPreferences.answers.interest3': answers[2], - 'jobPreferences.answers.interest4': answers[3], - 'jobPreferences.answers.interest5': answers[4] - }; + // updateObject = { + // 'jobPreferences.answers.interest1': answers[0], + // 'jobPreferences.answers.interest2': answers[1], + // 'jobPreferences.answers.interest3': answers[2], + // 'jobPreferences.answers.interest4': answers[3], + // 'jobPreferences.answers.interest5': answers[4] + // }; + const [interest1, interest2, interest3, interest4, interest5] = answers; + if (interest1?.trim()) updateObject['jobPreferences.answers.interest1'] = interest1; + if (interest2?.trim()) updateObject['jobPreferences.answers.interest2'] = interest2; + if (interest3?.trim()) updateObject['jobPreferences.asnwers.interest3'] = interest3; + if (interest4?.trim()) updateObject['jobPreferences.answers.interest4'] = interest4; + if (interest5?.trim()) updateObject['jobPreferences.answers.interest5'] = interest5; } // Updates preferences with new answers and the new date inputted. - await this.collection.updateOne( - { discordId: userID }, - { - $set: { - ...updateObject, - 'jobPreferences.userID': userID, - 'jobPreferences.lastUpdated': new Date() - } - }, - { upsert: true } - ); + if (Object.keys(updateObject).length > 0) { + await this.collection.updateOne( + { discordId: userID }, + { + $set: { + ...updateObject, + 'jobPreferences.userID': userID, + 'jobPreferences.lastUpdated': new Date() + } + }, + { upsert: true } + ); + } return true; } catch (error) { console.error('Error storing job form responses', error); From 372dc4a2a6c8d4b7d2069917f926e1ec78fa6630 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 5 Nov 2024 22:04:11 -0500 Subject: [PATCH 107/267] fixde getPreferences --- src/commands/Jobs/jobDatabase.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/commands/Jobs/jobDatabase.ts b/src/commands/Jobs/jobDatabase.ts index b81e8fb2..1cc7dcb4 100644 --- a/src/commands/Jobs/jobDatabase.ts +++ b/src/commands/Jobs/jobDatabase.ts @@ -33,7 +33,7 @@ export class JobPreferenceAPI { async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise { try { - let updateObject = {}; + const updateObject = {}; // const filterAnswers = answers.map(answer => answer.trim()).map((answer, index) => ({ // index, // answer @@ -89,8 +89,15 @@ export class JobPreferenceAPI { } } - async getPreference(userID: string, answers: string[], questionSet: number): Promise { - return this.storeFormResponses(userID, answers, questionSet); + async getPreference(userID: string): Promise { + try { + const user = await this.collection.findOne({ discordId: userID }); + return user?.jobPreferences || null; + } catch (error) { + console.error('Error getting job form responses', error); + return false; + } + // return this.storeFormResponses(userID, answers, questionSet); } // Deletes the preferences answers to an empty string. async deletePreference(userID: string): Promise { From 3b9fc26efcc388345539a8e07975056d239e6ce9 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 5 Nov 2024 22:21:09 -0500 Subject: [PATCH 108/267] changed minor issues --- src/commands/Jobs/update_preferences.ts | 3 ++- src/pieces/commandManager.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/commands/Jobs/update_preferences.ts b/src/commands/Jobs/update_preferences.ts index f3cdb356..5478d1b7 100644 --- a/src/commands/Jobs/update_preferences.ts +++ b/src/commands/Jobs/update_preferences.ts @@ -83,7 +83,8 @@ export default class extends Command { .setCustomId(`question${questionNum + 1}`) .setLabel(`${question}`) .setStyle(TextInputStyle.Short) - .setPlaceholder('Input Updated Answer Here')] }); + .setPlaceholder('Input Updated Answer Here') + .setRequired(false)] }); } } diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 301c9f04..60ac6fdf 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -173,7 +173,8 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie // ephemeral: true // }); await interaction.reply({ - content: success ? mess : 'Error saving preferences. Please try again' + content: success ? mess : 'Error saving preferences. Please try again', + ephemeral: true }); } catch (error) { console.error('update form error:', error); From d8b99704959ca1a9ecf9eb89e476bb2d269db26f Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 5 Nov 2024 22:42:17 -0500 Subject: [PATCH 109/267] The udate_preference form now works --- src/commands/Jobs/jobDatabase.ts | 18 ----------------- src/commands/Jobs/update_preferences.ts | 26 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/commands/Jobs/jobDatabase.ts b/src/commands/Jobs/jobDatabase.ts index 1cc7dcb4..a7ec0b95 100644 --- a/src/commands/Jobs/jobDatabase.ts +++ b/src/commands/Jobs/jobDatabase.ts @@ -34,19 +34,9 @@ export class JobPreferenceAPI { async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise { try { const updateObject = {}; - // const filterAnswers = answers.map(answer => answer.trim()).map((answer, index) => ({ - // index, - // answer - // })).filter(item => item.answer !== ''); // Adds answers to questions. if (questionSet === 0) { - // updateObject = { - // 'jobPreferences.answers.city': answers[0], - // 'jobPreferences.answers.workType': answers[1], - // 'jobPreferences.answers.employmentType': answers[2], - // 'jobPreferences.answers.travelDistance': answers[3] - // }; const [city, workType, employmentType, travelDistance] = answers; if (city?.trim()) updateObject['jobPreferences.answers.city'] = city; if (workType?.trim()) updateObject['jobPreferences.answers.workType'] = workType; @@ -54,13 +44,6 @@ export class JobPreferenceAPI { if (travelDistance?.trim()) updateObject['jobPreferences.answers.travelDistance'] = travelDistance; // Adds answers to interests. } else if (questionSet === 1) { - // updateObject = { - // 'jobPreferences.answers.interest1': answers[0], - // 'jobPreferences.answers.interest2': answers[1], - // 'jobPreferences.answers.interest3': answers[2], - // 'jobPreferences.answers.interest4': answers[3], - // 'jobPreferences.answers.interest5': answers[4] - // }; const [interest1, interest2, interest3, interest4, interest5] = answers; if (interest1?.trim()) updateObject['jobPreferences.answers.interest1'] = interest1; if (interest2?.trim()) updateObject['jobPreferences.answers.interest2'] = interest2; @@ -97,7 +80,6 @@ export class JobPreferenceAPI { console.error('Error getting job form responses', error); return false; } - // return this.storeFormResponses(userID, answers, questionSet); } // Deletes the preferences answers to an empty string. async deletePreference(userID: string): Promise { diff --git a/src/commands/Jobs/update_preferences.ts b/src/commands/Jobs/update_preferences.ts index 5478d1b7..b3b34ff2 100644 --- a/src/commands/Jobs/update_preferences.ts +++ b/src/commands/Jobs/update_preferences.ts @@ -12,7 +12,7 @@ const questions = [ export default class extends Command { - name: 'update_preferences' + name = 'update_preferences' description = 'View and update your preferences for jobs to be used with the Job Alert System!'; options: ApplicationCommandOptionData[] = [ @@ -38,7 +38,7 @@ export default class extends Command { // Checks if ansers already exists. const existingAnswers = await interaction.client.mongo.collection(DB.USERS).findOne({ discordId: interaction.user.id, - jobPreference: { $exists: true } + jobPreferences: { $exists: true } }); if (!existingAnswers) { @@ -48,16 +48,24 @@ export default class extends Command { }); return; } - - // const currentAnswers = existingAnswers.jobPreferences[questionSet]; - // let prefDisplay = + const currentAns = existingAnswers.jobPreferences?.answers; + const askedQuestions = questions[questionSet]; + const quesChoices = questionSet === 0 + ? ['city', 'workType', 'employmentType', 'travelDistance'] + : ['interest1', 'interest2', 'interest3', 'interest4', 'interest5']; + + const rows = askedQuestions.map((question) => { + let value = ''; + if (currentAns) { + value = currentAns[quesChoices[askedQuestions.indexOf(question)]] || ''; + } + return this.getAnswerField(question, askedQuestions.indexOf(question), value); + }); const modal = new ModalBuilder() .setCustomId(`updateModal${questionSet}`) .setTitle(`Update Job Preferences (${questionSet + 1} of 2)`); - const askedQuestions = questions[questionSet]; - const rows = askedQuestions.map((question) => this.getAnswerField(question, askedQuestions.indexOf(question))); for (const row of rows) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -78,12 +86,12 @@ export default class extends Command { } - getAnswerField(question: string, questionNum: number): ActionRowBuilder { + getAnswerField(question: string, questionNum: number, value: string): ActionRowBuilder { return new ActionRowBuilder({ components: [new TextInputBuilder() .setCustomId(`question${questionNum + 1}`) .setLabel(`${question}`) .setStyle(TextInputStyle.Short) - .setPlaceholder('Input Updated Answer Here') + .setPlaceholder(`Current value: ${value || 'Not Set'}`) .setRequired(false)] }); } From 84870b361725c3a1e30594e04ada6b2221e6d58e Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 5 Nov 2024 22:48:18 -0500 Subject: [PATCH 110/267] deleted unnesarcy comments --- src/pieces/commandManager.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 60ac6fdf..ead9501a 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -158,20 +158,10 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); const success = await jobPreferenceAPI.storeFormResponses(interaction.user.id, answers, formNumber); const isUpdate = customId.replace(/[0-9]/g, '') === 'updateModal'; - // const existingPref = await interaction.client.mongo.collection(DB.USERS).findOne({ - // discordId: interaction.user.id, - // jobPreferences: { $exists: true } - // }); const mess = isUpdate ? `Success: Your preferences have been updated! ${formNumber === 0 ? 'Please use /updateform qset:2 to complete your interests.' : ''}` : `Success: Form ${formNumber + 1} submitted! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}`; // Takes user to questions, then interests. If submitted correctly, the answers will be stored. - // await interaction.reply({ - // content: success - // ? `Form ${formNumber + 1} submitted successfully! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}` - // : 'Error saving preferences. Please try again.', - // ephemeral: true - // }); await interaction.reply({ content: success ? mess : 'Error saving preferences. Please try again', ephemeral: true From 8d59e761f1dc54a07ac1cf1d77399eca6529406e Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 6 Nov 2024 01:09:20 -0500 Subject: [PATCH 111/267] redid job reminders message formatting so it includes more information --- src/pieces/tasks.ts | 50 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 16fd0d20..fb39f6f6 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -77,6 +77,44 @@ async function checkPolls(bot: Client): Promise { }); } +// NOTE: MAKE SURE YOU TAKE INTO CONSIDERATION THAT DISCORD HAS A CHARACTER LIMIT! +function jobMessage(reminder:Reminder):string { + return `## Hey <@${reminder.owner}>! +## Here's your list of job/internship recommendations: +Based on your interests in data visualization, cybersecurity, web development, AI ethics, and automation, I've found these jobs you may find of interest: + +1. **Junior Data Visualization Engineer** + * **Salary**: $60,000 - $75,000 annually + * **Location**: San Francisco, CA + * **Job Type**: Full-time + * **Work Mode**: Hybrid + * **Job Description**: + As a Junior Data Visualization Engineer, you will work closely with the data science team to design and implement visually compelling dashboards and data presentations. The role involves + using tools like Tableau and D3.js to communicate data insights in ways that are accessible and engaging for various stakeholders. + * **Apply here**: [application](https://www.techjobportal.com/apply-junior-dve) + +2. **Cybersecurity Intern** + * **Salary**: $20 - $30 per hour + * **Location**: Arlington, VA + * **Job Type**: Internship + * **Work Mode**: In-person + * **Job Description**: + This internship offers hands-on experience in network security, ethical hacking, and threat assessment. The intern will support the security team in identifying and mitigating vulnerabilities, + responding to incidents, and learning security protocols. + - **Apply here**: [application](https://www.cybersecureintern.com/apply) + +3. **Front-End Web Developer (Contract)** + * **Salary**: $45 - $55 per hour + * **Location**: Remote + * **Job Type**: Contract (3 months) + * **Work Mode**: Online + * **Job Description**: + We are looking for a talented Front-End Developer to help enhance our company's website and improve user experience. You'll work on creating responsive, interactive, and dynamic + interfaces using React and CSS frameworks. + * **Apply here**: [application](https://www.devhubjobs.com/frontend-developer) +`; +} + async function checkReminders(bot: Client): Promise { const reminders: Reminder[] = await bot.mongo.collection(DB.REMINDERS).find({ expires: { $lte: new Date() } }).toArray(); const pubChan = (await bot.channels.fetch(CHANNELS.SAGE)) as TextChannel; @@ -87,21 +125,15 @@ async function checkReminders(bot: Client): Promise { // personalized job recommendations, they'll need to fill out the job form (by default they're getting a list of jobs from anywhere) const message = reminder.mode === 'private' - ? `## Hey <@${reminder.owner}>! \n` + - `### Here's your list of job recommendations! \n` + - `1. A \n` + - `2. B \n` + - `3. C \n` + - `-# Please note that if you would like more personalized job recommendations ` + - `(i.e. local computer science internships/jobs with more personal preferences), please fill out the jobform ` + - `(use the command: \`/jobform\` in the server).` + ? jobMessage(reminder) : `<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`; if (reminder.mode === 'public') { pubChan.send(message); } else { bot.users.fetch(reminder.owner).then((user) => - user.send(message).catch(() => { + user.send(message).catch((err) => { + console.log('ERROR', err); pubChan.send( `<@${reminder.owner}>, I tried to send you a DM about your private reminder but it looks like you have DMs closed. Please enable DMs in the future if you'd like to get private reminders.` ); From 51acc8303aedfce0c3206a7c4006e6b994a453af Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 6 Nov 2024 01:09:50 -0500 Subject: [PATCH 112/267] fixed ESLint issues --- src/commands/jobs/jobform.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 8b6f15dd..65f12025 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -8,7 +8,7 @@ import { ModalBuilder, ModalSubmitFields, TextInputBuilder, - TextInputStyle, + TextInputStyle } from 'discord.js'; // prettier-ignore @@ -17,16 +17,17 @@ const questions = [ 'What city are you located in?', 'Are you looking for remote or in person?', 'Job, internship or both?', - 'How far are you willing to travel?', + 'How far are you willing to travel?' ], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; // prettier-ignore export default class extends Command { + name: 'jobform'; description = - 'Form to get your preferences for jobs to be used with the Job Alert System!'; + 'Form to get your preferences for jobs to be used with the Job Alert System!'; options: ApplicationCommandOptionData[] = [ { @@ -84,4 +85,5 @@ export default class extends Command { ] }); } + } From cebc64084da9e6c907f77861eb8004a12c7e871d Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Thu, 7 Nov 2024 20:55:31 -0500 Subject: [PATCH 113/267] updated collecting handling, should be final --- src/pieces/commandManager.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 2a1cd66e..5eb2af5c 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -14,6 +14,7 @@ import { SageUser } from '../lib/types/SageUser'; import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; import { JobPreferenceAPI } from '../commands/jobs/jobDatabase'; +import { Job } from '../lib/types/Job'; const DELETE_DELAY = 10000; @@ -154,6 +155,24 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie const formNumber = parseInt(customId.slice(-1)); const answers = [1, 2, 3, 4, 5].slice(0, formNumber === 0 ? 4 : 5).map(num => fields.getTextInputValue(`question${num}`)); + const answerResponse: Job = { + owner: interaction.user.id, + content: '', + location: '', + questionSet: formNumber, + answers: answers, + mode: 'private' // temporary - switch to private before final submission + }; + + // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); + if (answerResponse.questionSet === 0) { + interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( + { questionSet: 0 }, answerResponse, { upsert: true }); + } else if (answerResponse.questionSet === 1) { + interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( + { questionSet: 1 }, answerResponse, { upsert: true }); + } + // Create API instance with the database instance directly const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); const success = await jobPreferenceAPI.storeFormResponses(interaction.user.id, answers, formNumber); From 563855bcdd875280ae7d6137a9f916f446bf4e7d Mon Sep 17 00:00:00 2001 From: Saieda Ali Zada <143635010+SaiedaJN@users.noreply.github.com> Date: Sat, 9 Nov 2024 12:58:45 -0500 Subject: [PATCH 114/267] want to git pull --- src/commands/jobs/Adzuna_job_search.ts | 152 +++++++++++++++++++++++-- 1 file changed, 142 insertions(+), 10 deletions(-) diff --git a/src/commands/jobs/Adzuna_job_search.ts b/src/commands/jobs/Adzuna_job_search.ts index d03d9f95..090d2b58 100644 --- a/src/commands/jobs/Adzuna_job_search.ts +++ b/src/commands/jobs/Adzuna_job_search.ts @@ -1,13 +1,54 @@ -import { APP_ID, APP_KEY } from '@root/config'; -// import axios from 'axios'; + import { APP_ID, APP_KEY } from '@root/config'; +// import { DB, GUILDS, MAINTAINERS, CHANNELS } from '@root/config'; +// import { Command } from '@root/src/lib/types/Command'; +// import { ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, +// CommandInteraction, EmbedBuilder, InteractionResponse, Message, MessageContextMenuCommandInteraction } from 'discord.js'; + const JOB_TITLE = 'software engineer'; + const LOCATION = 'us'; + const SALARY_MIN = 50000; -const JOB_TITLE = 'software engineer'; -const LOCATION = 'us'; -// const SALARY_MIN = 50000; + const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} + &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; -const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} -&results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; + + +// // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(responseData); +// // const jobAnswers = questionIDs[qSet].map((question) => interaction.fields.getTextInputValue(`question${question}`)); + + +// export default class extends Command { +// description = `Ask the /job command for job listings based on your criteria.`; +// extendedHelp = `Provide the job title, location, and minimum salary to get a list of jobs.`; + +// options: ApplicationCommandOptionData[] = [ +// { +// name: 'JOB_TITLE', +// description: 'The job title you are asking for', +// type: ApplicationCommandOptionType.String, +// required: true, +// }, +// { +// name: 'LOCATION', +// description: 'The location of the job', +// type: ApplicationCommandOptionType.String, +// required: true, +// }, +// { +// name: 'SALARY_MIN', +// description: 'The minimum salary for the job', +// type: ApplicationCommandOptionType.Integer, +// required: true, +// }, +// ]; + +// async run(interaction: CommandInteraction | MessageContextMenuCommandInteraction): Promise | void | Message> { +// const jobTitle = interaction.options.getString('JOB_TITLE'); +// const location = interaction.options.getString('LOCATION'); +// const salarymin = interaction.options.getInteger('SALARY_MIN'); + +// const URL = `https://api.adzuna.com/v1/api/jobs/${location}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} +// &results_per_page=10&what=${encodeURIComponent(jobTitle)}&where=${encodeURIComponent(location)}`; fetch(URL) .then((response) => { @@ -17,10 +58,101 @@ fetch(URL) return response.json(); }) .then((responseData) => { - console.log(responseData); + // loop through each item in the result array + for (let i = 0; i < responseData.results.length; i++) { + console.log(responseData.results[i]); // Access each element + } }) .catch((error) => { console.error('Fetch error:', error); }); - //interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(responseData); - //const jobAnswers = questionIDs[qSet].map((question) => interaction.fields.getTextInputValue(`question${question}`)); + + + +// import { APP_ID, APP_KEY, DB } from '@root/config'; +// import { Command } from '@root/src/lib/types/Command'; +// // import { DB, GUILDS, MAINTAINERS, CHANNELS } from '@root/config'; +// // import { Command } from '@root/src/lib/types/Command'; +// import { ApplicationCommandOptionData, ApplicationCommandOptionType, CommandInteraction, EmbedBuilder, InteractionResponse, Message, MessageContextMenuCommandInteraction } from 'discord.js'; +// export default class extends Command { + +// description = `Ask the /job command for job listings based on your criteria.`; +// extendedHelp = `Provide the job title, location, and minimum salary to get a list of jobs.`; + +// options: ApplicationCommandOptionData[] = [ +// { +// name: 'JOB_TITLE', +// description: 'The job title you are asking for', +// type: ApplicationCommandOptionType.String, +// required: true +// }, +// { +// name: 'LOCATION', +// description: 'The location of the job', +// type: ApplicationCommandOptionType.String, +// required: true +// }, +// { +// name: 'SALARY_MIN', +// description: 'The minimum salary for the job', +// type: ApplicationCommandOptionType.Integer, +// required: true +// } +// ]; + +// async run(interaction: CommandInteraction | MessageContextMenuCommandInteraction): Promise | void | Message> { +// // Retrieve command options +// const jobTitle = interaction.options.getString('JOB_TITLE'); +// const location = interaction.options.getString('LOCATION'); +// const salaryMin = interaction.options.getInteger('SALARY_MIN'); + +// if (!jobTitle || !location || salaryMin === null) { +// return interaction.reply({ content: 'Please provide all required information.', ephemeral: true }); +// } + +// // Construct the URL with query parameters +// // eslint-disable-next-line max-len +// const URL = `https://api.adzuna.com/v1/api/jobs/${encodeURIComponent(location)}/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=10&what=${encodeURIComponent(jobTitle)}&where=${encodeURIComponent(location)}&salary_min=${salaryMin}`; + +// try { +// // Fetch job data +// const response = await fetch(URL); +// if (!response.ok) throw new Error(`HTTP error ${response.status}`); +// const responseData = await response.json(); + +// // Check if results exist and process each job +// if (Array.isArray(responseData.results)) { +// const jobResults = responseData.results.map((job: any) => ({ +// title: job.title, +// location: job.location.display_name, +// salary: job.salary_min, +// company: job.company.display_name +// })); + +// // Insert job data into the database +// await interaction.client.mongo.collection(DB.CLIENT_DATA).insertMany(jobResults); + +// // Build and send an embed with the job listings +// const embed = new EmbedBuilder() +// .setTitle('Job Listings') +// .setDescription('Here are some job listings based on your criteria:') +// .setColor('#0099ff'); + +// jobResults.forEach((job) => { +// embed.addFields({ +// name: job.title, +// value: `Location: ${job.location}\nCompany: ${job.company}\nSalary: ${job.salary || 'N/A'}`, +// }); +// }); + +// await interaction.reply({ embeds: [embed] }); +// } else { +// await interaction.reply({ content: 'No job results found.', ephemeral: true }); +// } +// } catch (error) { +// console.error('Fetch error:', error); +// await interaction.reply({ content: 'There was an error fetching job listings. Please try again later.', ephemeral: true }); +// } +// } + +// } From 78f5462fe60f11aac53b60ff9f715df463d5a1f6 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 9 Nov 2024 14:23:05 -0500 Subject: [PATCH 115/267] interest 3 is not fixed, it was not woking because i misspelled answer :(, wasted so much time --- src/commands/Jobs/jobDatabase.ts | 2 +- src/commands/Jobs/viewJobForm.ts | 35 -------------------------------- 2 files changed, 1 insertion(+), 36 deletions(-) delete mode 100644 src/commands/Jobs/viewJobForm.ts diff --git a/src/commands/Jobs/jobDatabase.ts b/src/commands/Jobs/jobDatabase.ts index a7ec0b95..a8a8f96c 100644 --- a/src/commands/Jobs/jobDatabase.ts +++ b/src/commands/Jobs/jobDatabase.ts @@ -47,7 +47,7 @@ export class JobPreferenceAPI { const [interest1, interest2, interest3, interest4, interest5] = answers; if (interest1?.trim()) updateObject['jobPreferences.answers.interest1'] = interest1; if (interest2?.trim()) updateObject['jobPreferences.answers.interest2'] = interest2; - if (interest3?.trim()) updateObject['jobPreferences.asnwers.interest3'] = interest3; + if (interest3?.trim()) updateObject['jobPreferences.answers.interest3'] = interest3; if (interest4?.trim()) updateObject['jobPreferences.answers.interest4'] = interest4; if (interest5?.trim()) updateObject['jobPreferences.answers.interest5'] = interest5; } diff --git a/src/commands/Jobs/viewJobForm.ts b/src/commands/Jobs/viewJobForm.ts deleted file mode 100644 index ac16190d..00000000 --- a/src/commands/Jobs/viewJobForm.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { DB } from '@root/config'; -import { ChatInputCommandInteraction, Embed, EmbedBuilder, InteractionResponse } from 'discord.js'; -import { reminderTime } from '@root/src/lib/utils/generalUtils'; -import { Command } from '@lib/types/Command'; -import jobform from './jobform'; -import { JobPreferenceAPI } from './jobDatabase'; - -export default class extends Command { - - description = 'See your answers and interests inserted into job form.'; - extendedHelp = 'Don\'t worry, answers and interests will be hidden if you use this command publicly.'; - - async run(interaction: ChatInputCommandInteraction): Promise | void> { - const jobAnswers = await interaction.client.mongo.collection(DB.USERS) - .findOne({ owner: interaction.user.id, jobPreferences: { $exists: true } }); - - if (!jobAnswers) { - interaction.reply({ content: 'You don\'t have any submitted anwers to the job form!', ephemeral: true }); - } - - const embeds = new EmbedBuilder() - .setTitle('Your Job Preferences') - .setColor('DarkAqua'); - const preferences = jobAnswers.jobPreferences.answers; - if (preferences) { - embeds.addFields( - { name: 'Preffered City', value: preferences.city }, - { name: 'Preffered Job Type', value: preferences.jobType }, - { name: 'Preffered Job Title', value: preferences.jobTitle }, - { name: 'Preffered Job Description', value: preferences.jobDescription } - ); - } - } - -} From 9d595527c0bed248fe4bfccc485e951b478ab29b Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 11 Nov 2024 01:04:31 -0500 Subject: [PATCH 116/267] implemented function for getting the user's job form data and combingrouping it all in an array so it'll be accessible and modified the job list message a little more by substituting the actual interests the user provided via the form --- src/pieces/tasks.ts | 70 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 16 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index fb39f6f6..b41bcf3d 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -1,8 +1,10 @@ -import { CHANNELS, DB } from '@root/config'; +import { BOT, CHANNELS, DB } from '@root/config'; import { ChannelType, Client, EmbedBuilder, TextChannel } from 'discord.js'; import { schedule } from 'node-cron'; import { Reminder } from '@lib/types/Reminder'; import { Poll, PollResult } from '@lib/types/Poll'; +import { MongoClient } from 'mongodb'; +import { Job } from '../lib/types/Job'; async function register(bot: Client): Promise { schedule('0/30 * * * * *', () => { @@ -77,11 +79,52 @@ async function checkPolls(bot: Client): Promise { }); } +interface JobData { + city: string, + preference: string, + jobType: string, + distance: string +} + +interface Interest { + interest1: string, + interest2: string, + interest3: string, + interest4: string, + interest5: string +} + +// eslint-disable-next-line no-warning-comments +async function getJobFormData(userID:string):Promise<[JobData, Interest]> { + const client = await MongoClient.connect(DB.CONNECTION, { useUnifiedTopology: true }); + const db = client.db(BOT.NAME).collection(DB.JOB_FORMS); + const jobformAnswers:Job[] = await db.find({ owner: userID }).toArray(); + + const jobData:JobData = { + city: jobformAnswers[0].answers[0], + preference: jobformAnswers[0].answers[1], + jobType: jobformAnswers[0].answers[2], + distance: jobformAnswers[0].answers[3] + }; + + const interests:Interest = { + interest1: jobformAnswers[1].answers[0], + interest2: jobformAnswers[1].answers[1], + interest3: jobformAnswers[1].answers[2], + interest4: jobformAnswers[1].answers[3], + interest5: jobformAnswers[1].answers[4] + }; + + return [jobData, interests]; +} + // NOTE: MAKE SURE YOU TAKE INTO CONSIDERATION THAT DISCORD HAS A CHARACTER LIMIT! -function jobMessage(reminder:Reminder):string { +async function jobMessage(reminder:Reminder, userID:string):Promise { + const jobFormData:[JobData, Interest] = await getJobFormData(userID); return `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations: -Based on your interests in data visualization, cybersecurity, web development, AI ethics, and automation, I've found these jobs you may find of interest: +Based on your interests in ${jobFormData[1].interest1}, ${jobFormData[1].interest2}, +${jobFormData[1].interest3}, ${jobFormData[1].interest4}, and ${jobFormData[1].interest5}, I've found these jobs you may find of interest: 1. **Junior Data Visualization Engineer** * **Salary**: $60,000 - $75,000 annually @@ -120,25 +163,20 @@ async function checkReminders(bot: Client): Promise { const pubChan = (await bot.channels.fetch(CHANNELS.SAGE)) as TextChannel; reminders.forEach((reminder) => { - // eslint-disable-next-line no-warning-comments - // TODO - need to find a way to check if the user has set their job preferences. If they haven't, find a way to check it and display the message advising them where in order to get - // personalized job recommendations, they'll need to fill out the job form (by default they're getting a list of jobs from anywhere) - - const message = reminder.mode === 'private' - ? jobMessage(reminder) - : `<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`; - if (reminder.mode === 'public') { - pubChan.send(message); + pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); } else { - bot.users.fetch(reminder.owner).then((user) => + bot.users.fetch(reminder.owner).then(async (user) => { + const message = await jobMessage(reminder, user.id); user.send(message).catch((err) => { - console.log('ERROR', err); + console.log('ERROR:', err); pubChan.send( `<@${reminder.owner}>, I tried to send you a DM about your private reminder but it looks like you have DMs closed. Please enable DMs in the future if you'd like to get private reminders.` ); - }) - ); + }); + }).catch((error) => { + console.error(`Failed to fetch user with ID: ${reminder.owner}`, error); + }); } const newReminder: Reminder = { From d1d1c60fc5ed50b440839f272327ad41d22240c6 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 11 Nov 2024 09:37:14 -0500 Subject: [PATCH 117/267] added disclaimer to job postings message --- src/pieces/tasks.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index b41bcf3d..360fe24c 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -118,7 +118,6 @@ async function getJobFormData(userID:string):Promise<[JobData, Interest]> { return [jobData, interests]; } -// NOTE: MAKE SURE YOU TAKE INTO CONSIDERATION THAT DISCORD HAS A CHARACTER LIMIT! async function jobMessage(reminder:Reminder, userID:string):Promise { const jobFormData:[JobData, Interest] = await getJobFormData(userID); return `## Hey <@${reminder.owner}>! @@ -145,16 +144,9 @@ ${jobFormData[1].interest3}, ${jobFormData[1].interest4}, and ${jobFormData[1].i This internship offers hands-on experience in network security, ethical hacking, and threat assessment. The intern will support the security team in identifying and mitigating vulnerabilities, responding to incidents, and learning security protocols. - **Apply here**: [application](https://www.cybersecureintern.com/apply) - -3. **Front-End Web Developer (Contract)** - * **Salary**: $45 - $55 per hour - * **Location**: Remote - * **Job Type**: Contract (3 months) - * **Work Mode**: Online - * **Job Description**: - We are looking for a talented Front-End Developer to help enhance our company's website and improve user experience. You'll work on creating responsive, interactive, and dynamic - interfaces using React and CSS frameworks. - * **Apply here**: [application](https://www.devhubjobs.com/frontend-developer) + \n +-# **Disclaimer:** +-# Please note that the job listings provided are sourced from a third-party API and we cannot guarantee the legitimacy or security of all postings. Exercise caution when submitting personal information, resumes, or signing up on external sites. Always verify the authenticity of a job application before proceeding. Stay safe and mindful while applying! `; } From 0f80124c6cbcdb55a47fdfcd0b2a464266a5fe55 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 11 Nov 2024 09:42:32 -0500 Subject: [PATCH 118/267] broke up lengthy lines to remove ESLint max length reached warning --- src/pieces/tasks.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 360fe24c..acd1c3f2 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -146,7 +146,9 @@ ${jobFormData[1].interest3}, ${jobFormData[1].interest4}, and ${jobFormData[1].i - **Apply here**: [application](https://www.cybersecureintern.com/apply) \n -# **Disclaimer:** --# Please note that the job listings provided are sourced from a third-party API and we cannot guarantee the legitimacy or security of all postings. Exercise caution when submitting personal information, resumes, or signing up on external sites. Always verify the authenticity of a job application before proceeding. Stay safe and mindful while applying! +-# Please note that the job listings provided are sourced from a third-party API and we cannot guarantee the legitimacy or security of all postings. Exercise caution when submitting personal +-# information, resumes, or signing up on external sites. Always verify the authenticity of a job application +-# before proceeding. Stay safe and mindful while applying! `; } From 32589bd3d7efa36c80cbb1107786b818f2d5b137 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Thu, 14 Nov 2024 12:27:36 -0500 Subject: [PATCH 119/267] Made the questions more in depth in jobform --- src/commands/jobs/jobform.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index e0987533..a4a791c9 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -14,10 +14,10 @@ import { // prettier-ignore const questions = [ [ - 'What city are you located in?', - 'Are you looking for remote or in person?', - 'Job, internship or both?', - 'How far are you willing to travel?' + 'What city do you want the city to be located in or around?', + 'Are you looking for remote, hybrid, and/or in person?', + 'Employement type: Full-time, Part-time, Internship, Temporary, and/or contract?', + 'How far are you willing to travel (in miles)?' ], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; From 6098247340f51a314e1c1fc3e8443e9d1ea2e4f4 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Thu, 14 Nov 2024 12:28:26 -0500 Subject: [PATCH 120/267] changed it in update_preferences as well --- src/commands/Jobs/update_preferences.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/commands/Jobs/update_preferences.ts b/src/commands/Jobs/update_preferences.ts index b3b34ff2..61fd545d 100644 --- a/src/commands/Jobs/update_preferences.ts +++ b/src/commands/Jobs/update_preferences.ts @@ -6,7 +6,10 @@ import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptio const questions = [ - ['What city are you located in?', 'Are you looking for remote or in person?', 'Job, internship or both?', 'How far are you willing to travel?'], + ['What city do you want the city to be located in or around?', + 'Are you looking for remote, hybrid, and/or in person?', + 'Employement type: Full-time, Part-time, Internship, Temporary, and/or contract?', + 'How far are you willing to travel (in miles)?'], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; From fa56ed36ffec81d53e5c5c07361c629028c9f0c8 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Thu, 14 Nov 2024 12:46:38 -0500 Subject: [PATCH 121/267] shortened each question because of errors --- src/commands/Jobs/update_preferences.ts | 8 ++++---- src/commands/jobs/jobform.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/commands/Jobs/update_preferences.ts b/src/commands/Jobs/update_preferences.ts index 61fd545d..e3055465 100644 --- a/src/commands/Jobs/update_preferences.ts +++ b/src/commands/Jobs/update_preferences.ts @@ -6,10 +6,10 @@ import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptio const questions = [ - ['What city do you want the city to be located in or around?', - 'Are you looking for remote, hybrid, and/or in person?', - 'Employement type: Full-time, Part-time, Internship, Temporary, and/or contract?', - 'How far are you willing to travel (in miles)?'], + ['What city do you want to be located?', + 'Remote, hybrid, and/or in-person?', + 'Full-time, Part-time, and/or Internship?', + 'How far are you willing to travel?'], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index a4a791c9..dc5ddb81 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -14,10 +14,10 @@ import { // prettier-ignore const questions = [ [ - 'What city do you want the city to be located in or around?', - 'Are you looking for remote, hybrid, and/or in person?', - 'Employement type: Full-time, Part-time, Internship, Temporary, and/or contract?', - 'How far are you willing to travel (in miles)?' + 'What city do you want to be located?', + 'Remote, hybrid, and/or in-person?', + 'Full-time, Part-time, and/or Internship?', + 'How far are you willing to travel?' ], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; From 8e30ec4f48b26f32a7f7fb865f3ff8e48ded07a4 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Thu, 14 Nov 2024 12:58:20 -0500 Subject: [PATCH 122/267] added interface for new file validatePreferences.ts --- src/commands/Jobs/validatePreferences.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/commands/Jobs/validatePreferences.ts diff --git a/src/commands/Jobs/validatePreferences.ts b/src/commands/Jobs/validatePreferences.ts new file mode 100644 index 00000000..e69de29b From 9d47856ac2f2648183e6c8fae0385caf2a8d2f77 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Thu, 14 Nov 2024 13:10:35 -0500 Subject: [PATCH 123/267] added validations --- src/commands/Jobs/validatePreferences.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/commands/Jobs/validatePreferences.ts b/src/commands/Jobs/validatePreferences.ts index e69de29b..559dd93f 100644 --- a/src/commands/Jobs/validatePreferences.ts +++ b/src/commands/Jobs/validatePreferences.ts @@ -0,0 +1,17 @@ +interface ValidateResult { + isValid: boolean; + error: string[]; +} + +export const validatePreferences = (answers: string[], qset: number, isJobForm: boolean): ValidateResult => { + const errors: string[] = []; + if (qset === 0) { + const [city, workType, employmentType, travelDistance] = answers; + if (!city?.trim()) errors.push('Enter valid city'); + if (!workType?.trim()) { + errors.push('Enter valid work type'); + } else { + const validWorkTypes = ['remote', 'hybrid', 'in-person']; + } + } +}; From 3301c139193f3aa0c4efed078d67e4fe8f471587 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Fri, 15 Nov 2024 14:22:56 -0500 Subject: [PATCH 124/267] move jobDatabase.ts from Jobs to jobs --- src/commands/{Jobs => jobs}/jobDatabase.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/commands/{Jobs => jobs}/jobDatabase.ts (100%) diff --git a/src/commands/Jobs/jobDatabase.ts b/src/commands/jobs/jobDatabase.ts similarity index 100% rename from src/commands/Jobs/jobDatabase.ts rename to src/commands/jobs/jobDatabase.ts From fa61561a1984de51ab7d1f137fb0845964a8c23b Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Fri, 15 Nov 2024 14:23:24 -0500 Subject: [PATCH 125/267] move update_preferences.ts from Jobs to jobs --- src/commands/{Jobs => jobs}/update_preferences.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/commands/{Jobs => jobs}/update_preferences.ts (100%) diff --git a/src/commands/Jobs/update_preferences.ts b/src/commands/jobs/update_preferences.ts similarity index 100% rename from src/commands/Jobs/update_preferences.ts rename to src/commands/jobs/update_preferences.ts From e44343ae332560739b380dac06a9b58f4b2be3dd Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Fri, 15 Nov 2024 14:23:44 -0500 Subject: [PATCH 126/267] move viewJobForm.ts from Jobs to jobs --- src/commands/{Jobs => jobs}/viewJobForm.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/commands/{Jobs => jobs}/viewJobForm.ts (100%) diff --git a/src/commands/Jobs/viewJobForm.ts b/src/commands/jobs/viewJobForm.ts similarity index 100% rename from src/commands/Jobs/viewJobForm.ts rename to src/commands/jobs/viewJobForm.ts From 2d26416839a64d80fe35edd13bbbe8acd8b0dcfa Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Fri, 15 Nov 2024 14:30:43 -0500 Subject: [PATCH 127/267] removed printing of api data --- src/commands/jobs/Adzuna_job_search.ts | 3 ++- src/commands/jobs/viewJobForm.ts | 3 --- src/commands/reminders/remind.ts | 1 + 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/commands/jobs/Adzuna_job_search.ts b/src/commands/jobs/Adzuna_job_search.ts index eb70c35a..b5024db1 100644 --- a/src/commands/jobs/Adzuna_job_search.ts +++ b/src/commands/jobs/Adzuna_job_search.ts @@ -22,7 +22,8 @@ fetch(URL) return response.json(); }) .then((responseData) => { - console.log(responseData); + console.log('got data'); + // console.log(responseData); }) .catch((error) => { console.error('Fetch error:', error); diff --git a/src/commands/jobs/viewJobForm.ts b/src/commands/jobs/viewJobForm.ts index ac16190d..a36e809f 100644 --- a/src/commands/jobs/viewJobForm.ts +++ b/src/commands/jobs/viewJobForm.ts @@ -1,9 +1,6 @@ import { DB } from '@root/config'; import { ChatInputCommandInteraction, Embed, EmbedBuilder, InteractionResponse } from 'discord.js'; -import { reminderTime } from '@root/src/lib/utils/generalUtils'; import { Command } from '@lib/types/Command'; -import jobform from './jobform'; -import { JobPreferenceAPI } from './jobDatabase'; export default class extends Command { diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 83e93f34..bfa4bd71 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -9,6 +9,7 @@ import { Reminder } from '@lib/types/Reminder'; import parse from 'parse-duration'; import { reminderTime } from '@root/src/lib/utils/generalUtils'; import { Command } from '@lib/types/Command'; + export default class extends Command { description = `Have ${BOT.NAME} give you a reminder.`; From f8cd463805665e8e84d8b0e1b919db0016776544 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:38:10 -0500 Subject: [PATCH 128/267] re-configured package-lock.json --- package-lock.json | 2294 +-------------------------------------------- 1 file changed, 1 insertion(+), 2293 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e190be6..7bc2f023 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "sage", "version": "3.3.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -3182,2297 +3182,5 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@discordjs/builders": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.9.0.tgz", - "integrity": "sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg==", - "requires": { - "@discordjs/formatters": "^0.5.0", - "@discordjs/util": "^1.1.1", - "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "0.37.97", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.4", - "tslib": "^2.6.3" - }, - "dependencies": { - "discord-api-types": { - "version": "0.37.97", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", - "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" - } - } - }, - "@discordjs/collection": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", - "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==" - }, - "@discordjs/formatters": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.5.0.tgz", - "integrity": "sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g==", - "requires": { - "discord-api-types": "0.37.97" - }, - "dependencies": { - "discord-api-types": { - "version": "0.37.97", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", - "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" - } - } - }, - "@discordjs/rest": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.0.tgz", - "integrity": "sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw==", - "requires": { - "@discordjs/collection": "^2.1.1", - "@discordjs/util": "^1.1.1", - "@sapphire/async-queue": "^1.5.3", - "@sapphire/snowflake": "^3.5.3", - "@vladfrangu/async_event_emitter": "^2.4.6", - "discord-api-types": "0.37.97", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.19.8" - }, - "dependencies": { - "@discordjs/collection": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", - "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==" - }, - "discord-api-types": { - "version": "0.37.97", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", - "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" - } - } - }, - "@discordjs/util": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz", - "integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==" - }, - "@discordjs/ws": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", - "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", - "requires": { - "@discordjs/collection": "^2.1.0", - "@discordjs/rest": "^2.3.0", - "@discordjs/util": "^1.1.0", - "@sapphire/async-queue": "^1.5.2", - "@types/ws": "^8.5.10", - "@vladfrangu/async_event_emitter": "^2.2.4", - "discord-api-types": "0.37.83", - "tslib": "^2.6.2", - "ws": "^8.16.0" - }, - "dependencies": { - "@discordjs/collection": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", - "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==" - }, - "discord-api-types": { - "version": "0.37.83", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", - "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==" - } - } - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", - "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "requires": { - "@octokit/types": "^6.0.3" - } - }, - "@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "requires": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "requires": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "requires": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz", - "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==" - }, - "@octokit/plugin-paginate-rest": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz", - "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", - "requires": { - "@octokit/types": "^6.34.0" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "requires": {} - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz", - "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", - "requires": { - "@octokit/types": "^6.34.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "requires": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", - "requires": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" - } - }, - "@octokit/types": { - "version": "6.34.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz", - "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", - "requires": { - "@octokit/openapi-types": "^11.2.0" - } - }, - "@sapphire/async-queue": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.3.tgz", - "integrity": "sha512-x7zadcfJGxFka1Q3f8gCts1F0xMwCKbZweM85xECGI0hBTeIZJGGCrHgLggihBoprlQ/hBmDR5LKfIPqnmHM3w==" - }, - "@sapphire/shapeshift": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz", - "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==", - "requires": { - "fast-deep-equal": "^3.1.3", - "lodash": "^4.17.21" - } - }, - "@sapphire/snowflake": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", - "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==" - }, - "@types/bson": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz", - "integrity": "sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg==", - "dev": true, - "requires": { - "bson": "*" - } - }, - "@types/console-stamp": { - "version": "0.2.33", - "resolved": "https://registry.npmjs.org/@types/console-stamp/-/console-stamp-0.2.33.tgz", - "integrity": "sha512-ISAh9MXEnmW8eP6C0ItiMJX/cqqgUfom9W8XUwk9Ze51PRA01a9J3daWAUL1wDIVDovi7nD/AC6Efj2nJH6JdA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/mongodb": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", - "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", - "dev": true, - "requires": { - "@types/bson": "*", - "@types/node": "*" - } - }, - "@types/node": { - "version": "14.18.63", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" - }, - "@types/node-cron": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-2.0.5.tgz", - "integrity": "sha512-rQ4kduTmgW11tbtx0/RsoybYHHPu4Vxw5v5ZS5qUKNerlEAI8r8P1F5UUZ2o2HTvzG759sbFxuRuqWxU8zc+EQ==", - "dev": true, - "requires": { - "@types/tz-offset": "*" - } - }, - "@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - }, - "dependencies": { - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } - } - }, - "@types/nodemailer": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.4.tgz", - "integrity": "sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/tz-offset": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@types/tz-offset/-/tz-offset-0.0.0.tgz", - "integrity": "sha512-XLD/llTSB6EBe3thkN+/I0L+yCTB6sjrcVovQdx2Cnl6N6bTzHmwe/J8mWnsXFgxLrj/emzdv8IR4evKYG2qxQ==", - "dev": true - }, - "@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - } - }, - "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "@vladfrangu/async_event_emitter": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz", - "integrity": "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "before-after-hook": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==" - }, - "bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "bson": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", - "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", - "dev": true, - "requires": { - "buffer": "^5.6.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "canvas": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", - "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", - "requires": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "console-stamp": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/console-stamp/-/console-stamp-3.0.6.tgz", - "integrity": "sha512-j4tP+1shVIUjSnvrtv5nJ5uVzLeNOTweVHkcEXB2ej4NJdlRp14w0hOzQiF+iQvOTjz4jafmdhd1CdYSwNzM8Q==", - "requires": { - "chalk": "^4.1.2", - "dateformat": "^4.6.3" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "discord-api-types": { - "version": "0.37.100", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.100.tgz", - "integrity": "sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==" - }, - "discord.js": { - "version": "14.16.3", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.16.3.tgz", - "integrity": "sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==", - "requires": { - "@discordjs/builders": "^1.9.0", - "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.5.0", - "@discordjs/rest": "^2.4.0", - "@discordjs/util": "^1.1.1", - "@discordjs/ws": "1.1.1", - "@sapphire/snowflake": "3.5.3", - "discord-api-types": "0.37.100", - "fast-deep-equal": "3.1.3", - "lodash.snakecase": "4.1.1", - "tslib": "^2.6.3", - "undici": "6.19.8" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-bytes.js": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", - "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==" - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true - }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "module-alias": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", - "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" - }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" - }, - "mongodb": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", - "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", - "requires": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2", - "saslprep": "^1.0.0" - }, - "dependencies": { - "bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node-cleanup": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", - "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", - "dev": true - }, - "node-cron": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-2.0.3.tgz", - "integrity": "sha512-eJI+QitXlwcgiZwNNSRbqsjeZMp5shyajMR81RZCqeW0ZDEj4zU9tpd4nTh/1JsBiKbF8d08FCewiipDmVIYjg==", - "requires": { - "opencollective-postinstall": "^2.0.0", - "tz-offset": "0.0.1" - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "nodemailer": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", - "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==" - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" - }, - "optional-require": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", - "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", - "requires": { - "require-at": "^1.0.6" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-duration": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.4.4.tgz", - "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==" - }, - "parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "requires": { - "parse-ms": "^2.1.0" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "ps-tree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", - "dev": true, - "requires": { - "event-stream": "=3.3.4" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "require-at": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", - "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "requires": { - "through": "2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "string-argv": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.1.2.tgz", - "integrity": "sha512-mBqPGEOMNJKXRo7z0keX0wlAhbBAjilUdPW13nN0PecVryZxdHIeM7TqbsSUA7VYuS00HGC6mojP7DlQzfa9ZA==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "ts-mixer": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", - "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" - }, - "tsc-watch": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-4.6.2.tgz", - "integrity": "sha512-eHWzZGkPmzXVGQKbqQgf3BFpGiZZw1jQ29ZOJeaSe8JfyUvphbd221NfXmmsJUGGPGA/nnaSS01tXipUcyxAxg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "node-cleanup": "^2.1.2", - "ps-tree": "^1.2.0", - "string-argv": "^0.1.1", - "strip-ansi": "^6.0.0" - } - }, - "tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true - }, - "tz-offset": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tz-offset/-/tz-offset-0.0.1.tgz", - "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==" - }, - "undici": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", - "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==" - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "requires": {} - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } } From d1c40de7909828c754b70a563111d3be648e49e8 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:39:10 -0500 Subject: [PATCH 129/267] Revert "re-configured package-lock.json" This reverts commit f8cd463805665e8e84d8b0e1b919db0016776544. --- package-lock.json | 2294 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 2293 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 7bc2f023..6e190be6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "sage", "version": "3.3.0", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { @@ -3182,5 +3182,2297 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@discordjs/builders": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.9.0.tgz", + "integrity": "sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg==", + "requires": { + "@discordjs/formatters": "^0.5.0", + "@discordjs/util": "^1.1.1", + "@sapphire/shapeshift": "^4.0.0", + "discord-api-types": "0.37.97", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.4", + "tslib": "^2.6.3" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" + } + } + }, + "@discordjs/collection": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==" + }, + "@discordjs/formatters": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.5.0.tgz", + "integrity": "sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g==", + "requires": { + "discord-api-types": "0.37.97" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" + } + } + }, + "@discordjs/rest": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.0.tgz", + "integrity": "sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw==", + "requires": { + "@discordjs/collection": "^2.1.1", + "@discordjs/util": "^1.1.1", + "@sapphire/async-queue": "^1.5.3", + "@sapphire/snowflake": "^3.5.3", + "@vladfrangu/async_event_emitter": "^2.4.6", + "discord-api-types": "0.37.97", + "magic-bytes.js": "^1.10.0", + "tslib": "^2.6.3", + "undici": "6.19.8" + }, + "dependencies": { + "@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==" + }, + "discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" + } + } + }, + "@discordjs/util": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz", + "integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==" + }, + "@discordjs/ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", + "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", + "requires": { + "@discordjs/collection": "^2.1.0", + "@discordjs/rest": "^2.3.0", + "@discordjs/util": "^1.1.0", + "@sapphire/async-queue": "^1.5.2", + "@types/ws": "^8.5.10", + "@vladfrangu/async_event_emitter": "^2.2.4", + "discord-api-types": "0.37.83", + "tslib": "^2.6.2", + "ws": "^8.16.0" + }, + "dependencies": { + "@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==" + }, + "discord-api-types": { + "version": "0.37.83", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", + "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==" + } + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@octokit/auth-token": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "requires": { + "@octokit/types": "^6.0.3" + } + }, + "@octokit/core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", + "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "requires": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.3", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "requires": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "requires": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz", + "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==" + }, + "@octokit/plugin-paginate-rest": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz", + "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", + "requires": { + "@octokit/types": "^6.34.0" + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "requires": {} + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz", + "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", + "requires": { + "@octokit/types": "^6.34.0", + "deprecation": "^2.3.1" + } + }, + "@octokit/request": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "requires": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "requires": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "18.12.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", + "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "requires": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.8", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + } + }, + "@octokit/types": { + "version": "6.34.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz", + "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", + "requires": { + "@octokit/openapi-types": "^11.2.0" + } + }, + "@sapphire/async-queue": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.3.tgz", + "integrity": "sha512-x7zadcfJGxFka1Q3f8gCts1F0xMwCKbZweM85xECGI0hBTeIZJGGCrHgLggihBoprlQ/hBmDR5LKfIPqnmHM3w==" + }, + "@sapphire/shapeshift": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz", + "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==", + "requires": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" + } + }, + "@sapphire/snowflake": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", + "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==" + }, + "@types/bson": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz", + "integrity": "sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg==", + "dev": true, + "requires": { + "bson": "*" + } + }, + "@types/console-stamp": { + "version": "0.2.33", + "resolved": "https://registry.npmjs.org/@types/console-stamp/-/console-stamp-0.2.33.tgz", + "integrity": "sha512-ISAh9MXEnmW8eP6C0ItiMJX/cqqgUfom9W8XUwk9Ze51PRA01a9J3daWAUL1wDIVDovi7nD/AC6Efj2nJH6JdA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/mongodb": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", + "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", + "dev": true, + "requires": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, + "@types/node-cron": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-2.0.5.tgz", + "integrity": "sha512-rQ4kduTmgW11tbtx0/RsoybYHHPu4Vxw5v5ZS5qUKNerlEAI8r8P1F5UUZ2o2HTvzG759sbFxuRuqWxU8zc+EQ==", + "dev": true, + "requires": { + "@types/tz-offset": "*" + } + }, + "@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, + "@types/nodemailer": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.4.tgz", + "integrity": "sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/tz-offset": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@types/tz-offset/-/tz-offset-0.0.0.tgz", + "integrity": "sha512-XLD/llTSB6EBe3thkN+/I0L+yCTB6sjrcVovQdx2Cnl6N6bTzHmwe/J8mWnsXFgxLrj/emzdv8IR4evKYG2qxQ==", + "dev": true + }, + "@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + } + }, + "@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@vladfrangu/async_event_emitter": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz", + "integrity": "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "before-after-hook": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", + "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==" + }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "bson": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", + "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", + "dev": true, + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "console-stamp": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/console-stamp/-/console-stamp-3.0.6.tgz", + "integrity": "sha512-j4tP+1shVIUjSnvrtv5nJ5uVzLeNOTweVHkcEXB2ej4NJdlRp14w0hOzQiF+iQvOTjz4jafmdhd1CdYSwNzM8Q==", + "requires": { + "chalk": "^4.1.2", + "dateformat": "^4.6.3" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "discord-api-types": { + "version": "0.37.100", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.100.tgz", + "integrity": "sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==" + }, + "discord.js": { + "version": "14.16.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.16.3.tgz", + "integrity": "sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==", + "requires": { + "@discordjs/builders": "^1.9.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.5.0", + "@discordjs/rest": "^2.4.0", + "@discordjs/util": "^1.1.1", + "@discordjs/ws": "1.1.1", + "@sapphire/snowflake": "3.5.3", + "discord-api-types": "0.37.100", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "tslib": "^2.6.3", + "undici": "6.19.8" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-bytes.js": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", + "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", + "dev": true + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "mongodb": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "requires": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + }, + "dependencies": { + "bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nan": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node-cleanup": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", + "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", + "dev": true + }, + "node-cron": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-2.0.3.tgz", + "integrity": "sha512-eJI+QitXlwcgiZwNNSRbqsjeZMp5shyajMR81RZCqeW0ZDEj4zU9tpd4nTh/1JsBiKbF8d08FCewiipDmVIYjg==", + "requires": { + "opencollective-postinstall": "^2.0.0", + "tz-offset": "0.0.1" + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "nodemailer": { + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", + "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==" + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" + }, + "optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "requires": { + "require-at": "^1.0.6" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-duration": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.4.4.tgz", + "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==" + }, + "parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "requires": { + "through": "~2.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "requires": { + "parse-ms": "^2.1.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "ps-tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", + "dev": true, + "requires": { + "event-stream": "=3.3.4" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", + "dev": true, + "requires": { + "through": "2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", + "dev": true, + "requires": { + "duplexer": "~0.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "string-argv": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.1.2.tgz", + "integrity": "sha512-mBqPGEOMNJKXRo7z0keX0wlAhbBAjilUdPW13nN0PecVryZxdHIeM7TqbsSUA7VYuS00HGC6mojP7DlQzfa9ZA==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "table": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "ts-mixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" + }, + "tsc-watch": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-4.6.2.tgz", + "integrity": "sha512-eHWzZGkPmzXVGQKbqQgf3BFpGiZZw1jQ29ZOJeaSe8JfyUvphbd221NfXmmsJUGGPGA/nnaSS01tXipUcyxAxg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "node-cleanup": "^2.1.2", + "ps-tree": "^1.2.0", + "string-argv": "^0.1.1", + "strip-ansi": "^6.0.0" + } + }, + "tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true + }, + "tz-offset": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tz-offset/-/tz-offset-0.0.1.tgz", + "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==" + }, + "undici": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==" + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "requires": {} + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } } From dc2766d2ee3d89740988d3c6e21a199e8e4814ae Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:58:53 -0500 Subject: [PATCH 130/267] removed unneed files --- package-lock.json | 2294 +----------------------------------------- testing_JOB_FORMS.js | 43 - 2 files changed, 1 insertion(+), 2336 deletions(-) delete mode 100644 testing_JOB_FORMS.js diff --git a/package-lock.json b/package-lock.json index 6e190be6..7bc2f023 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "sage", "version": "3.3.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -3182,2297 +3182,5 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@discordjs/builders": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.9.0.tgz", - "integrity": "sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg==", - "requires": { - "@discordjs/formatters": "^0.5.0", - "@discordjs/util": "^1.1.1", - "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "0.37.97", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.4", - "tslib": "^2.6.3" - }, - "dependencies": { - "discord-api-types": { - "version": "0.37.97", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", - "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" - } - } - }, - "@discordjs/collection": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", - "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==" - }, - "@discordjs/formatters": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.5.0.tgz", - "integrity": "sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g==", - "requires": { - "discord-api-types": "0.37.97" - }, - "dependencies": { - "discord-api-types": { - "version": "0.37.97", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", - "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" - } - } - }, - "@discordjs/rest": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.0.tgz", - "integrity": "sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw==", - "requires": { - "@discordjs/collection": "^2.1.1", - "@discordjs/util": "^1.1.1", - "@sapphire/async-queue": "^1.5.3", - "@sapphire/snowflake": "^3.5.3", - "@vladfrangu/async_event_emitter": "^2.4.6", - "discord-api-types": "0.37.97", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.19.8" - }, - "dependencies": { - "@discordjs/collection": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", - "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==" - }, - "discord-api-types": { - "version": "0.37.97", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", - "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" - } - } - }, - "@discordjs/util": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz", - "integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==" - }, - "@discordjs/ws": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", - "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", - "requires": { - "@discordjs/collection": "^2.1.0", - "@discordjs/rest": "^2.3.0", - "@discordjs/util": "^1.1.0", - "@sapphire/async-queue": "^1.5.2", - "@types/ws": "^8.5.10", - "@vladfrangu/async_event_emitter": "^2.2.4", - "discord-api-types": "0.37.83", - "tslib": "^2.6.2", - "ws": "^8.16.0" - }, - "dependencies": { - "@discordjs/collection": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", - "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==" - }, - "discord-api-types": { - "version": "0.37.83", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", - "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==" - } - } - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", - "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "requires": { - "@octokit/types": "^6.0.3" - } - }, - "@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "requires": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "requires": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "requires": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz", - "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==" - }, - "@octokit/plugin-paginate-rest": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz", - "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", - "requires": { - "@octokit/types": "^6.34.0" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "requires": {} - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz", - "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", - "requires": { - "@octokit/types": "^6.34.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "requires": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", - "requires": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" - } - }, - "@octokit/types": { - "version": "6.34.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz", - "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", - "requires": { - "@octokit/openapi-types": "^11.2.0" - } - }, - "@sapphire/async-queue": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.3.tgz", - "integrity": "sha512-x7zadcfJGxFka1Q3f8gCts1F0xMwCKbZweM85xECGI0hBTeIZJGGCrHgLggihBoprlQ/hBmDR5LKfIPqnmHM3w==" - }, - "@sapphire/shapeshift": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz", - "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==", - "requires": { - "fast-deep-equal": "^3.1.3", - "lodash": "^4.17.21" - } - }, - "@sapphire/snowflake": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", - "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==" - }, - "@types/bson": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz", - "integrity": "sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg==", - "dev": true, - "requires": { - "bson": "*" - } - }, - "@types/console-stamp": { - "version": "0.2.33", - "resolved": "https://registry.npmjs.org/@types/console-stamp/-/console-stamp-0.2.33.tgz", - "integrity": "sha512-ISAh9MXEnmW8eP6C0ItiMJX/cqqgUfom9W8XUwk9Ze51PRA01a9J3daWAUL1wDIVDovi7nD/AC6Efj2nJH6JdA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/mongodb": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", - "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", - "dev": true, - "requires": { - "@types/bson": "*", - "@types/node": "*" - } - }, - "@types/node": { - "version": "14.18.63", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" - }, - "@types/node-cron": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-2.0.5.tgz", - "integrity": "sha512-rQ4kduTmgW11tbtx0/RsoybYHHPu4Vxw5v5ZS5qUKNerlEAI8r8P1F5UUZ2o2HTvzG759sbFxuRuqWxU8zc+EQ==", - "dev": true, - "requires": { - "@types/tz-offset": "*" - } - }, - "@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - }, - "dependencies": { - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } - } - }, - "@types/nodemailer": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.4.tgz", - "integrity": "sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/tz-offset": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@types/tz-offset/-/tz-offset-0.0.0.tgz", - "integrity": "sha512-XLD/llTSB6EBe3thkN+/I0L+yCTB6sjrcVovQdx2Cnl6N6bTzHmwe/J8mWnsXFgxLrj/emzdv8IR4evKYG2qxQ==", - "dev": true - }, - "@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - } - }, - "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "@vladfrangu/async_event_emitter": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz", - "integrity": "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "before-after-hook": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==" - }, - "bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "bson": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", - "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", - "dev": true, - "requires": { - "buffer": "^5.6.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "canvas": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", - "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", - "requires": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "console-stamp": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/console-stamp/-/console-stamp-3.0.6.tgz", - "integrity": "sha512-j4tP+1shVIUjSnvrtv5nJ5uVzLeNOTweVHkcEXB2ej4NJdlRp14w0hOzQiF+iQvOTjz4jafmdhd1CdYSwNzM8Q==", - "requires": { - "chalk": "^4.1.2", - "dateformat": "^4.6.3" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "discord-api-types": { - "version": "0.37.100", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.100.tgz", - "integrity": "sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==" - }, - "discord.js": { - "version": "14.16.3", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.16.3.tgz", - "integrity": "sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==", - "requires": { - "@discordjs/builders": "^1.9.0", - "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.5.0", - "@discordjs/rest": "^2.4.0", - "@discordjs/util": "^1.1.1", - "@discordjs/ws": "1.1.1", - "@sapphire/snowflake": "3.5.3", - "discord-api-types": "0.37.100", - "fast-deep-equal": "3.1.3", - "lodash.snakecase": "4.1.1", - "tslib": "^2.6.3", - "undici": "6.19.8" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-bytes.js": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", - "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==" - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true - }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "module-alias": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", - "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" - }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" - }, - "mongodb": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", - "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", - "requires": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2", - "saslprep": "^1.0.0" - }, - "dependencies": { - "bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node-cleanup": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", - "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", - "dev": true - }, - "node-cron": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-2.0.3.tgz", - "integrity": "sha512-eJI+QitXlwcgiZwNNSRbqsjeZMp5shyajMR81RZCqeW0ZDEj4zU9tpd4nTh/1JsBiKbF8d08FCewiipDmVIYjg==", - "requires": { - "opencollective-postinstall": "^2.0.0", - "tz-offset": "0.0.1" - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "nodemailer": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", - "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==" - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" - }, - "optional-require": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", - "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", - "requires": { - "require-at": "^1.0.6" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-duration": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.4.4.tgz", - "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==" - }, - "parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "requires": { - "parse-ms": "^2.1.0" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "ps-tree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", - "dev": true, - "requires": { - "event-stream": "=3.3.4" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "require-at": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", - "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "requires": { - "through": "2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "string-argv": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.1.2.tgz", - "integrity": "sha512-mBqPGEOMNJKXRo7z0keX0wlAhbBAjilUdPW13nN0PecVryZxdHIeM7TqbsSUA7VYuS00HGC6mojP7DlQzfa9ZA==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "ts-mixer": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", - "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" - }, - "tsc-watch": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-4.6.2.tgz", - "integrity": "sha512-eHWzZGkPmzXVGQKbqQgf3BFpGiZZw1jQ29ZOJeaSe8JfyUvphbd221NfXmmsJUGGPGA/nnaSS01tXipUcyxAxg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "node-cleanup": "^2.1.2", - "ps-tree": "^1.2.0", - "string-argv": "^0.1.1", - "strip-ansi": "^6.0.0" - } - }, - "tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true - }, - "tz-offset": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tz-offset/-/tz-offset-0.0.1.tgz", - "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==" - }, - "undici": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", - "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==" - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "requires": {} - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } } diff --git a/testing_JOB_FORMS.js b/testing_JOB_FORMS.js deleted file mode 100644 index 3b6575fa..00000000 --- a/testing_JOB_FORMS.js +++ /dev/null @@ -1,43 +0,0 @@ -/* global use, db */ -// MongoDB Playground -// Use Ctrl+Space inside a snippet or a string literal to trigger completions. - -const database = 'Jess_Test'; -const collection = 'JOB_FORMS'; - -// The current database to use. -use(database); - -// Create a new collection. -db.createCollection(collection); - -// The prototype form to create a collection: -/* db.createCollection( , - { - capped: , - autoIndexId: , - size: , - max: , - storageEngine: , - validator: , - validationLevel: , - validationAction: , - indexOptionDefaults: , - viewOn: , - pipeline: , - collation: , - writeConcern: , - timeseries: { // Added in MongoDB 5.0 - timeField: , // required for time series collections - metaField: , - granularity: , - bucketMaxSpanSeconds: , // Added in MongoDB 6.3 - bucketRoundingSeconds: , // Added in MongoDB 6.3 - }, - expireAfterSeconds: , - clusteredIndex: , // Added in MongoDB 5.3 - } -)*/ - -// More information on the `createCollection` command can be found at: -// https://www.mongodb.com/docs/manual/reference/method/db.createCollection/ From 903c53768da244e9c404c9a3a85f97bb1c6683df Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Fri, 15 Nov 2024 18:39:06 -0500 Subject: [PATCH 131/267] made generalUtils.ts not have 10000000 formatting errors --- src/lib/utils/generalUtils.ts | 119 +++++++++++++++++----------------- 1 file changed, 59 insertions(+), 60 deletions(-) diff --git a/src/lib/utils/generalUtils.ts b/src/lib/utils/generalUtils.ts index 0b87b5ab..6daa9cb6 100644 --- a/src/lib/utils/generalUtils.ts +++ b/src/lib/utils/generalUtils.ts @@ -7,20 +7,20 @@ import { TextChannel, ActionRowBuilder, ApplicationCommandPermissions, - StringSelectMenuBuilder, -} from "discord.js"; -import { Command, CompCommand } from "@lib/types/Command"; -import * as fs from "fs"; -import { DB, CHANNELS, ROLE_DROPDOWNS, BOT } from "@root/config"; -import moment from "moment"; -import { Reminder } from "@lib/types/Reminder"; -import { Course } from "@lib/types/Course"; + StringSelectMenuBuilder +} from 'discord.js'; +import { Command, CompCommand } from '@lib/types/Command'; +import * as fs from 'fs'; +import { DB, CHANNELS, ROLE_DROPDOWNS, BOT } from '@root/config'; +import moment from 'moment'; +import { Reminder } from '@lib/types/Reminder'; +import { Course } from '@lib/types/Course'; export function getCommand(bot: Client, cmd: string): Command { cmd = cmd.toLowerCase(); return ( - bot.commands.get(cmd) || - bot.commands.find( + bot.commands.get(cmd) + || bot.commands.find( (command) => command.aliases && command.aliases.includes(cmd) ) ); @@ -28,9 +28,9 @@ export function getCommand(bot: Client, cmd: string): Command { export function isCmdEqual(cmd1: CompCommand, cmd2: CompCommand): boolean { return ( - cmd1.name === cmd2.name && - cmd1.description === cmd2.description && - isOptionsListEqual(cmd1.options, cmd2.options) + cmd1.name === cmd2.name + && cmd1.description === cmd2.description + && isOptionsListEqual(cmd1.options, cmd2.options) ); } @@ -42,10 +42,10 @@ export function isOptionsListEqual( const valid = list1.every((list1Option) => list2.find( (list2Option) => - list2Option.name === list1Option.name && - list2Option.description === list1Option.description && - checkOptions(list1Option, list2Option) && - list2Option.type === list1Option.type + list2Option.name === list1Option.name + && list2Option.description === list1Option.description + && checkOptions(list1Option, list2Option) + && list2Option.type === list1Option.type ) ); return valid; @@ -55,7 +55,7 @@ function checkOptions( list1Option: ApplicationCommandOptionData, list2Option: ApplicationCommandOptionData ): boolean { - if ("required" in list1Option && "required" in list2Option) { + if ('required' in list1Option && 'required' in list2Option) { // see note 1 comment block in help.ts return list2Option.required === list1Option.required; } @@ -67,24 +67,23 @@ export function isPermissionEqual( perm2: ApplicationCommandPermissions ): boolean { return ( - perm1.id === perm2.id && - perm1.permission === perm2.permission && - perm1.type === perm2.type + perm1.id === perm2.id + && perm1.permission === perm2.permission + && perm1.type === perm2.type ); } export function generateErrorEmbed(msg: string): EmbedBuilder { const responseEmbed = new EmbedBuilder() - .setColor("#ff0000") - .setTitle("Error") + .setColor('#ff0000') + .setTitle('Error') .setDescription(msg); return responseEmbed; } export function getMsgIdFromLink(link: string): string { let msgId: string; - if ((msgId = link.split("/").pop()) === undefined) - throw "You must call this function with a message link!"; + if ((msgId = link.split('/').pop()) === undefined) { throw 'You must call this function with a message link!'; } return msgId; } @@ -109,20 +108,20 @@ export async function updateDropdowns( ); } catch (error) { const responseEmbed = new EmbedBuilder() - .setColor("#ff0000") - .setTitle("Argument error") + .setColor('#ff0000') + .setTitle('Argument error') .setDescription( `Unknown message(s), make sure your channel and message ID are correct.` ); interaction.channel.send({ embeds: [responseEmbed] }); } if ( - coursesMsg.author.id !== BOT.CLIENT_ID || - assignablesMsg.author.id !== BOT.CLIENT_ID + coursesMsg.author.id !== BOT.CLIENT_ID + || assignablesMsg.author.id !== BOT.CLIENT_ID ) { const responseEmbed = new EmbedBuilder() - .setColor("#ff0000") - .setTitle("Argument error") + .setColor('#ff0000') + .setTitle('Argument error') .setDescription( `You must tag a message that was sent by ${BOT.NAME} (me!).` ); @@ -145,16 +144,16 @@ export async function updateDropdowns( } // sort alphabetically - courses = courses.sort((a, b) => (a.name > b.name ? 1 : -1)); - assignables = assignables.sort((a, b) => (a.name > b.name ? 1 : -1)); + courses = courses.sort((a, b) => a.name > b.name ? 1 : -1); + assignables = assignables.sort((a, b) => a.name > b.name ? 1 : -1); // initialize dropdowns const coursesDropdown = new StringSelectMenuBuilder() - .setCustomId("roleselect") + .setCustomId('roleselect') .setMaxValues(courses.length) .setMinValues(0); const assignablesDropdown = new StringSelectMenuBuilder() - .setCustomId("roleselect") + .setCustomId('roleselect') .setMaxValues(assignables.length) .setMinValues(0); // these have to be here otherwise it won't add the dropdown components @@ -166,7 +165,7 @@ export async function updateDropdowns( coursesDropdown.addOptions( courses.map((c) => ({ label: `CISC ${c.name}`, - value: c.roles.student, + value: c.roles.student })) ); assignablesDropdown.addOptions( @@ -174,12 +173,12 @@ export async function updateDropdowns( ); // create component rows, add to messages - const coursesRow = - new ActionRowBuilder().addComponents( + const coursesRow + = new ActionRowBuilder().addComponents( coursesDropdown ); - const assignablesRow = - new ActionRowBuilder().addComponents( + const assignablesRow + = new ActionRowBuilder().addComponents( assignablesDropdown ); coursesMsg.edit({ components: [coursesRow] }); @@ -188,21 +187,21 @@ export async function updateDropdowns( return; } -export type TimestampType = "t" | "T" | "d" | "D" | "f" | "F" | "R"; -export function dateToTimestamp(date: Date, type: TimestampType = "t"): string { +export type TimestampType = 't' | 'T' | 'd' | 'D' | 'f' | 'F' | 'R'; +export function dateToTimestamp(date: Date, type: TimestampType = 't'): string { return ``; } export async function sendToFile( input: string, - filetype = "txt", + filetype = 'txt', filename: string = null, timestamp = false ): Promise { - const time = moment().format("M-D-YY_HH-mm"); - filename = `${filename}${timestamp ? `_${time}` : ""}` || time; + const time = moment().format('M-D-YY_HH-mm'); + filename = `${filename}${timestamp ? `_${time}` : ''}` || time; return new AttachmentBuilder(Buffer.from(input.trim()), { - name: `${filename}.${filetype}`, + name: `${filename}.${filetype}` }); } @@ -215,9 +214,9 @@ export async function generateQuestionId( )}${interaction.id.slice(interaction.id.length - depth)}`; if ( - (await interaction.client.mongo + await interaction.client.mongo .collection(DB.PVQ) - .countDocuments({ questionId: potentialId })) > 0 + .countDocuments({ questionId: potentialId }) > 0 ) { return generateQuestionId(interaction, depth + 1); } @@ -244,34 +243,34 @@ export function readdirRecursive(dir: string): string[] { export function reminderTime({ expires: date, repeat }: Reminder): string { const now = new Date(); - let prettyDateTime = ""; + let prettyDateTime = ''; const hour = date.getHours() % 12 === 0 ? 12 : date.getHours() % 12; const mins = date.getMinutes(); - const amPm = date.getHours() < 12 ? "AM" : "PM"; - prettyDateTime += `${hour}:${mins.toString().padStart(2, "0")} ${amPm} `; + const amPm = date.getHours() < 12 ? 'AM' : 'PM'; + prettyDateTime += `${hour}:${mins.toString().padStart(2, '0')} ${amPm} `; - if (repeat === "daily") { - prettyDateTime += "every day"; + if (repeat === 'daily') { + prettyDateTime += 'every day'; return prettyDateTime; } if ( !( - now.getDate() === date.getDate() && - now.getMonth() === date.getMonth() && - now.getFullYear() === date.getFullYear() + now.getDate() === date.getDate() + && now.getMonth() === date.getMonth() + && now.getFullYear() === date.getFullYear() ) ) { prettyDateTime += `on ${ date.getMonth() + 1 }/${date.getDate()}/${date.getFullYear()}`; } else { - prettyDateTime += "Today"; + prettyDateTime += 'Today'; } - if (repeat === "weekly") { - prettyDateTime += " and every week"; + if (repeat === 'weekly') { + prettyDateTime += ' and every week'; } return prettyDateTime; @@ -279,7 +278,7 @@ export function reminderTime({ expires: date, repeat }: Reminder): string { export function calcNeededExp(levelExp: number, direction: string): number { const xpRatio = 1.31; // Ren and I had an argument over whether it should be 1.3 or 1.33, we agreed on 1.31 because haha :) - if (direction === "+") { + if (direction === '+') { // calculate exp for next level return Math.floor(levelExp * xpRatio); } From fb168ecaefa49bd255c1294be904546d50aba016 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Fri, 15 Nov 2024 19:24:37 -0500 Subject: [PATCH 132/267] removed unneeded imports and parens --- src/commands/jobs/viewJobForm.ts | 2 +- src/commands/reminders/remind.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/commands/jobs/viewJobForm.ts b/src/commands/jobs/viewJobForm.ts index a36e809f..2125bb3c 100644 --- a/src/commands/jobs/viewJobForm.ts +++ b/src/commands/jobs/viewJobForm.ts @@ -1,5 +1,5 @@ import { DB } from '@root/config'; -import { ChatInputCommandInteraction, Embed, EmbedBuilder, InteractionResponse } from 'discord.js'; +import { ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; import { Command } from '@lib/types/Command'; export default class extends Command { diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index bfa4bd71..8d8bed16 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -82,9 +82,9 @@ export default class extends Command { const subcommand: string = interaction.options.getSubcommand(); if (subcommand === 'jobs') { - const jobReminderRepeat = (interaction.options.getString('job-repeat') as + const jobReminderRepeat = interaction.options.getString('job-repeat') as | 'daily' - | 'weekly') || null; + | 'weekly' || null; const jobReminder: Reminder = { owner: interaction.user.id, @@ -115,9 +115,9 @@ export default class extends Command { const content = interaction.options.getString('content'); const rawDuration = interaction.options.getString('duration'); const duration = parse(rawDuration); - const repeat = (interaction.options.getString('repeat') as + const repeat = interaction.options.getString('repeat') as | 'daily' - | 'weekly') || null; + | 'weekly' || null; if (!duration) { return interaction.reply({ From 7258cbce24cf1353a81d29ec02d0e23814804649 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 17 Nov 2024 17:45:26 -0500 Subject: [PATCH 133/267] finished making the error for workTypes --- src/commands/Jobs/validatePreferences.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/commands/Jobs/validatePreferences.ts b/src/commands/Jobs/validatePreferences.ts index 559dd93f..6bb84554 100644 --- a/src/commands/Jobs/validatePreferences.ts +++ b/src/commands/Jobs/validatePreferences.ts @@ -12,6 +12,13 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: errors.push('Enter valid work type'); } else { const validWorkTypes = ['remote', 'hybrid', 'in-person']; + // eslint-disable-next-line id-length + const workTypes = workType.toLowerCase().split(',').map(t => t.trim()); + // eslint-disable-next-line id-length + const invalidTypes = workTypes.filter(t => !validWorkTypes.includes(t)); + if (invalidTypes.length > 0) { + errors.push(`Invalid work type: ${invalidTypes.join(', ')}. Must be remote, hybrid, and/or in-person`); + } } } }; From b569fa4779838172e1452f17dc57208c2c37d553 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 17 Nov 2024 17:51:16 -0500 Subject: [PATCH 134/267] finished making the error for employmentTypes --- src/commands/Jobs/validatePreferences.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/commands/Jobs/validatePreferences.ts b/src/commands/Jobs/validatePreferences.ts index 6bb84554..2d0378b6 100644 --- a/src/commands/Jobs/validatePreferences.ts +++ b/src/commands/Jobs/validatePreferences.ts @@ -20,5 +20,17 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: errors.push(`Invalid work type: ${invalidTypes.join(', ')}. Must be remote, hybrid, and/or in-person`); } } + if (!employmentType?.trim()) { + errors.push('Enter valid employment type'); + } else { + const validEmploymentTypes = ['full time', 'part time', 'internship']; + // eslint-disable-next-line id-length + const employmentTypes = employmentType.toLowerCase().split(',').map(t => t.trim()); + // eslint-disable-next-line id-length + const invalidTypes = employmentTypes.filter(t => !validEmploymentTypes.includes(t)); + if (invalidTypes.length > 0) { + errors.push(`Invalid work type: ${invalidTypes.join(', ')}. Must be full time, part time, and/or internship`); + } + } } }; From 5d37529f315c98ecd97b710cc77bf287b0396032 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 17 Nov 2024 17:53:14 -0500 Subject: [PATCH 135/267] finished making the error for travel distance --- src/commands/Jobs/validatePreferences.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/commands/Jobs/validatePreferences.ts b/src/commands/Jobs/validatePreferences.ts index 2d0378b6..3f7a7620 100644 --- a/src/commands/Jobs/validatePreferences.ts +++ b/src/commands/Jobs/validatePreferences.ts @@ -32,5 +32,6 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: errors.push(`Invalid work type: ${invalidTypes.join(', ')}. Must be full time, part time, and/or internship`); } } + if (!travelDistance?.trim()) errors.push('Enter valid travel distance'); } }; From a741ae0b7dae23bfe15e3cb2bf82578e9cf620d1 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 17 Nov 2024 17:56:57 -0500 Subject: [PATCH 136/267] changed travelDistance error --- src/commands/Jobs/validatePreferences.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/commands/Jobs/validatePreferences.ts b/src/commands/Jobs/validatePreferences.ts index 3f7a7620..a33a2cf5 100644 --- a/src/commands/Jobs/validatePreferences.ts +++ b/src/commands/Jobs/validatePreferences.ts @@ -32,6 +32,8 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: errors.push(`Invalid work type: ${invalidTypes.join(', ')}. Must be full time, part time, and/or internship`); } } - if (!travelDistance?.trim()) errors.push('Enter valid travel distance'); + if (travelDistance && isNaN(Number(travelDistance.replace(/[^0-9]/g, '')))) { + errors.push('Travel distance must be a number'); + } } }; From 90a22e56bb847c98eb4ba2fc3879c6db1878bf24 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 17 Nov 2024 18:03:25 -0500 Subject: [PATCH 137/267] added qset 2 --- src/commands/Jobs/validatePreferences.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/commands/Jobs/validatePreferences.ts b/src/commands/Jobs/validatePreferences.ts index a33a2cf5..dfe76746 100644 --- a/src/commands/Jobs/validatePreferences.ts +++ b/src/commands/Jobs/validatePreferences.ts @@ -36,4 +36,10 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: errors.push('Travel distance must be a number'); } } + else if (qset === 1 && isJobForm) { + const intersts = answers.filter(interest => interest?.trim()).length; + if (intersts < 5) { + errors.push('Select at least 5 interests'); + } + } }; From 423328b643caeefb0b427456fc610748b3fa1825 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 17 Nov 2024 18:22:42 -0500 Subject: [PATCH 138/267] added handleSubmit in jobForm --- src/commands/Jobs/validatePreferences.ts | 9 ++++++--- src/commands/jobs/jobform.ts | 10 ++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/commands/Jobs/validatePreferences.ts b/src/commands/Jobs/validatePreferences.ts index dfe76746..9dc19253 100644 --- a/src/commands/Jobs/validatePreferences.ts +++ b/src/commands/Jobs/validatePreferences.ts @@ -1,6 +1,6 @@ interface ValidateResult { isValid: boolean; - error: string[]; + errors: string[]; } export const validatePreferences = (answers: string[], qset: number, isJobForm: boolean): ValidateResult => { @@ -35,11 +35,14 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: if (travelDistance && isNaN(Number(travelDistance.replace(/[^0-9]/g, '')))) { errors.push('Travel distance must be a number'); } - } - else if (qset === 1 && isJobForm) { + } else if (qset === 1 && isJobForm) { const intersts = answers.filter(interest => interest?.trim()).length; if (intersts < 5) { errors.push('Select at least 5 interests'); } } + return { + isValid: errors.length === 0, + errors + }; }; diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index dc5ddb81..d472179e 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -10,6 +10,7 @@ import { TextInputBuilder, TextInputStyle } from 'discord.js'; +import { validatePreferences } from './validatePreferences'; // prettier-ignore const questions = [ @@ -89,5 +90,14 @@ export default class extends Command { ] }); } + async handleSubmit(interaction: ChatInputCommandInteraction, answers: string[], qSet: number): Promise { + const validation = validatePreferences(answers, qSet, true); + if (!validation.isValid) { + await interaction.reply({ content: `Form validation failed:\n${validation.errors.join('\n')}`, + ephemeral: true }); + return false; + } + return true; + } } From 78f3882f341c99d072a558a05263b48a8b2f3443 Mon Sep 17 00:00:00 2001 From: pgsweet Date: Sun, 17 Nov 2024 22:00:30 -0500 Subject: [PATCH 139/267] changed main.yml to run workflow on every push --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4fd39ff5..76a8db32 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,7 +2,7 @@ name: Main Pipeline on: push: - branches: [ "main", "Ava-branch-config" ] + branches: [ "main"] pull_request: branches: [ "main", "Ava-branch-config" ] From 8ea39f7f3761136099a933c098f626f335407884 Mon Sep 17 00:00:00 2001 From: pgsweet Date: Sun, 17 Nov 2024 22:01:58 -0500 Subject: [PATCH 140/267] fixed main.yml so now it runs on every push --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 76a8db32..b027fc7d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,8 +1,8 @@ name: Main Pipeline on: - push: - branches: [ "main"] + push #: +# branches: [ "main", "Ava-branch-config" ] pull_request: branches: [ "main", "Ava-branch-config" ] From 4381c5b79f5bbfddaa571068f4b2ee1dbbe406b2 Mon Sep 17 00:00:00 2001 From: pgsweet Date: Sun, 17 Nov 2024 22:03:54 -0500 Subject: [PATCH 141/267] fixed syntax error on main.yml --- .github/workflows/main.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b027fc7d..c0c01f6e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,11 +1,17 @@ name: Main Pipeline -on: - push #: -# branches: [ "main", "Ava-branch-config" ] +# REMOVE THIS ON PRODUCTION CODE +on: push pull_request: branches: [ "main", "Ava-branch-config" ] +# RESTORE THIS ON PRODUCTION CODE +# on: +# push: +# branches: [ "main", "Ava-branch-config" ] +# pull_request: +# branches: [ "main", "Ava-branch-config" ] + env: DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} MAIN_BRANCH: 'main' From 448859d75ee3e60a8014fd836a324e3b7d93f54a Mon Sep 17 00:00:00 2001 From: pgsweet Date: Sun, 17 Nov 2024 22:05:14 -0500 Subject: [PATCH 142/267] this may fix main.yml so the workflow actually runs --- .github/workflows/main.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c0c01f6e..55f48fb0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,8 +2,6 @@ name: Main Pipeline # REMOVE THIS ON PRODUCTION CODE on: push - pull_request: - branches: [ "main", "Ava-branch-config" ] # RESTORE THIS ON PRODUCTION CODE # on: From 8948fd21b3f8111b74c874e15f9f08780d4e62b9 Mon Sep 17 00:00:00 2001 From: pgsweet Date: Sun, 17 Nov 2024 22:35:09 -0500 Subject: [PATCH 143/267] ran npm audit fix to maybe fix the build error --- package-lock.json | 92 ++++++++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7bc2f023..8a6c9dcf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -980,11 +980,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -1038,12 +1038,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1652,9 +1652,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -1683,9 +1683,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -2044,17 +2044,6 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/magic-bytes.js": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", @@ -2076,9 +2065,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -2105,12 +2094,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -2308,9 +2297,9 @@ } }, "node_modules/nodemailer": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", - "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==", + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", + "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", "engines": { "node": ">=6.0.0" } @@ -2686,12 +2675,9 @@ } }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -2929,19 +2915,27 @@ "dev": true }, "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" } }, "node_modules/text-table": { @@ -3143,9 +3137,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" From d6e54764c3a60141bdc1d5d843d13986d36be103 Mon Sep 17 00:00:00 2001 From: pgsweet Date: Sun, 17 Nov 2024 22:38:59 -0500 Subject: [PATCH 144/267] Revert "ran npm audit fix to maybe fix the build error" This reverts commit 8948fd21b3f8111b74c874e15f9f08780d4e62b9. --- package-lock.json | 92 +++++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8a6c9dcf..7bc2f023 100644 --- a/package-lock.json +++ b/package-lock.json @@ -980,11 +980,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", "dependencies": { - "follow-redirects": "^1.15.6", + "follow-redirects": "^1.15.0", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -1038,12 +1038,12 @@ } }, "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { - "fill-range": "^7.1.1" + "fill-range": "^7.0.1" }, "engines": { "node": ">=8" @@ -1652,9 +1652,9 @@ } }, "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -1683,9 +1683,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", @@ -2044,6 +2044,17 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/magic-bytes.js": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", @@ -2065,9 +2076,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -2094,12 +2105,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.3", + "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { @@ -2297,9 +2308,9 @@ } }, "node_modules/nodemailer": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", - "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", + "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==", "engines": { "node": ">=6.0.0" } @@ -2675,9 +2686,12 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -2915,27 +2929,19 @@ "dev": true }, "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", + "minipass": "^3.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "engines": { - "node": ">=8" + "node": ">= 10" } }, "node_modules/text-table": { @@ -3137,9 +3143,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, "engines": { "node": ">=0.10.0" From 3ef9d541b6ed6f0fb23c1ef639eba75e920d7de5 Mon Sep 17 00:00:00 2001 From: pgsweet Date: Sun, 17 Nov 2024 23:17:29 -0500 Subject: [PATCH 145/267] potential fix to build error --- config.example.ts | 7 +++++-- src/pieces/commandManager.ts | 5 ++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/config.example.ts b/config.example.ts index 5eb2e8d7..2f33857c 100644 --- a/config.example.ts +++ b/config.example.ts @@ -43,6 +43,7 @@ interface Config { MAINTAINERS: string; SEMESTER_ID: string; BLACKLIST: string; + JOB_FORMS: string; } function getEnvVar(name: keyof Config): string { @@ -97,7 +98,8 @@ export const config: Config = { PREFIX: getEnvVar('PREFIX'), MAINTAINERS: getEnvVar('MAINTAINERS'), SEMESTER_ID: getEnvVar('SEMESTER_ID'), - BLACKLIST: getEnvVar('BLACKLIST') + BLACKLIST: getEnvVar('BLACKLIST'), + JOB_FORMS: getEnvVar('JOB_FORMS') }; /* export const { DB_CONNECTION } = process.env.DB_CONNECTION; @@ -152,7 +154,8 @@ export const DB = { COURSES: config.DB_COURSES, REMINDERS: config.DB_REMINDERS, CLIENT_DATA: config.DB_CLIENT_DATA, - POLLS: config.DB_POLLS + POLLS: config.DB_POLLS, + JOB_FORMS: config.JOB_FORMS }; export const GUILDS = { diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 5eb2af5c..e0ea223c 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -1,10 +1,9 @@ -import { Collection, Client, CommandInteraction, ApplicationCommand, +import { Collection, Client, ApplicationCommand, GuildMember, SelectMenuInteraction, ModalSubmitInteraction, TextChannel, GuildMemberRoleManager, ButtonInteraction, ModalBuilder, TextInputBuilder, ActionRowBuilder, ModalActionRowComponentBuilder, ApplicationCommandType, ApplicationCommandDataResolvable, ChannelType, ApplicationCommandPermissionType, TextInputStyle, - ChatInputCommandInteraction, - ModalSubmitFields } from 'discord.js'; + ChatInputCommandInteraction } from 'discord.js'; import { isCmdEqual, readdirRecursive } from '@root/src/lib/utils/generalUtils'; import { Command } from '@lib/types/Command'; import { SageData } from '@lib/types/SageData'; From f37fb183cfffad2a08f4dbca33597b9d343335fe Mon Sep 17 00:00:00 2001 From: pgsweet Date: Sun, 17 Nov 2024 23:18:40 -0500 Subject: [PATCH 146/267] Revert "potential fix to build error" This reverts commit 3ef9d541b6ed6f0fb23c1ef639eba75e920d7de5. --- config.example.ts | 7 ++----- src/pieces/commandManager.ts | 5 +++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/config.example.ts b/config.example.ts index 2f33857c..5eb2e8d7 100644 --- a/config.example.ts +++ b/config.example.ts @@ -43,7 +43,6 @@ interface Config { MAINTAINERS: string; SEMESTER_ID: string; BLACKLIST: string; - JOB_FORMS: string; } function getEnvVar(name: keyof Config): string { @@ -98,8 +97,7 @@ export const config: Config = { PREFIX: getEnvVar('PREFIX'), MAINTAINERS: getEnvVar('MAINTAINERS'), SEMESTER_ID: getEnvVar('SEMESTER_ID'), - BLACKLIST: getEnvVar('BLACKLIST'), - JOB_FORMS: getEnvVar('JOB_FORMS') + BLACKLIST: getEnvVar('BLACKLIST') }; /* export const { DB_CONNECTION } = process.env.DB_CONNECTION; @@ -154,8 +152,7 @@ export const DB = { COURSES: config.DB_COURSES, REMINDERS: config.DB_REMINDERS, CLIENT_DATA: config.DB_CLIENT_DATA, - POLLS: config.DB_POLLS, - JOB_FORMS: config.JOB_FORMS + POLLS: config.DB_POLLS }; export const GUILDS = { diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index e0ea223c..5eb2af5c 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -1,9 +1,10 @@ -import { Collection, Client, ApplicationCommand, +import { Collection, Client, CommandInteraction, ApplicationCommand, GuildMember, SelectMenuInteraction, ModalSubmitInteraction, TextChannel, GuildMemberRoleManager, ButtonInteraction, ModalBuilder, TextInputBuilder, ActionRowBuilder, ModalActionRowComponentBuilder, ApplicationCommandType, ApplicationCommandDataResolvable, ChannelType, ApplicationCommandPermissionType, TextInputStyle, - ChatInputCommandInteraction } from 'discord.js'; + ChatInputCommandInteraction, + ModalSubmitFields } from 'discord.js'; import { isCmdEqual, readdirRecursive } from '@root/src/lib/utils/generalUtils'; import { Command } from '@lib/types/Command'; import { SageData } from '@lib/types/SageData'; From 2533452bcdefda63634e07fc3193540910695b56 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:31:30 -0500 Subject: [PATCH 147/267] moved files around --- src/{commands/jobs => lib/utils/jobUtils}/Adzuna_job_search.ts | 0 src/{commands/jobs => lib/utils/jobUtils}/jobDatabase.ts | 0 src/pieces/commandManager.ts | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename src/{commands/jobs => lib/utils/jobUtils}/Adzuna_job_search.ts (100%) rename src/{commands/jobs => lib/utils/jobUtils}/jobDatabase.ts (100%) diff --git a/src/commands/jobs/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts similarity index 100% rename from src/commands/jobs/Adzuna_job_search.ts rename to src/lib/utils/jobUtils/Adzuna_job_search.ts diff --git a/src/commands/jobs/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts similarity index 100% rename from src/commands/jobs/jobDatabase.ts rename to src/lib/utils/jobUtils/jobDatabase.ts diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 5eb2af5c..ed9ce59a 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -13,7 +13,7 @@ import { Course } from '../lib/types/Course'; import { SageUser } from '../lib/types/SageUser'; import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; -import { JobPreferenceAPI } from '../commands/jobs/jobDatabase'; +import { JobPreferenceAPI } from '../lib/utils/jobUtils/jobDatabase'; import { Job } from '../lib/types/Job'; const DELETE_DELAY = 10000; From c361b67caff14df5bd92a17c9a16bef700b626fd Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:41:26 -0500 Subject: [PATCH 148/267] reverted main.yml change --- .github/workflows/main.yml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 55f48fb0..4fd39ff5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,14 +1,10 @@ name: Main Pipeline -# REMOVE THIS ON PRODUCTION CODE -on: push - -# RESTORE THIS ON PRODUCTION CODE -# on: -# push: -# branches: [ "main", "Ava-branch-config" ] -# pull_request: -# branches: [ "main", "Ava-branch-config" ] +on: + push: + branches: [ "main", "Ava-branch-config" ] + pull_request: + branches: [ "main", "Ava-branch-config" ] env: DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} From 3eb50701504b762c61ec1cab496a4ea6d46f463f Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Mon, 18 Nov 2024 09:48:51 -0500 Subject: [PATCH 149/267] puling from main --- src/commands/jobs/jobform.ts | 2 +- src/{commands/jobs => lib/utils/jobUtils}/Adzuna_job_search.ts | 0 src/{commands/Jobs => lib/utils/jobUtils}/jobDatabase.ts | 0 .../Jobs => lib/utils/jobUtils}/validatePreferences.ts | 0 src/pieces/commandManager.ts | 2 +- 5 files changed, 2 insertions(+), 2 deletions(-) rename src/{commands/jobs => lib/utils/jobUtils}/Adzuna_job_search.ts (100%) rename src/{commands/Jobs => lib/utils/jobUtils}/jobDatabase.ts (100%) rename src/{commands/Jobs => lib/utils/jobUtils}/validatePreferences.ts (100%) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index d472179e..0900f512 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -10,7 +10,7 @@ import { TextInputBuilder, TextInputStyle } from 'discord.js'; -import { validatePreferences } from './validatePreferences'; +import { validatePreferences } from '../../lib/utils/jobUtils/validatePreferences'; // prettier-ignore const questions = [ diff --git a/src/commands/jobs/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts similarity index 100% rename from src/commands/jobs/Adzuna_job_search.ts rename to src/lib/utils/jobUtils/Adzuna_job_search.ts diff --git a/src/commands/Jobs/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts similarity index 100% rename from src/commands/Jobs/jobDatabase.ts rename to src/lib/utils/jobUtils/jobDatabase.ts diff --git a/src/commands/Jobs/validatePreferences.ts b/src/lib/utils/jobUtils/validatePreferences.ts similarity index 100% rename from src/commands/Jobs/validatePreferences.ts rename to src/lib/utils/jobUtils/validatePreferences.ts diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index ead9501a..379a9c42 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -13,7 +13,7 @@ import { Course } from '../lib/types/Course'; import { SageUser } from '../lib/types/SageUser'; import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; -import { JobPreferenceAPI } from '../commands/jobs/jobDatabase'; +import { JobPreferenceAPI } from '../lib/utils/jobUtils/jobDatabase'; const DELETE_DELAY = 10000; From fd36729cbf2edd9e3923031defc7730d22a11111 Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:50:03 -0500 Subject: [PATCH 150/267] removed viewJobForm --- src/commands/jobs/viewJobForm.ts | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 src/commands/jobs/viewJobForm.ts diff --git a/src/commands/jobs/viewJobForm.ts b/src/commands/jobs/viewJobForm.ts deleted file mode 100644 index 2125bb3c..00000000 --- a/src/commands/jobs/viewJobForm.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { DB } from '@root/config'; -import { ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; -import { Command } from '@lib/types/Command'; - -export default class extends Command { - - description = 'See your answers and interests inserted into job form.'; - extendedHelp = 'Don\'t worry, answers and interests will be hidden if you use this command publicly.'; - - async run(interaction: ChatInputCommandInteraction): Promise | void> { - const jobAnswers = await interaction.client.mongo.collection(DB.USERS) - .findOne({ owner: interaction.user.id, jobPreferences: { $exists: true } }); - - if (!jobAnswers) { - interaction.reply({ content: 'You don\'t have any submitted anwers to the job form!', ephemeral: true }); - } - - const embeds = new EmbedBuilder() - .setTitle('Your Job Preferences') - .setColor('DarkAqua'); - const preferences = jobAnswers.jobPreferences.answers; - if (preferences) { - embeds.addFields( - { name: 'Preffered City', value: preferences.city }, - { name: 'Preffered Job Type', value: preferences.jobType }, - { name: 'Preffered Job Title', value: preferences.jobTitle }, - { name: 'Preffered Job Description', value: preferences.jobDescription } - ); - } - } - -} From 7bfab22a18e7c931331e27546c7384a3a7720423 Mon Sep 17 00:00:00 2001 From: John Aromando Date: Mon, 18 Nov 2024 09:58:54 -0500 Subject: [PATCH 151/267] Update node.js.yml added required library for node-canvas fix to remote pipeline --- .github/workflows/node.js.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index af54dd53..3023484d 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -18,6 +18,12 @@ jobs: with: node-version: '>=18' cache: 'npm' + + - name: Install required system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libcairo2-dev libjpeg-dev libpango1.0-dev libgif-dev build-essential g++ + - run: npm cache clean --force - run: npm ci From 2a7fd0fc0636a190a5d8255d9e0b345a7a32a135 Mon Sep 17 00:00:00 2001 From: Saieda Ali Zada <143635010+SaiedaJN@users.noreply.github.com> Date: Tue, 19 Nov 2024 15:07:54 -0500 Subject: [PATCH 152/267] Job got formatted and cached. --- src/commands/jobs/Adzuna_job_search.ts | 34 +++++++ src/lib/utils/jobUtils/Adzuna_job_search.ts | 99 +++++++++++++++------ 2 files changed, 104 insertions(+), 29 deletions(-) create mode 100644 src/commands/jobs/Adzuna_job_search.ts diff --git a/src/commands/jobs/Adzuna_job_search.ts b/src/commands/jobs/Adzuna_job_search.ts new file mode 100644 index 00000000..b4e583e7 --- /dev/null +++ b/src/commands/jobs/Adzuna_job_search.ts @@ -0,0 +1,34 @@ +import axios from 'axios'; +import { APP_ID, APP_KEY } from '@root/config'; // configuration values imported from config.ts + +// Define the getJobs function to fetch and format data +// "async" means that it is a promising fuction which allows to use await +const getJobs = async (JOB_TITLE, LOCATION) => { + const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} + &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; + + try { // handles any error function + // Make the API request + const response = await axios.get(URL); + // iterate over each job object in the results array. + const jobListings = response.data.results.map((job) => ({ + title: job.title, + company: job.company?.name || 'Not Provided', // Assuming company object has a 'name' field + location: job.location?.display_name || 'Not Provided', // Assuming location object has a 'display_name' field + salary: job.salary_min ? `$${job.salary_min.toLocaleString()} - $${job.salary_max.toLocaleString()}` : 'Salary not listed', + link: job.redirect_url || 'No link available', + description: job.description || 'No description available' + + })); + + // Log the formatted job listings (see the output to console) + console.log('Formatted Job Listings:', jobListings); + } catch (error) { + // Handle any errors that occur during the request + console.error('Axios error:', error); + } +}; + +// Invoke the function with specific parameters (e.g., software engineer in the US) +getJobs('software engineer', 'us'); + diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index b5024db1..06ae0927 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -1,30 +1,71 @@ +import axios from 'axios'; import { APP_ID, APP_KEY } from '@root/config'; -// import axios from 'axios'; - - -// Questions: how to pull it? Do I need to pull it? -// how to work on the next part of the project? -// Task 3.5: Store fetched job listings temporarily for job matching -// Create a local cache or temporary storage to hold job listings for processing. - -const JOB_TITLE = 'software engineer'; -const LOCATION = 'us'; -// const SALARY_MIN = 50000; - -const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} -&results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; - -fetch(URL) - .then((response) => { - if (!response.ok) { - throw new Error(`HTTP error ${response.status}`); - } - return response.json(); - }) - .then((responseData) => { - console.log('got data'); - // console.log(responseData); - }) - .catch((error) => { - console.error('Fetch error:', error); - }); + +// Define the structure of a job listing +interface JobListing { + title: string; + company: string; + location: string; + salary: string; + link: string; + description: string; +} + + // Define the cache type + type JobCache = { + [key: string]: JobListing[]; + }; + +// Create a cache object to store results +const jobCache: JobCache = {}; + +// Define the getJobs function with caching +const getJobs = async (JOB_TITLE: string, LOCATION: string): Promise => { + const cacheKey = `${JOB_TITLE.toLowerCase()}-${LOCATION.toLowerCase()}`; + + // Check if the data is already in the cache + if (jobCache[cacheKey]) { + console.log('Fetching data from cache...'); + return jobCache[cacheKey]; + } + + // URL for the API request + const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} + &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; + + try { + // Make the API request + console.log('Fetching data from API...'); + const response = await axios.get(URL); + + // Format the job listings + const jobListings: JobListing[] = response.data.results.map((job: any) => ({ + title: job.title, + company: job.company?.name || 'Not Provided', + location: job.location?.display_name || 'Not Provided', + salary: job.salary_min + ? `$${job.salary_min.toLocaleString()} - $${job.salary_max.toLocaleString()}` + : 'Salary not listed', + link: job.redirect_url || 'No link available', + description: job.description || 'No description available' + })); + + // Store the formatted data in the cache + jobCache[cacheKey] = jobListings; + + // Return the data + return jobListings; + } catch (error) { + console.error('Axios error:', error); + throw error; + } +}; + +// Usage example +getJobs('software engineer', 'US') + .then((data) => console.log('Job Listings:', data)) + .catch((err) => console.error(err)); + +getJobs('software engineer', 'US') + .then((data) => console.log('Job Listings:', data)) + .catch((err) => console.error(err)); From f072f3877cc3b59611deda411a3811b75951ed22 Mon Sep 17 00:00:00 2001 From: Saieda Ali Zada <143635010+SaiedaJN@users.noreply.github.com> Date: Tue, 19 Nov 2024 15:14:55 -0500 Subject: [PATCH 153/267] deleted the old Adzuna_job_search.ts --- src/commands/jobs/Adzuna_job_search.ts | 34 -------------------------- 1 file changed, 34 deletions(-) delete mode 100644 src/commands/jobs/Adzuna_job_search.ts diff --git a/src/commands/jobs/Adzuna_job_search.ts b/src/commands/jobs/Adzuna_job_search.ts deleted file mode 100644 index b4e583e7..00000000 --- a/src/commands/jobs/Adzuna_job_search.ts +++ /dev/null @@ -1,34 +0,0 @@ -import axios from 'axios'; -import { APP_ID, APP_KEY } from '@root/config'; // configuration values imported from config.ts - -// Define the getJobs function to fetch and format data -// "async" means that it is a promising fuction which allows to use await -const getJobs = async (JOB_TITLE, LOCATION) => { - const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} - &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; - - try { // handles any error function - // Make the API request - const response = await axios.get(URL); - // iterate over each job object in the results array. - const jobListings = response.data.results.map((job) => ({ - title: job.title, - company: job.company?.name || 'Not Provided', // Assuming company object has a 'name' field - location: job.location?.display_name || 'Not Provided', // Assuming location object has a 'display_name' field - salary: job.salary_min ? `$${job.salary_min.toLocaleString()} - $${job.salary_max.toLocaleString()}` : 'Salary not listed', - link: job.redirect_url || 'No link available', - description: job.description || 'No description available' - - })); - - // Log the formatted job listings (see the output to console) - console.log('Formatted Job Listings:', jobListings); - } catch (error) { - // Handle any errors that occur during the request - console.error('Axios error:', error); - } -}; - -// Invoke the function with specific parameters (e.g., software engineer in the US) -getJobs('software engineer', 'us'); - From 983afb49b0927b81c36fee6cd656c4aafa46bab8 Mon Sep 17 00:00:00 2001 From: Saieda Ali Zada <143635010+SaiedaJN@users.noreply.github.com> Date: Tue, 19 Nov 2024 15:19:47 -0500 Subject: [PATCH 154/267] merge with task 3 --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index 06ae0927..d7ebefa1 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -66,6 +66,3 @@ getJobs('software engineer', 'US') .then((data) => console.log('Job Listings:', data)) .catch((err) => console.error(err)); -getJobs('software engineer', 'US') - .then((data) => console.log('Job Listings:', data)) - .catch((err) => console.error(err)); From a1ff59f8784c826405f2adf3ce61505564c875f1 Mon Sep 17 00:00:00 2001 From: Jessica Cunningham Date: Tue, 19 Nov 2024 21:32:53 -0500 Subject: [PATCH 155/267] added documentation, fixed typos, removed dated code no longer in use, adzunaAPI now in func --- src/commands/jobs/jobform.ts | 4 +++ src/commands/jobs/update_preferences.ts | 8 +++-- src/commands/reminders/remind.ts | 3 +- src/lib/utils/jobUtils/Adzuna_job_search.ts | 39 +++++++++++---------- src/lib/utils/jobUtils/jobDatabase.ts | 1 + src/pieces/commandManager.ts | 9 +++-- 6 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index e0987533..4747e9ef 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -12,6 +12,7 @@ import { } from 'discord.js'; // prettier-ignore +// can be updated based on job algorithm API information - if changed make sure to update in update_preferences.ts on line 8 and question titles on line 55 const questions = [ [ 'What city are you located in?', @@ -29,6 +30,7 @@ export default class extends Command { description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; + // gives option to command to choose what question set user is answering options: ApplicationCommandOptionData[] = [ { name: 'qset', @@ -47,11 +49,13 @@ export default class extends Command { ): Promise | void> { const questionSet = interaction.options.getNumber('qset') - 1; + // bad input handling if (questionSet !== 0 && questionSet !== 1) { interaction.reply({ content: 'Please enter either 1 or 2' }); return; } + // creates the modal that pops up once the command is run, giving it the correct title and set of questions const modal = new ModalBuilder() .setCustomId(`jobModal${questionSet}`) .setTitle(`Job Form (${questionSet + 1} of 2)`); diff --git a/src/commands/jobs/update_preferences.ts b/src/commands/jobs/update_preferences.ts index b3b34ff2..bdc58e9f 100644 --- a/src/commands/jobs/update_preferences.ts +++ b/src/commands/jobs/update_preferences.ts @@ -4,7 +4,7 @@ import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptio ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, TextInputBuilder, TextInputStyle } from 'discord.js'; - +// should be same questions as jobform.ts line 16 const questions = [ ['What city are you located in?', 'Are you looking for remote or in person?', 'Job, internship or both?', 'How far are you willing to travel?'], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] @@ -31,16 +31,18 @@ export default class extends Command { async run(interaction: ChatInputCommandInteraction): Promise | void> { const questionSet = interaction.options.getNumber('qset') - 1; + // bad input handling if (questionSet !== 0 && questionSet !== 1) { interaction.reply({ content: 'Please enter either 1 or 2' }); return; } - // Checks if ansers already exists. + // Checks if user has done the job form at least once const existingAnswers = await interaction.client.mongo.collection(DB.USERS).findOne({ discordId: interaction.user.id, jobPreferences: { $exists: true } }); + // directs user to do /jobform first since they have no preferences to update if (!existingAnswers) { interaction.reply({ content: 'No preferences found, enter preferences by using the command /jobform', @@ -50,6 +52,7 @@ export default class extends Command { } const currentAns = existingAnswers.jobPreferences?.answers; const askedQuestions = questions[questionSet]; + // if questions changed, making sure to update these titles to correctly describe question const quesChoices = questionSet === 0 ? ['city', 'workType', 'employmentType', 'travelDistance'] : ['interest1', 'interest2', 'interest3', 'interest4', 'interest5']; @@ -62,6 +65,7 @@ export default class extends Command { return this.getAnswerField(question, askedQuestions.indexOf(question), value); }); + // creates the modal that pops up when command is used, with title matching which questions set user is answering const modal = new ModalBuilder() .setCustomId(`updateModal${questionSet}`) .setTitle(`Update Job Preferences (${questionSet + 1} of 2)`); diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 8d8bed16..7cbc1618 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -44,6 +44,7 @@ export default class extends Command { } ] }, + // added by Fried Sage Leaves - handles what happens when /remind jobs is run { name: 'jobs', description: 'Create a job reminder', @@ -93,7 +94,7 @@ export default class extends Command { expires: new Date(), repeat: jobReminderRepeat }; - + // handling duplicate job reminders if (await this.checkJobReminder(interaction)) { return interaction.reply({ content: diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index b5024db1..1349a7f8 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -6,25 +6,26 @@ import { APP_ID, APP_KEY } from '@root/config'; // how to work on the next part of the project? // Task 3.5: Store fetched job listings temporarily for job matching // Create a local cache or temporary storage to hold job listings for processing. +export function adzunaAPI(): void { + const JOB_TITLE = 'software engineer'; + const LOCATION = 'us'; + // const SALARY_MIN = 50000; -const JOB_TITLE = 'software engineer'; -const LOCATION = 'us'; -// const SALARY_MIN = 50000; + const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} + &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; -const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} -&results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; - -fetch(URL) - .then((response) => { - if (!response.ok) { - throw new Error(`HTTP error ${response.status}`); - } - return response.json(); - }) - .then((responseData) => { - console.log('got data'); + fetch(URL) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error ${response.status}`); + } + return response.json(); + }) + .then((responseData) => { + console.log('got data'); // console.log(responseData); - }) - .catch((error) => { - console.error('Fetch error:', error); - }); + }) + .catch((error) => { + console.error('Fetch error:', error); + }); +} diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index a7ec0b95..30c35dd8 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -3,6 +3,7 @@ import { DB } from '@root/config'; import { Command } from '@root/src/lib/types/Command'; import { Emoji } from 'discord.js'; +// class to store the info of the preferences the user previously put in to match to jobs in the database interface JobPreferences { userID: string; answers: { diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index ed9ce59a..b2d61fb0 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -106,6 +106,7 @@ async function handleDropdown(interaction: SelectMenuInteraction) { } } +// used by jobform and update_preferences async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Client) { const { customId, fields } = interaction; const guild = await bot.guilds.fetch(GUILDS.MAIN); @@ -132,6 +133,7 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie interaction.reply({ content: `Your message was edited.` }); break; } + // makes sure the user is verified in the mongo db user collections case 'verify': { const givenHash = fields.getTextInputValue('verifyPrompt'); const entry: SageUser = await interaction.client.mongo.collection(DB.USERS).findOne({ hash: givenHash }); @@ -148,6 +150,7 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie interaction.reply({ content: `Thank you for verifying! You can now access the rest of the server. ${enrollStr}`, ephemeral: true }); break; } + // jobform and update_preferences use the same logic to store responses case 'jobModal': case 'updateModal': { try { @@ -155,16 +158,17 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie const formNumber = parseInt(customId.slice(-1)); const answers = [1, 2, 3, 4, 5].slice(0, formNumber === 0 ? 4 : 5).map(num => fields.getTextInputValue(`question${num}`)); + // schema used to store the responses by the user const answerResponse: Job = { owner: interaction.user.id, content: '', location: '', questionSet: formNumber, answers: answers, - mode: 'private' // temporary - switch to private before final submission + mode: 'private' }; - // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); + // handling which document to replace, upsert: true makes it so it makes the document if no matching one is found if (answerResponse.questionSet === 0) { interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( { questionSet: 0 }, answerResponse, { upsert: true }); @@ -185,6 +189,7 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie content: success ? mess : 'Error saving preferences. Please try again', ephemeral: true }); + // couldnt update form for some reason } catch (error) { console.error('update form error:', error); await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); From c15fb1368a2545cfb4dfe4d7c18b4e37deb02803 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 19 Nov 2024 22:15:25 -0500 Subject: [PATCH 156/267] added and changed to handleModalSubmit --- src/commands/jobs/jobform.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 0900f512..e0fd0820 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -90,14 +90,17 @@ export default class extends Command { ] }); } - async handleSubmit(interaction: ChatInputCommandInteraction, answers: string[], qSet: number): Promise { + async handleModalSubmit(interaction: ChatInputCommandInteraction, answers: string[], qSet: number): Promise { const validation = validatePreferences(answers, qSet, true); if (!validation.isValid) { await interaction.reply({ content: `Form validation failed:\n${validation.errors.join('\n')}`, ephemeral: true }); - return false; + return; } - return true; + await interaction.reply({ + content: 'Form submitted successfully!', + ephemeral: true + }); } } From 66482f2b3c5093ace7f6c5b139c55f2662def5e1 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 19 Nov 2024 22:19:57 -0500 Subject: [PATCH 157/267] added validation into commandManager --- src/pieces/commandManager.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index ed9ce59a..b1ca44f3 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -15,6 +15,7 @@ import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; import { JobPreferenceAPI } from '../lib/utils/jobUtils/jobDatabase'; import { Job } from '../lib/types/Job'; +import { validatePreferences } from '../lib/utils/jobUtils/validatePreferences'; const DELETE_DELAY = 10000; @@ -154,7 +155,14 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie // extracting the input from the modal const formNumber = parseInt(customId.slice(-1)); const answers = [1, 2, 3, 4, 5].slice(0, formNumber === 0 ? 4 : 5).map(num => fields.getTextInputValue(`question${num}`)); - + const { isValid, errors } = validatePreferences(answers, formNumber, true); + if (!isValid) { + await interaction.reply({ + content: `Form validation failed:\n${errors.join('\n')}`, + ephemeral: true + }); + return; + } const answerResponse: Job = { owner: interaction.user.id, content: '', From ad8eed00c33abcee2e059ffb7d8e01bfe681dd24 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 19 Nov 2024 22:34:20 -0500 Subject: [PATCH 158/267] added validation to validationPreferences.ts --- src/commands/jobs/jobform.ts | 1 + src/lib/utils/jobUtils/jobDatabase.ts | 7 +++++- src/pieces/commandManager.ts | 34 +++++++++++++-------------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index e0fd0820..786f8f37 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -87,6 +87,7 @@ export default class extends Command { .setLabel(`${question}`) .setStyle(TextInputStyle.Short) .setPlaceholder('Input Answer Here') + .setRequired(true) ] }); } diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index a8a8f96c..bc3b3cd8 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -2,6 +2,7 @@ import { Collection, Db, MongoClient } from 'mongodb'; import { DB } from '@root/config'; import { Command } from '@root/src/lib/types/Command'; import { Emoji } from 'discord.js'; +import { validatePreferences } from './validatePreferences'; interface JobPreferences { userID: string; @@ -34,7 +35,11 @@ export class JobPreferenceAPI { async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise { try { const updateObject = {}; - + const { isValid, errors } = validatePreferences(answers, questionSet, true); + if (!isValid) { + console.error('Validation failed', errors); + return false; + } // Adds answers to questions. if (questionSet === 0) { const [city, workType, employmentType, travelDistance] = answers; diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index b1ca44f3..88caacc6 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -163,23 +163,23 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie }); return; } - const answerResponse: Job = { - owner: interaction.user.id, - content: '', - location: '', - questionSet: formNumber, - answers: answers, - mode: 'private' // temporary - switch to private before final submission - }; - - // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); - if (answerResponse.questionSet === 0) { - interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( - { questionSet: 0 }, answerResponse, { upsert: true }); - } else if (answerResponse.questionSet === 1) { - interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( - { questionSet: 1 }, answerResponse, { upsert: true }); - } + // const answerResponse: Job = { + // owner: interaction.user.id, + // content: '', + // location: '', + // questionSet: formNumber, + // answers: answers, + // mode: 'private' // temporary - switch to private before final submission + // }; + + // // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); + // if (answerResponse.questionSet === 0) { + // interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( + // { questionSet: 0 }, answerResponse, { upsert: true }); + // } else if (answerResponse.questionSet === 1) { + // interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( + // { questionSet: 1 }, answerResponse, { upsert: true }); + // } // Create API instance with the database instance directly const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); From 43047d031fe87a444dcc39335caf4c833cb24c80 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 01:47:30 -0500 Subject: [PATCH 159/267] added function that calls Adzuna API to retrieve API response to be utilized in joblistings --- src/pieces/tasks.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index acd1c3f2..9557f436 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -5,6 +5,7 @@ import { Reminder } from '@lib/types/Reminder'; import { Poll, PollResult } from '@lib/types/Poll'; import { MongoClient } from 'mongodb'; import { Job } from '../lib/types/Job'; +import getJobAPIResponse from '../lib/utils/jobUtils/Adzuna_job_search'; async function register(bot: Client): Promise { schedule('0/30 * * * * *', () => { @@ -79,14 +80,14 @@ async function checkPolls(bot: Client): Promise { }); } -interface JobData { +export interface JobData { city: string, preference: string, jobType: string, distance: string } -interface Interest { +export interface Interest { interest1: string, interest2: string, interest3: string, @@ -99,7 +100,6 @@ async function getJobFormData(userID:string):Promise<[JobData, Interest]> { const client = await MongoClient.connect(DB.CONNECTION, { useUnifiedTopology: true }); const db = client.db(BOT.NAME).collection(DB.JOB_FORMS); const jobformAnswers:Job[] = await db.find({ owner: userID }).toArray(); - const jobData:JobData = { city: jobformAnswers[0].answers[0], preference: jobformAnswers[0].answers[1], @@ -115,6 +115,8 @@ async function getJobFormData(userID:string):Promise<[JobData, Interest]> { interest5: jobformAnswers[1].answers[4] }; + getJobAPIResponse(jobData, interests); + return [jobData, interests]; } @@ -146,8 +148,8 @@ ${jobFormData[1].interest3}, ${jobFormData[1].interest4}, and ${jobFormData[1].i - **Apply here**: [application](https://www.cybersecureintern.com/apply) \n -# **Disclaimer:** --# Please note that the job listings provided are sourced from a third-party API and we cannot guarantee the legitimacy or security of all postings. Exercise caution when submitting personal --# information, resumes, or signing up on external sites. Always verify the authenticity of a job application +-# Please note that the job listings provided are sourced from a third-party API and we cannot guarantee the legitimacy or security of all postings. Exercise caution when submitting personal +-# information, resumes, or signing up on external sites. Always verify the authenticity of a job application -# before proceeding. Stay safe and mindful while applying! `; } From b30fc2e51a95dc37f607b9754f69aea19c57c4dc Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 01:50:01 -0500 Subject: [PATCH 160/267] created function that takes in the user's job preference data and interests, passes this data to the API response, and stores it all in an array --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 88 +++++++++++++++------ 1 file changed, 64 insertions(+), 24 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index b5024db1..849404c2 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -1,30 +1,70 @@ import { APP_ID, APP_KEY } from '@root/config'; -// import axios from 'axios'; +import { Interest, JobData } from '@root/src/pieces/tasks'; +export interface JobResult { + company: string, + title: string, + description: string, + location, + created: string, + salaryMax: string, + salaryMin: string, + link: string, +} -// Questions: how to pull it? Do I need to pull it? -// how to work on the next part of the project? -// Task 3.5: Store fetched job listings temporarily for job matching -// Create a local cache or temporary storage to hold job listings for processing. +export default function getJobAPIResponse(jobData:JobData, interests:Interest):JobResult[] { + const LOCATION = encodeURIComponent(jobData.city); + const JOB_TYPE = encodeURIComponent(jobData.jobType); + const DISTANCE_KM = Number(jobData.distance) * 1.609; // miles in km + let whatInterests = ''; -const JOB_TITLE = 'software engineer'; -const LOCATION = 'us'; -// const SALARY_MIN = 50000; + const keys = Object.keys(interests); + const lastKey = keys[keys.length - 1]; + const lastValue = interests[lastKey]; -const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} -&results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; - -fetch(URL) - .then((response) => { - if (!response.ok) { - throw new Error(`HTTP error ${response.status}`); + for (const interest in interests) { + whatInterests += interests[interest].replace(/\s+/g, '-'); // replaces each space in a word with a dash + if (interests[interest] !== lastValue) { + whatInterests += ' '; } - return response.json(); - }) - .then((responseData) => { - console.log('got data'); - // console.log(responseData); - }) - .catch((error) => { - console.error('Fetch error:', error); - }); + } + + whatInterests = encodeURIComponent(whatInterests); + // const SALARY_MIN = 50000; + const URL = `https://api.adzuna.com/v1/api/jobs/us/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=7&what=${JOB_TYPE}&what_or=${whatInterests}&where= + ${LOCATION}&distance=${DISTANCE_KM}`; + + const jobResults = []; + + fetch(URL) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error ${response.status}`); + } + return response.json(); + }) + .then((responseData) => { + console.log('-------------------------------------------------------------------'); + for (let i = 0; i < responseData.results.length; i++) { + const jobResultData = { + company: responseData.results[i].company.display_name, + title: responseData.results[i].title, + description: responseData.results[i].description, + location: `${responseData.results[i].location.display_name} (${responseData.results[i].location.area.toString().replace(/,/g, ', ')})`, + created: responseData.results[i].created, + salaryMax: responseData.results[i].salary_max, + salaryMin: responseData.results[i].salary_min, + link: responseData.results[i].redirect_url + }; + + if (!jobResults.find((job:JobResult) => job.company === jobResultData.company)) { + jobResults.push(jobResultData); + } + } + }) + .catch((error) => { + console.error('Fetch error:', error); + }); + + return jobResults; +} From e83801e4a9c1097c2348208482ece597611e209f Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 02:34:38 -0500 Subject: [PATCH 161/267] converted function to an async function so it now properly returns the array of data --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 59 ++++++++++----------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index 849404c2..c454aa38 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -12,7 +12,7 @@ export interface JobResult { link: string, } -export default function getJobAPIResponse(jobData:JobData, interests:Interest):JobResult[] { +export default async function getJobAPIResponse(jobData: JobData, interests: Interest): Promise { const LOCATION = encodeURIComponent(jobData.city); const JOB_TYPE = encodeURIComponent(jobData.jobType); const DISTANCE_KM = Number(jobData.distance) * 1.609; // miles in km @@ -30,41 +30,38 @@ export default function getJobAPIResponse(jobData:JobData, interests:Interest):J } whatInterests = encodeURIComponent(whatInterests); - // const SALARY_MIN = 50000; + const URL = `https://api.adzuna.com/v1/api/jobs/us/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=7&what=${JOB_TYPE}&what_or=${whatInterests}&where= - ${LOCATION}&distance=${DISTANCE_KM}`; + ${LOCATION}&distance=${DISTANCE_KM}`; - const jobResults = []; + const jobResults: JobResult[] = []; - fetch(URL) - .then((response) => { - if (!response.ok) { - throw new Error(`HTTP error ${response.status}`); - } - return response.json(); - }) - .then((responseData) => { - console.log('-------------------------------------------------------------------'); - for (let i = 0; i < responseData.results.length; i++) { - const jobResultData = { - company: responseData.results[i].company.display_name, - title: responseData.results[i].title, - description: responseData.results[i].description, - location: `${responseData.results[i].location.display_name} (${responseData.results[i].location.area.toString().replace(/,/g, ', ')})`, - created: responseData.results[i].created, - salaryMax: responseData.results[i].salary_max, - salaryMin: responseData.results[i].salary_min, - link: responseData.results[i].redirect_url - }; + try { + const response = await fetch(URL); + if (!response.ok) { + throw new Error(`HTTP error ${response.status}`); + } - if (!jobResults.find((job:JobResult) => job.company === jobResultData.company)) { - jobResults.push(jobResultData); - } + const responseData = await response.json(); + for (let i = 0; i < responseData.results.length; i++) { + const jobResultData: JobResult = { + company: responseData.results[i].company.display_name, + title: responseData.results[i].title, + description: responseData.results[i].description, + location: `${responseData.results[i].location.display_name} (${responseData.results[i].location.area.toString().replace(/,/g, ', ')})`, + created: responseData.results[i].created, + salaryMax: responseData.results[i].salary_max, + salaryMin: responseData.results[i].salary_min, + link: responseData.results[i].redirect_url + }; + + if (!jobResults.find((job: JobResult) => job.company === jobResultData.company)) { + jobResults.push(jobResultData); } - }) - .catch((error) => { - console.error('Fetch error:', error); - }); + } + } catch (error) { + console.error('Fetch error:', error); + } return jobResults; } From cdadaafb093c03d6f06785d4bae471da83749caf Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 02:35:47 -0500 Subject: [PATCH 162/267] fixed message styling and logic for displaying the message data by having the code await the result from the now async function 'getJobAPIResponse' --- src/pieces/tasks.ts | 64 ++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 9557f436..7e67613c 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -5,7 +5,7 @@ import { Reminder } from '@lib/types/Reminder'; import { Poll, PollResult } from '@lib/types/Poll'; import { MongoClient } from 'mongodb'; import { Job } from '../lib/types/Job'; -import getJobAPIResponse from '../lib/utils/jobUtils/Adzuna_job_search'; +import getJobAPIResponse, { JobResult } from '../lib/utils/jobUtils/Adzuna_job_search'; async function register(bot: Client): Promise { schedule('0/30 * * * * *', () => { @@ -96,7 +96,7 @@ export interface Interest { } // eslint-disable-next-line no-warning-comments -async function getJobFormData(userID:string):Promise<[JobData, Interest]> { +async function getJobFormData(userID:string):Promise<[JobData, Interest, JobResult[]]> { const client = await MongoClient.connect(DB.CONNECTION, { useUnifiedTopology: true }); const db = client.db(BOT.NAME).collection(DB.JOB_FORMS); const jobformAnswers:Job[] = await db.find({ owner: userID }).toArray(); @@ -115,42 +115,40 @@ async function getJobFormData(userID:string):Promise<[JobData, Interest]> { interest5: jobformAnswers[1].answers[4] }; - getJobAPIResponse(jobData, interests); + const APIResponse:JobResult[] = await getJobAPIResponse(jobData, interests); + return [jobData, interests, APIResponse]; +} - return [jobData, interests]; +// TODO - need to figure out if the salary is in USD or not +function listJobs(jobData: JobResult[]): string { + let jobList = ''; + for (let i = 0; i < jobData.length; i++) { + jobList += `${i + 1}. **${jobData[i].company} (${jobData[i].title})** + * **Salary Average:** ${(Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2} + *(Min: ${jobData[i].salaryMin}, Max: ${jobData[i].salaryMax})* + * **Job Description:** ${jobData[i].description.slice(0, 50).trim()}... + * **Location:** ${jobData[i].location} + * **Apply here:** [read more about the job and apply here](${jobData[i].link}) + \n`; + } + return jobList || 'No jobs found based on your interests.'; } -async function jobMessage(reminder:Reminder, userID:string):Promise { - const jobFormData:[JobData, Interest] = await getJobFormData(userID); +async function jobMessage(reminder: Reminder, userID: string): Promise { + const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID); + return `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations: -Based on your interests in ${jobFormData[1].interest1}, ${jobFormData[1].interest2}, -${jobFormData[1].interest3}, ${jobFormData[1].interest4}, and ${jobFormData[1].interest5}, I've found these jobs you may find of interest: - -1. **Junior Data Visualization Engineer** - * **Salary**: $60,000 - $75,000 annually - * **Location**: San Francisco, CA - * **Job Type**: Full-time - * **Work Mode**: Hybrid - * **Job Description**: - As a Junior Data Visualization Engineer, you will work closely with the data science team to design and implement visually compelling dashboards and data presentations. The role involves - using tools like Tableau and D3.js to communicate data insights in ways that are accessible and engaging for various stakeholders. - * **Apply here**: [application](https://www.techjobportal.com/apply-junior-dve) - -2. **Cybersecurity Intern** - * **Salary**: $20 - $30 per hour - * **Location**: Arlington, VA - * **Job Type**: Internship - * **Work Mode**: In-person - * **Job Description**: - This internship offers hands-on experience in network security, ethical hacking, and threat assessment. The intern will support the security team in identifying and mitigating vulnerabilities, - responding to incidents, and learning security protocols. - - **Apply here**: [application](https://www.cybersecureintern.com/apply) - \n --# **Disclaimer:** --# Please note that the job listings provided are sourced from a third-party API and we cannot guarantee the legitimacy or security of all postings. Exercise caution when submitting personal --# information, resumes, or signing up on external sites. Always verify the authenticity of a job application --# before proceeding. Stay safe and mindful while applying! +Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, +**${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, +I've found these jobs you may find interesting: + +${listJobs(jobFormData[2])} + +--- +### **Disclaimer:** +-# Please note that the job listings provided are sourced from a third-party API, and we cannot guarantee the legitimacy or security of all postings. Exercise caution when submitting personal +-# information, resumes, or signing up on external sites. Always verify the authenticity of a job application before proceeding. Stay safe and mindful while applying! `; } From c879ab676586fbd527f8130a2a9bc3b87e377319 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 14:30:05 -0500 Subject: [PATCH 163/267] implemented logic to handle case where if the formatted message exceeds Discord message's character limit of 2000, the bot will send it as a txt file instead --- src/pieces/tasks.ts | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 7e67613c..ff5f9b37 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -1,11 +1,12 @@ import { BOT, CHANNELS, DB } from '@root/config'; -import { ChannelType, Client, EmbedBuilder, TextChannel } from 'discord.js'; +import { AttachmentBuilder, ChannelType, Client, EmbedBuilder, TextChannel } from 'discord.js'; import { schedule } from 'node-cron'; import { Reminder } from '@lib/types/Reminder'; import { Poll, PollResult } from '@lib/types/Poll'; import { MongoClient } from 'mongodb'; import { Job } from '../lib/types/Job'; import getJobAPIResponse, { JobResult } from '../lib/utils/jobUtils/Adzuna_job_search'; +import { sendToFile } from '../lib/utils/generalUtils'; async function register(bot: Client): Promise { schedule('0/30 * * * * *', () => { @@ -126,7 +127,6 @@ function listJobs(jobData: JobResult[]): string { jobList += `${i + 1}. **${jobData[i].company} (${jobData[i].title})** * **Salary Average:** ${(Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2} *(Min: ${jobData[i].salaryMin}, Max: ${jobData[i].salaryMax})* - * **Job Description:** ${jobData[i].description.slice(0, 50).trim()}... * **Location:** ${jobData[i].location} * **Apply here:** [read more about the job and apply here](${jobData[i].link}) \n`; @@ -136,8 +136,7 @@ function listJobs(jobData: JobResult[]): string { async function jobMessage(reminder: Reminder, userID: string): Promise { const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID); - - return `## Hey <@${reminder.owner}>! + const message = `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations: Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, **${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, @@ -150,6 +149,7 @@ ${listJobs(jobFormData[2])} -# Please note that the job listings provided are sourced from a third-party API, and we cannot guarantee the legitimacy or security of all postings. Exercise caution when submitting personal -# information, resumes, or signing up on external sites. Always verify the authenticity of a job application before proceeding. Stay safe and mindful while applying! `; + return message; } async function checkReminders(bot: Client): Promise { @@ -162,12 +162,19 @@ async function checkReminders(bot: Client): Promise { } else { bot.users.fetch(reminder.owner).then(async (user) => { const message = await jobMessage(reminder, user.id); - user.send(message).catch((err) => { - console.log('ERROR:', err); - pubChan.send( - `<@${reminder.owner}>, I tried to send you a DM about your private reminder but it looks like you have DMs closed. Please enable DMs in the future if you'd like to get private reminders.` - ); - }); + if (message.length <= 2000) { + user.send(message).catch((err) => { + console.log('ERROR:', err); + pubChan.send( + `<@${reminder.owner}>, I tried to send you a DM about your private reminder but it looks like you have DMs closed. Please enable DMs in the future if + you'd like to get private reminders.` + ); + }); + } else { + const attachments: AttachmentBuilder[] = []; + attachments.push(await sendToFile(message, 'md', 'Personalized Job/Internships', false)); + user.send({ files: attachments as AttachmentBuilder[] }); + } }).catch((error) => { console.error(`Failed to fetch user with ID: ${reminder.owner}`, error); }); From 45787d38ca2717f314365a79302a978f35a88984 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 14:35:39 -0500 Subject: [PATCH 164/267] stripped the greeting and user @ from the text file --- src/pieces/tasks.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index ff5f9b37..931ff8a2 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -172,7 +172,9 @@ async function checkReminders(bot: Client): Promise { }); } else { const attachments: AttachmentBuilder[] = []; - attachments.push(await sendToFile(message, 'md', 'Personalized Job/Internships', false)); + // eslint-disable-next-line max-len + attachments.push(await sendToFile(message.replace(`## Hey <@${reminder.owner}>! +## Here's your list of job/internship recommendations:`, ''), 'md', 'Personalized Job/Internships', false)); user.send({ files: attachments as AttachmentBuilder[] }); } }).catch((error) => { From 63956f30316c0db14ac2cd7b90b6ebd98b909560 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 14:43:57 -0500 Subject: [PATCH 165/267] added content along with the file being sent to the user that involves @ing the user like before and providing the file containing the list of jobs --- src/pieces/tasks.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 931ff8a2..7f46fa60 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -175,7 +175,8 @@ async function checkReminders(bot: Client): Promise { // eslint-disable-next-line max-len attachments.push(await sendToFile(message.replace(`## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations:`, ''), 'md', 'Personalized Job/Internships', false)); - user.send({ files: attachments as AttachmentBuilder[] }); + user.send({ content: `## Hey <@${reminder.owner}>! +## Here's your list of job/internship recommendations:`, files: attachments as AttachmentBuilder[] }); } }).catch((error) => { console.error(`Failed to fetch user with ID: ${reminder.owner}`, error); From 40bae560545dae4a1808d252aefcdff9548d840a Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 14:51:54 -0500 Subject: [PATCH 166/267] added regex to remove some markdown from the txt file to format the message better --- src/pieces/tasks.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 7f46fa60..ba48eb25 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -174,7 +174,8 @@ async function checkReminders(bot: Client): Promise { const attachments: AttachmentBuilder[] = []; // eslint-disable-next-line max-len attachments.push(await sendToFile(message.replace(`## Hey <@${reminder.owner}>! -## Here's your list of job/internship recommendations:`, ''), 'md', 'Personalized Job/Internships', false)); +## Here's your list of job/internship recommendations:`, '').replace(/\[read more about the job and apply here\]/g, '') +.replace(/\((https?:\/\/[^\s)]+)\)/g, '$1'), 'md', 'Personalized Job/Internships', false)); user.send({ content: `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations:`, files: attachments as AttachmentBuilder[] }); } From f8f815106c040fc5990038041381d005f0423d74 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 15:08:55 -0500 Subject: [PATCH 167/267] created a helper function for handling the message regex/replacing manipulation for easy readability and changed file type back to txt --- src/pieces/tasks.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index ba48eb25..2e2f327c 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -126,7 +126,7 @@ function listJobs(jobData: JobResult[]): string { for (let i = 0; i < jobData.length; i++) { jobList += `${i + 1}. **${jobData[i].company} (${jobData[i].title})** * **Salary Average:** ${(Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2} - *(Min: ${jobData[i].salaryMin}, Max: ${jobData[i].salaryMax})* + *(Min: ${jobData[i].salaryMin}, Max: ${jobData[i].salaryMax}) * **Location:** ${jobData[i].location} * **Apply here:** [read more about the job and apply here](${jobData[i].link}) \n`; @@ -152,6 +152,12 @@ ${listJobs(jobFormData[2])} return message; } +function modifyMessage(message:string, owner:string): string { + return message.replace(`## Hey <@${owner}>! +## Here's your list of job/internship recommendations:`, '').replace(/\[read more about the job and apply here\]/g, '').replace(/\((https?:\/\/[^\s)]+)\)/g, '$1') + .replace(/\*\*([^*]*(?:\*[^*]+)*)\*\*/g, '$1'); +} + async function checkReminders(bot: Client): Promise { const reminders: Reminder[] = await bot.mongo.collection(DB.REMINDERS).find({ expires: { $lte: new Date() } }).toArray(); const pubChan = (await bot.channels.fetch(CHANNELS.SAGE)) as TextChannel; @@ -172,10 +178,7 @@ async function checkReminders(bot: Client): Promise { }); } else { const attachments: AttachmentBuilder[] = []; - // eslint-disable-next-line max-len - attachments.push(await sendToFile(message.replace(`## Hey <@${reminder.owner}>! -## Here's your list of job/internship recommendations:`, '').replace(/\[read more about the job and apply here\]/g, '') -.replace(/\((https?:\/\/[^\s)]+)\)/g, '$1'), 'md', 'Personalized Job/Internships', false)); + attachments.push(await sendToFile(modifyMessage(message, reminder.owner), 'txt', 'list-of-jobs-internships', false)); user.send({ content: `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations:`, files: attachments as AttachmentBuilder[] }); } From 18a47d07b47767b863744c633adb54beccd188e2 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 15:15:16 -0500 Subject: [PATCH 168/267] added some clarifying text to the message body addressing the apparent duplicate job postings --- src/pieces/tasks.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 2e2f327c..b479df0f 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -125,8 +125,7 @@ function listJobs(jobData: JobResult[]): string { let jobList = ''; for (let i = 0; i < jobData.length; i++) { jobList += `${i + 1}. **${jobData[i].company} (${jobData[i].title})** - * **Salary Average:** ${(Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2} - *(Min: ${jobData[i].salaryMin}, Max: ${jobData[i].salaryMax}) + * **Salary Average:** ${(Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2} (Min: ${jobData[i].salaryMin}, Max: ${jobData[i].salaryMax}) * **Location:** ${jobData[i].location} * **Apply here:** [read more about the job and apply here](${jobData[i].link}) \n`; @@ -139,9 +138,8 @@ async function jobMessage(reminder: Reminder, userID: string): Promise { const message = `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations: Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, -**${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, -I've found these jobs you may find interesting: - +**${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**--Please note that while you may get job/internship recommendations from the same company, +their positions/details/applications/salary WILL be different and this is not a glitch/bug!--I've found these jobs you may find interesting-- : ${listJobs(jobFormData[2])} --- From 2c4d6f37917e291ab9a390ddea271bded3207971 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 15:20:18 -0500 Subject: [PATCH 169/267] renamed function to stripMarkdown and added some more replace methods to remove the hashtag markdown --- src/pieces/tasks.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index b479df0f..85a86ce5 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -150,10 +150,10 @@ ${listJobs(jobFormData[2])} return message; } -function modifyMessage(message:string, owner:string): string { +function stripMarkdown(message:string, owner:string): string { return message.replace(`## Hey <@${owner}>! ## Here's your list of job/internship recommendations:`, '').replace(/\[read more about the job and apply here\]/g, '').replace(/\((https?:\/\/[^\s)]+)\)/g, '$1') - .replace(/\*\*([^*]*(?:\*[^*]+)*)\*\*/g, '$1'); + .replace(/\*\*([^*]*(?:\*[^*]+)*)\*\*/g, '$1').replace(/#\S+/g, '').replace(/##\S+/g, ''); } async function checkReminders(bot: Client): Promise { @@ -176,7 +176,7 @@ async function checkReminders(bot: Client): Promise { }); } else { const attachments: AttachmentBuilder[] = []; - attachments.push(await sendToFile(modifyMessage(message, reminder.owner), 'txt', 'list-of-jobs-internships', false)); + attachments.push(await sendToFile(stripMarkdown(message, reminder.owner), 'txt', 'list-of-jobs-internships', false)); user.send({ content: `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations:`, files: attachments as AttachmentBuilder[] }); } From c59771ebf6f2188c7e2ea1e092163cc6a5d6a1c5 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Wed, 20 Nov 2024 15:37:25 -0500 Subject: [PATCH 170/267] letting the user add multiple answers for validEmploymentTypes --- src/lib/utils/jobUtils/validatePreferences.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/lib/utils/jobUtils/validatePreferences.ts b/src/lib/utils/jobUtils/validatePreferences.ts index 27025fd4..238a4fe9 100644 --- a/src/lib/utils/jobUtils/validatePreferences.ts +++ b/src/lib/utils/jobUtils/validatePreferences.ts @@ -13,7 +13,8 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: } else { const validWorkTypes = ['remote', 'hybrid', 'in person', 'remote, hybrid', 'remote, in person', 'hybrid, in person', 'hybrid. remote', 'in person, remote', 'in person, hybrid', - 'all']; + 'all' + ]; // eslint-disable-next-line id-length const workTypes = workType.toLowerCase().split(',').map(t => t.trim()); // eslint-disable-next-line id-length @@ -25,13 +26,16 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: if (!employmentType?.trim()) { errors.push('Enter valid employment type'); } else { - const validEmploymentTypes = ['full time', 'part time', 'internship']; + const validEmploymentTypes = ['full time', 'part time', 'internship', + 'full time, part time', 'full time, internship', 'part time, internship', 'part time, full time', 'internship, full time', 'internship, part time', + 'all' + ]; // eslint-disable-next-line id-length const employmentTypes = employmentType.toLowerCase().split(',').map(t => t.trim()); // eslint-disable-next-line id-length const invalidTypes = employmentTypes.filter(t => !validEmploymentTypes.includes(t)); if (invalidTypes.length > 0) { - errors.push(`Invalid employment type: ${invalidTypes.join(', ')}. Must be full time, part time, and/or internship seperated only by comams`); + errors.push(`Invalid employment type: ${invalidTypes.join(', ')}. Must be full time, part time, and/or internship seperated only by comams. Must be all if it is all three`); } } if (travelDistance && isNaN(Number(travelDistance.replace(/[^0-9]/g, '')))) { From ee07b6b957e5873cae2557a4ad0a25a72bb2e68a Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 15:47:03 -0500 Subject: [PATCH 171/267] reformatted message and added regex to remove the hashtag and '-#' markdown --- src/pieces/tasks.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 85a86ce5..6272fb01 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -138,8 +138,9 @@ async function jobMessage(reminder: Reminder, userID: string): Promise { const message = `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations: Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, -**${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**--Please note that while you may get job/internship recommendations from the same company, -their positions/details/applications/salary WILL be different and this is not a glitch/bug!--I've found these jobs you may find interesting-- : +**${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get +job/internship recommendations from the same company, +their positions/details/applications/salary WILL be different and this is not a glitch/bug! \n Here they are: ${listJobs(jobFormData[2])} --- @@ -153,7 +154,8 @@ ${listJobs(jobFormData[2])} function stripMarkdown(message:string, owner:string): string { return message.replace(`## Hey <@${owner}>! ## Here's your list of job/internship recommendations:`, '').replace(/\[read more about the job and apply here\]/g, '').replace(/\((https?:\/\/[^\s)]+)\)/g, '$1') - .replace(/\*\*([^*]*(?:\*[^*]+)*)\*\*/g, '$1').replace(/#\S+/g, '').replace(/##\S+/g, ''); + // eslint-disable-next-line no-useless-escape + .replace(/\*\*([^*]*(?:\*[^*]+)*)\*\*/g, '$1').replace(/(###|-\#)\s*/g, ''); } async function checkReminders(bot: Client): Promise { From 6d75752d3e0b2d7b8565eb2cbdbea911b69b3ec8 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 15:49:01 -0500 Subject: [PATCH 172/267] reformatted file text --- src/pieces/tasks.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 6272fb01..fbff1638 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -140,9 +140,8 @@ async function jobMessage(reminder: Reminder, userID: string): Promise { Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, **${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get job/internship recommendations from the same company, -their positions/details/applications/salary WILL be different and this is not a glitch/bug! \n Here they are: +their positions/details/applications/salary WILL be different and this is not a glitch/bug! \n Here they are \n: ${listJobs(jobFormData[2])} - --- ### **Disclaimer:** -# Please note that the job listings provided are sourced from a third-party API, and we cannot guarantee the legitimacy or security of all postings. Exercise caution when submitting personal From 80226cb2256f1f86b0660536929b91ce58485011 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 16:35:32 -0500 Subject: [PATCH 173/267] updated the results_per_page to 15 --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index c454aa38..99ebb6f8 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -31,7 +31,7 @@ export default async function getJobAPIResponse(jobData: JobData, interests: Int whatInterests = encodeURIComponent(whatInterests); - const URL = `https://api.adzuna.com/v1/api/jobs/us/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=7&what=${JOB_TYPE}&what_or=${whatInterests}&where= + const URL = `https://api.adzuna.com/v1/api/jobs/us/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=15&what=${JOB_TYPE}&what_or=${whatInterests}&where= ${LOCATION}&distance=${DISTANCE_KM}`; const jobResults: JobResult[] = []; @@ -55,9 +55,9 @@ export default async function getJobAPIResponse(jobData: JobData, interests: Int link: responseData.results[i].redirect_url }; - if (!jobResults.find((job: JobResult) => job.company === jobResultData.company)) { - jobResults.push(jobResultData); - } + // if (!jobResults.find((job: JobResult) => job.company === jobResultData.company)) { + jobResults.push(jobResultData); + // } } } catch (error) { console.error('Fetch error:', error); From c8ff6b10aa9f436cf55fe45bc9e5a032ed66183b Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 16:51:26 -0500 Subject: [PATCH 174/267] created function for formatting the currency for the listed salary and made some minor miscellaneous tweaks/changes --- src/pieces/tasks.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index fbff1638..5e057801 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -120,15 +120,23 @@ async function getJobFormData(userID:string):Promise<[JobData, Interest, JobResu return [jobData, interests, APIResponse]; } +function formatCurrency(currency:number): string { + return `${new Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD' + }).format(Number(currency))}`; +} + // TODO - need to figure out if the salary is in USD or not function listJobs(jobData: JobResult[]): string { let jobList = ''; for (let i = 0; i < jobData.length; i++) { - jobList += `${i + 1}. **${jobData[i].company} (${jobData[i].title})** - * **Salary Average:** ${(Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2} (Min: ${jobData[i].salaryMin}, Max: ${jobData[i].salaryMax}) + jobList += `${i + 1}. **${jobData[i].title})** + * **Salary Average:** ${formatCurrency((Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2)} + (Min: ${formatCurrency(Number(jobData[i].salaryMin))}, Max: ${formatCurrency(Number(jobData[i].salaryMax))}) * **Location:** ${jobData[i].location} * **Apply here:** [read more about the job and apply here](${jobData[i].link}) - \n`; + ${i !== jobData.length - 1 ? '\n' : ''}`; } return jobList || 'No jobs found based on your interests.'; } @@ -140,7 +148,7 @@ async function jobMessage(reminder: Reminder, userID: string): Promise { Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, **${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get job/internship recommendations from the same company, -their positions/details/applications/salary WILL be different and this is not a glitch/bug! \n Here they are \n: +their positions/details/applications/salary WILL be different and this is not a glitch/bug! \n Here's your personalized list: \n ${listJobs(jobFormData[2])} --- ### **Disclaimer:** @@ -167,7 +175,7 @@ async function checkReminders(bot: Client): Promise { } else { bot.users.fetch(reminder.owner).then(async (user) => { const message = await jobMessage(reminder, user.id); - if (message.length <= 2000) { + if (message.length < 2000) { user.send(message).catch((err) => { console.log('ERROR:', err); pubChan.send( From 8b8da7f845d7c69a6b0670e1d23fd0fd9f75fd1d Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 18:37:28 -0500 Subject: [PATCH 175/267] removed job about section --- src/pieces/tasks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 5e057801..cf5b7c32 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -131,7 +131,7 @@ function formatCurrency(currency:number): string { function listJobs(jobData: JobResult[]): string { let jobList = ''; for (let i = 0; i < jobData.length; i++) { - jobList += `${i + 1}. **${jobData[i].title})** + jobList += `${i + 1}. **${jobData[i].title}** * **Salary Average:** ${formatCurrency((Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2)} (Min: ${formatCurrency(Number(jobData[i].salaryMin))}, Max: ${formatCurrency(Number(jobData[i].salaryMax))}) * **Location:** ${jobData[i].location} From 8eab73fb708902ffc12b41784ee6a2d9dcc5119a Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 20 Nov 2024 19:26:41 -0500 Subject: [PATCH 176/267] updated no jobs found message and added character to prevent new linesin messages --- src/pieces/tasks.ts | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index cf5b7c32..e04d221f 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -127,33 +127,39 @@ function formatCurrency(currency:number): string { }).format(Number(currency))}`; } -// TODO - need to figure out if the salary is in USD or not function listJobs(jobData: JobResult[]): string { let jobList = ''; for (let i = 0; i < jobData.length; i++) { + const avgSalary = (Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2; + const formattedAvgSalary = formatCurrency(avgSalary); + const formattedSalaryMax = formatCurrency(Number(jobData[i].salaryMax)); + const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)); + jobList += `${i + 1}. **${jobData[i].title}** - * **Salary Average:** ${formatCurrency((Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2)} - (Min: ${formatCurrency(Number(jobData[i].salaryMin))}, Max: ${formatCurrency(Number(jobData[i].salaryMax))}) - * **Location:** ${jobData[i].location} - * **Apply here:** [read more about the job and apply here](${jobData[i].link}) - ${i !== jobData.length - 1 ? '\n' : ''}`; + * **Salary Average:** ${formattedAvgSalary}\ + ${formattedAvgSalary !== formattedSalaryMax ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` : ''} + * **Location:** ${jobData[i].location} + * **Apply here:** [read more about the job and apply here](${jobData[i].link}) + ${i !== jobData.length - 1 ? '\n' : ''}`; } - return jobList || 'No jobs found based on your interests.'; + return jobList || '### Unfortunately, there were no jobs found based on your interests :(. Consider updating your interests or waiting until something is found.'; } async function jobMessage(reminder: Reminder, userID: string): Promise { const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID); const message = `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations: -Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, -**${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get -job/internship recommendations from the same company, -their positions/details/applications/salary WILL be different and this is not a glitch/bug! \n Here's your personalized list: \n +Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ +**${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get\ +job/internship recommendations from the same company,\ +their positions/details/applications/salary WILL be different and this is not a glitch/bug! +Here's your personalized list: + ${listJobs(jobFormData[2])} --- ### **Disclaimer:** --# Please note that the job listings provided are sourced from a third-party API, and we cannot guarantee the legitimacy or security of all postings. Exercise caution when submitting personal --# information, resumes, or signing up on external sites. Always verify the authenticity of a job application before proceeding. Stay safe and mindful while applying! +-# Please note that the job listings provided are sourced from a third-party API, and we cannot guarantee the legitimacy or security of all postings. Exercise caution when submitting personal\ +information, resumes, or signing up on external sites. Always verify the authenticity of a job application before proceeding. Stay safe and mindful while applying! `; return message; } From a26fc02f750124337496fc773757c56aa8ccd051 Mon Sep 17 00:00:00 2001 From: Saieda Ali Zada <143635010+SaiedaJN@users.noreply.github.com> Date: Wed, 20 Nov 2024 20:01:10 -0500 Subject: [PATCH 177/267] the class is added. --- src/commands/jobs/jobDatabase.ts | 0 src/lib/utils/jobUtils/Adzuna_job_search.ts | 113 ++++++++++---------- 2 files changed, 56 insertions(+), 57 deletions(-) create mode 100644 src/commands/jobs/jobDatabase.ts diff --git a/src/commands/jobs/jobDatabase.ts b/src/commands/jobs/jobDatabase.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index 06ae0927..76a92e94 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -1,71 +1,70 @@ import axios from 'axios'; import { APP_ID, APP_KEY } from '@root/config'; -// Define the structure of a job listing -interface JobListing { - title: string; - company: string; - location: string; - salary: string; - link: string; - description: string; -} - // Define the cache type - type JobCache = { - [key: string]: JobListing[]; - }; +export function adzunaAPI(): void { + // Define the structure of a job listing + interface JobListing { + title: string; + company: string; + location: string; + salary: string; + link: string; + description: string; + } -// Create a cache object to store results -const jobCache: JobCache = {}; + // Define the cache type + type JobCache = { + [key: string]: JobListing[]; + }; -// Define the getJobs function with caching -const getJobs = async (JOB_TITLE: string, LOCATION: string): Promise => { - const cacheKey = `${JOB_TITLE.toLowerCase()}-${LOCATION.toLowerCase()}`; + // Create a cache object to store results + const jobCache: JobCache = {}; - // Check if the data is already in the cache - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - return jobCache[cacheKey]; - } + // Define the getJobs function with caching + const getJobs = async (JOB_TITLE: string, LOCATION: string): Promise => { + const cacheKey = `${JOB_TITLE.toLowerCase()}-${LOCATION.toLowerCase()}`; - // URL for the API request - const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} - &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; + // Check if the data is already in the cache + if (jobCache[cacheKey]) { + console.log('Fetching data from cache...'); + return jobCache[cacheKey]; + } - try { - // Make the API request - console.log('Fetching data from API...'); - const response = await axios.get(URL); + // URL for the API request + const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} + &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; - // Format the job listings - const jobListings: JobListing[] = response.data.results.map((job: any) => ({ - title: job.title, - company: job.company?.name || 'Not Provided', - location: job.location?.display_name || 'Not Provided', - salary: job.salary_min - ? `$${job.salary_min.toLocaleString()} - $${job.salary_max.toLocaleString()}` - : 'Salary not listed', - link: job.redirect_url || 'No link available', - description: job.description || 'No description available' - })); + try { + // Make the API request + console.log('Fetching data from API...'); + const response = await axios.get(URL); - // Store the formatted data in the cache - jobCache[cacheKey] = jobListings; + // Format the job listings + const jobListings: JobListing[] = response.data.results.map((job: any) => ({ + title: job.title, + company: job.company?.name || 'Not Provided', + location: job.location?.display_name || 'Not Provided', + salary: job.salary_min + ? `$${job.salary_min.toLocaleString()} - $${job.salary_max.toLocaleString()}` + : 'Salary not listed', + link: job.redirect_url || 'No link available', + description: job.description || 'No description available' + })); - // Return the data - return jobListings; - } catch (error) { - console.error('Axios error:', error); - throw error; - } -}; + // Store the formatted data in the cache + jobCache[cacheKey] = jobListings; -// Usage example -getJobs('software engineer', 'US') - .then((data) => console.log('Job Listings:', data)) - .catch((err) => console.error(err)); + // Return the data + return jobListings; + } catch (error) { + console.error('Axios error:', error); + throw error; + } + }; -getJobs('software engineer', 'US') - .then((data) => console.log('Job Listings:', data)) - .catch((err) => console.error(err)); + // Usage example + // getJobs('software engineer', 'US') + // .then((data) => console.log('Job Listings:', data)) + // .catch((err) => console.error(err)); +} From 8360b24d24ae8b45dcfda4e3e8a0298c71faf5e7 Mon Sep 17 00:00:00 2001 From: Saieda Ali Zada <143635010+SaiedaJN@users.noreply.github.com> Date: Wed, 20 Nov 2024 20:57:34 -0500 Subject: [PATCH 178/267] function return a value. --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 115 +++++++++----------- 1 file changed, 54 insertions(+), 61 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index 76a92e94..4d5806f8 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -1,70 +1,63 @@ import axios from 'axios'; import { APP_ID, APP_KEY } from '@root/config'; +// Define the structure of a job listing +interface JobListing { + title: string; + company: string; + location: string; + salary: string; + link: string; + description: string; +} -export function adzunaAPI(): void { - // Define the structure of a job listing - interface JobListing { - title: string; - company: string; - location: string; - salary: string; - link: string; - description: string; - } - - // Define the cache type - type JobCache = { - [key: string]: JobListing[]; - }; - - // Create a cache object to store results - const jobCache: JobCache = {}; - - // Define the getJobs function with caching - const getJobs = async (JOB_TITLE: string, LOCATION: string): Promise => { - const cacheKey = `${JOB_TITLE.toLowerCase()}-${LOCATION.toLowerCase()}`; - - // Check if the data is already in the cache - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - return jobCache[cacheKey]; - } - - // URL for the API request - const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} - &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; - - try { - // Make the API request - console.log('Fetching data from API...'); - const response = await axios.get(URL); +// Define the cache type +type JobCache = { + [key: string]: JobListing[]; +}; - // Format the job listings - const jobListings: JobListing[] = response.data.results.map((job: any) => ({ - title: job.title, - company: job.company?.name || 'Not Provided', - location: job.location?.display_name || 'Not Provided', - salary: job.salary_min - ? `$${job.salary_min.toLocaleString()} - $${job.salary_max.toLocaleString()}` - : 'Salary not listed', - link: job.redirect_url || 'No link available', - description: job.description || 'No description available' - })); +// a cache object to store results +const jobCache: JobCache = {}; - // Store the formatted data in the cache - jobCache[cacheKey] = jobListings; +// the adzunaAPI function +export async function adzunaAPI(JOB_TITLE: string, LOCATION: string): Promise { + const cacheKey = `${JOB_TITLE.toLowerCase()}-${LOCATION.toLowerCase()}`; - // Return the data - return jobListings; - } catch (error) { - console.error('Axios error:', error); - throw error; - } - }; + // Check if the data is already in the cache + if (jobCache[cacheKey]) { + console.log('Fetching data from cache...'); + return jobCache[cacheKey]; + } - // Usage example - // getJobs('software engineer', 'US') - // .then((data) => console.log('Job Listings:', data)) - // .catch((err) => console.error(err)); + // URL for the API + const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} + &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; + + try { + // Make the API request + console.log('Fetching data from API...'); + const response = await axios.get(URL); + + // Format the job listings + const jobListings: JobListing[] = response.data.results.map((job: any) => ({ + title: job.title, + company: job.company?.name || 'Not Provided', + location: job.location?.display_name || 'Not Provided', + salary: job.salary_min + ? `$${job.salary_min.toLocaleString()} - $${job.salary_max.toLocaleString()}` + : 'Salary not listed', + link: job.redirect_url || 'No link available', + description: job.description || 'No description available' + })); + + // Store the formatted data in the cache + jobCache[cacheKey] = jobListings; + + // Return the data + return jobListings; + } catch (error) { + console.error('Axios error:', error); + throw error; + } } + From ee797c0a80ec0c382732513c3af00e45645b1803 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 21 Nov 2024 12:58:28 -0500 Subject: [PATCH 179/267] added tab character to job list so each bullet point is indented --- src/pieces/tasks.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index e04d221f..dbf5f5fa 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -136,10 +136,10 @@ function listJobs(jobData: JobResult[]): string { const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)); jobList += `${i + 1}. **${jobData[i].title}** - * **Salary Average:** ${formattedAvgSalary}\ + \t \t * **Salary Average:** ${formattedAvgSalary}\ ${formattedAvgSalary !== formattedSalaryMax ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` : ''} - * **Location:** ${jobData[i].location} - * **Apply here:** [read more about the job and apply here](${jobData[i].link}) + \t \t * **Location:** ${jobData[i].location} + \t \t * **Apply here:** [read more about the job and apply here](${jobData[i].link}) ${i !== jobData.length - 1 ? '\n' : ''}`; } return jobList || '### Unfortunately, there were no jobs found based on your interests :(. Consider updating your interests or waiting until something is found.'; From 4734ee87c3ea8cbc2d0f1501626cdeb1385ca1d9 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 21 Nov 2024 13:19:48 -0500 Subject: [PATCH 180/267] created a function that will uniformly title-case the job postings' titles --- src/pieces/tasks.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index dbf5f5fa..daa56538 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -127,6 +127,10 @@ function formatCurrency(currency:number): string { }).format(Number(currency))}`; } +function titleCase(jobTitle:string): string { + return jobTitle.toLowerCase().replace(/[()]/g, '').split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' '); +} + function listJobs(jobData: JobResult[]): string { let jobList = ''; for (let i = 0; i < jobData.length; i++) { @@ -135,7 +139,7 @@ function listJobs(jobData: JobResult[]): string { const formattedSalaryMax = formatCurrency(Number(jobData[i].salaryMax)); const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)); - jobList += `${i + 1}. **${jobData[i].title}** + jobList += `${i + 1}. **${titleCase(jobData[i].title)}** \t \t * **Salary Average:** ${formattedAvgSalary}\ ${formattedAvgSalary !== formattedSalaryMax ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` : ''} \t \t * **Location:** ${jobData[i].location} From 3eecf97859313427c7b7c90d80c2b28947656087 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 21 Nov 2024 13:27:09 -0500 Subject: [PATCH 181/267] updated disclaimer message and reformatted code --- src/pieces/tasks.ts | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index daa56538..0df4e481 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -152,25 +152,28 @@ function listJobs(jobData: JobResult[]): string { async function jobMessage(reminder: Reminder, userID: string): Promise { const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID); const message = `## Hey <@${reminder.owner}>! -## Here's your list of job/internship recommendations: -Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ -**${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get\ -job/internship recommendations from the same company,\ -their positions/details/applications/salary WILL be different and this is not a glitch/bug! -Here's your personalized list: - -${listJobs(jobFormData[2])} ---- -### **Disclaimer:** --# Please note that the job listings provided are sourced from a third-party API, and we cannot guarantee the legitimacy or security of all postings. Exercise caution when submitting personal\ -information, resumes, or signing up on external sites. Always verify the authenticity of a job application before proceeding. Stay safe and mindful while applying! -`; + ## Here's your list of job/internship recommendations: + Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ + **${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get\ + job/internship recommendations from the same company,\ + their positions/details/applications/salary WILL be different and this is not a glitch/bug! + Here's your personalized list: + + ${listJobs(jobFormData[2])} + --- + ### **Disclaimer:** + -# Please be aware that the job listings displayed are retrieved from a third-party API.\ + While we strive to provide accurate information, we cannot guarantee the legitimacy or security\ + of all postings. Exercise caution when sharing personal information, submitting resumes, or registering\ + on external sites. Always verify the authenticity of job applications before proceeding. Additionally,\ + some job postings may contain inaccuracies due to API limitations, which are beyond our control. We apologize for any inconvenience this may cause and appreciate your understanding. + `; return message; } function stripMarkdown(message:string, owner:string): string { return message.replace(`## Hey <@${owner}>! -## Here's your list of job/internship recommendations:`, '').replace(/\[read more about the job and apply here\]/g, '').replace(/\((https?:\/\/[^\s)]+)\)/g, '$1') + ## Here's your list of job/internship recommendations:`, '').replace(/\[read more about the job and apply here\]/g, '').replace(/\((https?:\/\/[^\s)]+)\)/g, '$1') // eslint-disable-next-line no-useless-escape .replace(/\*\*([^*]*(?:\*[^*]+)*)\*\*/g, '$1').replace(/(###|-\#)\s*/g, ''); } From efeb2d18bb98ec36c1436b0a9bec7a6402cd2de0 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 21 Nov 2024 13:44:49 -0500 Subject: [PATCH 182/267] created a helper function to format the header message that returns the content along wit hthe text file of job data --- src/pieces/tasks.ts | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 0df4e481..6e46ef3d 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -153,7 +153,7 @@ async function jobMessage(reminder: Reminder, userID: string): Promise { const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID); const message = `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations: - Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ + Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**,\ **${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get\ job/internship recommendations from the same company,\ their positions/details/applications/salary WILL be different and this is not a glitch/bug! @@ -162,10 +162,10 @@ async function jobMessage(reminder: Reminder, userID: string): Promise { ${listJobs(jobFormData[2])} --- ### **Disclaimer:** - -# Please be aware that the job listings displayed are retrieved from a third-party API.\ + -# Please be aware that the job listings displayed are retrieved from a third-party API. \ While we strive to provide accurate information, we cannot guarantee the legitimacy or security\ of all postings. Exercise caution when sharing personal information, submitting resumes, or registering\ - on external sites. Always verify the authenticity of job applications before proceeding. Additionally,\ + on external sites. Always verify the authenticity of job applications before proceeding. Additionally, \ some job postings may contain inaccuracies due to API limitations, which are beyond our control. We apologize for any inconvenience this may cause and appreciate your understanding. `; return message; @@ -178,6 +178,18 @@ function stripMarkdown(message:string, owner:string): string { .replace(/\*\*([^*]*(?:\*[^*]+)*)\*\*/g, '$1').replace(/(###|-\#)\s*/g, ''); } +function headerMessage(owner:string):string { + return `## Hey <@${owner}>! + ### **__please read this disclaimer before reading your list of jobs/internships__:** +-# Please be aware that the job listings displayed are retrieved from a third-party API. \ +While we strive to provide accurate information, we cannot guarantee the legitimacy or security \ +of all postings. Exercise caution when sharing personal information, submitting resumes, or registering\ + on external sites. Always verify the authenticity of job applications before proceeding. Additionally, \ +some job postings may contain inaccuracies due to API limitations, which are beyond our control. We apologize for any inconvenience this may cause and appreciate your understanding. +## Here's your list of job/internship recommendations: + `; +} + async function checkReminders(bot: Client): Promise { const reminders: Reminder[] = await bot.mongo.collection(DB.REMINDERS).find({ expires: { $lte: new Date() } }).toArray(); const pubChan = (await bot.channels.fetch(CHANNELS.SAGE)) as TextChannel; @@ -199,8 +211,7 @@ async function checkReminders(bot: Client): Promise { } else { const attachments: AttachmentBuilder[] = []; attachments.push(await sendToFile(stripMarkdown(message, reminder.owner), 'txt', 'list-of-jobs-internships', false)); - user.send({ content: `## Hey <@${reminder.owner}>! -## Here's your list of job/internship recommendations:`, files: attachments as AttachmentBuilder[] }); + user.send({ content: headerMessage(reminder.owner), files: attachments as AttachmentBuilder[] }); } }).catch((error) => { console.error(`Failed to fetch user with ID: ${reminder.owner}`, error); From 24d155e60ef1b6437049ffb9092cae8156c2b3ea Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 21 Nov 2024 13:48:12 -0500 Subject: [PATCH 183/267] made some fixes to the header message formatting --- src/pieces/tasks.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 6e46ef3d..dbfaa676 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -180,11 +180,11 @@ function stripMarkdown(message:string, owner:string): string { function headerMessage(owner:string):string { return `## Hey <@${owner}>! - ### **__please read this disclaimer before reading your list of jobs/internships__:** + ### **__Please read this disclaimer before reading your list of jobs/internships__:** -# Please be aware that the job listings displayed are retrieved from a third-party API. \ While we strive to provide accurate information, we cannot guarantee the legitimacy or security \ -of all postings. Exercise caution when sharing personal information, submitting resumes, or registering\ - on external sites. Always verify the authenticity of job applications before proceeding. Additionally, \ +of all postings. Exercise caution when sharing personal information, submitting resumes, or registering \ +on external sites. Always verify the authenticity of job applications before proceeding. Additionally, \ some job postings may contain inaccuracies due to API limitations, which are beyond our control. We apologize for any inconvenience this may cause and appreciate your understanding. ## Here's your list of job/internship recommendations: `; From 1a4e30ef790d23bec7a284a65808ed8695e72295 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 21 Nov 2024 14:08:38 -0500 Subject: [PATCH 184/267] removed disclaimers section from job listings txt file --- src/pieces/tasks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index dbfaa676..de8b30d6 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -210,7 +210,7 @@ async function checkReminders(bot: Client): Promise { }); } else { const attachments: AttachmentBuilder[] = []; - attachments.push(await sendToFile(stripMarkdown(message, reminder.owner), 'txt', 'list-of-jobs-internships', false)); + attachments.push(await sendToFile(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); user.send({ content: headerMessage(reminder.owner), files: attachments as AttachmentBuilder[] }); } }).catch((error) => { From 56c6b32d5d3b21dad356025d9991b9884e21bcb9 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Thu, 21 Nov 2024 23:16:08 -0500 Subject: [PATCH 185/267] added missing space in job format message --- src/pieces/tasks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index de8b30d6..e255c611 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -153,7 +153,7 @@ async function jobMessage(reminder: Reminder, userID: string): Promise { const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID); const message = `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations: - Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**,\ + Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ **${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get\ job/internship recommendations from the same company,\ their positions/details/applications/salary WILL be different and this is not a glitch/bug! From 62ec0d6bbf90f1336cc91e576c8cdd90db92f78b Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 23 Nov 2024 12:48:31 -0500 Subject: [PATCH 186/267] changed it so that update_preferences does not need all of the answers filled out, hopefully it works --- src/commands/jobs/jobform.ts | 2 +- src/commands/jobs/update_preferences.ts | 2 +- src/lib/utils/jobUtils/validatePreferences.ts | 20 +++++++++++-------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 968a1eca..fc39a636 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -18,7 +18,7 @@ const questions = [ [ 'What city do you want to be located?', 'Remote, hybrid, and/or in-person?', - 'Full-time, Part-time, and/or Internship?', + 'Full time, Part time, and/or Internship?', 'How far are you willing to travel?' ], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] diff --git a/src/commands/jobs/update_preferences.ts b/src/commands/jobs/update_preferences.ts index db80e1f6..13793224 100644 --- a/src/commands/jobs/update_preferences.ts +++ b/src/commands/jobs/update_preferences.ts @@ -8,7 +8,7 @@ import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptio const questions = [ ['What city do you want to be located?', 'Remote, hybrid, and/or in-person?', - 'Full-time, Part-time, and/or Internship?', + 'Full time, Part time, and/or Internship?', 'How far are you willing to travel?'], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; diff --git a/src/lib/utils/jobUtils/validatePreferences.ts b/src/lib/utils/jobUtils/validatePreferences.ts index 238a4fe9..7356e49b 100644 --- a/src/lib/utils/jobUtils/validatePreferences.ts +++ b/src/lib/utils/jobUtils/validatePreferences.ts @@ -1,3 +1,5 @@ +import jobform from '@root/src/commands/jobs/jobform'; + interface ValidateResult { isValid: boolean; errors: string[]; @@ -7,8 +9,8 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: const errors: string[] = []; if (qset === 0) { const [city, workType, employmentType, travelDistance] = answers; - if (!city?.trim()) errors.push('Enter valid city'); - if (!workType?.trim()) { + if (!isJobForm || !city?.trim()) errors.push('Enter valid city'); + if (!isJobForm || !workType?.trim()) { errors.push('Enter valid work type'); } else { const validWorkTypes = ['remote', 'hybrid', 'in person', @@ -23,7 +25,7 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: errors.push(`Invalid work type: ${invalidTypes.join(', ')}. Must be remote, hybrid, and/or in person seperated only by comams. Must be all if it is all three`); } } - if (!employmentType?.trim()) { + if (!isJobForm || !employmentType?.trim()) { errors.push('Enter valid employment type'); } else { const validEmploymentTypes = ['full time', 'part time', 'internship', @@ -38,13 +40,15 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: errors.push(`Invalid employment type: ${invalidTypes.join(', ')}. Must be full time, part time, and/or internship seperated only by comams. Must be all if it is all three`); } } - if (travelDistance && isNaN(Number(travelDistance.replace(/[^0-9]/g, '')))) { + if (!isJobForm || (travelDistance && isNaN(Number(travelDistance.replace(/[^0-9]/g, ''))))) { errors.push('Travel distance must be a number'); } - } else if (qset === 1 && isJobForm) { - const intersts = answers.filter(interest => interest?.trim()).length; - if (intersts < 5) { - errors.push('Select at least 5 interests'); + } else if (qset === 1) { + if (isJobForm) { + const intersts = answers.filter(interest => interest?.trim()).length; + if (intersts < 5) { + errors.push('Select at least 5 interests'); + } } } return { From 085a06354c7ba5af04f4cdb305e12672e239ed19 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 23 Nov 2024 13:03:41 -0500 Subject: [PATCH 187/267] fixed city --- src/commands/jobs/update_preferences.ts | 13 +++++++++++++ src/lib/utils/jobUtils/validatePreferences.ts | 6 +++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/commands/jobs/update_preferences.ts b/src/commands/jobs/update_preferences.ts index 13793224..e482f7a4 100644 --- a/src/commands/jobs/update_preferences.ts +++ b/src/commands/jobs/update_preferences.ts @@ -1,5 +1,6 @@ import { DB } from '@root/config'; import { Command } from '@root/src/lib/types/Command'; +import { validatePreferences } from '@root/src/lib/utils/jobUtils/validatePreferences'; import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, TextInputBuilder, TextInputStyle } from 'discord.js'; @@ -101,5 +102,17 @@ export default class extends Command { .setPlaceholder(`Current value: ${value || 'Not Set'}`) .setRequired(false)] }); } + async handleModalSubmit(interaction: ChatInputCommandInteraction, answers: string[], qSet: number): Promise { + const validation = validatePreferences(answers, qSet, false); + if (!validation.isValid) { + await interaction.reply({ content: `Form validation failed:\n${validation.errors.join('\n')}`, + ephemeral: true }); + return; + } + await interaction.reply({ + content: 'Form submitted successfully!', + ephemeral: true + }); + } } diff --git a/src/lib/utils/jobUtils/validatePreferences.ts b/src/lib/utils/jobUtils/validatePreferences.ts index 7356e49b..80c4978c 100644 --- a/src/lib/utils/jobUtils/validatePreferences.ts +++ b/src/lib/utils/jobUtils/validatePreferences.ts @@ -9,7 +9,11 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: const errors: string[] = []; if (qset === 0) { const [city, workType, employmentType, travelDistance] = answers; - if (!isJobForm || !city?.trim()) errors.push('Enter valid city'); + if (!isJobForm || !city?.trim()) { + if (city?.trim() === '') { + errors.push('Enter valid city'); + } + } if (!isJobForm || !workType?.trim()) { errors.push('Enter valid work type'); } else { From 2253a70406c09ae8af57b3f33b9233ac36798e89 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 23 Nov 2024 13:09:15 -0500 Subject: [PATCH 188/267] fixed workTypes --- src/lib/utils/jobUtils/validatePreferences.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/lib/utils/jobUtils/validatePreferences.ts b/src/lib/utils/jobUtils/validatePreferences.ts index 80c4978c..a32a006d 100644 --- a/src/lib/utils/jobUtils/validatePreferences.ts +++ b/src/lib/utils/jobUtils/validatePreferences.ts @@ -15,18 +15,20 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: } } if (!isJobForm || !workType?.trim()) { - errors.push('Enter valid work type'); - } else { const validWorkTypes = ['remote', 'hybrid', 'in person', 'remote, hybrid', 'remote, in person', 'hybrid, in person', 'hybrid. remote', 'in person, remote', 'in person, hybrid', 'all' ]; + if (workType?.trim()) { // eslint-disable-next-line id-length - const workTypes = workType.toLowerCase().split(',').map(t => t.trim()); - // eslint-disable-next-line id-length - const invalidTypes = workTypes.filter(t => !validWorkTypes.includes(t)); - if (invalidTypes.length > 0) { - errors.push(`Invalid work type: ${invalidTypes.join(', ')}. Must be remote, hybrid, and/or in person seperated only by comams. Must be all if it is all three`); + const workTypes = workType.toLowerCase().split(',').map(t => t.trim()); + // eslint-disable-next-line id-length + const invalidTypes = workTypes.filter(t => !validWorkTypes.includes(t)); + if (invalidTypes.length > 0) { + errors.push(`Invalid work type: ${invalidTypes.join(', ')}. Must be remote, hybrid, and/or in person seperated only by comams. Must be all if it is all three`); + } + } else if (isJobForm) { + errors.push('Enter valid work type'); } } if (!isJobForm || !employmentType?.trim()) { From 51e18b903ea0a607f8038d296e321e49a2ed6edd Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 23 Nov 2024 13:16:20 -0500 Subject: [PATCH 189/267] fixed employmentTypes --- src/lib/utils/jobUtils/validatePreferences.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/lib/utils/jobUtils/validatePreferences.ts b/src/lib/utils/jobUtils/validatePreferences.ts index a32a006d..dcbafff0 100644 --- a/src/lib/utils/jobUtils/validatePreferences.ts +++ b/src/lib/utils/jobUtils/validatePreferences.ts @@ -5,6 +5,7 @@ interface ValidateResult { errors: string[]; } +// eslint-disable-next-line complexity export const validatePreferences = (answers: string[], qset: number, isJobForm: boolean): ValidateResult => { const errors: string[] = []; if (qset === 0) { @@ -32,18 +33,20 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: } } if (!isJobForm || !employmentType?.trim()) { - errors.push('Enter valid employment type'); - } else { const validEmploymentTypes = ['full time', 'part time', 'internship', 'full time, part time', 'full time, internship', 'part time, internship', 'part time, full time', 'internship, full time', 'internship, part time', 'all' ]; - // eslint-disable-next-line id-length - const employmentTypes = employmentType.toLowerCase().split(',').map(t => t.trim()); - // eslint-disable-next-line id-length - const invalidTypes = employmentTypes.filter(t => !validEmploymentTypes.includes(t)); - if (invalidTypes.length > 0) { - errors.push(`Invalid employment type: ${invalidTypes.join(', ')}. Must be full time, part time, and/or internship seperated only by comams. Must be all if it is all three`); + if (employmentType?.trim()) { + // eslint-disable-next-line id-length + const employmentTypes = employmentType.toLowerCase().split(',').map(t => t.trim()); + // eslint-disable-next-line id-length + const invalidTypes = employmentTypes.filter(t => !validEmploymentTypes.includes(t)); + if (invalidTypes.length > 0) { + errors.push(`Invalid employment type: ${invalidTypes.join(', ')}. Must be full time, part time, and/or internship seperated only by comams. Must be all if it is all three`); + } + } else if (isJobForm) { + errors.push('Enter valid employment type'); } } if (!isJobForm || (travelDistance && isNaN(Number(travelDistance.replace(/[^0-9]/g, ''))))) { From 365ef20f732dfc86862e3b339afd2ba9d4931edf Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 23 Nov 2024 13:38:40 -0500 Subject: [PATCH 190/267] got rid of qset2 validations, was unnecessary and fixed all update_preferences and jobForm. Also changed comments --- src/lib/utils/jobUtils/validatePreferences.ts | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src/lib/utils/jobUtils/validatePreferences.ts b/src/lib/utils/jobUtils/validatePreferences.ts index dcbafff0..c24ee1db 100644 --- a/src/lib/utils/jobUtils/validatePreferences.ts +++ b/src/lib/utils/jobUtils/validatePreferences.ts @@ -1,65 +1,72 @@ -import jobform from '@root/src/commands/jobs/jobform'; - interface ValidateResult { isValid: boolean; errors: string[]; } -// eslint-disable-next-line complexity export const validatePreferences = (answers: string[], qset: number, isJobForm: boolean): ValidateResult => { const errors: string[] = []; + + // For job form, enforce all fields if (qset === 0) { const [city, workType, employmentType, travelDistance] = answers; - if (!isJobForm || !city?.trim()) { + + // Only validate non-empty fields when updating preferences + if (!isJobForm || city?.trim()) { if (city?.trim() === '') { errors.push('Enter valid city'); } } - if (!isJobForm || !workType?.trim()) { - const validWorkTypes = ['remote', 'hybrid', 'in person', - 'remote, hybrid', 'remote, in person', 'hybrid, in person', 'hybrid. remote', 'in person, remote', 'in person, hybrid', + + if (!isJobForm || workType?.trim()) { + const validWorkTypes = [ + 'remote', 'hybrid', 'in person', + 'remote, hybrid', 'remote, in person', 'hybrid, in person', + 'hybrid. remote', 'in person, remote', 'in person, hybrid', 'all' ]; + if (workType?.trim()) { - // eslint-disable-next-line id-length + // eslint-disable-next-line id-length const workTypes = workType.toLowerCase().split(',').map(t => t.trim()); // eslint-disable-next-line id-length const invalidTypes = workTypes.filter(t => !validWorkTypes.includes(t)); + if (invalidTypes.length > 0) { - errors.push(`Invalid work type: ${invalidTypes.join(', ')}. Must be remote, hybrid, and/or in person seperated only by comams. Must be all if it is all three`); + errors.push(`Invalid work type: ${invalidTypes.join(', ')}. Must be remote, hybrid, and/or in person separated only by commas. Must be all if it is all three`); } } else if (isJobForm) { errors.push('Enter valid work type'); } } - if (!isJobForm || !employmentType?.trim()) { - const validEmploymentTypes = ['full time', 'part time', 'internship', - 'full time, part time', 'full time, internship', 'part time, internship', 'part time, full time', 'internship, full time', 'internship, part time', + + if (!isJobForm || employmentType?.trim()) { + const validEmploymentTypes = [ + 'full time', 'part time', 'internship', + 'full time, part time', 'full time, internship', 'part time, internship', + 'part time, full time', 'internship, full time', 'internship, part time', 'all' ]; + if (employmentType?.trim()) { // eslint-disable-next-line id-length const employmentTypes = employmentType.toLowerCase().split(',').map(t => t.trim()); // eslint-disable-next-line id-length const invalidTypes = employmentTypes.filter(t => !validEmploymentTypes.includes(t)); + if (invalidTypes.length > 0) { - errors.push(`Invalid employment type: ${invalidTypes.join(', ')}. Must be full time, part time, and/or internship seperated only by comams. Must be all if it is all three`); + errors.push(`Invalid employment type: ${invalidTypes.join(', ')}. Must be full time, part time, and/or internship separated only by commas. Must be all if it is all three`); } } else if (isJobForm) { errors.push('Enter valid employment type'); } } - if (!isJobForm || (travelDistance && isNaN(Number(travelDistance.replace(/[^0-9]/g, ''))))) { + + if (travelDistance?.trim() && isNaN(Number(travelDistance.replace(/[^0-9]/g, '')))) { errors.push('Travel distance must be a number'); } - } else if (qset === 1) { - if (isJobForm) { - const intersts = answers.filter(interest => interest?.trim()).length; - if (intersts < 5) { - errors.push('Select at least 5 interests'); - } - } } + + return { isValid: errors.length === 0, errors From 9d39438e2d8a898d9b01b79d925f8721c1016f69 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 23 Nov 2024 13:39:12 -0500 Subject: [PATCH 191/267] got rid of qset2 validations, was unnecessary and fixed all update_preferences and jobForm. Also changed comments --- src/lib/utils/jobUtils/validatePreferences.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/lib/utils/jobUtils/validatePreferences.ts b/src/lib/utils/jobUtils/validatePreferences.ts index c24ee1db..a6b19f6b 100644 --- a/src/lib/utils/jobUtils/validatePreferences.ts +++ b/src/lib/utils/jobUtils/validatePreferences.ts @@ -65,8 +65,6 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: errors.push('Travel distance must be a number'); } } - - return { isValid: errors.length === 0, errors From 99055612acfa85946dcb4e9922de4b86d7d45ec3 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 23 Nov 2024 13:43:18 -0500 Subject: [PATCH 192/267] changed and added new comments for different files --- src/commands/jobs/jobform.ts | 1 + src/commands/jobs/update_preferences.ts | 1 + src/lib/utils/jobUtils/jobDatabase.ts | 2 +- src/pieces/commandManager.ts | 19 +------------------ 4 files changed, 4 insertions(+), 19 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index fc39a636..210b61d8 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -95,6 +95,7 @@ export default class extends Command { ] }); } + // Handles validation for qset1 async handleModalSubmit(interaction: ChatInputCommandInteraction, answers: string[], qSet: number): Promise { const validation = validatePreferences(answers, qSet, true); if (!validation.isValid) { diff --git a/src/commands/jobs/update_preferences.ts b/src/commands/jobs/update_preferences.ts index e482f7a4..874e0881 100644 --- a/src/commands/jobs/update_preferences.ts +++ b/src/commands/jobs/update_preferences.ts @@ -102,6 +102,7 @@ export default class extends Command { .setPlaceholder(`Current value: ${value || 'Not Set'}`) .setRequired(false)] }); } + // Handles validation for qset1 async handleModalSubmit(interaction: ChatInputCommandInteraction, answers: string[], qSet: number): Promise { const validation = validatePreferences(answers, qSet, false); if (!validation.isValid) { diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index 30cef7ae..d2393ab9 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -77,7 +77,7 @@ export class JobPreferenceAPI { return false; } } - + // Gets the preferences anwers from the database. async getPreference(userID: string): Promise { try { const user = await this.collection.findOne({ discordId: userID }); diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 30ba1044..c9e32210 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -166,23 +166,6 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie }); return; } - // const answerResponse: Job = { - // owner: interaction.user.id, - // content: '', - // location: '', - // questionSet: formNumber, - // answers: answers, - // mode: 'private' // temporary - switch to private before final submission - // }; - - // // interaction.client.mongo.collection(DB.JOB_FORMS).insertOne(answerResponse); - // if (answerResponse.questionSet === 0) { - // interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( - // { questionSet: 0 }, answerResponse, { upsert: true }); - // } else if (answerResponse.questionSet === 1) { - // interaction.client.mongo.collection(DB.JOB_FORMS).findOneAndReplace( - // { questionSet: 1 }, answerResponse, { upsert: true }); - // } // Create API instance with the database instance directly const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); @@ -196,7 +179,7 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie content: success ? mess : 'Error saving preferences. Please try again', ephemeral: true }); - // couldnt update form for some reason + // Error for failed update } catch (error) { console.error('update form error:', error); await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); From 1d1cadfeeac69116ba4389be97bf7f48fc612bd7 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sat, 23 Nov 2024 13:59:31 -0500 Subject: [PATCH 193/267] pushing to task 7 --- src/lib/utils/jobUtils/jobDatabase.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index d2393ab9..b364ecc8 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -1,7 +1,5 @@ import { Collection, Db, MongoClient } from 'mongodb'; import { DB } from '@root/config'; -import { Command } from '@root/src/lib/types/Command'; -import { Emoji } from 'discord.js'; import { validatePreferences } from './validatePreferences'; // class to store the info of the preferences the user previously put in to match to jobs in the database From 2379361e9bdda45a659cad5568d8701d10e554d7 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 2 Dec 2024 10:01:55 -0500 Subject: [PATCH 194/267] temporary code --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 103 ++++++++++---------- 1 file changed, 49 insertions(+), 54 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index 99ebb6f8..ed6a07c9 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -1,67 +1,62 @@ +import axios from 'axios'; import { APP_ID, APP_KEY } from '@root/config'; -import { Interest, JobData } from '@root/src/pieces/tasks'; -export interface JobResult { - company: string, - title: string, - description: string, - location, - created: string, - salaryMax: string, - salaryMin: string, - link: string, +// Define the structure of a job listing +interface JobListing { + title: string; + company: string; + location: string; + salary: string; + link: string; + description: string; } -export default async function getJobAPIResponse(jobData: JobData, interests: Interest): Promise { - const LOCATION = encodeURIComponent(jobData.city); - const JOB_TYPE = encodeURIComponent(jobData.jobType); - const DISTANCE_KM = Number(jobData.distance) * 1.609; // miles in km - let whatInterests = ''; +// Define the cache type +type JobCache = { + [key: string]: JobListing[]; +}; - const keys = Object.keys(interests); - const lastKey = keys[keys.length - 1]; - const lastValue = interests[lastKey]; +// a cache object to store results +const jobCache: JobCache = {}; - for (const interest in interests) { - whatInterests += interests[interest].replace(/\s+/g, '-'); // replaces each space in a word with a dash - if (interests[interest] !== lastValue) { - whatInterests += ' '; - } - } - - whatInterests = encodeURIComponent(whatInterests); +// the adzunaAPI function +export async function adzunaAPI(JOB_TITLE: string, LOCATION: string): Promise { + const cacheKey = `${JOB_TITLE.toLowerCase()}-${LOCATION.toLowerCase()}`; - const URL = `https://api.adzuna.com/v1/api/jobs/us/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=15&what=${JOB_TYPE}&what_or=${whatInterests}&where= - ${LOCATION}&distance=${DISTANCE_KM}`; + // Check if the data is already in the cache + if (jobCache[cacheKey]) { + console.log('Fetching data from cache...'); + return jobCache[cacheKey]; + } - const jobResults: JobResult[] = []; + // URL for the API + const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} + &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; try { - const response = await fetch(URL); - if (!response.ok) { - throw new Error(`HTTP error ${response.status}`); - } - - const responseData = await response.json(); - for (let i = 0; i < responseData.results.length; i++) { - const jobResultData: JobResult = { - company: responseData.results[i].company.display_name, - title: responseData.results[i].title, - description: responseData.results[i].description, - location: `${responseData.results[i].location.display_name} (${responseData.results[i].location.area.toString().replace(/,/g, ', ')})`, - created: responseData.results[i].created, - salaryMax: responseData.results[i].salary_max, - salaryMin: responseData.results[i].salary_min, - link: responseData.results[i].redirect_url - }; - - // if (!jobResults.find((job: JobResult) => job.company === jobResultData.company)) { - jobResults.push(jobResultData); - // } - } + // Make the API request + console.log('Fetching data from API...'); + const response = await axios.get(URL); + + // Format the job listings + const jobListings: JobListing[] = response.data.results.map((job: any) => ({ + title: job.title, + company: job.company?.name || 'Not Provided', + location: job.location?.display_name || 'Not Provided', + salary: job.salary_min + ? `$${job.salary_min.toLocaleString()} - $${job.salary_max.toLocaleString()}` + : 'Salary not listed', + link: job.redirect_url || 'No link available', + description: job.description || 'No description available' + })); + + // Store the formatted data in the cache + jobCache[cacheKey] = jobListings; + + // Return the data + return jobListings; } catch (error) { - console.error('Fetch error:', error); + console.error('Axios error:', error); + throw error; } - - return jobResults; } From fb89adc7e6c0f1f4817e93c134657fcbba3c4900 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 3 Dec 2024 11:04:07 -0500 Subject: [PATCH 195/267] storeFormResponse now ends the function if the validations are false --- src/commands/jobs/jobform.ts | 2 +- src/commands/jobs/update_preferences.ts | 2 +- src/lib/utils/jobUtils/jobDatabase.ts | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 210b61d8..f2356111 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -19,7 +19,7 @@ const questions = [ 'What city do you want to be located?', 'Remote, hybrid, and/or in-person?', 'Full time, Part time, and/or Internship?', - 'How far are you willing to travel?' + 'How far are you willing to travel? (in miles)' ], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; diff --git a/src/commands/jobs/update_preferences.ts b/src/commands/jobs/update_preferences.ts index 874e0881..ad450a60 100644 --- a/src/commands/jobs/update_preferences.ts +++ b/src/commands/jobs/update_preferences.ts @@ -10,7 +10,7 @@ const questions = [ ['What city do you want to be located?', 'Remote, hybrid, and/or in-person?', 'Full time, Part time, and/or Internship?', - 'How far are you willing to travel?'], + 'How far are you willing to travel? (in miles)'], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index b364ecc8..d9c3a32c 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -32,6 +32,8 @@ export class JobPreferenceAPI { } async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise { + // If user id does not exist, then nothing will be stored + if (!userID?.trim()) return false; try { const updateObject = {}; const { isValid, errors } = validatePreferences(answers, questionSet, true); @@ -55,7 +57,8 @@ export class JobPreferenceAPI { if (interest4?.trim()) updateObject['jobPreferences.answers.interest4'] = interest4; if (interest5?.trim()) updateObject['jobPreferences.answers.interest5'] = interest5; } - // Updates preferences with new answers and the new date inputted. + // Updates preferences with new answers and the new date inputted if the answers length is greater than 0. + if (Object.keys(updateObject).length === 0) return false; if (Object.keys(updateObject).length > 0) { await this.collection.updateOne( { discordId: userID }, From 9e763620df2157fb2f9d8f6080da467091ff8d88 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 3 Dec 2024 11:06:07 -0500 Subject: [PATCH 196/267] did something similar to delete and update preferences wuth store preferences --- src/lib/utils/jobUtils/jobDatabase.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index d9c3a32c..28af6ed0 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -80,6 +80,8 @@ export class JobPreferenceAPI { } // Gets the preferences anwers from the database. async getPreference(userID: string): Promise { + // If user id does not exist, then nothing will be stored + if (!userID?.trim()) return false; try { const user = await this.collection.findOne({ discordId: userID }); return user?.jobPreferences || null; @@ -90,6 +92,8 @@ export class JobPreferenceAPI { } // Deletes the preferences answers to an empty string. async deletePreference(userID: string): Promise { + // If user id does not exist, then nothing will be stored + if (!userID?.trim()) return false; try { const result = await this.collection.updateOne( { discordId: userID }, From 11412d0f8ca75f0b8a65e2d782311dca32f5b6ac Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Tue, 3 Dec 2024 13:57:00 -0500 Subject: [PATCH 197/267] reverted changes --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 80 +++++++-------------- 1 file changed, 24 insertions(+), 56 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index ed6a07c9..6406cc35 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -1,62 +1,30 @@ -import axios from 'axios'; import { APP_ID, APP_KEY } from '@root/config'; +// import axios from 'axios'; -// Define the structure of a job listing -interface JobListing { - title: string; - company: string; - location: string; - salary: string; - link: string; - description: string; -} - -// Define the cache type -type JobCache = { - [key: string]: JobListing[]; -}; - -// a cache object to store results -const jobCache: JobCache = {}; - -// the adzunaAPI function -export async function adzunaAPI(JOB_TITLE: string, LOCATION: string): Promise { - const cacheKey = `${JOB_TITLE.toLowerCase()}-${LOCATION.toLowerCase()}`; - // Check if the data is already in the cache - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - return jobCache[cacheKey]; - } +// Questions: how to pull it? Do I need to pull it? +// how to work on the next part of the project? +// Task 3.5: Store fetched job listings temporarily for job matching +// Create a local cache or temporary storage to hold job listings for processing. +export function adzunaAPI(): void { + const JOB_TITLE = 'software engineer'; + const LOCATION = 'us'; + // const SALARY_MIN = 50000; - // URL for the API const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} - &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; - - try { - // Make the API request - console.log('Fetching data from API...'); - const response = await axios.get(URL); - - // Format the job listings - const jobListings: JobListing[] = response.data.results.map((job: any) => ({ - title: job.title, - company: job.company?.name || 'Not Provided', - location: job.location?.display_name || 'Not Provided', - salary: job.salary_min - ? `$${job.salary_min.toLocaleString()} - $${job.salary_max.toLocaleString()}` - : 'Salary not listed', - link: job.redirect_url || 'No link available', - description: job.description || 'No description available' - })); - - // Store the formatted data in the cache - jobCache[cacheKey] = jobListings; - - // Return the data - return jobListings; - } catch (error) { - console.error('Axios error:', error); - throw error; - } + &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; + + fetch(URL) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error ${response.status}`); + } + return response.json(); + }) + .then((responseData) => { + console.log(responseData); + }) + .catch((error) => { + console.error('Fetch error:', error); + }); } From 999ba612cc8d22d83db312eb5667e95b0dfe9bcf Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 3 Dec 2024 22:14:04 -0500 Subject: [PATCH 198/267] added messages to store preferences --- src/lib/utils/jobUtils/jobDatabase.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index 28af6ed0..30d3c736 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -1,6 +1,7 @@ import { Collection, Db, MongoClient } from 'mongodb'; import { DB } from '@root/config'; import { validatePreferences } from './validatePreferences'; +import { EmbedBuilder } from 'discord.js'; // class to store the info of the preferences the user previously put in to match to jobs in the database interface JobPreferences { @@ -31,15 +32,17 @@ export class JobPreferenceAPI { this.collection = db.collection(DB.USERS); } - async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise { + async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise<{ success: boolean; message: string }> { // If user id does not exist, then nothing will be stored - if (!userID?.trim()) return false; + if (!userID?.trim()) { + return { success: false, message: 'User ID is required' }; + } try { const updateObject = {}; const { isValid, errors } = validatePreferences(answers, questionSet, true); if (!isValid) { console.error('Validation failed', errors); - return false; + return { success: false, message: 'Invalid preferences provided' }; } // Adds answers to questions. if (questionSet === 0) { @@ -58,7 +61,7 @@ export class JobPreferenceAPI { if (interest5?.trim()) updateObject['jobPreferences.answers.interest5'] = interest5; } // Updates preferences with new answers and the new date inputted if the answers length is greater than 0. - if (Object.keys(updateObject).length === 0) return false; + if (Object.keys(updateObject).length === 0) return { success: false, message: 'No valid answers provided' }; if (Object.keys(updateObject).length > 0) { await this.collection.updateOne( { discordId: userID }, @@ -72,10 +75,10 @@ export class JobPreferenceAPI { { upsert: true } ); } - return true; + return { success: true, message: 'Preferences stored successfully' }; } catch (error) { console.error('Error storing job form responses', error); - return false; + return { success: false, message: 'Failed to store preferences' }; } } // Gets the preferences anwers from the database. From fca359342f41dc6daa8d6497d8de8588ec339ca7 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Tue, 3 Dec 2024 22:22:00 -0500 Subject: [PATCH 199/267] added more error handling to getPreferences --- src/lib/utils/jobUtils/jobDatabase.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index 30d3c736..d5980ea8 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -82,15 +82,21 @@ export class JobPreferenceAPI { } } // Gets the preferences anwers from the database. - async getPreference(userID: string): Promise { + async getPreference(userID: string): Promise<{ success: boolean; data?; message: string }> { // If user id does not exist, then nothing will be stored - if (!userID?.trim()) return false; + if (!userID?.trim()) { + return { success: false, message: 'User ID is required' }; + } try { const user = await this.collection.findOne({ discordId: userID }); - return user?.jobPreferences || null; + return { + success: true, + data: user?.jobPreferences || null, + message: user?.jobPreferences ? 'Preferences found' : 'No preferences found' + }; } catch (error) { console.error('Error getting job form responses', error); - return false; + return { success: false, message: 'Failed to retrieve preferences' }; } } // Deletes the preferences answers to an empty string. From 38934325f87f93aa10bb986ba9da290c1bc4f521 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 4 Dec 2024 01:58:48 -0500 Subject: [PATCH 200/267] modified code for parsing the job API response and applied caching logic --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 77 +++++++++++++-------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index e7e35313..4905acad 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -1,7 +1,7 @@ import axios from 'axios'; import { APP_ID, APP_KEY } from '@root/config'; +import { JobData, Interest } from '@root/src/pieces/tasks'; -// Define the structure of a job listing interface JobListing { title: string; company: string; @@ -11,52 +11,71 @@ interface JobListing { description: string; } -// Define the cache type +export interface JobResult { + company: string; + title: string; + description: string; + location: string; + created: string; + salaryMax: string; + salaryMin: string; + link: string; +} + type JobCache = { - [key: string]: JobListing[]; + [key: string]: JobListing[] | JobResult[]; }; -// a cache object to store results const jobCache: JobCache = {}; -// the adzunaAPI function -export async function adzunaAPI(JOB_TITLE: string, LOCATION: string): Promise { - const cacheKey = `${JOB_TITLE.toLowerCase()}-${LOCATION.toLowerCase()}`; +export async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { + const LOCATION = encodeURIComponent(jobData.city); + const JOB_TYPE = encodeURIComponent(jobData.jobType); + const DISTANCE_KM = Number(jobData.distance) * 1.609; // Convert miles to kilometers + + let whatInterests = ''; + if (interests) { + const keys = Object.keys(interests); + const lastKey = keys[keys.length - 1]; + const lastValue = interests[lastKey]; + + for (const interest in interests) { + whatInterests += interests[interest].replace(/\s+/g, '-'); // Replace spaces with dashes + if (interests[interest] !== lastValue) { + whatInterests += ' '; + } + } + } + whatInterests = encodeURIComponent(whatInterests); - // Check if the data is already in the cache + const cacheKey = `${jobData.jobType.toLowerCase()}-${jobData.city.toLowerCase()}-${whatInterests}`; if (jobCache[cacheKey]) { console.log('Fetching data from cache...'); - return jobCache[cacheKey]; + return jobCache[cacheKey] as JobResult[]; } - // URL for the API - const URL = `https://api.adzuna.com/v1/api/jobs/${LOCATION}/search/1?app_id=${APP_ID}&app_key=${APP_KEY} - &results_per_page=10&what=${encodeURIComponent(JOB_TITLE)}&where=${encodeURIComponent(LOCATION)}`; + const URL = `https://api.adzuna.com/v1/api/jobs/us/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=15&what=${JOB_TYPE}&what_or=${whatInterests}&where= + ${LOCATION}&distance=${DISTANCE_KM}`; try { - // Make the API request console.log('Fetching data from API...'); const response = await axios.get(URL); - - // Format the job listings - const jobListings: JobListing[] = response.data.results.map((job: any) => ({ + const jobResults: JobResult[] = response.data.results.map((job: any) => ({ + company: job.company?.display_name || 'Not Provided', title: job.title, - company: job.company?.name || 'Not Provided', - location: job.location?.display_name || 'Not Provided', - salary: job.salary_min - ? `$${job.salary_min.toLocaleString()} - $${job.salary_max.toLocaleString()}` - : 'Salary not listed', - link: job.redirect_url || 'No link available', - description: job.description || 'No description available' + description: job.description || 'No description available', + location: `${job.location?.display_name || 'Not Provided'} (${job.location?.area?.toString().replace(/,/g, ', ') || ''})`, + created: job.created || 'Unknown', + salaryMax: job.salary_max || 'Not listed', + salaryMin: job.salary_min || 'Not listed', + link: job.redirect_url || 'No link available' })); - // Store the formatted data in the cache - jobCache[cacheKey] = jobListings; + jobCache[cacheKey] = jobResults; - // Return the data - return jobListings; + return jobResults; } catch (error) { - console.error('Axios error:', error); + console.error('API error:', error); throw error; } -} \ No newline at end of file +} From 48a8b4cef9e15f4a9aface31114acf6b248210ad Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Wed, 4 Dec 2024 09:23:30 -0500 Subject: [PATCH 201/267] added more error handling to deletePreferences --- src/lib/utils/jobUtils/jobDatabase.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index d5980ea8..c48facac 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -100,18 +100,23 @@ export class JobPreferenceAPI { } } // Deletes the preferences answers to an empty string. - async deletePreference(userID: string): Promise { + async deletePreference(userID: string): Promise<{ success: boolean; message: string }> { // If user id does not exist, then nothing will be stored - if (!userID?.trim()) return false; + if (!userID?.trim()) { + return { success: false, message: 'User ID is required' }; + } try { const result = await this.collection.updateOne( { discordId: userID }, { $unset: { jobPreferences: '' } } ); - return result.modifiedCount > 0; + return { + success: result.modifiedCount > 0, + message: result.modifiedCount > 0 ? 'Preferences deleted' : 'No preferences found' + }; } catch (error) { console.error('Error deleting job preference', error); - return false; + return { success: false, message: 'Failed to delete preferences' }; } } From 540ab1a01d6836d0e9c2908483e5197ca48833f7 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 4 Dec 2024 09:40:09 -0500 Subject: [PATCH 202/267] updated imported function to the correct name of 'fetchJobListings' and replaced any instances of the old name with the new name --- src/pieces/tasks.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index e255c611..77093809 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -5,7 +5,7 @@ import { Reminder } from '@lib/types/Reminder'; import { Poll, PollResult } from '@lib/types/Poll'; import { MongoClient } from 'mongodb'; import { Job } from '../lib/types/Job'; -import getJobAPIResponse, { JobResult } from '../lib/utils/jobUtils/Adzuna_job_search'; +import fetchJobListings, { JobResult } from '../lib/utils/jobUtils/Adzuna_job_search'; import { sendToFile } from '../lib/utils/generalUtils'; async function register(bot: Client): Promise { @@ -116,7 +116,7 @@ async function getJobFormData(userID:string):Promise<[JobData, Interest, JobResu interest5: jobformAnswers[1].answers[4] }; - const APIResponse:JobResult[] = await getJobAPIResponse(jobData, interests); + const APIResponse:JobResult[] = await fetchJobListings(jobData, interests); return [jobData, interests, APIResponse]; } From c1d614eaa4707b9ab1555255f6a6591756d4b531 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 4 Dec 2024 09:41:15 -0500 Subject: [PATCH 203/267] removed detached, unused, and unnecessary return and catch block and made sure the exported function is being returned as 'export default' --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index 72ed51a5..ab028b2e 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -28,7 +28,7 @@ type JobCache = { const jobCache: JobCache = {}; -export async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { +export default async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { const LOCATION = encodeURIComponent(jobData.city); const JOB_TYPE = encodeURIComponent(jobData.jobType); const DISTANCE_KM = Number(jobData.distance) * 1.609; // Convert miles to kilometers @@ -78,12 +78,4 @@ export async function fetchJobListings(jobData: JobData, interests?: Interest): console.error('API error:', error); throw error; } - return response.json(); - }) - .then((responseData) => { - console.log(responseData); - }) - .catch((error) => { - console.error('Fetch error:', error); - }); } From 436f956284238c99c5c42aae4cc770d4ecca2acb Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Wed, 4 Dec 2024 09:45:02 -0500 Subject: [PATCH 204/267] Update commandManager.ts --- src/pieces/commandManager.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index b2d61fb0..7164c96a 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -1,10 +1,9 @@ -import { Collection, Client, CommandInteraction, ApplicationCommand, +import { Collection, Client, ApplicationCommand, GuildMember, SelectMenuInteraction, ModalSubmitInteraction, TextChannel, GuildMemberRoleManager, ButtonInteraction, ModalBuilder, TextInputBuilder, ActionRowBuilder, ModalActionRowComponentBuilder, ApplicationCommandType, ApplicationCommandDataResolvable, ChannelType, ApplicationCommandPermissionType, TextInputStyle, - ChatInputCommandInteraction, - ModalSubmitFields } from 'discord.js'; + ChatInputCommandInteraction } from 'discord.js'; import { isCmdEqual, readdirRecursive } from '@root/src/lib/utils/generalUtils'; import { Command } from '@lib/types/Command'; import { SageData } from '@lib/types/SageData'; From 69223783e83c7189084f9b7a304d18151e5cbeea Mon Sep 17 00:00:00 2001 From: pgsweet <113042887+pgsweet@users.noreply.github.com> Date: Wed, 4 Dec 2024 09:48:24 -0500 Subject: [PATCH 205/267] Update jobDatabase.ts --- src/lib/utils/jobUtils/jobDatabase.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index 30c35dd8..5cb2b0d1 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -1,7 +1,5 @@ -import { Collection, Db, MongoClient } from 'mongodb'; +import { Collection, Db } from 'mongodb'; import { DB } from '@root/config'; -import { Command } from '@root/src/lib/types/Command'; -import { Emoji } from 'discord.js'; // class to store the info of the preferences the user previously put in to match to jobs in the database interface JobPreferences { From 88d7d3d2881b26688e9975a51d71c34b99f483b3 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Wed, 4 Dec 2024 09:54:25 -0500 Subject: [PATCH 206/267] pulling from main --- src/lib/utils/jobUtils/jobDatabase.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index c48facac..a2d5158c 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -35,7 +35,7 @@ export class JobPreferenceAPI { async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise<{ success: boolean; message: string }> { // If user id does not exist, then nothing will be stored if (!userID?.trim()) { - return { success: false, message: 'User ID is required' }; + return { success: false, message: 'Invalid User ID' }; } try { const updateObject = {}; @@ -85,7 +85,7 @@ export class JobPreferenceAPI { async getPreference(userID: string): Promise<{ success: boolean; data?; message: string }> { // If user id does not exist, then nothing will be stored if (!userID?.trim()) { - return { success: false, message: 'User ID is required' }; + return { success: false, message: 'Invalid User ID' }; } try { const user = await this.collection.findOne({ discordId: userID }); @@ -103,7 +103,7 @@ export class JobPreferenceAPI { async deletePreference(userID: string): Promise<{ success: boolean; message: string }> { // If user id does not exist, then nothing will be stored if (!userID?.trim()) { - return { success: false, message: 'User ID is required' }; + return { success: false, message: 'Invalid User ID' }; } try { const result = await this.collection.updateOne( From ca56d1f471ca21a2f53e5893a8c11609ac9f19b0 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 4 Dec 2024 15:11:50 -0500 Subject: [PATCH 207/267] added a 'filter type' selection for the user to choose for the job reminder command --- src/commands/reminders/remind.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 7cbc1618..3c593ae7 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -59,6 +59,17 @@ export default class extends Command { ], type: ApplicationCommandOptionType.String, required: true + }, + { + name: 'filter-type', + description: 'Select what you would like your job/internships filtered by', + choices: [ + { name: 'Relevance', value: 'relevance' }, + { name: 'Salary', value: 'salary' }, + { name: 'Date Posted', value: 'date posted' }, + { name: 'Default', value: 'default' } + ], + type: ApplicationCommandOptionType.String } ] } From eefa1d7172fabe8b4b7a18dbf5a376744a5b9a63 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Wed, 4 Dec 2024 15:38:35 -0500 Subject: [PATCH 208/267] added 'null' to the filtyBy property as a valid type --- src/lib/types/Reminder.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/types/Reminder.d.ts b/src/lib/types/Reminder.d.ts index bbc21138..770874a5 100644 --- a/src/lib/types/Reminder.d.ts +++ b/src/lib/types/Reminder.d.ts @@ -4,4 +4,5 @@ export interface Reminder { content: string; repeat: null | 'daily' | 'weekly'; mode: 'public' | 'private'; + filterBy?: 'relevance' | 'salary' | 'date-posted' | 'default' | null } From 3ca949605d4405c67eecaae06e2f1510e21ecf74 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 19:33:15 -0500 Subject: [PATCH 209/267] added code for retrieving the filter type the user selected when running the jobs command --- src/commands/reminders/remind.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 3c593ae7..5c6b26a9 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -98,12 +98,15 @@ export default class extends Command { | 'daily' | 'weekly' || null; + const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date-posted' | 'default' | null; + const jobReminder: Reminder = { owner: interaction.user.id, content: 'Job Reminder', mode: 'private', expires: new Date(), - repeat: jobReminderRepeat + repeat: jobReminderRepeat, + filterBy }; // handling duplicate job reminders if (await this.checkJobReminder(interaction)) { From b7fe1c1c1217923556431f4ef514796d0e8db58a Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 20:25:05 -0500 Subject: [PATCH 210/267] modified code inside of formatCurrency function to handle case where result isNaN --- src/pieces/tasks.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 77093809..9fc0b7b0 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -85,7 +85,8 @@ export interface JobData { city: string, preference: string, jobType: string, - distance: string + distance: string, + filterBy: string } export interface Interest { @@ -97,7 +98,7 @@ export interface Interest { } // eslint-disable-next-line no-warning-comments -async function getJobFormData(userID:string):Promise<[JobData, Interest, JobResult[]]> { +async function getJobFormData(userID:string, filterBy: string):Promise<[JobData, Interest, JobResult[]]> { const client = await MongoClient.connect(DB.CONNECTION, { useUnifiedTopology: true }); const db = client.db(BOT.NAME).collection(DB.JOB_FORMS); const jobformAnswers:Job[] = await db.find({ owner: userID }).toArray(); @@ -105,7 +106,8 @@ async function getJobFormData(userID:string):Promise<[JobData, Interest, JobResu city: jobformAnswers[0].answers[0], preference: jobformAnswers[0].answers[1], jobType: jobformAnswers[0].answers[2], - distance: jobformAnswers[0].answers[3] + distance: jobformAnswers[0].answers[3], + filterBy }; const interests:Interest = { @@ -121,7 +123,7 @@ async function getJobFormData(userID:string):Promise<[JobData, Interest, JobResu } function formatCurrency(currency:number): string { - return `${new Intl.NumberFormat('en-US', { + return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(Number(currency))}`; @@ -150,7 +152,7 @@ function listJobs(jobData: JobResult[]): string { } async function jobMessage(reminder: Reminder, userID: string): Promise { - const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID); + const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, reminder.filterBy || "default"); const message = `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations: Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ From 85f15a948c1d337c46cd110065178e44d1e5aec0 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 20:28:57 -0500 Subject: [PATCH 211/267] utilized Math.round() method to round the DISTANCE_KM variable --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index ab028b2e..ad4c9aae 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -55,7 +55,9 @@ export default async function fetchJobListings(jobData: JobData, interests?: Int } const URL = `https://api.adzuna.com/v1/api/jobs/us/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=15&what=${JOB_TYPE}&what_or=${whatInterests}&where= - ${LOCATION}&distance=${DISTANCE_KM}`; + ${LOCATION}&distance=${Math.round(DISTANCE_KM)}&sort_by=${jobData.filterBy}`; + + console.log('URL ---------------------->', URL); try { console.log('Fetching data from API...'); From b6ddc685465b2f3ce99ee0d6a21803eb6b58941d Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 20:56:58 -0500 Subject: [PATCH 212/267] changed 'data-posted' to 'date' --- src/lib/types/Reminder.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/types/Reminder.d.ts b/src/lib/types/Reminder.d.ts index 770874a5..e572ee51 100644 --- a/src/lib/types/Reminder.d.ts +++ b/src/lib/types/Reminder.d.ts @@ -4,5 +4,5 @@ export interface Reminder { content: string; repeat: null | 'daily' | 'weekly'; mode: 'public' | 'private'; - filterBy?: 'relevance' | 'salary' | 'date-posted' | 'default' | null + filterBy?: 'relevance' | 'salary' | 'date' | 'default' | null } From e067edea11d285e4cf451d0e7bc9ff51bcb8a49e Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 20:57:35 -0500 Subject: [PATCH 213/267] changed Date Posted value from 'date-posted' to 'date' --- src/commands/reminders/remind.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 5c6b26a9..b895e391 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -66,7 +66,7 @@ export default class extends Command { choices: [ { name: 'Relevance', value: 'relevance' }, { name: 'Salary', value: 'salary' }, - { name: 'Date Posted', value: 'date posted' }, + { name: 'Date Posted', value: 'date' }, { name: 'Default', value: 'default' } ], type: ApplicationCommandOptionType.String From d411b529cb77b62abd68aa0e88160ffe51cc40ae Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 20:58:39 -0500 Subject: [PATCH 214/267] removed '-posted' prefix from 'date' in type assertion statement --- src/commands/reminders/remind.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index b895e391..8efb7ff8 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -98,7 +98,7 @@ export default class extends Command { | 'daily' | 'weekly' || null; - const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date-posted' | 'default' | null; + const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date' | 'default' | null; const jobReminder: Reminder = { owner: interaction.user.id, From aca4002038aa757639f52ee3dd0bb5a969e6a1b2 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 21:06:27 -0500 Subject: [PATCH 215/267] rewrote listJobs function code --- src/pieces/tasks.ts | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 9fc0b7b0..a282ba9b 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -141,18 +141,23 @@ function listJobs(jobData: JobResult[]): string { const formattedSalaryMax = formatCurrency(Number(jobData[i].salaryMax)); const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)); + const salaryDetails = formattedAvgSalary !== formattedSalaryMax + ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` + : ''; + jobList += `${i + 1}. **${titleCase(jobData[i].title)}** - \t \t * **Salary Average:** ${formattedAvgSalary}\ - ${formattedAvgSalary !== formattedSalaryMax ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` : ''} - \t \t * **Location:** ${jobData[i].location} - \t \t * **Apply here:** [read more about the job and apply here](${jobData[i].link}) - ${i !== jobData.length - 1 ? '\n' : ''}`; + \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} + \t\t* **Location:** ${jobData[i].location} + \t\t* **Apply here:** [read more about the job and apply here](${jobData[i].link}) + ${i !== jobData.length - 1 ? '\n' : ''}`; } + return jobList || '### Unfortunately, there were no jobs found based on your interests :(. Consider updating your interests or waiting until something is found.'; } + async function jobMessage(reminder: Reminder, userID: string): Promise { - const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, reminder.filterBy || "default"); + const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, reminder.filterBy || 'default'); const message = `## Hey <@${reminder.owner}>! ## Here's your list of job/internship recommendations: Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ @@ -168,7 +173,8 @@ async function jobMessage(reminder: Reminder, userID: string): Promise { While we strive to provide accurate information, we cannot guarantee the legitimacy or security\ of all postings. Exercise caution when sharing personal information, submitting resumes, or registering\ on external sites. Always verify the authenticity of job applications before proceeding. Additionally, \ - some job postings may contain inaccuracies due to API limitations, which are beyond our control. We apologize for any inconvenience this may cause and appreciate your understanding. + some job postings may contain inaccuracies due to API limitations, which are beyond our control. We apologize for any inconvenience this may cause and appreciate your understanding.\ + ${reminder.filterBy !== 'default' ? `Your job results were filtered by: ${reminder.filterBy}` : ''} `; return message; } From ff44c1e0a2ff984054b8730226514b65776855e2 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 21:26:18 -0500 Subject: [PATCH 216/267] created an interface file for Interest --- src/lib/types/Interest.d.ts | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/lib/types/Interest.d.ts diff --git a/src/lib/types/Interest.d.ts b/src/lib/types/Interest.d.ts new file mode 100644 index 00000000..6755e5d0 --- /dev/null +++ b/src/lib/types/Interest.d.ts @@ -0,0 +1,7 @@ +export interface Interest { + interest1: string, + interest2: string, + interest3: string, + interest4: string, + interest5: string +} From d72c99996e8b63fc967cda18cf0ecf3d92d88084 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 21:26:35 -0500 Subject: [PATCH 217/267] created an interface file for JobData --- src/lib/types/JobData.d.ts | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/lib/types/JobData.d.ts diff --git a/src/lib/types/JobData.d.ts b/src/lib/types/JobData.d.ts new file mode 100644 index 00000000..a8e2724d --- /dev/null +++ b/src/lib/types/JobData.d.ts @@ -0,0 +1,7 @@ +export interface JobData { + city: string, + preference: string, + jobType: string, + distance: string, + filterBy: string +} From 2dc6f2917a69db887317c40d2fb829592c1174c1 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 21:27:37 -0500 Subject: [PATCH 218/267] removed Interest and JobData interface and now imports them into the file from types folder --- src/pieces/tasks.ts | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index a282ba9b..1077768b 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -7,6 +7,8 @@ import { MongoClient } from 'mongodb'; import { Job } from '../lib/types/Job'; import fetchJobListings, { JobResult } from '../lib/utils/jobUtils/Adzuna_job_search'; import { sendToFile } from '../lib/utils/generalUtils'; +import { JobData } from '../lib/types/JobData'; +import { Interest } from '../lib/types/Interest'; async function register(bot: Client): Promise { schedule('0/30 * * * * *', () => { @@ -81,21 +83,6 @@ async function checkPolls(bot: Client): Promise { }); } -export interface JobData { - city: string, - preference: string, - jobType: string, - distance: string, - filterBy: string -} - -export interface Interest { - interest1: string, - interest2: string, - interest3: string, - interest4: string, - interest5: string -} // eslint-disable-next-line no-warning-comments async function getJobFormData(userID:string, filterBy: string):Promise<[JobData, Interest, JobResult[]]> { From 55df6d118c88ec2c1e6906ac0d6dced12eaa54db Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 21:28:19 -0500 Subject: [PATCH 219/267] changed import for JobData and Interest interfaces so they now get imported from types folder --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index ad4c9aae..e8f453a4 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -1,6 +1,7 @@ import axios from 'axios'; import { APP_ID, APP_KEY } from '@root/config'; -import { JobData, Interest } from '@root/src/pieces/tasks'; +import { JobData } from '../../types/JobData'; +import { Interest } from '../../types/Interest'; interface JobListing { title: string; @@ -57,10 +58,9 @@ export default async function fetchJobListings(jobData: JobData, interests?: Int const URL = `https://api.adzuna.com/v1/api/jobs/us/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=15&what=${JOB_TYPE}&what_or=${whatInterests}&where= ${LOCATION}&distance=${Math.round(DISTANCE_KM)}&sort_by=${jobData.filterBy}`; - console.log('URL ---------------------->', URL); + // TODO - need to change 'any' type here try { - console.log('Fetching data from API...'); const response = await axios.get(URL); const jobResults: JobResult[] = response.data.results.map((job: any) => ({ company: job.company?.display_name || 'Not Provided', From 7132ca5d65f5558b474d8609c7734783b744460c Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 21:29:27 -0500 Subject: [PATCH 220/267] updated import for JobResult interface --- src/pieces/tasks.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 1077768b..48afe132 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -5,10 +5,11 @@ import { Reminder } from '@lib/types/Reminder'; import { Poll, PollResult } from '@lib/types/Poll'; import { MongoClient } from 'mongodb'; import { Job } from '../lib/types/Job'; -import fetchJobListings, { JobResult } from '../lib/utils/jobUtils/Adzuna_job_search'; +import fetchJobListings from '../lib/utils/jobUtils/Adzuna_job_search'; import { sendToFile } from '../lib/utils/generalUtils'; import { JobData } from '../lib/types/JobData'; import { Interest } from '../lib/types/Interest'; +import { JobResult } from '../lib/types/JobResult'; async function register(bot: Client): Promise { schedule('0/30 * * * * *', () => { From d2cfc3202930c53e090cd9f31b7e83521bab9e76 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 21:30:01 -0500 Subject: [PATCH 221/267] removed JobResult and JobListing interfaces from file and imported them from types folder --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index e8f453a4..869df3a5 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -2,26 +2,9 @@ import axios from 'axios'; import { APP_ID, APP_KEY } from '@root/config'; import { JobData } from '../../types/JobData'; import { Interest } from '../../types/Interest'; +import { JobListing } from '../../types/JobListing'; +import { JobResult } from '../../types/JobResult'; -interface JobListing { - title: string; - company: string; - location: string; - salary: string; - link: string; - description: string; -} - -export interface JobResult { - company: string; - title: string; - description: string; - location: string; - created: string; - salaryMax: string; - salaryMin: string; - link: string; -} type JobCache = { [key: string]: JobListing[] | JobResult[]; From 05a302c7cadbb68a8f8b7095fbc4639e3bb114dc Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 21:30:19 -0500 Subject: [PATCH 222/267] created file for JobResult interface --- src/lib/types/JobResult.d.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/lib/types/JobResult.d.ts diff --git a/src/lib/types/JobResult.d.ts b/src/lib/types/JobResult.d.ts new file mode 100644 index 00000000..5b29d5ef --- /dev/null +++ b/src/lib/types/JobResult.d.ts @@ -0,0 +1,10 @@ +export interface JobResult { + company: string; + title: string; + description: string; + location: string; + created: string; + salaryMax: string; + salaryMin: string; + link: string; +} From e0c1c84ead788dc5f1feb0f67ff81d59df411577 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 21:30:44 -0500 Subject: [PATCH 223/267] created file for JobListing interface --- src/lib/types/JobListing.d.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/lib/types/JobListing.d.ts diff --git a/src/lib/types/JobListing.d.ts b/src/lib/types/JobListing.d.ts new file mode 100644 index 00000000..f551524d --- /dev/null +++ b/src/lib/types/JobListing.d.ts @@ -0,0 +1,8 @@ +export interface JobListing { + title: string; + company: string; + location: string; + salary: string; + link: string; + description: string; +} From 9bfb95815505bdffad74288634466a5d9c6b1805 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 21:33:10 -0500 Subject: [PATCH 224/267] replaced 'int' with 'number' as the valid JavaScript type --- src/lib/types/Job.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/types/Job.d.ts b/src/lib/types/Job.d.ts index fe7adc18..8b88c9c6 100644 --- a/src/lib/types/Job.d.ts +++ b/src/lib/types/Job.d.ts @@ -1,9 +1,9 @@ export interface Job { owner: string; - questionSet: int; + questionSet: number; content: string; location: string; - questionSet: int; + questionSet: number; answers: string[]; mode: 'public' | 'private'; } From 3a5d6270c551aed5cf61adae5284a6e2b91b2645 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 21:47:00 -0500 Subject: [PATCH 225/267] added appropriate type for 'job' variable that's utilized in the map loop --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index 869df3a5..3b66c672 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -4,7 +4,7 @@ import { JobData } from '../../types/JobData'; import { Interest } from '../../types/Interest'; import { JobListing } from '../../types/JobListing'; import { JobResult } from '../../types/JobResult'; - +import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; type JobCache = { [key: string]: JobListing[] | JobResult[]; @@ -41,11 +41,9 @@ export default async function fetchJobListings(jobData: JobData, interests?: Int const URL = `https://api.adzuna.com/v1/api/jobs/us/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=15&what=${JOB_TYPE}&what_or=${whatInterests}&where= ${LOCATION}&distance=${Math.round(DISTANCE_KM)}&sort_by=${jobData.filterBy}`; - - // TODO - need to change 'any' type here try { const response = await axios.get(URL); - const jobResults: JobResult[] = response.data.results.map((job: any) => ({ + const jobResults: JobResult[] = response.data.results.map((job: AdzunaJobResponse) => ({ company: job.company?.display_name || 'Not Provided', title: job.title, description: job.description || 'No description available', From bc757be4e141e26eb2e6d22f929d59993f044723 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 21:47:21 -0500 Subject: [PATCH 226/267] created interface for the Adzuna Job API response --- src/lib/types/AdzunaJobResponse.d.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/lib/types/AdzunaJobResponse.d.ts diff --git a/src/lib/types/AdzunaJobResponse.d.ts b/src/lib/types/AdzunaJobResponse.d.ts new file mode 100644 index 00000000..9c9472e9 --- /dev/null +++ b/src/lib/types/AdzunaJobResponse.d.ts @@ -0,0 +1,16 @@ +/* eslint-disable camelcase */ +export interface AdzunaJobResponse { + company: { + display_name: string + }; + title: string, + description: string, + location: { + display_name: string, + area: string + } + created: string; + salary_max: number | string; + salary_min: number | string; + redirect_url: string; +} From 7f082ef93332ac5e8ea4271a4874a4983d2c2dda Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 8 Dec 2024 22:10:33 -0500 Subject: [PATCH 227/267] removed bad code, added comments --- src/commands/jobs/jobform.ts | 43 ++++++++----------- src/commands/jobs/update_preferences.ts | 9 +--- src/lib/utils/jobUtils/jobDatabase.ts | 35 ++++----------- src/lib/utils/jobUtils/validatePreferences.ts | 12 +++--- src/pieces/commandManager.ts | 11 ++--- 5 files changed, 39 insertions(+), 71 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index f2356111..78dccf32 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -13,7 +13,7 @@ import { import { validatePreferences } from '../../lib/utils/jobUtils/validatePreferences'; // prettier-ignore -// can be updated based on job algorithm API information - if changed make sure to update in update_preferences.ts on line 8 and question titles on line 55 +// Questions users will be asked to input into the API const questions = [ [ 'What city do you want to be located?', @@ -27,9 +27,8 @@ const questions = [ // prettier-ignore export default class extends Command { - name: 'jobform'; - description = - 'Form to get your preferences for jobs to be used with the Job Alert System!'; + name = 'jobform'; + description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; // gives option to command to choose what question set user is answering options: ApplicationCommandOptionData[] = [ @@ -45,18 +44,16 @@ export default class extends Command { } ]; - async run( - interaction: ChatInputCommandInteraction - ): Promise | void> { + async run(interaction: ChatInputCommandInteraction): Promise | void> { const questionSet = interaction.options.getNumber('qset') - 1; // bad input handling - if (questionSet !== 0 && questionSet !== 1) { - interaction.reply({ content: 'Please enter either 1 or 2' }); - return; - } + // if (questionSet !== 0 && questionSet !== 1) { + // interaction.reply({ content: 'Please enter either 1 or 2' }); + // return; + // } - // creates the modal that pops up once the command is run, giving it the correct title and set of questions + // Creates the modal that pops up once the command is run, giving it the correct title and set of questions. const modal = new ModalBuilder() .setCustomId(`jobModal${questionSet}`) .setTitle(`Job Form (${questionSet + 1} of 2)`); @@ -73,27 +70,21 @@ export default class extends Command { } await interaction.showModal(modal); - - // Answers are handled in src/pieces/commandManager.ts on line 149 - return; } getAnswer(fields: ModalSubmitFields, questionNum: number): string { return fields.getField(`question${questionNum + 1}`).value; } - + // Creates the interface where the user can anwer the questions. getAnswerField(question: string, questionNum: number): ActionRowBuilder { - return new ActionRowBuilder({ - components: [ - new TextInputBuilder() - .setCustomId(`question${questionNum + 1}`) - .setLabel(`${question}`) - .setStyle(TextInputStyle.Short) - .setPlaceholder('Input Answer Here') - .setRequired(true) - ] - }); + return new ActionRowBuilder({ components: [new TextInputBuilder() + .setCustomId(`question${questionNum + 1}`) + .setLabel(`${question}`) + .setStyle(TextInputStyle.Short) + .setPlaceholder('Input Answer Here') + .setRequired(true) + ] }); } // Handles validation for qset1 async handleModalSubmit(interaction: ChatInputCommandInteraction, answers: string[], qSet: number): Promise { diff --git a/src/commands/jobs/update_preferences.ts b/src/commands/jobs/update_preferences.ts index ad450a60..96dc93c3 100644 --- a/src/commands/jobs/update_preferences.ts +++ b/src/commands/jobs/update_preferences.ts @@ -5,7 +5,7 @@ import { ActionRowBuilder, ApplicationCommandOptionData, ApplicationCommandOptio ChatInputCommandInteraction, InteractionResponse, ModalBuilder, ModalSubmitFields, TextInputBuilder, TextInputStyle } from 'discord.js'; -// should be same questions as jobform.ts line 16 +// Questions users will be asked to input into the API const questions = [ ['What city do you want to be located?', 'Remote, hybrid, and/or in-person?', @@ -35,11 +35,6 @@ export default class extends Command { async run(interaction: ChatInputCommandInteraction): Promise | void> { const questionSet = interaction.options.getNumber('qset') - 1; - // bad input handling - if (questionSet !== 0 && questionSet !== 1) { - interaction.reply({ content: 'Please enter either 1 or 2' }); - return; - } // Checks if user has done the job form at least once const existingAnswers = await interaction.client.mongo.collection(DB.USERS).findOne({ discordId: interaction.user.id, @@ -93,7 +88,7 @@ export default class extends Command { return fields.getField(`question${questionNum + 1}`).value; } - + // Creates the interface where the user can view and answer the questions. getAnswerField(question: string, questionNum: number, value: string): ActionRowBuilder { return new ActionRowBuilder({ components: [new TextInputBuilder() .setCustomId(`question${questionNum + 1}`) diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index 91a5cdba..737a38be 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -1,28 +1,8 @@ import { Collection, Db } from 'mongodb'; import { DB } from '@root/config'; import { validatePreferences } from './validatePreferences'; -import { EmbedBuilder } from 'discord.js'; - -// class to store the info of the preferences the user previously put in to match to jobs in the database -interface JobPreferences { - userID: string; - answers: { - // Questions - city: string; - workType: string; - employmentType: string; - travelDistance: string; - // Interests - interest1: string; - interest2: string; - interest3: string; - interest4: string; - interest5: string; - }; - lastUpdated: Date; -} - +// Class to store the info of the preferences the user previously put in to match to jobs in the database. export class JobPreferenceAPI { private collection: Collection; @@ -31,14 +11,15 @@ export class JobPreferenceAPI { constructor(db: Db) { this.collection = db.collection(DB.USERS); } - + // Stores preferences into the database. Returns an error message if success is false. async storeFormResponses(userID: string, answers: string[], questionSet: number): Promise<{ success: boolean; message: string }> { - // If user id does not exist, then nothing will be stored + // If user id does not exist, then nothing will be stored. if (!userID?.trim()) { return { success: false, message: 'Invalid User ID' }; } try { const updateObject = {}; + // Checks if the answer provided is accuate. const { isValid, errors } = validatePreferences(answers, questionSet, true); if (!isValid) { console.error('Validation failed', errors); @@ -81,9 +62,9 @@ export class JobPreferenceAPI { return { success: false, message: 'Failed to store preferences' }; } } - // Gets the preferences anwers from the database. + // Gets the preferences anwers from the database. Returns an error message if success is false. async getPreference(userID: string): Promise<{ success: boolean; data?; message: string }> { - // If user id does not exist, then nothing will be stored + // If user id does not exist, then nothing will be stored. if (!userID?.trim()) { return { success: false, message: 'Invalid User ID' }; } @@ -99,9 +80,9 @@ export class JobPreferenceAPI { return { success: false, message: 'Failed to retrieve preferences' }; } } - // Deletes the preferences answers to an empty string. + // Deletes the preferences answers to an empty string. Returns an error message if success is false. async deletePreference(userID: string): Promise<{ success: boolean; message: string }> { - // If user id does not exist, then nothing will be stored + // If user id does not exist, then nothing will be stored. if (!userID?.trim()) { return { success: false, message: 'Invalid User ID' }; } diff --git a/src/lib/utils/jobUtils/validatePreferences.ts b/src/lib/utils/jobUtils/validatePreferences.ts index a6b19f6b..cf720470 100644 --- a/src/lib/utils/jobUtils/validatePreferences.ts +++ b/src/lib/utils/jobUtils/validatePreferences.ts @@ -2,21 +2,21 @@ interface ValidateResult { isValid: boolean; errors: string[]; } - +// Validates the answers inputted by the user based on the question and if it is part of jobForm or update_preferences. export const validatePreferences = (answers: string[], qset: number, isJobForm: boolean): ValidateResult => { const errors: string[] = []; - // For job form, enforce all fields + // For job form, enforce all fields. if (qset === 0) { const [city, workType, employmentType, travelDistance] = answers; - // Only validate non-empty fields when updating preferences + // Only validate non-empty fields when updating preferences. if (!isJobForm || city?.trim()) { if (city?.trim() === '') { errors.push('Enter valid city'); } } - + // Fields must be exact or an error will occur for work types. if (!isJobForm || workType?.trim()) { const validWorkTypes = [ 'remote', 'hybrid', 'in person', @@ -38,7 +38,7 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: errors.push('Enter valid work type'); } } - + // Fields must be exact or an error will occur for employment type. if (!isJobForm || employmentType?.trim()) { const validEmploymentTypes = [ 'full time', 'part time', 'internship', @@ -60,7 +60,7 @@ export const validatePreferences = (answers: string[], qset: number, isJobForm: errors.push('Enter valid employment type'); } } - + // Field must be an integer for travel distance or an error will occur. if (travelDistance?.trim() && isNaN(Number(travelDistance.replace(/[^0-9]/g, '')))) { errors.push('Travel distance must be a number'); } diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 496f1c9a..f0b5d4fe 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -150,13 +150,14 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie interaction.reply({ content: `Thank you for verifying! You can now access the rest of the server. ${enrollStr}`, ephemeral: true }); break; } - // jobform and update_preferences use the same logic to store responses + // jobform and update_preferences use the same logic to store responses. case 'jobModal': case 'updateModal': { try { - // extracting the input from the modal + // extracting the input from the modal. const formNumber = parseInt(customId.slice(-1)); const answers = [1, 2, 3, 4, 5].slice(0, formNumber === 0 ? 4 : 5).map(num => fields.getTextInputValue(`question${num}`)); + // Checks if the answer provided is accuate. const { isValid, errors } = validatePreferences(answers, formNumber, true); if (!isValid) { await interaction.reply({ @@ -166,19 +167,19 @@ async function handleModalBuilder(interaction: ModalSubmitInteraction, bot: Clie return; } - // Create API instance with the database instance directly + // Create API instance with the database instance directly. const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); const success = await jobPreferenceAPI.storeFormResponses(interaction.user.id, answers, formNumber); const isUpdate = customId.replace(/[0-9]/g, '') === 'updateModal'; const mess = isUpdate ? `Success: Your preferences have been updated! ${formNumber === 0 - ? 'Please use /updateform qset:2 to complete your interests.' : ''}` + ? 'Please use /update_preferences qset:2 to complete your interests.' : ''}` : `Success: Form ${formNumber + 1} submitted! ${formNumber === 0 ? 'Please use /jobform qset:2 to complete your interests.' : ''}`; // Takes user to questions, then interests. If submitted correctly, the answers will be stored. await interaction.reply({ content: success ? mess : 'Error saving preferences. Please try again', ephemeral: true }); - // Error for failed update + // Error for failed update. } catch (error) { console.error('update form error:', error); await interaction.reply({ content: 'An error occurred. Please try again.', ephemeral: true }); From cdf9f52dea0ce72c7f28f1f91487e2476692ff46 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 8 Dec 2024 22:22:37 -0500 Subject: [PATCH 228/267] added more comments --- src/commands/jobs/jobform.ts | 8 +------- src/commands/jobs/update_preferences.ts | 7 +++---- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 78dccf32..df1a367a 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -30,7 +30,7 @@ export default class extends Command { name = 'jobform'; description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; - // gives option to command to choose what question set user is answering + // Gives option to command to choose what question set user is answering. options: ApplicationCommandOptionData[] = [ { name: 'qset', @@ -47,12 +47,6 @@ export default class extends Command { async run(interaction: ChatInputCommandInteraction): Promise | void> { const questionSet = interaction.options.getNumber('qset') - 1; - // bad input handling - // if (questionSet !== 0 && questionSet !== 1) { - // interaction.reply({ content: 'Please enter either 1 or 2' }); - // return; - // } - // Creates the modal that pops up once the command is run, giving it the correct title and set of questions. const modal = new ModalBuilder() .setCustomId(`jobModal${questionSet}`) diff --git a/src/commands/jobs/update_preferences.ts b/src/commands/jobs/update_preferences.ts index 96dc93c3..ea791443 100644 --- a/src/commands/jobs/update_preferences.ts +++ b/src/commands/jobs/update_preferences.ts @@ -19,6 +19,7 @@ export default class extends Command { name = 'update_preferences' description = 'View and update your preferences for jobs to be used with the Job Alert System!'; + // Gives option to command to choose what question set user is answering. options: ApplicationCommandOptionData[] = [ { name: 'qset', @@ -51,7 +52,7 @@ export default class extends Command { } const currentAns = existingAnswers.jobPreferences?.answers; const askedQuestions = questions[questionSet]; - // if questions changed, making sure to update these titles to correctly describe question + // If questions changed, making sure to update these titles to correctly describe question. const quesChoices = questionSet === 0 ? ['city', 'workType', 'employmentType', 'travelDistance'] : ['interest1', 'interest2', 'interest3', 'interest4', 'interest5']; @@ -64,7 +65,7 @@ export default class extends Command { return this.getAnswerField(question, askedQuestions.indexOf(question), value); }); - // creates the modal that pops up when command is used, with title matching which questions set user is answering + // Creates the modal that pops up once the command is run, giving it the correct title and set of questions. const modal = new ModalBuilder() .setCustomId(`updateModal${questionSet}`) .setTitle(`Update Job Preferences (${questionSet + 1} of 2)`); @@ -78,8 +79,6 @@ export default class extends Command { await interaction.showModal(modal); - // Answers are handled in src/pieces/commandManager.ts on line 149 - return; } From a20674c4fced9f69c3103fc46c204b496628f14e Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 22:52:53 -0500 Subject: [PATCH 229/267] added code to filter the average salary if the user wants the jobs sorted by salary --- src/pieces/tasks.ts | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 48afe132..a43fc9b6 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -95,7 +95,7 @@ async function getJobFormData(userID:string, filterBy: string):Promise<[JobData, preference: jobformAnswers[0].answers[1], jobType: jobformAnswers[0].answers[2], distance: jobformAnswers[0].answers[3], - filterBy + filterBy: filterBy ?? 'default' }; const interests:Interest = { @@ -121,48 +121,60 @@ function titleCase(jobTitle:string): string { return jobTitle.toLowerCase().replace(/[()]/g, '').split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' '); } -function listJobs(jobData: JobResult[]): string { +function listJobs(jobData: JobResult[], filterBy: string): string { + // Conditionally sort jobs by salary if sortBy is 'salary' + if (filterBy === 'salary') { + jobData.sort((a, b) => { + const avgA = (Number(a.salaryMax) + Number(a.salaryMin)) / 2; + const avgB = (Number(b.salaryMax) + Number(b.salaryMin)) / 2; + + // Handle cases where salaryMax or salaryMin is "Not listed" + if (isNaN(avgA)) return 1; // Treat jobs with no salary info as lowest + if (isNaN(avgB)) return -1; + + return avgB - avgA; // Descending order + }); + } + let jobList = ''; for (let i = 0; i < jobData.length; i++) { const avgSalary = (Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2; const formattedAvgSalary = formatCurrency(avgSalary); - const formattedSalaryMax = formatCurrency(Number(jobData[i].salaryMax)); - const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)); + const formattedSalaryMax = formatCurrency(Number(jobData[i].salaryMax)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMax)) : ''; + const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMin)) : ''; - const salaryDetails = formattedAvgSalary !== formattedSalaryMax + const salaryDetails = (formattedSalaryMin && formattedSalaryMax) ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` - : ''; + : formattedAvgSalary; jobList += `${i + 1}. **${titleCase(jobData[i].title)}** - \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} - \t\t* **Location:** ${jobData[i].location} - \t\t* **Apply here:** [read more about the job and apply here](${jobData[i].link}) - ${i !== jobData.length - 1 ? '\n' : ''}`; + \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} + \t\t* **Location:** ${jobData[i].location} + \t\t* **Apply here:** [read more about the job and apply here](${jobData[i].link}) + ${i !== jobData.length - 1 ? '\n' : ''}`; } return jobList || '### Unfortunately, there were no jobs found based on your interests :(. Consider updating your interests or waiting until something is found.'; } - async function jobMessage(reminder: Reminder, userID: string): Promise { - const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, reminder.filterBy || 'default'); + const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, reminder.filterBy); const message = `## Hey <@${reminder.owner}>! - ## Here's your list of job/internship recommendations: + ## Here's your list of job/internship recommendations${reminder.filterBy ? ` (filtered based on ${reminder.filterBy}):` : ':'} Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ **${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get\ job/internship recommendations from the same company,\ their positions/details/applications/salary WILL be different and this is not a glitch/bug! Here's your personalized list: - ${listJobs(jobFormData[2])} + ${listJobs(jobFormData[2], reminder.filterBy)} --- ### **Disclaimer:** -# Please be aware that the job listings displayed are retrieved from a third-party API. \ While we strive to provide accurate information, we cannot guarantee the legitimacy or security\ of all postings. Exercise caution when sharing personal information, submitting resumes, or registering\ on external sites. Always verify the authenticity of job applications before proceeding. Additionally, \ - some job postings may contain inaccuracies due to API limitations, which are beyond our control. We apologize for any inconvenience this may cause and appreciate your understanding.\ - ${reminder.filterBy !== 'default' ? `Your job results were filtered by: ${reminder.filterBy}` : ''} + some job postings may contain inaccuracies due to API limitations, which are beyond our control. We apologize for any inconvenience this may cause and appreciate your understanding. `; return message; } From 58d73aa8233ced05c4ff3013f71798ee2f6cf2c3 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Sun, 8 Dec 2024 22:54:52 -0500 Subject: [PATCH 230/267] added conditional logic to handle case where user did not choose to have their job data sorted which in turn utilized a different version of the API response and thus stopping the Axios 400 error response --- src/lib/utils/jobUtils/Adzuna_job_search.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index 3b66c672..d72ebf0b 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -38,11 +38,14 @@ export default async function fetchJobListings(jobData: JobData, interests?: Int return jobCache[cacheKey] as JobResult[]; } - const URL = `https://api.adzuna.com/v1/api/jobs/us/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=15&what=${JOB_TYPE}&what_or=${whatInterests}&where= - ${LOCATION}&distance=${Math.round(DISTANCE_KM)}&sort_by=${jobData.filterBy}`; + // const URL = `https://api.adzuna.com/v1/api/jobs/us/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=15&what=${JOB_TYPE}&what_or=${whatInterests}&where= + // ${LOCATION}&distance=${Math.round(DISTANCE_KM)}&sort_by=${jobData.filterBy}`; + + const URL_BASE = `https://api.adzuna.com/v1/api/jobs/us/search/1?app_id=${APP_ID}&app_key=${APP_KEY}&results_per_page=15&what=${JOB_TYPE}&what_or=${whatInterests}&where=\ + ${LOCATION}&distance=${Math.round(DISTANCE_KM)}`; try { - const response = await axios.get(URL); + const response = await axios.get(jobData.filterBy && jobData.filterBy !== 'default' ? `${URL_BASE}&sort_by=${jobData.filterBy}` : URL_BASE); const jobResults: JobResult[] = response.data.results.map((job: AdzunaJobResponse) => ({ company: job.company?.display_name || 'Not Provided', title: job.title, @@ -56,7 +59,7 @@ export default async function fetchJobListings(jobData: JobData, interests?: Int jobCache[cacheKey] = jobResults; - return jobResults; + return jobResults.sort(); } catch (error) { console.error('API error:', error); throw error; From 2d3edf45f3633968548b023bc84f5a76e56b8f37 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 9 Dec 2024 00:23:48 -0500 Subject: [PATCH 231/267] removed unused Job interface import --- src/pieces/commandManager.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 496f1c9a..6bf17799 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -13,7 +13,6 @@ import { SageUser } from '../lib/types/SageUser'; import { CommandError } from '../lib/types/errors'; import { verify } from '../pieces/verification'; import { JobPreferenceAPI } from '../lib/utils/jobUtils/jobDatabase'; -import { Job } from '../lib/types/Job'; import { validatePreferences } from '../lib/utils/jobUtils/validatePreferences'; const DELETE_DELAY = 10000; From a1a0949c365e3598ea87e420c2d9c2295e613ebf Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 9 Dec 2024 00:48:06 -0500 Subject: [PATCH 232/267] modified stripMarkdown function regex and replace logic and rearranged logic for displaying the filtered message: --- src/pieces/tasks.ts | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index a43fc9b6..f93d3649 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -160,7 +160,7 @@ function listJobs(jobData: JobResult[], filterBy: string): string { async function jobMessage(reminder: Reminder, userID: string): Promise { const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, reminder.filterBy); const message = `## Hey <@${reminder.owner}>! - ## Here's your list of job/internship recommendations${reminder.filterBy ? ` (filtered based on ${reminder.filterBy}):` : ':'} + ## Here's your list of job/internship recommendations: Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ **${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get\ job/internship recommendations from the same company,\ @@ -179,14 +179,20 @@ async function jobMessage(reminder: Reminder, userID: string): Promise { return message; } -function stripMarkdown(message:string, owner:string): string { - return message.replace(`## Hey <@${owner}>! - ## Here's your list of job/internship recommendations:`, '').replace(/\[read more about the job and apply here\]/g, '').replace(/\((https?:\/\/[^\s)]+)\)/g, '$1') +function stripMarkdown(message: string, owner: string): string { + return message + .replace(new RegExp(`## Hey <@${owner}>!\\s*## Here's your list of job/internship recommendations:?`, 'g'), '') // Remove specific header + .replace(/\[read more about the job and apply here\]/g, '') + .replace(/\((https?:\/\/[^\s)]+)\)/g, '$1') + .replace(/\*\*([^*]+)\*\*/g, '$1') + .replace(/##+\s*/g, '') // eslint-disable-next-line no-useless-escape - .replace(/\*\*([^*]*(?:\*[^*]+)*)\*\*/g, '$1').replace(/(###|-\#)\s*/g, ''); + .replace(/###|-\#\s*/g, '') + .trim(); } -function headerMessage(owner:string):string { + +function headerMessage(owner:string, filterBy:string):string { return `## Hey <@${owner}>! ### **__Please read this disclaimer before reading your list of jobs/internships__:** -# Please be aware that the job listings displayed are retrieved from a third-party API. \ @@ -194,7 +200,7 @@ While we strive to provide accurate information, we cannot guarantee the legitim of all postings. Exercise caution when sharing personal information, submitting resumes, or registering \ on external sites. Always verify the authenticity of job applications before proceeding. Additionally, \ some job postings may contain inaccuracies due to API limitations, which are beyond our control. We apologize for any inconvenience this may cause and appreciate your understanding. -## Here's your list of job/internship recommendations: +## Here's your list of job/internship recommendations${filterBy ? ` (filtered based on ${filterBy}):` : ':'} `; } @@ -219,7 +225,7 @@ async function checkReminders(bot: Client): Promise { } else { const attachments: AttachmentBuilder[] = []; attachments.push(await sendToFile(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - user.send({ content: headerMessage(reminder.owner), files: attachments as AttachmentBuilder[] }); + user.send({ content: headerMessage(reminder.owner, reminder.filterBy), files: attachments as AttachmentBuilder[] }); } }).catch((error) => { console.error(`Failed to fetch user with ID: ${reminder.owner}`, error); From 3b84b724d4c79eb28a3ee8851174509f309eaae4 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 9 Dec 2024 00:51:31 -0500 Subject: [PATCH 233/267] modified conditional logic so that if filterBy is set to 'default' it won't show that it's been filtered by 'default' --- src/pieces/tasks.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index f93d3649..c4e455e2 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -84,7 +84,6 @@ async function checkPolls(bot: Client): Promise { }); } - // eslint-disable-next-line no-warning-comments async function getJobFormData(userID:string, filterBy: string):Promise<[JobData, Interest, JobResult[]]> { const client = await MongoClient.connect(DB.CONNECTION, { useUnifiedTopology: true }); @@ -191,7 +190,6 @@ function stripMarkdown(message: string, owner: string): string { .trim(); } - function headerMessage(owner:string, filterBy:string):string { return `## Hey <@${owner}>! ### **__Please read this disclaimer before reading your list of jobs/internships__:** @@ -200,7 +198,7 @@ While we strive to provide accurate information, we cannot guarantee the legitim of all postings. Exercise caution when sharing personal information, submitting resumes, or registering \ on external sites. Always verify the authenticity of job applications before proceeding. Additionally, \ some job postings may contain inaccuracies due to API limitations, which are beyond our control. We apologize for any inconvenience this may cause and appreciate your understanding. -## Here's your list of job/internship recommendations${filterBy ? ` (filtered based on ${filterBy}):` : ':'} +## Here's your list of job/internship recommendations${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy}):` : ':'} `; } @@ -228,6 +226,7 @@ async function checkReminders(bot: Client): Promise { user.send({ content: headerMessage(reminder.owner, reminder.filterBy), files: attachments as AttachmentBuilder[] }); } }).catch((error) => { + console.log('ERROR CALLED ----------------------------------------------------'); console.error(`Failed to fetch user with ID: ${reminder.owner}`, error); }); } From f6c0f452818e8ab75f0b236acd89cb972581a33d Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 9 Dec 2024 00:57:35 -0500 Subject: [PATCH 234/267] added logic to display 'date posted' instead of 'date' when listing what the job data was filtered by for more clarity --- src/pieces/tasks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index c4e455e2..cb4a1d4d 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -198,7 +198,7 @@ While we strive to provide accurate information, we cannot guarantee the legitim of all postings. Exercise caution when sharing personal information, submitting resumes, or registering \ on external sites. Always verify the authenticity of job applications before proceeding. Additionally, \ some job postings may contain inaccuracies due to API limitations, which are beyond our control. We apologize for any inconvenience this may cause and appreciate your understanding. -## Here's your list of job/internship recommendations${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy}):` : ':'} +## Here's your list of job/internship recommendations${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} `; } From 0bee6b00b0d82e4f528ad92930776777d8a56b82 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Fri, 13 Dec 2024 15:24:06 -0500 Subject: [PATCH 235/267] added a question mark to a question --- src/commands/jobs/jobform.ts | 7 ++++++- src/commands/jobs/update_preferences.ts | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index df1a367a..1520f4f2 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -19,7 +19,7 @@ const questions = [ 'What city do you want to be located?', 'Remote, hybrid, and/or in-person?', 'Full time, Part time, and/or Internship?', - 'How far are you willing to travel? (in miles)' + 'How far are you willing to travel? (in miles)?' ], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; @@ -47,6 +47,11 @@ export default class extends Command { async run(interaction: ChatInputCommandInteraction): Promise | void> { const questionSet = interaction.options.getNumber('qset') - 1; + if (questionSet !== 0 && questionSet !== 1) { + await interaction.reply({ content: 'Please enter either 1 or 2' }); + return; + } + // Creates the modal that pops up once the command is run, giving it the correct title and set of questions. const modal = new ModalBuilder() .setCustomId(`jobModal${questionSet}`) diff --git a/src/commands/jobs/update_preferences.ts b/src/commands/jobs/update_preferences.ts index ea791443..9390a247 100644 --- a/src/commands/jobs/update_preferences.ts +++ b/src/commands/jobs/update_preferences.ts @@ -10,7 +10,7 @@ const questions = [ ['What city do you want to be located?', 'Remote, hybrid, and/or in-person?', 'Full time, Part time, and/or Internship?', - 'How far are you willing to travel? (in miles)'], + 'How far are you willing to travel? (in miles)?'], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; @@ -36,6 +36,11 @@ export default class extends Command { async run(interaction: ChatInputCommandInteraction): Promise | void> { const questionSet = interaction.options.getNumber('qset') - 1; + if (questionSet !== 0 && questionSet !== 1) { + await interaction.reply({ content: 'Please enter either 1 or 2' }); + return; + } + // Checks if user has done the job form at least once const existingAnswers = await interaction.client.mongo.collection(DB.USERS).findOne({ discordId: interaction.user.id, From 1210fc482280c6400cd95d692579928097747baa Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Sun, 15 Dec 2024 21:24:48 -0500 Subject: [PATCH 236/267] pushing --- src/commands/jobs/jobform.ts | 2 +- src/commands/jobs/update_preferences.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 1520f4f2..aab47985 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -19,7 +19,7 @@ const questions = [ 'What city do you want to be located?', 'Remote, hybrid, and/or in-person?', 'Full time, Part time, and/or Internship?', - 'How far are you willing to travel? (in miles)?' + 'How far are you willing to travel? (in miles)' ], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; diff --git a/src/commands/jobs/update_preferences.ts b/src/commands/jobs/update_preferences.ts index 9390a247..41dde16a 100644 --- a/src/commands/jobs/update_preferences.ts +++ b/src/commands/jobs/update_preferences.ts @@ -10,7 +10,7 @@ const questions = [ ['What city do you want to be located?', 'Remote, hybrid, and/or in-person?', 'Full time, Part time, and/or Internship?', - 'How far are you willing to travel? (in miles)?'], + 'How far are you willing to travel? (in miles)'], ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] ]; From 7edd2e78b2b972a6c0ffa9d5f21c3b761f099381 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 16 Dec 2024 15:29:51 -0500 Subject: [PATCH 237/267] removed checkJobReminder method and moved it to generalUtils file --- src/commands/reminders/remind.ts | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 8efb7ff8..c5715a39 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -7,7 +7,7 @@ import { } from 'discord.js'; import { Reminder } from '@lib/types/Reminder'; import parse from 'parse-duration'; -import { reminderTime } from '@root/src/lib/utils/generalUtils'; +import { checkJobReminder, reminderTime } from '@root/src/lib/utils/generalUtils'; import { Command } from '@lib/types/Command'; export default class extends Command { @@ -74,20 +74,7 @@ export default class extends Command { ] } ]; - - async checkJobReminder( - interaction: ChatInputCommandInteraction - ): Promise { - const reminders: Array = await interaction.client.mongo - .collection(DB.REMINDERS) - .find({ owner: interaction.user.id }) - .toArray(); - - return reminders.some( - (reminder: Reminder) => reminder.content === 'Job Reminder' - ); - } - + async run( interaction: ChatInputCommandInteraction ): Promise | void> { @@ -109,7 +96,7 @@ export default class extends Command { filterBy }; // handling duplicate job reminders - if (await this.checkJobReminder(interaction)) { + if (await checkJobReminder(interaction)) { return interaction.reply({ content: 'You currently already have a job reminder set. To clear your existing job reminder, run `/cancelreminder` and provide the reminder number.', @@ -158,5 +145,8 @@ export default class extends Command { }); } } + checkJobReminder(interaction: ChatInputCommandInteraction) { + throw new Error('Method not implemented.'); + } } From 68ce98d6fe7747a20190bcf1a020bcdf7994409e Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 16 Dec 2024 15:30:36 -0500 Subject: [PATCH 238/267] added and exported checkJobReminder --- src/lib/utils/generalUtils.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/lib/utils/generalUtils.ts b/src/lib/utils/generalUtils.ts index 6daa9cb6..ba887ff4 100644 --- a/src/lib/utils/generalUtils.ts +++ b/src/lib/utils/generalUtils.ts @@ -7,7 +7,8 @@ import { TextChannel, ActionRowBuilder, ApplicationCommandPermissions, - StringSelectMenuBuilder + StringSelectMenuBuilder, + ChatInputCommandInteraction } from 'discord.js'; import { Command, CompCommand } from '@lib/types/Command'; import * as fs from 'fs'; @@ -284,3 +285,16 @@ export function calcNeededExp(levelExp: number, direction: string): number { } return Math.ceil(levelExp / xpRatio); // calculate exp for previous level } + +export async function checkJobReminder( + interaction: ChatInputCommandInteraction +): Promise { + const reminders: Array = await interaction.client.mongo + .collection(DB.REMINDERS) + .find({ owner: interaction.user.id }) + .toArray(); + + return reminders.some( + (reminder: Reminder) => reminder.content === 'Job Reminder' + ); +} \ No newline at end of file From a18f9800db90fe5c1f1304fce36ce713904bbfe7 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 16 Dec 2024 19:54:02 -0500 Subject: [PATCH 239/267] implemented logic for updating the user's job filtering preference --- src/commands/jobs/update_filtering.ts | 65 +++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/commands/jobs/update_filtering.ts diff --git a/src/commands/jobs/update_filtering.ts b/src/commands/jobs/update_filtering.ts new file mode 100644 index 00000000..ee4db2fb --- /dev/null +++ b/src/commands/jobs/update_filtering.ts @@ -0,0 +1,65 @@ +import { BOT, DB } from '@root/config'; +import { + ApplicationCommandOptionData, + ApplicationCommandOptionType, + ChatInputCommandInteraction, + InteractionResponse +} from 'discord.js'; +import { Command } from '@lib/types/Command'; +import { checkJobReminder } from '@root/src/lib/utils/generalUtils'; + +export default class extends Command { + + description = `Have ${BOT.NAME} update what you'd like your job/internship results to be filtered by.`; + options: ApplicationCommandOptionData[] = [ + { + name: '-', + description: 'Update job/internship filter', + type: ApplicationCommandOptionType.Subcommand, + options: [ + { + name: 'filter-type', + description: 'Select an option', + choices: [ + { name: 'Relevance', value: 'relevance' }, + { name: 'Salary', value: 'salary' }, + { name: 'Date Posted', value: 'date' }, + { name: 'Default', value: 'default' } + ], + type: ApplicationCommandOptionType.String, + required: true + } + ] + } + ]; + + async updateFilter(interaction: ChatInputCommandInteraction, filter:string) { + try { + await interaction.client.mongo.collection(DB.REMINDERS).update( + { owner: interaction.user.id }, + { $set: { filterBy: filter } } + ); + } catch (error) { + console.error('Failed to update filter:', error); + interaction.reply("There was an error updating your filter preference"); + } + } + + async run( + interaction: ChatInputCommandInteraction + ): Promise | void> { + + // check if the user has a job reminder + if (!(await checkJobReminder(interaction))) { + await interaction.reply('Please make sure you have set a job reminder set. To do so, run `/remind jobs`'); + } + else { + const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date' | 'default' | null; + await this.updateFilter(interaction, filterBy); + await interaction.reply(`Your job/internship filter has been updated to "${filterBy}" successfully!`); + } + + await interaction.reply('Filter updated successfully!'); + } + +} From d4490e753e7a235e22a6037815816dffe8986c29 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 16 Dec 2024 20:34:48 -0500 Subject: [PATCH 240/267] updated ESLint issues --- src/commands/reminders/remind.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index c5715a39..3ec3c308 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -74,7 +74,7 @@ export default class extends Command { ] } ]; - + async run( interaction: ChatInputCommandInteraction ): Promise | void> { @@ -145,8 +145,5 @@ export default class extends Command { }); } } - checkJobReminder(interaction: ChatInputCommandInteraction) { - throw new Error('Method not implemented.'); - } } From fc1f9ef0216c69e9df7597b7bf6414e6fd7406d3 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 16 Dec 2024 20:35:06 -0500 Subject: [PATCH 241/267] updated ESLint issues --- src/commands/jobs/update_filtering.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/commands/jobs/update_filtering.ts b/src/commands/jobs/update_filtering.ts index ee4db2fb..dff78d86 100644 --- a/src/commands/jobs/update_filtering.ts +++ b/src/commands/jobs/update_filtering.ts @@ -33,7 +33,7 @@ export default class extends Command { } ]; - async updateFilter(interaction: ChatInputCommandInteraction, filter:string) { + async updateFilter(interaction: ChatInputCommandInteraction, filter:string):Promise { try { await interaction.client.mongo.collection(DB.REMINDERS).update( { owner: interaction.user.id }, @@ -41,20 +41,18 @@ export default class extends Command { ); } catch (error) { console.error('Failed to update filter:', error); - interaction.reply("There was an error updating your filter preference"); - } + interaction.reply('There was an error updating your filter preference'); + } } async run( interaction: ChatInputCommandInteraction ): Promise | void> { - // check if the user has a job reminder if (!(await checkJobReminder(interaction))) { await interaction.reply('Please make sure you have set a job reminder set. To do so, run `/remind jobs`'); - } - else { - const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date' | 'default' | null; + } else { + const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date' | 'default' | null; await this.updateFilter(interaction, filterBy); await interaction.reply(`Your job/internship filter has been updated to "${filterBy}" successfully!`); } From 265e1943bb6fee0ca5f54f22a6ca66e31621a7ca Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 16 Dec 2024 20:39:42 -0500 Subject: [PATCH 242/267] resolved ESLint issue --- src/lib/utils/generalUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/utils/generalUtils.ts b/src/lib/utils/generalUtils.ts index ba887ff4..f0ed3b85 100644 --- a/src/lib/utils/generalUtils.ts +++ b/src/lib/utils/generalUtils.ts @@ -297,4 +297,4 @@ export async function checkJobReminder( return reminders.some( (reminder: Reminder) => reminder.content === 'Job Reminder' ); -} \ No newline at end of file +} From 8128d7ae6aa0d6ed12ebd6b806b1a572eb2e1399 Mon Sep 17 00:00:00 2001 From: Hairum Qureshi Date: Mon, 16 Dec 2024 20:39:56 -0500 Subject: [PATCH 243/267] resolved ESLint issue --- src/commands/jobs/update_filtering.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/jobs/update_filtering.ts b/src/commands/jobs/update_filtering.ts index dff78d86..dde9ba7e 100644 --- a/src/commands/jobs/update_filtering.ts +++ b/src/commands/jobs/update_filtering.ts @@ -49,7 +49,7 @@ export default class extends Command { interaction: ChatInputCommandInteraction ): Promise | void> { // check if the user has a job reminder - if (!(await checkJobReminder(interaction))) { + if (!await checkJobReminder(interaction)) { await interaction.reply('Please make sure you have set a job reminder set. To do so, run `/remind jobs`'); } else { const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date' | 'default' | null; From e4d96510e754334a722f6597a77557faa43c8c4d Mon Sep 17 00:00:00 2001 From: John Aromando Date: Sun, 16 Feb 2025 15:15:15 -0500 Subject: [PATCH 244/267] Update package.json Configure project to use node-pre-gyp --- package.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 9d2a2144..950af9a9 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "main": "dist/src/sage.js", "scripts": { "start": "node dist/src/sage.js", + "install": "node-pre-gyp install --fallback-to-build", "build": "tsc -p .", "clean": "rm -rf dist", "test": "eslint src --ext .ts", @@ -18,6 +19,11 @@ "nudge": "node dist/onboard/nudge.js", "autodoc": "node dist/autodoc/writecommands.js && autodoc/movemd.sh" }, + "binary": { + "module_name": "your_module", + "module_path": "./lib/binding/", + "host": "https://your_module.s3-us-west-1.amazonaws.com" + }, "repository": { "type": "git", "url": "git+https://github.com/ud-cis-discord/SageV2.git" @@ -34,9 +40,10 @@ "canvas": "^2.11.2", "console-stamp": "^3.0.2", "discord.js": "^14.16.3", + "@discordjs/node-pre-gyp": "0.4.5", "module-alias": "^2.2.2", "moment": "^2.29.1", - "mongodb": "^3.7.4", + "mongodb": "^3.6.3", "node-cron": "^2.0.3", "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", From fc27a09d8b1733031d4a0541aaeb9985b24cf77f Mon Sep 17 00:00:00 2001 From: John Aromando Date: Mon, 17 Feb 2025 13:05:13 -0500 Subject: [PATCH 245/267] Update node.js.yml --- .github/workflows/node.js.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 3023484d..289e6543 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -23,6 +23,9 @@ jobs: run: | sudo apt-get update sudo apt-get install -y libcairo2-dev libjpeg-dev libpango1.0-dev libgif-dev build-essential g++ + + - name: Install node-gyp + run: npm install -g node-gyp - run: npm cache clean --force - run: npm ci From b736de637d9da1deb03aac5fa0a4eaffed9e21f7 Mon Sep 17 00:00:00 2001 From: John Aromando Date: Mon, 17 Feb 2025 13:20:18 -0500 Subject: [PATCH 246/267] Create install-deps-windows.ps1 --- install-deps-windows.ps1 | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 install-deps-windows.ps1 diff --git a/install-deps-windows.ps1 b/install-deps-windows.ps1 new file mode 100644 index 00000000..5697662e --- /dev/null +++ b/install-deps-windows.ps1 @@ -0,0 +1,5 @@ +Write-Host "Installing system dependencies for Windows..." +winget install -e --id GnuWin32.Make +winget install -e --id Git.Git +winget install -e --id StrawberryPerl.StrawberryPerl +winget install -e --id Python.Python.3.10 From 8d57321d99d92fb95ca394f435f252047a7302fc Mon Sep 17 00:00:00 2001 From: John Aromando Date: Mon, 17 Feb 2025 13:21:08 -0500 Subject: [PATCH 247/267] Create install-deps-mac.sh --- install-deps-mac.sh | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 install-deps-mac.sh diff --git a/install-deps-mac.sh b/install-deps-mac.sh new file mode 100644 index 00000000..77515e31 --- /dev/null +++ b/install-deps-mac.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -e +echo "Installing system dependencies for macOS..." +brew install pkg-config cairo pango jpeg giflib From 1812dc0a0933af766717a1dfe883fddf36c3c7e8 Mon Sep 17 00:00:00 2001 From: John Aromando Date: Mon, 17 Feb 2025 13:21:34 -0500 Subject: [PATCH 248/267] Create install-deps.js --- install-deps.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 install-deps.js diff --git a/install-deps.js b/install-deps.js new file mode 100644 index 00000000..844ea3f4 --- /dev/null +++ b/install-deps.js @@ -0,0 +1,21 @@ +const { execSync } = require("child_process"); +const os = process.platform; + +try { + if (os === "linux") { + console.log("🟢 Installing Linux dependencies..."); + execSync("bash ./install-deps-linux.sh", { stdio: "inherit" }); + } else if (os === "darwin") { + console.log("🍎 Installing macOS dependencies..."); + execSync("bash ./install-deps-mac.sh", { stdio: "inherit" }); + } else if (os === "win32") { + console.log("🟣 Installing Windows dependencies..."); + execSync("powershell -ExecutionPolicy Bypass -File install-deps-windows.ps1", { stdio: "inherit" }); + } else { + console.error("❌ Unsupported OS:", os); + process.exit(1); + } +} catch (error) { + console.error("⚠️ Dependency installation failed:", error); + process.exit(1); +} From b036f329a9e764f9694d1e3f8a58d04d1623954b Mon Sep 17 00:00:00 2001 From: John Aromando Date: Mon, 17 Feb 2025 13:22:18 -0500 Subject: [PATCH 249/267] Update package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 950af9a9..682552ce 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "description": "A purpose build Discord bot to manage the UD CIS Discord server.", "main": "dist/src/sage.js", "scripts": { + "preinstall": "node install-deps.js", "start": "node dist/src/sage.js", "install": "node-pre-gyp install --fallback-to-build", "build": "tsc -p .", From 6bfa34561aa25d33e5278a8bf449548c6cc0cd9e Mon Sep 17 00:00:00 2001 From: John Aromando Date: Mon, 17 Feb 2025 13:22:59 -0500 Subject: [PATCH 250/267] Create install-deps-linux.sh --- install-deps-linux.sh | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 install-deps-linux.sh diff --git a/install-deps-linux.sh b/install-deps-linux.sh new file mode 100644 index 00000000..8b8a88ae --- /dev/null +++ b/install-deps-linux.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -e +echo "Installing system dependencies for Linux..." +sudo apt-get update +sudo apt-get install -y libcairo2-dev libjpeg-dev libpango1.0-dev libgif-dev \ + build-essential g++ pkg-config python3 python3-pip From b4d789824b764aca7a1130a7db3c60386646eaa4 Mon Sep 17 00:00:00 2001 From: John Aromando Date: Mon, 17 Feb 2025 13:52:47 -0500 Subject: [PATCH 251/267] Update install-deps-windows.ps1 --- install-deps-windows.ps1 | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/install-deps-windows.ps1 b/install-deps-windows.ps1 index 5697662e..569f64ce 100644 --- a/install-deps-windows.ps1 +++ b/install-deps-windows.ps1 @@ -1,5 +1,32 @@ -Write-Host "Installing system dependencies for Windows..." -winget install -e --id GnuWin32.Make -winget install -e --id Git.Git -winget install -e --id StrawberryPerl.StrawberryPerl -winget install -e --id Python.Python.3.10 +Write-Host "🟣 Installing dependencies for Windows..." + +# Ensure Chocolatey is installed +if (-Not (Test-Path "$env:ProgramData\chocolatey")) { + Write-Host "📦 Installing Chocolatey..." + Set-ExecutionPolicy Bypass -Scope Process -Force + [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 + Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) +} + +# Refresh environment variables +$env:Path += ";C:\ProgramData\chocolatey\bin" + +# Install build tools via Chocolatey +choco install -y python3 make mingw git cmake + +# Install vcpkg for managing dependencies +if (-Not (Test-Path "C:\vcpkg")) { + Write-Host "📦 Cloning vcpkg..." + git clone https://github.com/microsoft/vcpkg.git C:\vcpkg + cd C:\vcpkg + .\bootstrap-vcpkg.bat +} + +# Add vcpkg to PATH +$env:Path += ";C:\vcpkg" + +# Install necessary libraries using vcpkg +Write-Host "📦 Installing Cairo, Pango, JPEG, and GIF dependencies..." +C:\vcpkg\vcpkg install cairo:x64-windows pango:x64-windows libjpeg-turbo:x64-windows giflib:x64-windows + +Write-Host "✅ All dependencies installed successfully!" From fdc0aa015b0e22b51a68c1e3bcacfaccde8846ea Mon Sep 17 00:00:00 2001 From: JAromando Date: Wed, 19 Feb 2025 11:42:46 -0500 Subject: [PATCH 252/267] fix for node-gyp error during npm install. New preinstall step in package which calls install-deps.js to determine OS then leverages proper OS script (install-deps-linux, install-deps-mac, install-deps-windows) to install dependencies for node-gyp --- install-deps-windows.ps1 | 83 ++++++++++++++++++++++++++++++---------- install-deps.js | 80 +++++++++++++++++++++++++++++--------- package.json | 2 +- 3 files changed, 126 insertions(+), 39 deletions(-) diff --git a/install-deps-windows.ps1 b/install-deps-windows.ps1 index 569f64ce..7890943f 100644 --- a/install-deps-windows.ps1 +++ b/install-deps-windows.ps1 @@ -1,32 +1,75 @@ -Write-Host "🟣 Installing dependencies for Windows..." +#Runs as administrator +$adminCheck = [Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent() +if (-not $adminCheck.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { + Write-Host "This script requires administrative privileges. Restarting..." + Start-Process powershell -ArgumentList "-NoExit -NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs -Wait +} + +Write-Host "Installing Windows dependencies for node-canvas and node-gyp..." -# Ensure Chocolatey is installed -if (-Not (Test-Path "$env:ProgramData\chocolatey")) { - Write-Host "📦 Installing Chocolatey..." +#Check if Chocolatey is installed, install if not +if (!(Test-Path "$env:ProgramData\chocolatey\bin\choco.exe")) { + Write-Host "Installing Chocolatey..." Set-ExecutionPolicy Bypass -Scope Process -Force [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) + RefreshEnv +} + +#Check for pending reboot BEFORE installation +$pendingReboot = Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired" +if ($pendingReboot) { + Write-Host "Pending system reboot detected. Please restart your computer and rerun this script." } -# Refresh environment variables -$env:Path += ";C:\ProgramData\chocolatey\bin" +#Enable Chocolatey to ignore pending reboots (if needed) +Write-Host "Configuring Chocolatey to ignore pending reboots..." +choco feature enable --name="exitOnRebootDetected" + +#Force reinstall Visual Studio Build Tools with necessary components +Write-Host "Installing Visual Studio 2022 tools..." +choco install python visualstudio2022-workload-vctools -y + +#Set GYP_MSVS_VERSION for node-gyp +Write-Host "Setting GYP_MSVS_VERSION for node-gyp..." +[System.Environment]::SetEnvironmentVariable("GYP_MSVS_VERSION", "2022", "Machine") -# Install build tools via Chocolatey -choco install -y python3 make mingw git cmake +#Install MSYS2 +Write-Host "Installing MSYS2..." +choco install -y msys2 -# Install vcpkg for managing dependencies -if (-Not (Test-Path "C:\vcpkg")) { - Write-Host "📦 Cloning vcpkg..." - git clone https://github.com/microsoft/vcpkg.git C:\vcpkg - cd C:\vcpkg - .\bootstrap-vcpkg.bat +#Force refresh pacman package database +Write-Host "Updating MSYS2 package database..." +& "$msys2Path" -lc "pacman -Sy --noconfirm" + +#Install required libraries using pacman +Write-Host "Installing required libraries for node-canvas..." +& "$msys2Path" -lc "pacman -S --needed --noconfirm mingw-w64-x86_64-cairo mingw-w64-x86_64-pango mingw-w64-x86_64-libjpeg-turbo mingw-w64-x86_64-giflib" + +#Define the path for binding.gyp +$bindingGypPath = "$PSScriptRoot\binding.gyp" + +#Ensure binding.gyp is created without BOM +if (!(Test-Path $bindingGypPath)) { + Write-Host "Creating missing binding.gyp..." + + $bindingContent = @" +{ + "targets": [ + { + "target_name": "sage", + "sources": ["src/sage.ts"] + } + ] } +"@ -# Add vcpkg to PATH -$env:Path += ";C:\vcpkg" + # Write file in UTF-8 without BOM + [System.Text.Encoding]::UTF8.GetBytes($bindingContent) | Set-Content -Path $bindingGypPath -Encoding Byte +} -# Install necessary libraries using vcpkg -Write-Host "📦 Installing Cairo, Pango, JPEG, and GIF dependencies..." -C:\vcpkg\vcpkg install cairo:x64-windows pango:x64-windows libjpeg-turbo:x64-windows giflib:x64-windows +#Verify Installation +Write-Host "Verifying installed packages..." +& "$msys2Path" -lc "pacman -Q mingw-w64-x86_64-cairo mingw-w64-x86_64-pango mingw-w64-x86_64-libjpeg-turbo mingw-w64-x86_64-giflib" -Write-Host "✅ All dependencies installed successfully!" +Write-Host "All dependencies installed successfully!" \ No newline at end of file diff --git a/install-deps.js b/install-deps.js index 844ea3f4..f56762ee 100644 --- a/install-deps.js +++ b/install-deps.js @@ -1,21 +1,65 @@ -const { execSync } = require("child_process"); -const os = process.platform; - -try { - if (os === "linux") { - console.log("🟢 Installing Linux dependencies..."); - execSync("bash ./install-deps-linux.sh", { stdio: "inherit" }); - } else if (os === "darwin") { - console.log("🍎 Installing macOS dependencies..."); - execSync("bash ./install-deps-mac.sh", { stdio: "inherit" }); - } else if (os === "win32") { - console.log("🟣 Installing Windows dependencies..."); - execSync("powershell -ExecutionPolicy Bypass -File install-deps-windows.ps1", { stdio: "inherit" }); - } else { - console.error("❌ Unsupported OS:", os); +const { spawnSync } = require("child_process"); +const path = require("path"); + +const isWindows = process.platform === "win32"; + +//Function to check if running as Administrator +function isAdmin() { + if (!isWindows) return true; + const result = spawnSync("powershell.exe", [ + "-NoProfile", "-ExecutionPolicy", "Bypass", + "-Command", "([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)" + ], { encoding: "utf8" }); + + return result.stdout.trim() === "True"; +} + +if (isWindows) { + console.log("🟣 Installing Windows dependencies..."); + + if (!isAdmin()) { + console.log("🔴 Not running as admin. Restarting as administrator..."); + + //Relaunch as admin to keep window open + const scriptPath = path.join(__dirname, "install-deps-windows.ps1"); + const result = spawnSync("powershell.exe", [ + "-NoProfile", "-ExecutionPolicy", "Bypass", + "-Command", `Start-Process powershell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File \\"${scriptPath}\\"' -Verb RunAs -Wait` + ], { stdio: "inherit", shell: true }); + + if (result.error) { + console.error("⚠️ Failed to elevate PowerShell:", result.error); + process.exit(1); + } + + console.log("✅ Dependency installation completed!"); + process.exit(result.status); + } + + //Run PowerShell script synchronously (when already elevated) + const scriptPath = path.join(__dirname, "install-deps-windows.ps1"); + const result = spawnSync("powershell.exe", [ + "-NoProfile", "-ExecutionPolicy", "Bypass", + "-File", scriptPath + ], { stdio: "inherit", shell: true }); + + if (result.status !== 0) { + console.error("⚠️ PowerShell script failed with exit code:", result.status); process.exit(1); } -} catch (error) { - console.error("⚠️ Dependency installation failed:", error); + + console.log("✅ Windows dependency installation complete."); + +} else if (os === "linux") { + console.log("🟢 Installing Linux dependencies..."); + spawnSync("bash", ["./install-deps-linux.sh"], { stdio: "inherit" }); + +} else if (os === "darwin") { + console.log("🍎 Installing macOS dependencies..."); + spawnSync("bash", ["./install-deps-mac.sh"], { stdio: "inherit" }); + +} else { + console.log("❌ Unsupported OS detected."); process.exit(1); -} + +} \ No newline at end of file diff --git a/package.json b/package.json index 682552ce..270b55ac 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "scripts": { "preinstall": "node install-deps.js", "start": "node dist/src/sage.js", - "install": "node-pre-gyp install --fallback-to-build", + "install": "node-pre-gyp install --fallback-to-build --build-from-source", "build": "tsc -p .", "clean": "rm -rf dist", "test": "eslint src --ext .ts", From 14610c730a48a3917a167dcb2d06575e307edf4c Mon Sep 17 00:00:00 2001 From: JAromando Date: Wed, 19 Feb 2025 12:54:54 -0500 Subject: [PATCH 253/267] added binding.sh generation for mac --- install-deps-mac.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/install-deps-mac.sh b/install-deps-mac.sh index 77515e31..c30b569b 100644 --- a/install-deps-mac.sh +++ b/install-deps-mac.sh @@ -2,3 +2,23 @@ set -e echo "Installing system dependencies for macOS..." brew install pkg-config cairo pango jpeg giflib + +echo "Checking for binding.gyp..." +BINDING_GYP="binding.gyp" +MODULE_NAME="sage" +SRC_FILE="src/sage.ts" + +if [ ! -f "$BINDING_GYP" ]; then + echo "Creating missing binding.gyp..." + cat < $BINDING_GYP +{ + "targets": [ + { + "target_name": "$MODULE_NAME", + "sources": ["$SRC_FILE"], + } + ] +} +EOF + echo "binding.gyp created successfully." + From d731b68c71f2ccb1cd191f0664e00c4dff9bc943 Mon Sep 17 00:00:00 2001 From: JAromando Date: Wed, 19 Feb 2025 14:14:24 -0500 Subject: [PATCH 254/267] small fix to end of mac dep script --- install-deps-mac.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install-deps-mac.sh b/install-deps-mac.sh index c30b569b..d7331c83 100644 --- a/install-deps-mac.sh +++ b/install-deps-mac.sh @@ -15,10 +15,10 @@ if [ ! -f "$BINDING_GYP" ]; then "targets": [ { "target_name": "$MODULE_NAME", - "sources": ["$SRC_FILE"], + "sources": ["$SRC_FILE"] } ] } EOF echo "binding.gyp created successfully." - +fi \ No newline at end of file From f47a2b8f830411aa8e229ff41a7e49bfd3bc168b Mon Sep 17 00:00:00 2001 From: John Aromando Date: Thu, 20 Feb 2025 21:12:22 -0500 Subject: [PATCH 255/267] Update install-deps.js --- install-deps.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/install-deps.js b/install-deps.js index f56762ee..9597137b 100644 --- a/install-deps.js +++ b/install-deps.js @@ -1,5 +1,6 @@ const { spawnSync } = require("child_process"); const path = require("path"); +const os = process.platform; const isWindows = process.platform === "win32"; @@ -62,4 +63,4 @@ if (isWindows) { console.log("❌ Unsupported OS detected."); process.exit(1); -} \ No newline at end of file +} From ad02f6bc04a98264c3d72f46c43dba906fa0b1b3 Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Fri, 7 Mar 2025 13:05:17 -0500 Subject: [PATCH 256/267] Added job test command --- src/commands/jobs/jobs.ts | 76 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/commands/jobs/jobs.ts diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts new file mode 100644 index 00000000..19f1d7e9 --- /dev/null +++ b/src/commands/jobs/jobs.ts @@ -0,0 +1,76 @@ +import { ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; +import fetchJobListings from '@root/src/lib/utils/jobUtils/Adzuna_job_search'; +import { JobResult } from '@root/src/lib/types/JobResult'; +import { Interest } from '@root/src/lib/types/Interest'; +import { JobData } from '@root/src/lib/types/JobData'; +import { Command } from '@lib/types/Command'; + +const MAGIC8BALL_RESPONSES = [ + 'As I see it, yes.', + 'Ask again later.', + 'Better not tell you now.', + 'Cannot predict now.', + 'Concentrate and ask again.', + 'Don’t count on it.', + 'It is certain.', + 'It is decidedly so.', + 'Most likely.', + 'My reply is no.', + 'My sources say no.', + 'Outlook not so good.', + 'Outlook good.', + 'Reply hazy, try again.', + 'Signs point to yes.', + 'Very doubtful.', + 'Without a doubt.', + 'Yes.', + 'Yes – definitely.', + 'You may rely on it.' +]; + +export default class extends Command { + + description = `Testing for stuff.`; + extendedHelp = `This command requires you to put a question mark ('?') at the end of your message.`; + + // options: ApplicationCommandOptionData[] = [ + // { + // name: 'question', + // description: 'The question you want to ask', + // type: ApplicationCommandOptionType.String, + // required: true + // } + // ] + + async run(interaction: ChatInputCommandInteraction): Promise> { + const testJobData: JobData = { + city: 'New York', + preference: 'Software Engineer', + jobType: 'Full Time', + distance: '10', + filterBy: 'date' + }; + + const testInterests: Interest = { + interest1: 'Software', + interest2: 'Engineer', + interest3: 'Full Time', + interest4: 'New York', + interest5: '10' + }; + + const jobTest : JobResult[] = await fetchJobListings(testJobData, testInterests); + return interaction.reply({ content: `The job results are: ${jobTest}` }); + // return interaction.reply({ content: 'This is a new command' }); + + // const testEmbed = new EmbedBuilder() + // .setTitle('Test Embed') + // .setDescription('This is a test embed for the new command.') + // .setThumbnail('https://upload.wikimedia.org/wikipedia/en/d/d0/Neurosama_new_model.png') + // .addFields({ name: 'City', value: `${testJobData.city}` }) + // .addFields({ name: 'Field 2', value: 'This is the second field.' }) + // .setColor('#0099ff'); + // return interaction.reply({ embeds: [testEmbed] }); + } + +} From f6e94d4af5557ab130acefca8553060cb1b983d8 Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Fri, 7 Mar 2025 13:26:04 -0500 Subject: [PATCH 257/267] Job listing command --- src/commands/jobs/jobs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index 19f1d7e9..a4ae8a57 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -60,7 +60,7 @@ export default class extends Command { }; const jobTest : JobResult[] = await fetchJobListings(testJobData, testInterests); - return interaction.reply({ content: `The job results are: ${jobTest}` }); + return interaction.reply({ content: `This is a test command. Here are the job results: ${jobTest.map(job => job.title).join('\n')}` }); // return interaction.reply({ content: 'This is a new command' }); // const testEmbed = new EmbedBuilder() From a712acdf2cd372e009d6122ca06050bbc7b1fb5a Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Wed, 12 Mar 2025 12:59:59 -0400 Subject: [PATCH 258/267] updated jobs command --- src/commands/jobs/jobs.ts | 168 +++++++++++++++++++++++++++++--------- 1 file changed, 130 insertions(+), 38 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index a4ae8a57..a8b4b87d 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -4,34 +4,15 @@ import { JobResult } from '@root/src/lib/types/JobResult'; import { Interest } from '@root/src/lib/types/Interest'; import { JobData } from '@root/src/lib/types/JobData'; import { Command } from '@lib/types/Command'; +import { DB, BOT } from '@root/config'; +import { Job } from '@root/src/lib/types/Job'; +import { MongoClient } from 'mongodb'; -const MAGIC8BALL_RESPONSES = [ - 'As I see it, yes.', - 'Ask again later.', - 'Better not tell you now.', - 'Cannot predict now.', - 'Concentrate and ask again.', - 'Don’t count on it.', - 'It is certain.', - 'It is decidedly so.', - 'Most likely.', - 'My reply is no.', - 'My sources say no.', - 'Outlook not so good.', - 'Outlook good.', - 'Reply hazy, try again.', - 'Signs point to yes.', - 'Very doubtful.', - 'Without a doubt.', - 'Yes.', - 'Yes – definitely.', - 'You may rely on it.' -]; export default class extends Command { - description = `Testing for stuff.`; - extendedHelp = `This command requires you to put a question mark ('?') at the end of your message.`; + description = `Get a listing of jobs based on your interests and preferences.`; + extendedHelp = `This command will return a listing of jobs based on your interests and preferences.`; // options: ApplicationCommandOptionData[] = [ // { @@ -42,8 +23,53 @@ export default class extends Command { // } // ] + // options: ApplicationCommandOptionData[] = [ + // { + // name: 'filter Options', + // description: 'Filter options for job listings', + // type: ApplicationCommandOptionType.String, + // required: false, + // choices: [ + // { + // name: 'Date', + // value: 'date' + // }, + // { + // name: 'Salary', + // value: 'salary' + // }, + // { + // name: 'Alphabetical', + // value: 'alphabetical' + // } + // ] + // } + // ] + async run(interaction: ChatInputCommandInteraction): Promise> { - const testJobData: JobData = { + const userID = interaction.user.id; + + const client = await MongoClient.connect(DB.CONNECTION, { useUnifiedTopology: true }); + const db = client.db(BOT.NAME).collection(DB.JOB_FORMS); + const jobformAnswers:Job[] = await db.find({ owner: userID }).toArray(); + // const jobData:JobData = { + // city: jobformAnswers[0].answers[0], + // preference: jobformAnswers[0].answers[1], + // jobType: jobformAnswers[0].answers[2], + // distance: jobformAnswers[0].answers[3], + // // filterBy: filterBy ?? 'default' + // filterBy: 'default' + // }; + + // const interests:Interest = { + // interest1: jobformAnswers[1].answers[0], + // interest2: jobformAnswers[1].answers[1], + // interest3: jobformAnswers[1].answers[2], + // interest4: jobformAnswers[1].answers[3], + // interest5: jobformAnswers[1].answers[4] + // }; + + const jobData: JobData = { city: 'New York', preference: 'Software Engineer', jobType: 'Full Time', @@ -51,7 +77,7 @@ export default class extends Command { filterBy: 'date' }; - const testInterests: Interest = { + const interests: Interest = { interest1: 'Software', interest2: 'Engineer', interest3: 'Full Time', @@ -59,18 +85,84 @@ export default class extends Command { interest5: '10' }; - const jobTest : JobResult[] = await fetchJobListings(testJobData, testInterests); - return interaction.reply({ content: `This is a test command. Here are the job results: ${jobTest.map(job => job.title).join('\n')}` }); - // return interaction.reply({ content: 'This is a new command' }); - - // const testEmbed = new EmbedBuilder() - // .setTitle('Test Embed') - // .setDescription('This is a test embed for the new command.') - // .setThumbnail('https://upload.wikimedia.org/wikipedia/en/d/d0/Neurosama_new_model.png') - // .addFields({ name: 'City', value: `${testJobData.city}` }) - // .addFields({ name: 'Field 2', value: 'This is the second field.' }) - // .setColor('#0099ff'); - // return interaction.reply({ embeds: [testEmbed] }); + + const APIResponse:JobResult[] = await fetchJobListings(jobData, interests); + const results = [jobData, interests, APIResponse]; + const jobFormData: [JobData, Interest, JobResult[]] = [jobData, interests, APIResponse]; + + let message = `## Hey <@${userID}>! + ## Here's your list of job/internship recommendations: + Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ + **${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get\ + job/internship recommendations from the same company,\ + their positions/details/applications/salary WILL be different and this is not a glitch/bug! + Here's your personalized list: + + ${this.listJobs(jobFormData[2], 'date')} + + --- + ### **Disclaimer:** + -# Please be aware that the job listings displayed are retrieved from a third-party API. \ + While we strive to provide accurate information, we cannot guarantee the legitimacy or security\ + of all postings. Exercise caution when sharing personal information, submitting resumes, or registering\ + on external sites. Always verify the authenticity of job applications before proceeding. Additionally, \ + some job postings may contain inaccuracies due to API limitations, which are beyond our control. We apologize for any inconvenience this may cause and appreciate your understanding. + `; + + if (message.length > 2000) { + message = `${message.substring(0, 1997)}...`; + } + + const pubChan = interaction.channel; + if (pubChan) { + pubChan.send({ content: message }); + } else { + console.error('Channel not found'); + } + } + + listJobs(jobData: JobResult[], filterBy: string): string { + // Conditionally sort jobs by salary if sortBy is 'salary' + if (filterBy === 'salary') { + jobData.sort((a, b) => { + const avgA = (Number(a.salaryMax) + Number(a.salaryMin)) / 2; + const avgB = (Number(b.salaryMax) + Number(b.salaryMin)) / 2; + + // Handle cases where salaryMax or salaryMin is "Not listed" + if (isNaN(avgA)) return 1; // Treat jobs with no salary info as lowest + if (isNaN(avgB)) return -1; + + return avgB - avgA; // Descending order + }); + } + + let jobList = ''; + for (let i = 0; i < jobData.length; i++) { + const avgSalary = (Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2; + const formattedAvgSalary = this.formatCurrency(avgSalary); + const formattedSalaryMax = this.formatCurrency(Number(jobData[i].salaryMax)) !== 'N/A' ? this.formatCurrency(Number(jobData[i].salaryMax)) : ''; + const formattedSalaryMin = this.formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? this.formatCurrency(Number(jobData[i].salaryMin)) : ''; + + const salaryDetails = (formattedSalaryMin && formattedSalaryMax) + ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` + : formattedAvgSalary; + + jobList += `${i + 1}. **${jobData[i].title}** + \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} + \t\t* **Location:** ${jobData[i].location} + \t\t* **Apply here:** [read more about the job and apply here](${jobData[i].link}) + ${i !== jobData.length - 1 ? '\n' : ''}`; + } + + return jobList || '### Unfortunately, there were no jobs found based on your interests :(. Consider updating your interests or waiting until something is found.'; + } + + formatCurrency(currency: number): string { + return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD' + }).format(Number(currency))}`; } + } From b69b5a4a51c7a4e97c9c25addbdb748e32ab0e48 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 17 Mar 2025 13:04:37 -0400 Subject: [PATCH 259/267] added new questions --- binding.gyp | 8 + build/binding.sln | 19 + build/config.gypi | 131 ++- build/sage.vcxproj | 146 ++++ build/sage.vcxproj.filters | 67 ++ package-lock.json | 1547 ++++++++++++++++++++++++---------- package.json | 10 +- src/commands/jobs/jobform.ts | 29 +- src/pieces/blacklist.ts | 2 +- 9 files changed, 1476 insertions(+), 483 deletions(-) create mode 100644 binding.gyp create mode 100644 build/binding.sln create mode 100644 build/sage.vcxproj create mode 100644 build/sage.vcxproj.filters diff --git a/binding.gyp b/binding.gyp new file mode 100644 index 00000000..b2402bae --- /dev/null +++ b/binding.gyp @@ -0,0 +1,8 @@ +{ + "targets": [ + { + "target_name": "sage", + "sources": ["src/sage.ts"] + } + ] +} \ No newline at end of file diff --git a/build/binding.sln b/build/binding.sln new file mode 100644 index 00000000..652ef129 --- /dev/null +++ b/build/binding.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2015 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sage", "sage.vcxproj", "{CA89C133-1032-EC19-8F42-31354B1BC90F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CA89C133-1032-EC19-8F42-31354B1BC90F}.Debug|x64.ActiveCfg = Debug|x64 + {CA89C133-1032-EC19-8F42-31354B1BC90F}.Debug|x64.Build.0 = Debug|x64 + {CA89C133-1032-EC19-8F42-31354B1BC90F}.Release|x64.ActiveCfg = Release|x64 + {CA89C133-1032-EC19-8F42-31354B1BC90F}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/build/config.gypi b/build/config.gypi index e9edeef1..4c624a2f 100644 --- a/build/config.gypi +++ b/build/config.gypi @@ -2,6 +2,16 @@ { "target_defaults": { "cflags": [], + "configurations": { + "Debug": { + "v8_enable_v8_checks": 0, + "variables": {} + }, + "Release": { + "v8_enable_v8_checks": 1, + "variables": {} + } + }, "default_configuration": "Release", "defines": [], "include_dirs": [], @@ -11,6 +21,7 @@ }, "variables": { "asan": 0, + "clang": 0, "coverage": "false", "dcheck_always_on": 0, "debug_nghttp2": "false", @@ -21,21 +32,21 @@ "error_on_warn": "false", "force_dynamic_crt": 0, "host_arch": "x64", - "icu_data_in": "..\\..\\deps\\icu-tmp\\icudt73l.dat", + "icu_data_in": "..\\..\\deps\\icu-tmp\\icudt76l.dat", "icu_endianness": "l", "icu_gyp_path": "tools/icu/icu-generic.gyp", "icu_path": "deps/icu-small", "icu_small": "false", - "icu_ver_major": "73", - "is_debug": 0, + "icu_ver_major": "76", "libdir": "lib", "llvm_version": "0.0", - "napi_build_version": "9", + "napi_build_version": "0", "nasm_version": "2.16", "node_builtin_shareable_builtins": [ "deps/cjs-module-lexer/lexer.js", "deps/cjs-module-lexer/dist/lexer.js", - "deps/undici/undici.js" + "deps/undici/undici.js", + "deps/amaro/dist/index.js" ], "node_byteorder": "little", "node_debug_lib": "false", @@ -80,20 +91,28 @@ "lib/http2.js", "lib/https.js", "lib/inspector.js", + "lib/inspector/promises.js", "lib/internal/abort_controller.js", "lib/internal/assert.js", "lib/internal/assert/assertion_error.js", "lib/internal/assert/calltracker.js", + "lib/internal/assert/myers_diff.js", + "lib/internal/assert/utils.js", + "lib/internal/async_context_frame.js", "lib/internal/async_hooks.js", + "lib/internal/async_local_storage/async_context_frame.js", + "lib/internal/async_local_storage/async_hooks.js", "lib/internal/blob.js", "lib/internal/blocklist.js", - "lib/internal/bootstrap/browser.js", - "lib/internal/bootstrap/loaders.js", "lib/internal/bootstrap/node.js", + "lib/internal/bootstrap/realm.js", + "lib/internal/bootstrap/shadow_realm.js", "lib/internal/bootstrap/switches/does_not_own_process_state.js", "lib/internal/bootstrap/switches/does_own_process_state.js", "lib/internal/bootstrap/switches/is_main_thread.js", "lib/internal/bootstrap/switches/is_not_main_thread.js", + "lib/internal/bootstrap/web/exposed-wildcard.js", + "lib/internal/bootstrap/web/exposed-window-or-worker.js", "lib/internal/buffer.js", "lib/internal/child_process.js", "lib/internal/child_process/serialization.js", @@ -128,6 +147,7 @@ "lib/internal/crypto/webcrypto.js", "lib/internal/crypto/webidl.js", "lib/internal/crypto/x509.js", + "lib/internal/data_url.js", "lib/internal/debugger/inspect.js", "lib/internal/debugger/inspect_client.js", "lib/internal/debugger/inspect_repl.js", @@ -135,11 +155,12 @@ "lib/internal/dns/callback_resolver.js", "lib/internal/dns/promises.js", "lib/internal/dns/utils.js", - "lib/internal/dtrace.js", "lib/internal/encoding.js", "lib/internal/error_serdes.js", "lib/internal/errors.js", "lib/internal/event_target.js", + "lib/internal/events/abort_listener.js", + "lib/internal/events/symbols.js", "lib/internal/file.js", "lib/internal/fixed_queue.js", "lib/internal/freelist.js", @@ -147,8 +168,9 @@ "lib/internal/fs/cp/cp-sync.js", "lib/internal/fs/cp/cp.js", "lib/internal/fs/dir.js", + "lib/internal/fs/glob.js", "lib/internal/fs/promises.js", - "lib/internal/fs/read_file_context.js", + "lib/internal/fs/read/context.js", "lib/internal/fs/recursive_watch.js", "lib/internal/fs/rimraf.js", "lib/internal/fs/streams.js", @@ -161,13 +183,16 @@ "lib/internal/http2/compat.js", "lib/internal/http2/core.js", "lib/internal/http2/util.js", - "lib/internal/idna.js", + "lib/internal/inspector/network.js", + "lib/internal/inspector/network_http.js", + "lib/internal/inspector/network_undici.js", "lib/internal/inspector_async_hook.js", + "lib/internal/inspector_network_tracking.js", "lib/internal/js_stream_socket.js", "lib/internal/legacy/processbinding.js", "lib/internal/linkedlist.js", "lib/internal/main/check_syntax.js", - "lib/internal/main/environment.js", + "lib/internal/main/embedding.js", "lib/internal/main/eval_stdin.js", "lib/internal/main/eval_string.js", "lib/internal/main/inspect.js", @@ -176,30 +201,32 @@ "lib/internal/main/prof_process.js", "lib/internal/main/repl.js", "lib/internal/main/run_main_module.js", - "lib/internal/main/single_executable_application.js", "lib/internal/main/test_runner.js", "lib/internal/main/watch_mode.js", "lib/internal/main/worker_thread.js", "lib/internal/mime.js", - "lib/internal/modules/cjs/helpers.js", "lib/internal/modules/cjs/loader.js", "lib/internal/modules/esm/assert.js", "lib/internal/modules/esm/create_dynamic_module.js", "lib/internal/modules/esm/fetch_module.js", "lib/internal/modules/esm/formats.js", "lib/internal/modules/esm/get_format.js", - "lib/internal/modules/esm/handle_process_exit.js", + "lib/internal/modules/esm/hooks.js", "lib/internal/modules/esm/initialize_import_meta.js", "lib/internal/modules/esm/load.js", "lib/internal/modules/esm/loader.js", "lib/internal/modules/esm/module_job.js", "lib/internal/modules/esm/module_map.js", - "lib/internal/modules/esm/package_config.js", "lib/internal/modules/esm/resolve.js", + "lib/internal/modules/esm/shared_constants.js", "lib/internal/modules/esm/translators.js", "lib/internal/modules/esm/utils.js", + "lib/internal/modules/esm/worker.js", + "lib/internal/modules/helpers.js", "lib/internal/modules/package_json_reader.js", "lib/internal/modules/run_main.js", + "lib/internal/modules/typescript.js", + "lib/internal/navigator.js", "lib/internal/net.js", "lib/internal/options.js", "lib/internal/per_context/domexception.js", @@ -215,13 +242,11 @@ "lib/internal/perf/timerify.js", "lib/internal/perf/usertiming.js", "lib/internal/perf/utils.js", - "lib/internal/policy/manifest.js", - "lib/internal/policy/sri.js", "lib/internal/priority_queue.js", - "lib/internal/process/esm_loader.js", "lib/internal/process/execution.js", + "lib/internal/process/finalization.js", "lib/internal/process/per_thread.js", - "lib/internal/process/policy.js", + "lib/internal/process/permission.js", "lib/internal/process/pre_execution.js", "lib/internal/process/promises.js", "lib/internal/process/report.js", @@ -231,6 +256,10 @@ "lib/internal/process/worker_thread_only.js", "lib/internal/promise_hooks.js", "lib/internal/querystring.js", + "lib/internal/quic/quic.js", + "lib/internal/quic/state.js", + "lib/internal/quic/stats.js", + "lib/internal/quic/symbols.js", "lib/internal/readline/callbacks.js", "lib/internal/readline/emitKeypressEvents.js", "lib/internal/readline/interface.js", @@ -245,13 +274,14 @@ "lib/internal/source_map/prepare_stack_trace.js", "lib/internal/source_map/source_map.js", "lib/internal/source_map/source_map_cache.js", + "lib/internal/source_map/source_map_cache_map.js", "lib/internal/stream_base_commons.js", "lib/internal/streams/add-abort-signal.js", - "lib/internal/streams/buffer_list.js", "lib/internal/streams/compose.js", "lib/internal/streams/destroy.js", "lib/internal/streams/duplex.js", "lib/internal/streams/duplexify.js", + "lib/internal/streams/duplexpair.js", "lib/internal/streams/end-of-stream.js", "lib/internal/streams/from.js", "lib/internal/streams/lazy_transform.js", @@ -264,17 +294,23 @@ "lib/internal/streams/transform.js", "lib/internal/streams/utils.js", "lib/internal/streams/writable.js", - "lib/internal/structured_clone.js", "lib/internal/test/binding.js", "lib/internal/test/transfer.js", + "lib/internal/test_runner/assert.js", "lib/internal/test_runner/coverage.js", "lib/internal/test_runner/harness.js", - "lib/internal/test_runner/mock.js", + "lib/internal/test_runner/mock/loader.js", + "lib/internal/test_runner/mock/mock.js", + "lib/internal/test_runner/mock/mock_timers.js", "lib/internal/test_runner/reporter/dot.js", + "lib/internal/test_runner/reporter/junit.js", + "lib/internal/test_runner/reporter/lcov.js", "lib/internal/test_runner/reporter/spec.js", "lib/internal/test_runner/reporter/tap.js", + "lib/internal/test_runner/reporter/utils.js", "lib/internal/test_runner/reporter/v8-serializer.js", "lib/internal/test_runner/runner.js", + "lib/internal/test_runner/snapshot.js", "lib/internal/test_runner/test.js", "lib/internal/test_runner/tests_stream.js", "lib/internal/test_runner/utils.js", @@ -290,7 +326,6 @@ "lib/internal/util/debuglog.js", "lib/internal/util/inspect.js", "lib/internal/util/inspector.js", - "lib/internal/util/iterable_weak_map.js", "lib/internal/util/parse_args/parse_args.js", "lib/internal/util/parse_args/utils.js", "lib/internal/util/types.js", @@ -304,6 +339,7 @@ "lib/internal/watch_mode/files_watcher.js", "lib/internal/watchdog.js", "lib/internal/webidl.js", + "lib/internal/webstorage.js", "lib/internal/webstreams/adapters.js", "lib/internal/webstreams/compression.js", "lib/internal/webstreams/encoding.js", @@ -316,6 +352,7 @@ "lib/internal/worker.js", "lib/internal/worker/io.js", "lib/internal/worker/js_transferable.js", + "lib/internal/worker/messaging.js", "lib/module.js", "lib/net.js", "lib/os.js", @@ -329,6 +366,8 @@ "lib/readline.js", "lib/readline/promises.js", "lib/repl.js", + "lib/sea.js", + "lib/sqlite.js", "lib/stream.js", "lib/stream/consumers.js", "lib/stream/promises.js", @@ -351,11 +390,12 @@ "lib/worker_threads.js", "lib/zlib.js" ], - "node_module_version": 108, + "node_module_version": 127, "node_no_browser_globals": "false", "node_prefix": "\\usr\\local", "node_release_urlbase": "https://nodejs.org/download/release/", "node_shared": "false", + "node_shared_ada": "false", "node_shared_brotli": "false", "node_shared_cares": "false", "node_shared_http_parser": "false", @@ -364,47 +404,74 @@ "node_shared_nghttp3": "false", "node_shared_ngtcp2": "false", "node_shared_openssl": "false", + "node_shared_simdjson": "false", + "node_shared_simdutf": "false", + "node_shared_sqlite": "false", + "node_shared_uvwasi": "false", "node_shared_zlib": "false", "node_tag": "", "node_target_type": "executable", + "node_use_amaro": "true", "node_use_bundled_v8": "true", - "node_use_dtrace": "false", - "node_use_etw": "true", "node_use_node_code_cache": "true", "node_use_node_snapshot": "true", "node_use_openssl": "true", "node_use_v8_platform": "true", "node_with_ltcg": "true", "node_without_node_options": "false", + "node_write_snapshot_as_array_literals": "true", "openssl_is_fips": "false", "openssl_quic": "true", "ossfuzz": "false", - "shlib_suffix": "so.108", + "shlib_suffix": "so.127", "single_executable_application": "true", "target_arch": "x64", + "ubsan": 0, + "use_prefix_to_find_headers": "false", "v8_enable_31bit_smis_on_64bit_arch": 0, + "v8_enable_extensible_ro_snapshot": 0, "v8_enable_gdbjit": 0, "v8_enable_hugepage": 0, "v8_enable_i18n_support": 1, "v8_enable_inspector": 1, "v8_enable_javascript_promise_hooks": 1, "v8_enable_lite_mode": 0, + "v8_enable_maglev": 0, "v8_enable_object_print": 1, "v8_enable_pointer_compression": 0, + "v8_enable_sandbox": 0, "v8_enable_shared_ro_heap": 1, "v8_enable_short_builtin_calls": 1, + "v8_enable_wasm_simd256_revec": 1, "v8_enable_webassembly": 1, - "v8_no_strict_aliasing": 1, "v8_optimized_debug": 1, "v8_promise_internal_field_count": 1, "v8_random_seed": 0, "v8_trace_maps": 0, "v8_use_siphash": 1, "want_separate_host_toolset": 0, - "nodedir": "C:\\Users\\avasw\\AppData\\Local\\node-gyp\\Cache\\18.17.1", - "python": "C:\\Users\\avasw\\AppData\\Local\\Programs\\Python\\Python310\\python.exe", + "nodedir": "C:\\Users\\chris\\AppData\\Local\\node-gyp\\Cache\\22.14.0", + "python": "C:\\Python313\\python.exe", "standalone_static_library": 1, - "msbuild_path": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\MSBuild.exe", - "configfile": "configure.gypi" + "msbuild_path": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\MSBuild\\Current\\Bin\\MSBuild.exe", + "fallback_to_build": "true", + "build_from_source": "true", + "module": "C:\\Users\\chris\\OneDrive\\Desktop\\CISC367\\Local Sage\\SageTeamY\\lib\\binding\\your_module.node", + "module_name": "your_module", + "module_path": "C:\\Users\\chris\\OneDrive\\Desktop\\CISC367\\Local Sage\\SageTeamY\\lib\\binding", + "napi_version": "10", + "node_abi_napi": "napi", + "node_napi_label": "node-v127", + "cache": "C:\\Users\\chris\\AppData\\Local\\npm-cache", + "engine_strict": "true", + "globalconfig": "C:\\Users\\chris\\AppData\\Roaming\\fnm\\node-versions\\v22.14.0\\installation\\etc\\npmrc", + "global_prefix": "C:\\Users\\chris\\AppData\\Roaming\\fnm\\node-versions\\v22.14.0\\installation", + "init_module": "C:\\Users\\chris\\.npm-init.js", + "local_prefix": "C:\\Users\\chris\\OneDrive\\Desktop\\CISC367\\Local Sage\\SageTeamY", + "node_gyp": "C:\\Users\\chris\\AppData\\Roaming\\fnm\\node-versions\\v22.14.0\\installation\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js", + "npm_version": "10.9.2", + "prefix": "C:\\Users\\chris\\AppData\\Roaming\\fnm\\node-versions\\v22.14.0\\installation", + "userconfig": "C:\\Users\\chris\\.npmrc", + "user_agent": "npm/10.9.2 node/v22.14.0 win32 x64 workspaces/false" } } diff --git a/build/sage.vcxproj b/build/sage.vcxproj new file mode 100644 index 00000000..c7b31e28 --- /dev/null +++ b/build/sage.vcxproj @@ -0,0 +1,146 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {CA89C133-1032-EC19-8F42-31354B1BC90F} + Win32Proj + sage + true + x64 + 10.0.22621.0 + + + + DynamicLibrary + + + v143 + + + + + + + + + + $(ExecutablePath);$(MSBuildProjectDirectory)\..\bin\;$(MSBuildProjectDirectory)\..\bin\ + true + $(Configuration)\obj\$(ProjectName)\ + false + true + $(SolutionDir)$(Configuration)\ + .node + .node + .node + .node + $(ProjectName) + $(OutDir)\$(ProjectName).node + + + + C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\include\node;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\src;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\config;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\openssl\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\uv\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\zlib;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\v8\include;%(AdditionalIncludeDirectories) + /Zc:__cplusplus -std:c++20 /Zm2000 %(AdditionalOptions) + EnableFastChecks + true + OldStyle + 4351;4355;4800;4251;4275;4244;4267;%(DisableSpecificWarnings) + false + false + true + false + Disabled + NotUsing + NODE_GYP_MODULE_NAME=sage;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;_GLIBCXX_USE_CXX11_ABI=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;NOMINMAX;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";DEBUG;_DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebug + true + true + false + Level3 + true + + + /LTCG:INCREMENTAL %(AdditionalOptions) + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;DelayImp.lib;"C:\\Users\\chris\\AppData\\Local\\node-gyp\\Cache\\22.14.0\\x64\\node.lib" + /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) + node.exe;%(DelayLoadDLLs) + true + true + true + $(OutDir)$(ProjectName).node + true + .node + MachineX64 + + + C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\include\node;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\src;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\config;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\openssl\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\uv\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\zlib;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\v8\include;%(AdditionalIncludeDirectories) + NODE_GYP_MODULE_NAME=sage;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;_GLIBCXX_USE_CXX11_ABI=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;NOMINMAX;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";DEBUG;_DEBUG;%(PreprocessorDefinitions);%(PreprocessorDefinitions) + + + + + C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\include\node;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\src;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\config;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\openssl\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\uv\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\zlib;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\v8\include;%(AdditionalIncludeDirectories) + /Zc:__cplusplus -std:c++20 /Zm2000 %(AdditionalOptions) + true + OldStyle + 4351;4355;4800;4251;4275;4244;4267;%(DisableSpecificWarnings) + false + Speed + true + AnySuitable + true + true + true + Full + NotUsing + NODE_GYP_MODULE_NAME=sage;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;_GLIBCXX_USE_CXX11_ABI=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;NOMINMAX;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";%(PreprocessorDefinitions) + MultiThreaded + false + true + true + false + Level3 + true + + + /LTCG:INCREMENTAL %(AdditionalOptions) + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;DelayImp.lib;"C:\\Users\\chris\\AppData\\Local\\node-gyp\\Cache\\22.14.0\\x64\\node.lib" + /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) + node.exe;%(DelayLoadDLLs) + true + true + true + $(OutDir)$(ProjectName).node + true + .node + MachineX64 + + + C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\include\node;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\src;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\config;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\openssl\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\uv\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\zlib;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\v8\include;%(AdditionalIncludeDirectories) + NODE_GYP_MODULE_NAME=sage;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;_GLIBCXX_USE_CXX11_ABI=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;NOMINMAX;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";%(PreprocessorDefinitions);%(PreprocessorDefinitions) + + + + + + + + + + + + + diff --git a/build/sage.vcxproj.filters b/build/sage.vcxproj.filters new file mode 100644 index 00000000..de3611e4 --- /dev/null +++ b/build/sage.vcxproj.filters @@ -0,0 +1,67 @@ + + + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8CDEE807-BC53-E450-C8B8-4DEBB66742D4} + + + {7B735499-E5DD-1C2B-6C26-70023832A1CF} + + + {E9F714C1-DA89-54E2-60CF-39FEB20BF756} + + + {B71FC3D6-3F9C-77A3-BF2C-A47B891940C3} + + + {F852EB63-437C-846A-220F-8D9ED6DAEC1D} + + + {D51E5808-912B-5C70-4BB7-475D1DBFA067} + + + {32444292-0D0F-9718-E054-399674062C45} + + + {21C45271-02AD-7F00-716D-A535CE435014} + + + {36890C2C-DAFF-16EA-A2B8-3A765D4A0198} + + + {A1566883-8936-914F-8AFA-D0F4AAB8B5B2} + + + {56DF7A98-063D-FB9D-485C-089023B4C16A} + + + {741E0E76-39B2-B1AB-9FA1-F1A20B16F295} + + + {56DF7A98-063D-FB9D-485C-089023B4C16A} + + + {77348C0E-2034-7791-74D5-63C077DF5A3B} + + + {8CDEE807-BC53-E450-C8B8-4DEBB66742D4} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + + + ..\src + + + C:\Users\chris\AppData\Roaming\fnm\node-versions\v22.14.0\installation\node_modules\npm\node_modules\node-gyp\src + + + .. + + + diff --git a/package-lock.json b/package-lock.json index 7bc2f023..15b9079e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,16 +7,18 @@ "": { "name": "sage", "version": "3.3.0", + "hasInstallScript": true, "license": "MIT", "dependencies": { + "@discordjs/node-pre-gyp": "0.4.5", "@octokit/rest": "^18.3.5", "axios": "^1.4.0", - "canvas": "^2.11.2", + "canvas": "^3.1.0", "console-stamp": "^3.0.2", "discord.js": "^14.16.3", "module-alias": "^2.2.2", "moment": "^2.29.1", - "mongodb": "^3.7.4", + "mongodb": "^3.6.3", "node-cron": "^2.0.3", "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", @@ -45,28 +47,32 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.10.4" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -77,6 +83,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -89,6 +96,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -103,6 +111,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -111,13 +120,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -127,6 +138,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -136,6 +148,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -144,32 +157,26 @@ } }, "node_modules/@discordjs/builders": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.9.0.tgz", - "integrity": "sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.10.1.tgz", + "integrity": "sha512-OWo1fY4ztL1/M/DUyRPShB4d/EzVfuUvPTRRHRIt/YxBrUYSz0a+JicD5F5zHFoNs2oTuWavxCOVFV1UljHTng==", "license": "Apache-2.0", "dependencies": { - "@discordjs/formatters": "^0.5.0", + "@discordjs/formatters": "^0.6.0", "@discordjs/util": "^1.1.1", "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "0.37.97", + "discord-api-types": "^0.37.119", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.4", "tslib": "^2.6.3" }, "engines": { - "node": ">=18" + "node": ">=16.11.0" }, "funding": { "url": "https://github.com/discordjs/discord.js?sponsor" } }, - "node_modules/@discordjs/builders/node_modules/discord-api-types": { - "version": "0.37.97", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", - "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", - "license": "MIT" - }, "node_modules/@discordjs/collection": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", @@ -180,30 +187,44 @@ } }, "node_modules/@discordjs/formatters": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.5.0.tgz", - "integrity": "sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.0.tgz", + "integrity": "sha512-YIruKw4UILt/ivO4uISmrGq2GdMY6EkoTtD0oS0GvkJFRZbTSdPhzYiUILbJ/QslsvC9H9nTgGgnarnIl4jMfw==", "license": "Apache-2.0", "dependencies": { - "discord-api-types": "0.37.97" + "discord-api-types": "^0.37.114" }, "engines": { - "node": ">=18" + "node": ">=16.11.0" }, "funding": { "url": "https://github.com/discordjs/discord.js?sponsor" } }, - "node_modules/@discordjs/formatters/node_modules/discord-api-types": { - "version": "0.37.97", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", - "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", - "license": "MIT" + "node_modules/@discordjs/node-pre-gyp": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.5.tgz", + "integrity": "sha512-YJOVVZ545x24mHzANfYoy0BJX5PDyeZlpiJjDkUBM/V/Ao7TFX9lcUvCN4nr0tbr5ubeaXxtEBILUrHtTphVeQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } }, "node_modules/@discordjs/rest": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.0.tgz", - "integrity": "sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.3.tgz", + "integrity": "sha512-+SO4RKvWsM+y8uFHgYQrcTl/3+cY02uQOH7/7bKbVZsTfrfpoE62o5p+mmV+s7FVhTX82/kQUGGbu4YlV60RtA==", "license": "Apache-2.0", "dependencies": { "@discordjs/collection": "^2.1.1", @@ -211,10 +232,10 @@ "@sapphire/async-queue": "^1.5.3", "@sapphire/snowflake": "^3.5.3", "@vladfrangu/async_event_emitter": "^2.4.6", - "discord-api-types": "0.37.97", + "discord-api-types": "^0.37.119", "magic-bytes.js": "^1.10.0", "tslib": "^2.6.3", - "undici": "6.19.8" + "undici": "6.21.1" }, "engines": { "node": ">=18" @@ -235,12 +256,6 @@ "url": "https://github.com/discordjs/discord.js?sponsor" } }, - "node_modules/@discordjs/rest/node_modules/discord-api-types": { - "version": "0.37.97", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", - "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", - "license": "MIT" - }, "node_modules/@discordjs/util": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz", @@ -254,20 +269,20 @@ } }, "node_modules/@discordjs/ws": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", - "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.1.tgz", + "integrity": "sha512-PBvenhZG56a6tMWF/f4P6f4GxZKJTBG95n7aiGSPTnodmz4N5g60t79rSIAq7ywMbv8A4jFtexMruH+oe51aQQ==", "license": "Apache-2.0", "dependencies": { "@discordjs/collection": "^2.1.0", - "@discordjs/rest": "^2.3.0", + "@discordjs/rest": "^2.4.3", "@discordjs/util": "^1.1.0", "@sapphire/async-queue": "^1.5.2", "@types/ws": "^8.5.10", "@vladfrangu/async_event_emitter": "^2.2.4", - "discord-api-types": "0.37.83", + "discord-api-types": "^0.37.119", "tslib": "^2.6.2", - "ws": "^8.16.0" + "ws": "^8.17.0" }, "engines": { "node": ">=16.11.0" @@ -288,17 +303,12 @@ "url": "https://github.com/discordjs/discord.js?sponsor" } }, - "node_modules/@discordjs/ws/node_modules/discord-api-types": { - "version": "0.37.83", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", - "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==", - "license": "MIT" - }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -319,6 +329,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -327,7 +338,9 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -341,32 +354,16 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", - "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -380,6 +377,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -389,6 +387,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -401,6 +400,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "license": "MIT", "dependencies": { "@octokit/types": "^6.0.3" } @@ -409,6 +409,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "license": "MIT", "dependencies": { "@octokit/auth-token": "^2.4.4", "@octokit/graphql": "^4.5.8", @@ -423,6 +424,7 @@ "version": "6.0.12", "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "license": "MIT", "dependencies": { "@octokit/types": "^6.0.3", "is-plain-object": "^5.0.0", @@ -433,6 +435,7 @@ "version": "4.8.0", "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "license": "MIT", "dependencies": { "@octokit/request": "^5.6.0", "@octokit/types": "^6.0.3", @@ -440,16 +443,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz", - "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==" + "version": "12.11.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", + "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", + "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz", - "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", + "version": "2.21.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", + "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", + "license": "MIT", "dependencies": { - "@octokit/types": "^6.34.0" + "@octokit/types": "^6.40.0" }, "peerDependencies": { "@octokit/core": ">=2" @@ -459,16 +464,18 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "license": "MIT", "peerDependencies": { "@octokit/core": ">=3" } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz", - "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", + "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", + "license": "MIT", "dependencies": { - "@octokit/types": "^6.34.0", + "@octokit/types": "^6.39.0", "deprecation": "^2.3.1" }, "peerDependencies": { @@ -479,6 +486,7 @@ "version": "5.6.3", "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "license": "MIT", "dependencies": { "@octokit/endpoint": "^6.0.1", "@octokit/request-error": "^2.1.0", @@ -492,6 +500,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "license": "MIT", "dependencies": { "@octokit/types": "^6.0.3", "deprecation": "^2.0.0", @@ -502,6 +511,7 @@ "version": "18.12.0", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "license": "MIT", "dependencies": { "@octokit/core": "^3.5.1", "@octokit/plugin-paginate-rest": "^2.16.8", @@ -510,17 +520,18 @@ } }, "node_modules/@octokit/types": { - "version": "6.34.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz", - "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^11.2.0" + "@octokit/openapi-types": "^12.11.0" } }, "node_modules/@sapphire/async-queue": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.3.tgz", - "integrity": "sha512-x7zadcfJGxFka1Q3f8gCts1F0xMwCKbZweM85xECGI0hBTeIZJGGCrHgLggihBoprlQ/hBmDR5LKfIPqnmHM3w==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.5.tgz", + "integrity": "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==", "license": "MIT", "engines": { "node": ">=v14.0.0", @@ -551,13 +562,13 @@ } }, "node_modules/@types/bson": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz", - "integrity": "sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg==", - "deprecated": "This is a stub types definition. bson provides its own type definitions, so you do not need this installed.", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", + "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", "dev": true, + "license": "MIT", "dependencies": { - "bson": "*" + "@types/node": "*" } }, "node_modules/@types/console-stamp": { @@ -565,21 +576,24 @@ "resolved": "https://registry.npmjs.org/@types/console-stamp/-/console-stamp-0.2.33.tgz", "integrity": "sha512-ISAh9MXEnmW8eP6C0ItiMJX/cqqgUfom9W8XUwk9Ze51PRA01a9J3daWAUL1wDIVDovi7nD/AC6Efj2nJH6JdA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/mongodb": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/bson": "*", "@types/node": "*" @@ -592,57 +606,47 @@ "license": "MIT" }, "node_modules/@types/node-cron": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-2.0.5.tgz", - "integrity": "sha512-rQ4kduTmgW11tbtx0/RsoybYHHPu4Vxw5v5ZS5qUKNerlEAI8r8P1F5UUZ2o2HTvzG759sbFxuRuqWxU8zc+EQ==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-2.0.8.tgz", + "integrity": "sha512-YeoqKLt4ElsPHNIwc3tZ86yLRcyZ8GzUN1PbP4dnmBrwMISZfNaiH9OIqHdDq8fnhxxdjHN+G6HYYQ0MaRoDYA==", "dev": true, + "license": "MIT", "dependencies": { "@types/tz-offset": "*" } }, "node_modules/@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/node-fetch/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "form-data": "^4.0.0" } }, "node_modules/@types/nodemailer": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.4.tgz", - "integrity": "sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw==", + "version": "6.4.17", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.17.tgz", + "integrity": "sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/tz-offset": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@types/tz-offset/-/tz-offset-0.0.0.tgz", - "integrity": "sha512-XLD/llTSB6EBe3thkN+/I0L+yCTB6sjrcVovQdx2Cnl6N6bTzHmwe/J8mWnsXFgxLrj/emzdv8IR4evKYG2qxQ==", - "dev": true + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/tz-offset/-/tz-offset-0.0.3.tgz", + "integrity": "sha512-JPieQFasx+g7DQE0jRf1Vw7k7ak9LCLWnzcis/fcVwnfTuGwo7XRI4q/BaBTxatAVI2Ea/+d/4thzdN3yOu19A==", + "dev": true, + "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -653,6 +657,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "4.33.0", "@typescript-eslint/scope-manager": "4.33.0", @@ -685,6 +690,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.7", "@typescript-eslint/scope-manager": "4.33.0", @@ -704,29 +710,12 @@ "eslint": "*" } }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, "node_modules/@typescript-eslint/parser": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "4.33.0", "@typescript-eslint/types": "4.33.0", @@ -754,6 +743,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.33.0", "@typescript-eslint/visitor-keys": "4.33.0" @@ -771,6 +761,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", "dev": true, + "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -784,6 +775,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "4.33.0", "@typescript-eslint/visitor-keys": "4.33.0", @@ -811,6 +803,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.33.0", "eslint-visitor-keys": "^2.0.0" @@ -836,13 +829,15 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" }, "node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -855,6 +850,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -863,6 +859,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", "dependencies": { "debug": "4" }, @@ -875,6 +872,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -891,6 +889,7 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -899,6 +898,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -907,6 +907,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -920,12 +921,15 @@ "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "license": "ISC" }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -935,9 +939,10 @@ } }, "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -952,6 +957,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -961,6 +967,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -970,6 +977,7 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -977,14 +985,16 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", + "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -992,13 +1002,13 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -1012,17 +1022,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/before-after-hook": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "license": "Apache-2.0" }, "node_modules/bl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "license": "MIT", "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -1032,40 +1045,38 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/bson": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", - "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", - "dev": true, - "dependencies": { - "buffer": "^5.6.0" - }, + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=0.6.19" } }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -1080,39 +1091,54 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/canvas": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", - "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.1.0.tgz", + "integrity": "sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1" }, "engines": { - "node": ">=6" + "node": "^18.12.0 || >= 20.9.0" } }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1128,6 +1154,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", "engines": { "node": ">=10" } @@ -1136,6 +1163,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1146,12 +1174,14 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", "bin": { "color-support": "bin.js" } @@ -1160,6 +1190,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1170,35 +1201,40 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" }, "node_modules/console-stamp": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/console-stamp/-/console-stamp-3.0.6.tgz", - "integrity": "sha512-j4tP+1shVIUjSnvrtv5nJ5uVzLeNOTweVHkcEXB2ej4NJdlRp14w0hOzQiF+iQvOTjz4jafmdhd1CdYSwNzM8Q==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/console-stamp/-/console-stamp-3.1.2.tgz", + "integrity": "sha512-ab66x3NxOTxPuq71dI6gXEiw2X6ql4Le5gZz0bm7FW3FSCB00eztra/oQUuCoCGlsyKOxtULnHwphzMrRtzMBg==", + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "dateformat": "^4.6.3" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1212,16 +1248,18 @@ "version": "4.6.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1233,26 +1271,41 @@ } }, "node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", "dependencies": { - "mimic-response": "^2.0.0" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" } }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -1260,12 +1313,14 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" }, "node_modules/denque": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "license": "Apache-2.0", "engines": { "node": ">=0.10" } @@ -1273,12 +1328,14 @@ "node_modules/deprecation": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "license": "ISC" }, "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", "engines": { "node": ">=8" } @@ -1288,6 +1345,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -1296,29 +1354,29 @@ } }, "node_modules/discord-api-types": { - "version": "0.37.100", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.100.tgz", - "integrity": "sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==", + "version": "0.37.119", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.119.tgz", + "integrity": "sha512-WasbGFXEB+VQWXlo6IpW3oUv73Yuau1Ig4AZF/m13tXcTKnMpc/mHjpztIlz4+BM9FG9BHQkEXiPto3bKduQUg==", "license": "MIT" }, "node_modules/discord.js": { - "version": "14.16.3", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.16.3.tgz", - "integrity": "sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==", + "version": "14.18.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.18.0.tgz", + "integrity": "sha512-SvU5kVUvwunQhN2/+0t55QW/1EHfB1lp0TtLZUSXVHDmyHTrdOj5LRKdR0zLcybaA15F+NtdWuWmGOX9lE+CAw==", "license": "Apache-2.0", "dependencies": { - "@discordjs/builders": "^1.9.0", + "@discordjs/builders": "^1.10.1", "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.5.0", - "@discordjs/rest": "^2.4.0", + "@discordjs/formatters": "^0.6.0", + "@discordjs/rest": "^2.4.3", "@discordjs/util": "^1.1.1", - "@discordjs/ws": "1.1.1", + "@discordjs/ws": "^1.2.1", "@sapphire/snowflake": "3.5.3", - "discord-api-types": "0.37.100", + "discord-api-types": "^0.37.119", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", "tslib": "^2.6.3", - "undici": "6.19.8" + "undici": "6.21.1" }, "engines": { "node": ">=18" @@ -1332,6 +1390,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -1339,34 +1398,107 @@ "node": ">=6.0.0" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } }, "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8.6" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1378,7 +1510,9 @@ "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -1436,6 +1570,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -1445,10 +1580,40 @@ } }, "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -1459,29 +1624,22 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint/node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -1491,6 +1649,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -1505,6 +1664,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -1514,6 +1674,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -1523,10 +1684,11 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -1539,6 +1701,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1548,6 +1711,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -1560,6 +1724,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1569,6 +1734,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1578,6 +1744,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -1587,6 +1754,7 @@ "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", "dev": true, + "license": "MIT", "dependencies": { "duplexer": "~0.1.1", "from": "~0", @@ -1597,22 +1765,33 @@ "through": "~2.3.1" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -1622,19 +1801,39 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -1644,6 +1843,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -1652,10 +1852,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1664,12 +1865,14 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -1677,21 +1880,23 @@ } }, "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1702,12 +1907,14 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -1718,12 +1925,20 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -1731,21 +1946,46 @@ "node": ">= 8" } }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -1761,10 +2001,55 @@ "node": ">=10" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1785,6 +2070,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -1793,10 +2079,11 @@ } }, "node_modules/globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -1812,6 +2099,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -1827,23 +2115,77 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -1856,7 +2198,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -1870,22 +2211,25 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1902,6 +2246,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -1910,6 +2255,8 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -1918,13 +2265,21 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1933,6 +2288,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } @@ -1942,6 +2298,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1954,6 +2311,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -1962,6 +2320,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1969,25 +2328,29 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1996,23 +2359,43 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -2031,29 +2414,21 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "dev": true, + "license": "MIT" }, "node_modules/magic-bytes.js": { "version": "1.10.0", @@ -2065,6 +2440,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -2076,9 +2452,10 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -2089,10 +2466,20 @@ "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", "dev": true }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT", "optional": true }, "node_modules/merge2": { @@ -2100,17 +2487,19 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -2121,6 +2510,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2129,6 +2519,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -2137,11 +2528,12 @@ } }, "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2151,6 +2543,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2158,13 +2551,20 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", "engines": { "node": ">=8" } @@ -2173,6 +2573,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -2181,10 +2582,23 @@ "node": ">= 8" } }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -2192,15 +2606,23 @@ "node": ">=10" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, "node_modules/module-alias": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", - "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz", + "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==", + "license": "MIT" }, "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", "engines": { "node": "*" } @@ -2244,42 +2666,56 @@ } } }, - "node_modules/mongodb/node_modules/bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", - "engines": { - "node": ">=0.6.19" - } - }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, - "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.74.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", + "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" }, "node_modules/node-cleanup": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-cron": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-2.0.3.tgz", "integrity": "sha512-eJI+QitXlwcgiZwNNSRbqsjeZMp5shyajMR81RZCqeW0ZDEj4zU9tpd4nTh/1JsBiKbF8d08FCewiipDmVIYjg==", "hasInstallScript": true, + "license": "ISC", "dependencies": { "opencollective-postinstall": "^2.0.0", "tz-offset": "0.0.1" @@ -2289,9 +2725,10 @@ } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -2308,9 +2745,10 @@ } }, "node_modules/nodemailer": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", - "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.0.tgz", + "integrity": "sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA==", + "license": "MIT-0", "engines": { "node": ">=6.0.0" } @@ -2319,6 +2757,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", "dependencies": { "abbrev": "1" }, @@ -2333,6 +2772,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -2344,6 +2785,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2352,6 +2794,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -2360,6 +2803,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "license": "MIT", "bin": { "opencollective-postinstall": "index.js" } @@ -2368,6 +2812,7 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "license": "Apache-2.0", "dependencies": { "require-at": "^1.0.6" }, @@ -2376,17 +2821,18 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -2397,6 +2843,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -2407,12 +2854,14 @@ "node_modules/parse-duration": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.4.4.tgz", - "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==" + "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==", + "license": "MIT" }, "node_modules/parse-ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -2421,6 +2870,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2430,6 +2880,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2439,6 +2890,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2448,15 +2900,27 @@ "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", "dev": true, + "license": [ + "MIT", + "Apache2" + ], "dependencies": { "through": "~2.3" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -2464,11 +2928,38 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", + "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": "^2.0.0", + "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" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -2477,6 +2968,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "license": "MIT", "dependencies": { "parse-ms": "^2.1.0" }, @@ -2490,13 +2982,15 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -2504,13 +2998,15 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, "node_modules/ps-tree": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", "dev": true, + "license": "MIT", "dependencies": { "event-stream": "=3.3.4" }, @@ -2521,11 +3017,22 @@ "node": ">= 0.10" } }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2548,12 +3055,38 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -2567,13 +3100,15 @@ "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2585,6 +3120,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -2594,6 +3130,7 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2603,15 +3140,17 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -2621,6 +3160,8 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -2650,6 +3191,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -2671,12 +3213,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/saslprep": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "license": "MIT", "optional": true, "dependencies": { "sparse-bitfield": "^3.0.3" @@ -2686,12 +3230,10 @@ } }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2702,13 +3244,15 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -2721,6 +3265,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2728,7 +3273,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" }, "node_modules/simple-concat": { "version": "1.0.1", @@ -2747,14 +3293,30 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "dependencies": { - "decompress-response": "^4.2.0", + "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } @@ -2764,6 +3326,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2773,6 +3336,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -2789,6 +3353,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", "optional": true, "dependencies": { "memory-pager": "^1.0.2" @@ -2799,6 +3364,7 @@ "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", "dev": true, + "license": "MIT", "dependencies": { "through": "2" }, @@ -2810,13 +3376,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/stream-combiner": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", "dev": true, + "license": "MIT", "dependencies": { "duplexer": "~0.1.1" } @@ -2825,6 +3393,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -2832,13 +3401,15 @@ "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/string-argv": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.1.2.tgz", "integrity": "sha512-mBqPGEOMNJKXRo7z0keX0wlAhbBAjilUdPW13nN0PecVryZxdHIeM7TqbsSUA7VYuS00HGC6mojP7DlQzfa9ZA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.19" } @@ -2847,6 +3418,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2860,6 +3432,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2872,6 +3445,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2883,6 +3457,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -2891,10 +3466,11 @@ } }, "node_modules/table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -2907,15 +3483,16 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -2926,41 +3503,105 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -2971,7 +3612,8 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, "node_modules/ts-mixer": { "version": "6.0.4", @@ -2984,6 +3626,7 @@ "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-4.6.2.tgz", "integrity": "sha512-eHWzZGkPmzXVGQKbqQgf3BFpGiZZw1jQ29ZOJeaSe8JfyUvphbd221NfXmmsJUGGPGA/nnaSS01tXipUcyxAxg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "node-cleanup": "^2.1.2", @@ -3002,9 +3645,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/tsutils": { @@ -3012,6 +3655,7 @@ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -3026,13 +3670,27 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -3045,6 +3703,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -3053,9 +3712,9 @@ } }, "node_modules/typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3063,33 +3722,36 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/tz-offset": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tz-offset/-/tz-offset-0.0.1.tgz", - "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==" + "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==", + "license": "ISC" }, "node_modules/undici": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", - "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "version": "6.21.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.1.tgz", + "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==", "license": "MIT", "engines": { "node": ">=18.17" } }, "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "license": "ISC" }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -3097,23 +3759,27 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", + "dev": true, + "license": "MIT" }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -3124,6 +3790,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3138,15 +3805,17 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3154,12 +3823,13 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -3180,7 +3850,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" } } } diff --git a/package.json b/package.json index 270b55ac..34fb2cb7 100644 --- a/package.json +++ b/package.json @@ -21,9 +21,9 @@ "autodoc": "node dist/autodoc/writecommands.js && autodoc/movemd.sh" }, "binary": { - "module_name": "your_module", - "module_path": "./lib/binding/", - "host": "https://your_module.s3-us-west-1.amazonaws.com" + "module_name": "your_module", + "module_path": "./lib/binding/", + "host": "https://your_module.s3-us-west-1.amazonaws.com" }, "repository": { "type": "git", @@ -36,12 +36,12 @@ }, "homepage": "https://github.com/ud-cis-discord/SageV2", "dependencies": { + "@discordjs/node-pre-gyp": "0.4.5", "@octokit/rest": "^18.3.5", "axios": "^1.4.0", - "canvas": "^2.11.2", + "canvas": "^3.1.0", "console-stamp": "^3.0.2", "discord.js": "^14.16.3", - "@discordjs/node-pre-gyp": "0.4.5", "module-alias": "^2.2.2", "moment": "^2.29.1", "mongodb": "^3.6.3", diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index aab47985..d4ed6d9a 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -19,9 +19,23 @@ const questions = [ 'What city do you want to be located?', 'Remote, hybrid, and/or in-person?', 'Full time, Part time, and/or Internship?', - 'How far are you willing to travel? (in miles)' + 'How far are you willing to travel? (in miles)', + 'What are your salary expectations?' ], - ['Interest 1', 'Interest 2', 'Interest 3', 'Interest 4', 'Interest 5'] + [ + 'Interest 1', + 'Interest 2', + 'Interest 3', + 'Interest 4', + 'Interest 5' + ], + [ + 'Strength 1', + 'Strength 2', + 'Strength 3', + 'Goal 1', + 'Goal 2' + ] ]; // prettier-ignore @@ -34,12 +48,13 @@ export default class extends Command { options: ApplicationCommandOptionData[] = [ { name: 'qset', - description: 'Which question set do you want to view (1 or 2).', + description: 'Which question set do you want to view (1, 2, or 3).', type: ApplicationCommandOptionType.Number, required: true, choices: [ { name: 'qset 1', value: 1 }, - { name: 'qset 2', value: 2 } + { name: 'qset 2', value: 2 }, + { name: 'qset 3', value: 3 } ] } ]; @@ -47,15 +62,15 @@ export default class extends Command { async run(interaction: ChatInputCommandInteraction): Promise | void> { const questionSet = interaction.options.getNumber('qset') - 1; - if (questionSet !== 0 && questionSet !== 1) { - await interaction.reply({ content: 'Please enter either 1 or 2' }); + if (questionSet !== 0 && questionSet !== 1 && questionSet !== 2) { + await interaction.reply({ content: 'Please enter either 1, 2, or 3' }); return; } // Creates the modal that pops up once the command is run, giving it the correct title and set of questions. const modal = new ModalBuilder() .setCustomId(`jobModal${questionSet}`) - .setTitle(`Job Form (${questionSet + 1} of 2)`); + .setTitle(`Job Form (${questionSet + 1} of 3)`); const askedQuestions = questions[questionSet]; const rows = askedQuestions.map((question) => diff --git a/src/pieces/blacklist.ts b/src/pieces/blacklist.ts index 6f698939..36257c21 100644 --- a/src/pieces/blacklist.ts +++ b/src/pieces/blacklist.ts @@ -88,7 +88,7 @@ async function register(bot: Client): Promise { if (msg.partial) { msg = await msg.fetch(); } - msg = msg as Message; + msg = msg as Message; filterMessages(msg).catch(async error => bot.emit('error', error)); }); From a59146d6de5079cab96f187844141632061161ff Mon Sep 17 00:00:00 2001 From: rkhadija1 <131796778+rkhadija1@users.noreply.github.com> Date: Mon, 10 Mar 2025 12:55:29 -0400 Subject: [PATCH 260/267] fixed the message line in the blacklist file --- src/pieces/blacklist.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pieces/blacklist.ts b/src/pieces/blacklist.ts index 6f698939..36257c21 100644 --- a/src/pieces/blacklist.ts +++ b/src/pieces/blacklist.ts @@ -88,7 +88,7 @@ async function register(bot: Client): Promise { if (msg.partial) { msg = await msg.fetch(); } - msg = msg as Message; + msg = msg as Message; filterMessages(msg).catch(async error => bot.emit('error', error)); }); From 46c42c68cc7fc09b8a0f9089aa7cc6d55a17bbc2 Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Mon, 17 Mar 2025 12:39:48 -0400 Subject: [PATCH 261/267] Added filtering options --- src/commands/jobs/jobs.ts | 58 +++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index a8b4b87d..2d0c5cfe 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -14,6 +14,20 @@ export default class extends Command { description = `Get a listing of jobs based on your interests and preferences.`; extendedHelp = `This command will return a listing of jobs based on your interests and preferences.`; + options: ApplicationCommandOptionData[] = [ + { + name: 'filter', + description: 'Filter options for job listings', + type: ApplicationCommandOptionType.String, + required: false, + choices: [ + { name: 'Date Posted', value: 'date' }, + { name: 'Salary', value: 'salary' }, + { name: 'Alphabetical', value: 'alphabetical' } + ] + } + ] + // options: ApplicationCommandOptionData[] = [ // { // name: 'question', @@ -23,28 +37,6 @@ export default class extends Command { // } // ] - // options: ApplicationCommandOptionData[] = [ - // { - // name: 'filter Options', - // description: 'Filter options for job listings', - // type: ApplicationCommandOptionType.String, - // required: false, - // choices: [ - // { - // name: 'Date', - // value: 'date' - // }, - // { - // name: 'Salary', - // value: 'salary' - // }, - // { - // name: 'Alphabetical', - // value: 'alphabetical' - // } - // ] - // } - // ] async run(interaction: ChatInputCommandInteraction): Promise> { const userID = interaction.user.id; @@ -89,16 +81,17 @@ export default class extends Command { const APIResponse:JobResult[] = await fetchJobListings(jobData, interests); const results = [jobData, interests, APIResponse]; const jobFormData: [JobData, Interest, JobResult[]] = [jobData, interests, APIResponse]; + const filterBy = interaction.options.getString('filter') ?? 'default'; let message = `## Hey <@${userID}>! ## Here's your list of job/internship recommendations: - Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ - **${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get\ - job/internship recommendations from the same company,\ - their positions/details/applications/salary WILL be different and this is not a glitch/bug! - Here's your personalized list: +Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ +**${jobFormData[1].interest3}**, **${jobFormData[1].interest4}**, and **${jobFormData[1].interest5}**, I've found these jobs you may find interesting. Please note that while you may get\ +job/internship recommendations from the same company,\ +their positions/details/applications/salary WILL be different and this is not a glitch/bug! +Here's your personalized list: - ${this.listJobs(jobFormData[2], 'date')} + ${this.listJobs(jobFormData[2], filterBy)} --- ### **Disclaimer:** @@ -134,8 +127,14 @@ export default class extends Command { return avgB - avgA; // Descending order }); + } else if (filterBy === 'alphabetical') { + jobData.sort((a, b) => (a.title > b.title ? 1 : -1)); } - + else if (filterBy === 'date') { + jobData.sort((a, b) => new Date(a.created).getTime() - new Date(b.created).getTime()); + } + + let jobList = ''; for (let i = 0; i < jobData.length; i++) { const avgSalary = (Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2; @@ -150,6 +149,7 @@ export default class extends Command { jobList += `${i + 1}. **${jobData[i].title}** \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} \t\t* **Location:** ${jobData[i].location} + \t\t* **Date Posted:** ${new Date(jobData[i].created).toDateString()} at ${new Date(jobData[i].created).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })} \t\t* **Apply here:** [read more about the job and apply here](${jobData[i].link}) ${i !== jobData.length - 1 ? '\n' : ''}`; } From c5c93efd5a01af7f6d3146b4b684f0f0efda6086 Mon Sep 17 00:00:00 2001 From: Karanvir Date: Mon, 7 Apr 2025 21:00:27 -0400 Subject: [PATCH 262/267] Clean commit: embed changes without secret files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 23593b77..d3c9ea1b 100644 --- a/.gitignore +++ b/.gitignore @@ -113,3 +113,5 @@ dist # TernJS port file .tern-port +.history/ +.history/ From a0f7564f933aef7b5450e7584f69d748acdace43 Mon Sep 17 00:00:00 2001 From: Karanvir Date: Mon, 7 Apr 2025 21:08:29 -0400 Subject: [PATCH 263/267] Ignore .history folder and prevent future secret leaks --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d3c9ea1b..0f05eed6 100644 --- a/.gitignore +++ b/.gitignore @@ -114,4 +114,4 @@ dist # TernJS port file .tern-port .history/ -.history/ + From b1bb9aabd4a89e76f11ee18a69520a6db8047c56 Mon Sep 17 00:00:00 2001 From: Karanvir Date: Mon, 7 Apr 2025 21:26:13 -0400 Subject: [PATCH 264/267] Fix: Sync lock file to resolve CI install error --- package-lock.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 7bc2f023..78631f65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,8 +7,10 @@ "": { "name": "sage", "version": "3.3.0", + "hasInstallScript": true, "license": "MIT", "dependencies": { + "@discordjs/node-pre-gyp": "0.4.5", "@octokit/rest": "^18.3.5", "axios": "^1.4.0", "canvas": "^2.11.2", @@ -16,7 +18,7 @@ "discord.js": "^14.16.3", "module-alias": "^2.2.2", "moment": "^2.29.1", - "mongodb": "^3.7.4", + "mongodb": "^3.6.3", "node-cron": "^2.0.3", "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", @@ -200,6 +202,25 @@ "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", "license": "MIT" }, + "node_modules/@discordjs/node-pre-gyp": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.5.tgz", + "integrity": "sha512-YJOVVZ545x24mHzANfYoy0BJX5PDyeZlpiJjDkUBM/V/Ao7TFX9lcUvCN4nr0tbr5ubeaXxtEBILUrHtTphVeQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "node_modules/@discordjs/rest": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.0.tgz", From d86cb5b85185ca6c17002516b3c525818f5d9b4b Mon Sep 17 00:00:00 2001 From: Karanvir Date: Mon, 7 Apr 2025 22:17:08 -0400 Subject: [PATCH 265/267] fixing embed --- src/commands/jobs/jobs.ts | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index 2d0c5cfe..a76c69bf 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -108,7 +108,32 @@ Here's your personalized list: const pubChan = interaction.channel; if (pubChan) { - pubChan.send({ content: message }); + for (let i = 0; i < Math.min(3, jobFormData[2].length); i++) { + const job = jobFormData[2][i]; + + // calc avg salary for display + const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; + const formattedAvgSalary = this.formatCurrency(avgSalary); + + // Formating date the job was posted + const postedDate = new Date(job.created).toDateString(); + + // Building a rich embed message to display job info + const embed = new EmbedBuilder() + .setTitle(`${job.title}`) // Set the job title as the embed title + .setURL(job.link) // Make the embed title clickable to the job listing + .setDescription(`Job opportunity found for you!`) + .addFields( // Add relevant fields as name-value pairs + { name: 'Average Salary', value: formattedAvgSalary || 'N/A', inline: true }, + { name: 'Location', value: job.location || 'N/A', inline: true }, + { name: 'Date Posted', value: postedDate, inline: true }, + ) + .setColor(0x00AE86) + .setFooter({ text: 'Powered by SageBot & Adzuna' }); + + // Send the embed into the same channel the command was triggered in + await pubChan.send({ embeds: [embed] }); + } } else { console.error('Channel not found'); } From 931c13abc88977e1908268ae1912e067bdd33d50 Mon Sep 17 00:00:00 2001 From: Karanvir Date: Mon, 7 Apr 2025 22:21:03 -0400 Subject: [PATCH 266/267] Fix: ESLint auto-fixes in jobs.ts --- src/commands/jobs/jobs.ts | 43 +++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index a76c69bf..f9244cd9 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -109,28 +109,28 @@ Here's your personalized list: const pubChan = interaction.channel; if (pubChan) { for (let i = 0; i < Math.min(3, jobFormData[2].length); i++) { - const job = jobFormData[2][i]; - + const job = jobFormData[2][i]; + // calc avg salary for display const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; const formattedAvgSalary = this.formatCurrency(avgSalary); - + // Formating date the job was posted const postedDate = new Date(job.created).toDateString(); - + // Building a rich embed message to display job info const embed = new EmbedBuilder() - .setTitle(`${job.title}`) // Set the job title as the embed title - .setURL(job.link) // Make the embed title clickable to the job listing - .setDescription(`Job opportunity found for you!`) - .addFields( // Add relevant fields as name-value pairs + .setTitle(`${job.title}`) // Set the job title as the embed title + .setURL(job.link) // Make the embed title clickable to the job listing + .setDescription(`Job opportunity found for you!`) + .addFields( // Add relevant fields as name-value pairs { name: 'Average Salary', value: formattedAvgSalary || 'N/A', inline: true }, { name: 'Location', value: job.location || 'N/A', inline: true }, - { name: 'Date Posted', value: postedDate, inline: true }, + { name: 'Date Posted', value: postedDate, inline: true } ) - .setColor(0x00AE86) - .setFooter({ text: 'Powered by SageBot & Adzuna' }); - + .setColor(0x00AE86) + .setFooter({ text: 'Powered by SageBot & Adzuna' }); + // Send the embed into the same channel the command was triggered in await pubChan.send({ embeds: [embed] }); } @@ -145,17 +145,16 @@ Here's your personalized list: jobData.sort((a, b) => { const avgA = (Number(a.salaryMax) + Number(a.salaryMin)) / 2; const avgB = (Number(b.salaryMax) + Number(b.salaryMin)) / 2; - + // Handle cases where salaryMax or salaryMin is "Not listed" if (isNaN(avgA)) return 1; // Treat jobs with no salary info as lowest if (isNaN(avgB)) return -1; - + return avgB - avgA; // Descending order }); } else if (filterBy === 'alphabetical') { - jobData.sort((a, b) => (a.title > b.title ? 1 : -1)); - } - else if (filterBy === 'date') { + jobData.sort((a, b) => a.title > b.title ? 1 : -1); + } else if (filterBy === 'date') { jobData.sort((a, b) => new Date(a.created).getTime() - new Date(b.created).getTime()); } @@ -166,11 +165,11 @@ Here's your personalized list: const formattedAvgSalary = this.formatCurrency(avgSalary); const formattedSalaryMax = this.formatCurrency(Number(jobData[i].salaryMax)) !== 'N/A' ? this.formatCurrency(Number(jobData[i].salaryMax)) : ''; const formattedSalaryMin = this.formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? this.formatCurrency(Number(jobData[i].salaryMin)) : ''; - - const salaryDetails = (formattedSalaryMin && formattedSalaryMax) + + const salaryDetails = formattedSalaryMin && formattedSalaryMax ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` : formattedAvgSalary; - + jobList += `${i + 1}. **${jobData[i].title}** \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} \t\t* **Location:** ${jobData[i].location} @@ -178,7 +177,7 @@ Here's your personalized list: \t\t* **Apply here:** [read more about the job and apply here](${jobData[i].link}) ${i !== jobData.length - 1 ? '\n' : ''}`; } - + return jobList || '### Unfortunately, there were no jobs found based on your interests :(. Consider updating your interests or waiting until something is found.'; } @@ -188,6 +187,6 @@ Here's your personalized list: currency: 'USD' }).format(Number(currency))}`; } - + } From 92c9308e14235059f5ca71e074c0fb9aacb5880e Mon Sep 17 00:00:00 2001 From: Karanvir Date: Mon, 7 Apr 2025 22:44:02 -0400 Subject: [PATCH 267/267] fixed dependency issue --- build/Makefile | 347 +++++++++++++++++ build/binding.Makefile | 6 + build/binding.sln | 19 - build/config.gypi | 126 +++--- build/gyp-mac-tool | 772 +++++++++++++++++++++++++++++++++++++ build/sage.target.mk | 161 ++++++++ build/sage.vcxproj | 146 ------- build/sage.vcxproj.filters | 67 ---- package-lock.json | 550 ++++++-------------------- tsconfig.json | 31 +- 10 files changed, 1453 insertions(+), 772 deletions(-) create mode 100644 build/Makefile create mode 100644 build/binding.Makefile delete mode 100644 build/binding.sln create mode 100755 build/gyp-mac-tool create mode 100644 build/sage.target.mk delete mode 100644 build/sage.vcxproj delete mode 100644 build/sage.vcxproj.filters diff --git a/build/Makefile b/build/Makefile new file mode 100644 index 00000000..f3daedcc --- /dev/null +++ b/build/Makefile @@ -0,0 +1,347 @@ +# We borrow heavily from the kernel build setup, though we are simpler since +# we don't have Kconfig tweaking settings on us. + +# The implicit make rules have it looking for RCS files, among other things. +# We instead explicitly write all the rules we care about. +# It's even quicker (saves ~200ms) to pass -r on the command line. +MAKEFLAGS=-r + +# The source directory tree. +srcdir := .. +abs_srcdir := $(abspath $(srcdir)) + +# The name of the builddir. +builddir_name ?= . + +# The V=1 flag on command line makes us verbosely print command lines. +ifdef V + quiet= +else + quiet=quiet_ +endif + +# Specify BUILDTYPE=Release on the command line for a release build. +BUILDTYPE ?= Release + +# Directory all our build output goes into. +# Note that this must be two directories beneath src/ for unit tests to pass, +# as they reach into the src/ directory for data with relative paths. +builddir ?= $(builddir_name)/$(BUILDTYPE) +abs_builddir := $(abspath $(builddir)) +depsdir := $(builddir)/.deps + +# Object output directory. +obj := $(builddir)/obj +abs_obj := $(abspath $(obj)) + +# We build up a list of every single one of the targets so we can slurp in the +# generated dependency rule Makefiles in one pass. +all_deps := + + + +CC.target ?= $(CC) +CFLAGS.target ?= $(CPPFLAGS) $(CFLAGS) +CXX.target ?= $(CXX) +CXXFLAGS.target ?= $(CPPFLAGS) $(CXXFLAGS) +LINK.target ?= $(LINK) +LDFLAGS.target ?= $(LDFLAGS) +AR.target ?= $(AR) +PLI.target ?= pli + +# C++ apps need to be linked with g++. +LINK ?= $(CXX.target) + +# TODO(evan): move all cross-compilation logic to gyp-time so we don't need +# to replicate this environment fallback in make as well. +CC.host ?= gcc +CFLAGS.host ?= $(CPPFLAGS_host) $(CFLAGS_host) +CXX.host ?= g++ +CXXFLAGS.host ?= $(CPPFLAGS_host) $(CXXFLAGS_host) +LINK.host ?= $(CXX.host) +LDFLAGS.host ?= $(LDFLAGS_host) +AR.host ?= ar +PLI.host ?= pli + +# Define a dir function that can handle spaces. +# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions +# "leading spaces cannot appear in the text of the first argument as written. +# These characters can be put into the argument value by variable substitution." +empty := +space := $(empty) $(empty) + +# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces +replace_spaces = $(subst $(space),?,$1) +unreplace_spaces = $(subst ?,$(space),$1) +dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1))) + +# Flags to make gcc output dependency info. Note that you need to be +# careful here to use the flags that ccache and distcc can understand. +# We write to a dep file on the side first and then rename at the end +# so we can't end up with a broken dep file. +depfile = $(depsdir)/$(call replace_spaces,$@).d +DEPFLAGS = -MMD -MF $(depfile).raw + +# We have to fixup the deps output in a few ways. +# (1) the file output should mention the proper .o file. +# ccache or distcc lose the path to the target, so we convert a rule of +# the form: +# foobar.o: DEP1 DEP2 +# into +# path/to/foobar.o: DEP1 DEP2 +# (2) we want missing files not to cause us to fail to build. +# We want to rewrite +# foobar.o: DEP1 DEP2 \ +# DEP3 +# to +# DEP1: +# DEP2: +# DEP3: +# so if the files are missing, they're just considered phony rules. +# We have to do some pretty insane escaping to get those backslashes +# and dollar signs past make, the shell, and sed at the same time. +# Doesn't work with spaces, but that's fine: .d files have spaces in +# their names replaced with other characters. +define fixup_dep +# The depfile may not exist if the input file didn't have any #includes. +touch $(depfile).raw +# Fixup path as in (1). +sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile) +# Add extra rules as in (2). +# We remove slashes and replace spaces with new lines; +# remove blank lines; +# delete the first line and append a colon to the remaining lines. +sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ + grep -v '^$$' |\ + sed -e 1d -e 's|$$|:|' \ + >> $(depfile) +rm $(depfile).raw +endef + +# Command definitions: +# - cmd_foo is the actual command to run; +# - quiet_cmd_foo is the brief-output summary of the command. + +quiet_cmd_cc = CC($(TOOLSET)) $@ +cmd_cc = $(CC.$(TOOLSET)) -o $@ $< $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c + +quiet_cmd_cxx = CXX($(TOOLSET)) $@ +cmd_cxx = $(CXX.$(TOOLSET)) -o $@ $< $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c + +quiet_cmd_objc = CXX($(TOOLSET)) $@ +cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< + +quiet_cmd_objcxx = CXX($(TOOLSET)) $@ +cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +# Commands for precompiled header files. +quiet_cmd_pch_c = CXX($(TOOLSET)) $@ +cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< +quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ +cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< +quiet_cmd_pch_m = CXX($(TOOLSET)) $@ +cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< +quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ +cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +# gyp-mac-tool is written next to the root Makefile by gyp. +# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd +# already. +quiet_cmd_mac_tool = MACTOOL $(4) $< +cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@" + +quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ +cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4) + +quiet_cmd_infoplist = INFOPLIST $@ +cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" + +quiet_cmd_touch = TOUCH $@ +cmd_touch = touch $@ + +quiet_cmd_copy = COPY $@ +# send stderr to /dev/null to ignore messages when linking directories. +cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@") + +quiet_cmd_symlink = SYMLINK $@ +cmd_symlink = ln -sf "$<" "$@" + +quiet_cmd_alink = LIBTOOL-STATIC $@ +cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool $(GYP_LIBTOOLFLAGS) -static -o $@ $(filter %.o,$^) + +quiet_cmd_link = LINK($(TOOLSET)) $@ +cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) + +quiet_cmd_solink = SOLINK($(TOOLSET)) $@ +cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) + +quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ +cmd_solink_module = $(LINK.$(TOOLSET)) -bundle $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) + + +# Define an escape_quotes function to escape single quotes. +# This allows us to handle quotes properly as long as we always use +# use single quotes and escape_quotes. +escape_quotes = $(subst ','\'',$(1)) +# This comment is here just to include a ' to unconfuse syntax highlighting. +# Define an escape_vars function to escape '$' variable syntax. +# This allows us to read/write command lines with shell variables (e.g. +# $LD_LIBRARY_PATH), without triggering make substitution. +escape_vars = $(subst $$,$$$$,$(1)) +# Helper that expands to a shell command to echo a string exactly as it is in +# make. This uses printf instead of echo because printf's behaviour with respect +# to escape sequences is more portable than echo's across different shells +# (e.g., dash, bash). +exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' + +# Helper to compare the command we're about to run against the command +# we logged the last time we ran the command. Produces an empty +# string (false) when the commands match. +# Tricky point: Make has no string-equality test function. +# The kernel uses the following, but it seems like it would have false +# positives, where one string reordered its arguments. +# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ +# $(filter-out $(cmd_$@), $(cmd_$(1)))) +# We instead substitute each for the empty string into the other, and +# say they're equal if both substitutions produce the empty string. +# .d files contain ? instead of spaces, take that into account. +command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ + $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) + +# Helper that is non-empty when a prerequisite changes. +# Normally make does this implicitly, but we force rules to always run +# so we can check their command lines. +# $? -- new prerequisites +# $| -- order-only dependencies +prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) + +# Helper that executes all postbuilds until one fails. +define do_postbuilds + @E=0;\ + for p in $(POSTBUILDS); do\ + eval $$p;\ + E=$$?;\ + if [ $$E -ne 0 ]; then\ + break;\ + fi;\ + done;\ + if [ $$E -ne 0 ]; then\ + rm -rf "$@";\ + exit $$E;\ + fi +endef + +# do_cmd: run a command via the above cmd_foo names, if necessary. +# Should always run for a given target to handle command-line changes. +# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. +# Third argument, if non-zero, makes it do POSTBUILDS processing. +# Note: We intentionally do NOT call dirx for depfile, since it contains ? for +# spaces already and dirx strips the ? characters. +define do_cmd +$(if $(or $(command_changed),$(prereq_changed)), + @$(call exact_echo, $($(quiet)cmd_$(1))) + @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" + $(if $(findstring flock,$(word 2,$(cmd_$1))), + @$(cmd_$(1)) + @echo " $(quiet_cmd_$(1)): Finished", + @$(cmd_$(1)) + ) + @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) + @$(if $(2),$(fixup_dep)) + $(if $(and $(3), $(POSTBUILDS)), + $(call do_postbuilds) + ) +) +endef + +# Declare the "all" target first so it is the default, +# even though we don't have the deps yet. +.PHONY: all +all: + +# make looks for ways to re-generate included makefiles, but in our case, we +# don't have a direct way. Explicitly telling make that it has nothing to do +# for them makes it go faster. +%.d: ; + +# Use FORCE_DO_CMD to force a target to run. Should be coupled with +# do_cmd. +.PHONY: FORCE_DO_CMD +FORCE_DO_CMD: + +TOOLSET := target +# Suffix rules, putting all outputs into $(obj). +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) + +# Try building from generated source, too. +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) + +$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) + + +ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ + $(findstring $(join ^,$(prefix)),\ + $(join ^,sage.target.mk)))),) + include sage.target.mk +endif + +quiet_cmd_regen_makefile = ACTION Regenerating $@ +cmd_regen_makefile = cd $(srcdir); /usr/local/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/karansingh/Library/Caches/node-gyp/20.11.0" "-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/Users/karansingh/Library/Caches/node-gyp/20.11.0/<(target_arch)/node.lib" "-Dmodule_root_dir=/Users/karansingh/SageTeamY" "-Dnode_engine=v8" "--depth=." "-Goutput_dir=." "--generator-output=build" -I/Users/karansingh/SageTeamY/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/karansingh/Library/Caches/node-gyp/20.11.0/include/node/common.gypi "--toplevel-dir=." binding.gyp +Makefile: $(srcdir)/../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/binding.gyp $(srcdir)/../Library/Caches/node-gyp/20.11.0/include/node/common.gypi $(srcdir)/build/config.gypi + $(call do_cmd,regen_makefile) + +# "all" is a concatenation of the "all" targets from all the included +# sub-makefiles. This is just here to clarify. +all: + +# Add in dependency-tracking rules. $(all_deps) is the list of every single +# target in our tree. Only consider the ones with .d (dependency) info: +d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) +ifneq ($(d_files),) + include $(d_files) +endif diff --git a/build/binding.Makefile b/build/binding.Makefile new file mode 100644 index 00000000..e90d0e3d --- /dev/null +++ b/build/binding.Makefile @@ -0,0 +1,6 @@ +# This file is generated by gyp; do not edit. + +export builddir_name ?= ./build/. +.PHONY: all +all: + $(MAKE) sage diff --git a/build/binding.sln b/build/binding.sln deleted file mode 100644 index 652ef129..00000000 --- a/build/binding.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2015 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sage", "sage.vcxproj", "{CA89C133-1032-EC19-8F42-31354B1BC90F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {CA89C133-1032-EC19-8F42-31354B1BC90F}.Debug|x64.ActiveCfg = Debug|x64 - {CA89C133-1032-EC19-8F42-31354B1BC90F}.Debug|x64.Build.0 = Debug|x64 - {CA89C133-1032-EC19-8F42-31354B1BC90F}.Release|x64.ActiveCfg = Release|x64 - {CA89C133-1032-EC19-8F42-31354B1BC90F}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/build/config.gypi b/build/config.gypi index 4c624a2f..8cb04d64 100644 --- a/build/config.gypi +++ b/build/config.gypi @@ -2,26 +2,16 @@ { "target_defaults": { "cflags": [], - "configurations": { - "Debug": { - "v8_enable_v8_checks": 0, - "variables": {} - }, - "Release": { - "v8_enable_v8_checks": 1, - "variables": {} - } - }, "default_configuration": "Release", "defines": [], "include_dirs": [], "libraries": [], - "msbuild_toolset": "v143", - "msvs_windows_target_platform_version": "10.0.22621.0" + "msvs_configuration_platform": "ARM64", + "xcode_configuration_platform": "arm64" }, "variables": { + "arm_fpu": "neon", "asan": 0, - "clang": 0, "coverage": "false", "dcheck_always_on": 0, "debug_nghttp2": "false", @@ -31,22 +21,21 @@ "enable_pgo_use": "false", "error_on_warn": "false", "force_dynamic_crt": 0, - "host_arch": "x64", - "icu_data_in": "..\\..\\deps\\icu-tmp\\icudt76l.dat", + "host_arch": "arm64", + "icu_data_in": "../../deps/icu-tmp/icudt73l.dat", "icu_endianness": "l", "icu_gyp_path": "tools/icu/icu-generic.gyp", "icu_path": "deps/icu-small", "icu_small": "false", - "icu_ver_major": "76", + "icu_ver_major": "73", + "is_debug": 0, "libdir": "lib", - "llvm_version": "0.0", + "llvm_version": "13.0", "napi_build_version": "0", - "nasm_version": "2.16", "node_builtin_shareable_builtins": [ "deps/cjs-module-lexer/lexer.js", "deps/cjs-module-lexer/dist/lexer.js", - "deps/undici/undici.js", - "deps/amaro/dist/index.js" + "deps/undici/undici.js" ], "node_byteorder": "little", "node_debug_lib": "false", @@ -96,12 +85,7 @@ "lib/internal/assert.js", "lib/internal/assert/assertion_error.js", "lib/internal/assert/calltracker.js", - "lib/internal/assert/myers_diff.js", - "lib/internal/assert/utils.js", - "lib/internal/async_context_frame.js", "lib/internal/async_hooks.js", - "lib/internal/async_local_storage/async_context_frame.js", - "lib/internal/async_local_storage/async_hooks.js", "lib/internal/blob.js", "lib/internal/blocklist.js", "lib/internal/bootstrap/node.js", @@ -147,7 +131,6 @@ "lib/internal/crypto/webcrypto.js", "lib/internal/crypto/webidl.js", "lib/internal/crypto/x509.js", - "lib/internal/data_url.js", "lib/internal/debugger/inspect.js", "lib/internal/debugger/inspect_client.js", "lib/internal/debugger/inspect_repl.js", @@ -159,7 +142,6 @@ "lib/internal/error_serdes.js", "lib/internal/errors.js", "lib/internal/event_target.js", - "lib/internal/events/abort_listener.js", "lib/internal/events/symbols.js", "lib/internal/file.js", "lib/internal/fixed_queue.js", @@ -168,7 +150,6 @@ "lib/internal/fs/cp/cp-sync.js", "lib/internal/fs/cp/cp.js", "lib/internal/fs/dir.js", - "lib/internal/fs/glob.js", "lib/internal/fs/promises.js", "lib/internal/fs/read/context.js", "lib/internal/fs/recursive_watch.js", @@ -183,11 +164,8 @@ "lib/internal/http2/compat.js", "lib/internal/http2/core.js", "lib/internal/http2/util.js", - "lib/internal/inspector/network.js", - "lib/internal/inspector/network_http.js", - "lib/internal/inspector/network_undici.js", + "lib/internal/idna.js", "lib/internal/inspector_async_hook.js", - "lib/internal/inspector_network_tracking.js", "lib/internal/js_stream_socket.js", "lib/internal/legacy/processbinding.js", "lib/internal/linkedlist.js", @@ -211,12 +189,14 @@ "lib/internal/modules/esm/fetch_module.js", "lib/internal/modules/esm/formats.js", "lib/internal/modules/esm/get_format.js", + "lib/internal/modules/esm/handle_process_exit.js", "lib/internal/modules/esm/hooks.js", "lib/internal/modules/esm/initialize_import_meta.js", "lib/internal/modules/esm/load.js", "lib/internal/modules/esm/loader.js", "lib/internal/modules/esm/module_job.js", "lib/internal/modules/esm/module_map.js", + "lib/internal/modules/esm/package_config.js", "lib/internal/modules/esm/resolve.js", "lib/internal/modules/esm/shared_constants.js", "lib/internal/modules/esm/translators.js", @@ -225,7 +205,6 @@ "lib/internal/modules/helpers.js", "lib/internal/modules/package_json_reader.js", "lib/internal/modules/run_main.js", - "lib/internal/modules/typescript.js", "lib/internal/navigator.js", "lib/internal/net.js", "lib/internal/options.js", @@ -242,11 +221,14 @@ "lib/internal/perf/timerify.js", "lib/internal/perf/usertiming.js", "lib/internal/perf/utils.js", + "lib/internal/policy/manifest.js", + "lib/internal/policy/sri.js", "lib/internal/priority_queue.js", + "lib/internal/process/esm_loader.js", "lib/internal/process/execution.js", - "lib/internal/process/finalization.js", "lib/internal/process/per_thread.js", "lib/internal/process/permission.js", + "lib/internal/process/policy.js", "lib/internal/process/pre_execution.js", "lib/internal/process/promises.js", "lib/internal/process/report.js", @@ -256,10 +238,6 @@ "lib/internal/process/worker_thread_only.js", "lib/internal/promise_hooks.js", "lib/internal/querystring.js", - "lib/internal/quic/quic.js", - "lib/internal/quic/state.js", - "lib/internal/quic/stats.js", - "lib/internal/quic/symbols.js", "lib/internal/readline/callbacks.js", "lib/internal/readline/emitKeypressEvents.js", "lib/internal/readline/interface.js", @@ -274,14 +252,12 @@ "lib/internal/source_map/prepare_stack_trace.js", "lib/internal/source_map/source_map.js", "lib/internal/source_map/source_map_cache.js", - "lib/internal/source_map/source_map_cache_map.js", "lib/internal/stream_base_commons.js", "lib/internal/streams/add-abort-signal.js", "lib/internal/streams/compose.js", "lib/internal/streams/destroy.js", "lib/internal/streams/duplex.js", "lib/internal/streams/duplexify.js", - "lib/internal/streams/duplexpair.js", "lib/internal/streams/end-of-stream.js", "lib/internal/streams/from.js", "lib/internal/streams/lazy_transform.js", @@ -296,10 +272,8 @@ "lib/internal/streams/writable.js", "lib/internal/test/binding.js", "lib/internal/test/transfer.js", - "lib/internal/test_runner/assert.js", "lib/internal/test_runner/coverage.js", "lib/internal/test_runner/harness.js", - "lib/internal/test_runner/mock/loader.js", "lib/internal/test_runner/mock/mock.js", "lib/internal/test_runner/mock/mock_timers.js", "lib/internal/test_runner/reporter/dot.js", @@ -307,10 +281,8 @@ "lib/internal/test_runner/reporter/lcov.js", "lib/internal/test_runner/reporter/spec.js", "lib/internal/test_runner/reporter/tap.js", - "lib/internal/test_runner/reporter/utils.js", "lib/internal/test_runner/reporter/v8-serializer.js", "lib/internal/test_runner/runner.js", - "lib/internal/test_runner/snapshot.js", "lib/internal/test_runner/test.js", "lib/internal/test_runner/tests_stream.js", "lib/internal/test_runner/utils.js", @@ -324,8 +296,10 @@ "lib/internal/util/colors.js", "lib/internal/util/comparisons.js", "lib/internal/util/debuglog.js", + "lib/internal/util/embedding.js", "lib/internal/util/inspect.js", "lib/internal/util/inspector.js", + "lib/internal/util/iterable_weak_map.js", "lib/internal/util/parse_args/parse_args.js", "lib/internal/util/parse_args/utils.js", "lib/internal/util/types.js", @@ -339,7 +313,6 @@ "lib/internal/watch_mode/files_watcher.js", "lib/internal/watchdog.js", "lib/internal/webidl.js", - "lib/internal/webstorage.js", "lib/internal/webstreams/adapters.js", "lib/internal/webstreams/compression.js", "lib/internal/webstreams/encoding.js", @@ -352,7 +325,6 @@ "lib/internal/worker.js", "lib/internal/worker/io.js", "lib/internal/worker/js_transferable.js", - "lib/internal/worker/messaging.js", "lib/module.js", "lib/net.js", "lib/os.js", @@ -366,8 +338,6 @@ "lib/readline.js", "lib/readline/promises.js", "lib/repl.js", - "lib/sea.js", - "lib/sqlite.js", "lib/stream.js", "lib/stream/consumers.js", "lib/stream/promises.js", @@ -390,12 +360,11 @@ "lib/worker_threads.js", "lib/zlib.js" ], - "node_module_version": 127, + "node_module_version": 115, "node_no_browser_globals": "false", - "node_prefix": "\\usr\\local", + "node_prefix": "/usr/local", "node_release_urlbase": "https://nodejs.org/download/release/", "node_shared": "false", - "node_shared_ada": "false", "node_shared_brotli": "false", "node_shared_cares": "false", "node_shared_http_parser": "false", @@ -404,30 +373,23 @@ "node_shared_nghttp3": "false", "node_shared_ngtcp2": "false", "node_shared_openssl": "false", - "node_shared_simdjson": "false", - "node_shared_simdutf": "false", - "node_shared_sqlite": "false", - "node_shared_uvwasi": "false", "node_shared_zlib": "false", "node_tag": "", "node_target_type": "executable", - "node_use_amaro": "true", "node_use_bundled_v8": "true", "node_use_node_code_cache": "true", "node_use_node_snapshot": "true", "node_use_openssl": "true", "node_use_v8_platform": "true", - "node_with_ltcg": "true", + "node_with_ltcg": "false", "node_without_node_options": "false", - "node_write_snapshot_as_array_literals": "true", + "node_write_snapshot_as_array_literals": "false", "openssl_is_fips": "false", "openssl_quic": "true", "ossfuzz": "false", - "shlib_suffix": "so.127", + "shlib_suffix": "115.dylib", "single_executable_application": "true", - "target_arch": "x64", - "ubsan": 0, - "use_prefix_to_find_headers": "false", + "target_arch": "arm64", "v8_enable_31bit_smis_on_64bit_arch": 0, "v8_enable_extensible_ro_snapshot": 0, "v8_enable_gdbjit": 0, @@ -439,39 +401,37 @@ "v8_enable_maglev": 0, "v8_enable_object_print": 1, "v8_enable_pointer_compression": 0, - "v8_enable_sandbox": 0, "v8_enable_shared_ro_heap": 1, - "v8_enable_short_builtin_calls": 1, - "v8_enable_wasm_simd256_revec": 1, + "v8_enable_v8_checks": 0, "v8_enable_webassembly": 1, + "v8_no_strict_aliasing": 1, "v8_optimized_debug": 1, "v8_promise_internal_field_count": 1, "v8_random_seed": 0, "v8_trace_maps": 0, "v8_use_siphash": 1, "want_separate_host_toolset": 0, - "nodedir": "C:\\Users\\chris\\AppData\\Local\\node-gyp\\Cache\\22.14.0", - "python": "C:\\Python313\\python.exe", + "xcode_version": "13.0", + "nodedir": "/Users/karansingh/Library/Caches/node-gyp/20.11.0", + "python": "/Library/Frameworks/Python.framework/Versions/3.11/bin/python3", "standalone_static_library": 1, - "msbuild_path": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\MSBuild\\Current\\Bin\\MSBuild.exe", "fallback_to_build": "true", - "build_from_source": "true", - "module": "C:\\Users\\chris\\OneDrive\\Desktop\\CISC367\\Local Sage\\SageTeamY\\lib\\binding\\your_module.node", + "module": "/Users/karansingh/SageTeamY/lib/binding/your_module.node", "module_name": "your_module", - "module_path": "C:\\Users\\chris\\OneDrive\\Desktop\\CISC367\\Local Sage\\SageTeamY\\lib\\binding", - "napi_version": "10", + "module_path": "/Users/karansingh/SageTeamY/lib/binding", + "napi_version": "9", "node_abi_napi": "napi", - "node_napi_label": "node-v127", - "cache": "C:\\Users\\chris\\AppData\\Local\\npm-cache", + "node_napi_label": "node-v115", + "global_prefix": "/usr/local", + "local_prefix": "/Users/karansingh/SageTeamY", + "globalconfig": "/usr/local/etc/npmrc", "engine_strict": "true", - "globalconfig": "C:\\Users\\chris\\AppData\\Roaming\\fnm\\node-versions\\v22.14.0\\installation\\etc\\npmrc", - "global_prefix": "C:\\Users\\chris\\AppData\\Roaming\\fnm\\node-versions\\v22.14.0\\installation", - "init_module": "C:\\Users\\chris\\.npm-init.js", - "local_prefix": "C:\\Users\\chris\\OneDrive\\Desktop\\CISC367\\Local Sage\\SageTeamY", - "node_gyp": "C:\\Users\\chris\\AppData\\Roaming\\fnm\\node-versions\\v22.14.0\\installation\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js", - "npm_version": "10.9.2", - "prefix": "C:\\Users\\chris\\AppData\\Roaming\\fnm\\node-versions\\v22.14.0\\installation", - "userconfig": "C:\\Users\\chris\\.npmrc", - "user_agent": "npm/10.9.2 node/v22.14.0 win32 x64 workspaces/false" + "userconfig": "/Users/karansingh/.npmrc", + "init_module": "/Users/karansingh/.npm-init.js", + "npm_version": "10.2.4", + "node_gyp": "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js", + "cache": "/Users/karansingh/.npm", + "user_agent": "npm/10.2.4 node/v20.11.0 darwin arm64 workspaces/false", + "prefix": "/usr/local" } } diff --git a/build/gyp-mac-tool b/build/gyp-mac-tool new file mode 100755 index 00000000..ffef860c --- /dev/null +++ b/build/gyp-mac-tool @@ -0,0 +1,772 @@ +#!/usr/bin/env python3 +# Generated by gyp. Do not edit. +# Copyright (c) 2012 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Utility functions to perform Xcode-style build steps. + +These functions are executed via gyp-mac-tool when using the Makefile generator. +""" + + +import fcntl +import fnmatch +import glob +import json +import os +import plistlib +import re +import shutil +import struct +import subprocess +import sys +import tempfile + + +def main(args): + executor = MacTool() + exit_code = executor.Dispatch(args) + if exit_code is not None: + sys.exit(exit_code) + + +class MacTool: + """This class performs all the Mac tooling steps. The methods can either be + executed directly, or dispatched from an argument list.""" + + def Dispatch(self, args): + """Dispatches a string command to a method.""" + if len(args) < 1: + raise Exception("Not enough arguments") + + method = "Exec%s" % self._CommandifyName(args[0]) + return getattr(self, method)(*args[1:]) + + def _CommandifyName(self, name_string): + """Transforms a tool name like copy-info-plist to CopyInfoPlist""" + return name_string.title().replace("-", "") + + def ExecCopyBundleResource(self, source, dest, convert_to_binary): + """Copies a resource file to the bundle/Resources directory, performing any + necessary compilation on each resource.""" + convert_to_binary = convert_to_binary == "True" + extension = os.path.splitext(source)[1].lower() + if os.path.isdir(source): + # Copy tree. + # TODO(thakis): This copies file attributes like mtime, while the + # single-file branch below doesn't. This should probably be changed to + # be consistent with the single-file branch. + if os.path.exists(dest): + shutil.rmtree(dest) + shutil.copytree(source, dest) + elif extension == ".xib": + return self._CopyXIBFile(source, dest) + elif extension == ".storyboard": + return self._CopyXIBFile(source, dest) + elif extension == ".strings" and not convert_to_binary: + self._CopyStringsFile(source, dest) + else: + if os.path.exists(dest): + os.unlink(dest) + shutil.copy(source, dest) + + if convert_to_binary and extension in (".plist", ".strings"): + self._ConvertToBinary(dest) + + def _CopyXIBFile(self, source, dest): + """Compiles a XIB file with ibtool into a binary plist in the bundle.""" + + # ibtool sometimes crashes with relative paths. See crbug.com/314728. + base = os.path.dirname(os.path.realpath(__file__)) + if os.path.relpath(source): + source = os.path.join(base, source) + if os.path.relpath(dest): + dest = os.path.join(base, dest) + + args = ["xcrun", "ibtool", "--errors", "--warnings", "--notices"] + + if os.environ["XCODE_VERSION_ACTUAL"] > "0700": + args.extend(["--auto-activate-custom-fonts"]) + if "IPHONEOS_DEPLOYMENT_TARGET" in os.environ: + args.extend( + [ + "--target-device", + "iphone", + "--target-device", + "ipad", + "--minimum-deployment-target", + os.environ["IPHONEOS_DEPLOYMENT_TARGET"], + ] + ) + else: + args.extend( + [ + "--target-device", + "mac", + "--minimum-deployment-target", + os.environ["MACOSX_DEPLOYMENT_TARGET"], + ] + ) + + args.extend( + ["--output-format", "human-readable-text", "--compile", dest, source] + ) + + ibtool_section_re = re.compile(r"/\*.*\*/") + ibtool_re = re.compile(r".*note:.*is clipping its content") + try: + stdout = subprocess.check_output(args) + except subprocess.CalledProcessError as e: + print(e.output) + raise + current_section_header = None + for line in stdout.splitlines(): + if ibtool_section_re.match(line): + current_section_header = line + elif not ibtool_re.match(line): + if current_section_header: + print(current_section_header) + current_section_header = None + print(line) + return 0 + + def _ConvertToBinary(self, dest): + subprocess.check_call( + ["xcrun", "plutil", "-convert", "binary1", "-o", dest, dest] + ) + + def _CopyStringsFile(self, source, dest): + """Copies a .strings file using iconv to reconvert the input into UTF-16.""" + input_code = self._DetectInputEncoding(source) or "UTF-8" + + # Xcode's CpyCopyStringsFile / builtin-copyStrings seems to call + # CFPropertyListCreateFromXMLData() behind the scenes; at least it prints + # CFPropertyListCreateFromXMLData(): Old-style plist parser: missing + # semicolon in dictionary. + # on invalid files. Do the same kind of validation. + import CoreFoundation + + with open(source, "rb") as in_file: + s = in_file.read() + d = CoreFoundation.CFDataCreate(None, s, len(s)) + _, error = CoreFoundation.CFPropertyListCreateFromXMLData(None, d, 0, None) + if error: + return + + with open(dest, "wb") as fp: + fp.write(s.decode(input_code).encode("UTF-16")) + + def _DetectInputEncoding(self, file_name): + """Reads the first few bytes from file_name and tries to guess the text + encoding. Returns None as a guess if it can't detect it.""" + with open(file_name, "rb") as fp: + try: + header = fp.read(3) + except Exception: + return None + if header.startswith(b"\xFE\xFF"): + return "UTF-16" + elif header.startswith(b"\xFF\xFE"): + return "UTF-16" + elif header.startswith(b"\xEF\xBB\xBF"): + return "UTF-8" + else: + return None + + def ExecCopyInfoPlist(self, source, dest, convert_to_binary, *keys): + """Copies the |source| Info.plist to the destination directory |dest|.""" + # Read the source Info.plist into memory. + with open(source) as fd: + lines = fd.read() + + # Insert synthesized key/value pairs (e.g. BuildMachineOSBuild). + plist = plistlib.readPlistFromString(lines) + if keys: + plist.update(json.loads(keys[0])) + lines = plistlib.writePlistToString(plist) + + # Go through all the environment variables and replace them as variables in + # the file. + IDENT_RE = re.compile(r"[_/\s]") + for key in os.environ: + if key.startswith("_"): + continue + evar = "${%s}" % key + evalue = os.environ[key] + lines = lines.replace(lines, evar, evalue) + + # Xcode supports various suffices on environment variables, which are + # all undocumented. :rfc1034identifier is used in the standard project + # template these days, and :identifier was used earlier. They are used to + # convert non-url characters into things that look like valid urls -- + # except that the replacement character for :identifier, '_' isn't valid + # in a URL either -- oops, hence :rfc1034identifier was born. + evar = "${%s:identifier}" % key + evalue = IDENT_RE.sub("_", os.environ[key]) + lines = lines.replace(lines, evar, evalue) + + evar = "${%s:rfc1034identifier}" % key + evalue = IDENT_RE.sub("-", os.environ[key]) + lines = lines.replace(lines, evar, evalue) + + # Remove any keys with values that haven't been replaced. + lines = lines.splitlines() + for i in range(len(lines)): + if lines[i].strip().startswith("${"): + lines[i] = None + lines[i - 1] = None + lines = "\n".join(line for line in lines if line is not None) + + # Write out the file with variables replaced. + with open(dest, "w") as fd: + fd.write(lines) + + # Now write out PkgInfo file now that the Info.plist file has been + # "compiled". + self._WritePkgInfo(dest) + + if convert_to_binary == "True": + self._ConvertToBinary(dest) + + def _WritePkgInfo(self, info_plist): + """This writes the PkgInfo file from the data stored in Info.plist.""" + plist = plistlib.readPlist(info_plist) + if not plist: + return + + # Only create PkgInfo for executable types. + package_type = plist["CFBundlePackageType"] + if package_type != "APPL": + return + + # The format of PkgInfo is eight characters, representing the bundle type + # and bundle signature, each four characters. If that is missing, four + # '?' characters are used instead. + signature_code = plist.get("CFBundleSignature", "????") + if len(signature_code) != 4: # Wrong length resets everything, too. + signature_code = "?" * 4 + + dest = os.path.join(os.path.dirname(info_plist), "PkgInfo") + with open(dest, "w") as fp: + fp.write(f"{package_type}{signature_code}") + + def ExecFlock(self, lockfile, *cmd_list): + """Emulates the most basic behavior of Linux's flock(1).""" + # Rely on exception handling to report errors. + fd = os.open(lockfile, os.O_RDONLY | os.O_NOCTTY | os.O_CREAT, 0o666) + fcntl.flock(fd, fcntl.LOCK_EX) + return subprocess.call(cmd_list) + + def ExecFilterLibtool(self, *cmd_list): + """Calls libtool and filters out '/path/to/libtool: file: foo.o has no + symbols'.""" + libtool_re = re.compile( + r"^.*libtool: (?:for architecture: \S* )?" r"file: .* has no symbols$" + ) + libtool_re5 = re.compile( + r"^.*libtool: warning for library: " + + r".* the table of contents is empty " + + r"\(no object file members in the library define global symbols\)$" + ) + env = os.environ.copy() + # Ref: + # http://www.opensource.apple.com/source/cctools/cctools-809/misc/libtool.c + # The problem with this flag is that it resets the file mtime on the file to + # epoch=0, e.g. 1970-1-1 or 1969-12-31 depending on timezone. + env["ZERO_AR_DATE"] = "1" + libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE, env=env) + err = libtoolout.communicate()[1].decode("utf-8") + for line in err.splitlines(): + if not libtool_re.match(line) and not libtool_re5.match(line): + print(line, file=sys.stderr) + # Unconditionally touch the output .a file on the command line if present + # and the command succeeded. A bit hacky. + if not libtoolout.returncode: + for i in range(len(cmd_list) - 1): + if cmd_list[i] == "-o" and cmd_list[i + 1].endswith(".a"): + os.utime(cmd_list[i + 1], None) + break + return libtoolout.returncode + + def ExecPackageIosFramework(self, framework): + # Find the name of the binary based on the part before the ".framework". + binary = os.path.basename(framework).split(".")[0] + module_path = os.path.join(framework, "Modules") + if not os.path.exists(module_path): + os.mkdir(module_path) + module_template = ( + "framework module %s {\n" + ' umbrella header "%s.h"\n' + "\n" + " export *\n" + " module * { export * }\n" + "}\n" % (binary, binary) + ) + + with open(os.path.join(module_path, "module.modulemap"), "w") as module_file: + module_file.write(module_template) + + def ExecPackageFramework(self, framework, version): + """Takes a path to Something.framework and the Current version of that and + sets up all the symlinks.""" + # Find the name of the binary based on the part before the ".framework". + binary = os.path.basename(framework).split(".")[0] + + CURRENT = "Current" + RESOURCES = "Resources" + VERSIONS = "Versions" + + if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)): + # Binary-less frameworks don't seem to contain symlinks (see e.g. + # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle). + return + + # Move into the framework directory to set the symlinks correctly. + pwd = os.getcwd() + os.chdir(framework) + + # Set up the Current version. + self._Relink(version, os.path.join(VERSIONS, CURRENT)) + + # Set up the root symlinks. + self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary) + self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES) + + # Back to where we were before! + os.chdir(pwd) + + def _Relink(self, dest, link): + """Creates a symlink to |dest| named |link|. If |link| already exists, + it is overwritten.""" + if os.path.lexists(link): + os.remove(link) + os.symlink(dest, link) + + def ExecCompileIosFrameworkHeaderMap(self, out, framework, *all_headers): + framework_name = os.path.basename(framework).split(".")[0] + all_headers = [os.path.abspath(header) for header in all_headers] + filelist = {} + for header in all_headers: + filename = os.path.basename(header) + filelist[filename] = header + filelist[os.path.join(framework_name, filename)] = header + WriteHmap(out, filelist) + + def ExecCopyIosFrameworkHeaders(self, framework, *copy_headers): + header_path = os.path.join(framework, "Headers") + if not os.path.exists(header_path): + os.makedirs(header_path) + for header in copy_headers: + shutil.copy(header, os.path.join(header_path, os.path.basename(header))) + + def ExecCompileXcassets(self, keys, *inputs): + """Compiles multiple .xcassets files into a single .car file. + + This invokes 'actool' to compile all the inputs .xcassets files. The + |keys| arguments is a json-encoded dictionary of extra arguments to + pass to 'actool' when the asset catalogs contains an application icon + or a launch image. + + Note that 'actool' does not create the Assets.car file if the asset + catalogs does not contains imageset. + """ + command_line = [ + "xcrun", + "actool", + "--output-format", + "human-readable-text", + "--compress-pngs", + "--notices", + "--warnings", + "--errors", + ] + is_iphone_target = "IPHONEOS_DEPLOYMENT_TARGET" in os.environ + if is_iphone_target: + platform = os.environ["CONFIGURATION"].split("-")[-1] + if platform not in ("iphoneos", "iphonesimulator"): + platform = "iphonesimulator" + command_line.extend( + [ + "--platform", + platform, + "--target-device", + "iphone", + "--target-device", + "ipad", + "--minimum-deployment-target", + os.environ["IPHONEOS_DEPLOYMENT_TARGET"], + "--compile", + os.path.abspath(os.environ["CONTENTS_FOLDER_PATH"]), + ] + ) + else: + command_line.extend( + [ + "--platform", + "macosx", + "--target-device", + "mac", + "--minimum-deployment-target", + os.environ["MACOSX_DEPLOYMENT_TARGET"], + "--compile", + os.path.abspath(os.environ["UNLOCALIZED_RESOURCES_FOLDER_PATH"]), + ] + ) + if keys: + keys = json.loads(keys) + for key, value in keys.items(): + arg_name = "--" + key + if isinstance(value, bool): + if value: + command_line.append(arg_name) + elif isinstance(value, list): + for v in value: + command_line.append(arg_name) + command_line.append(str(v)) + else: + command_line.append(arg_name) + command_line.append(str(value)) + # Note: actool crashes if inputs path are relative, so use os.path.abspath + # to get absolute path name for inputs. + command_line.extend(map(os.path.abspath, inputs)) + subprocess.check_call(command_line) + + def ExecMergeInfoPlist(self, output, *inputs): + """Merge multiple .plist files into a single .plist file.""" + merged_plist = {} + for path in inputs: + plist = self._LoadPlistMaybeBinary(path) + self._MergePlist(merged_plist, plist) + plistlib.writePlist(merged_plist, output) + + def ExecCodeSignBundle(self, key, entitlements, provisioning, path, preserve): + """Code sign a bundle. + + This function tries to code sign an iOS bundle, following the same + algorithm as Xcode: + 1. pick the provisioning profile that best match the bundle identifier, + and copy it into the bundle as embedded.mobileprovision, + 2. copy Entitlements.plist from user or SDK next to the bundle, + 3. code sign the bundle. + """ + substitutions, overrides = self._InstallProvisioningProfile( + provisioning, self._GetCFBundleIdentifier() + ) + entitlements_path = self._InstallEntitlements( + entitlements, substitutions, overrides + ) + + args = ["codesign", "--force", "--sign", key] + if preserve == "True": + args.extend(["--deep", "--preserve-metadata=identifier,entitlements"]) + else: + args.extend(["--entitlements", entitlements_path]) + args.extend(["--timestamp=none", path]) + subprocess.check_call(args) + + def _InstallProvisioningProfile(self, profile, bundle_identifier): + """Installs embedded.mobileprovision into the bundle. + + Args: + profile: string, optional, short name of the .mobileprovision file + to use, if empty or the file is missing, the best file installed + will be used + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + + Returns: + A tuple containing two dictionary: variables substitutions and values + to overrides when generating the entitlements file. + """ + source_path, provisioning_data, team_id = self._FindProvisioningProfile( + profile, bundle_identifier + ) + target_path = os.path.join( + os.environ["BUILT_PRODUCTS_DIR"], + os.environ["CONTENTS_FOLDER_PATH"], + "embedded.mobileprovision", + ) + shutil.copy2(source_path, target_path) + substitutions = self._GetSubstitutions(bundle_identifier, team_id + ".") + return substitutions, provisioning_data["Entitlements"] + + def _FindProvisioningProfile(self, profile, bundle_identifier): + """Finds the .mobileprovision file to use for signing the bundle. + + Checks all the installed provisioning profiles (or if the user specified + the PROVISIONING_PROFILE variable, only consult it) and select the most + specific that correspond to the bundle identifier. + + Args: + profile: string, optional, short name of the .mobileprovision file + to use, if empty or the file is missing, the best file installed + will be used + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + + Returns: + A tuple of the path to the selected provisioning profile, the data of + the embedded plist in the provisioning profile and the team identifier + to use for code signing. + + Raises: + SystemExit: if no .mobileprovision can be used to sign the bundle. + """ + profiles_dir = os.path.join( + os.environ["HOME"], "Library", "MobileDevice", "Provisioning Profiles" + ) + if not os.path.isdir(profiles_dir): + print( + "cannot find mobile provisioning for %s" % (bundle_identifier), + file=sys.stderr, + ) + sys.exit(1) + provisioning_profiles = None + if profile: + profile_path = os.path.join(profiles_dir, profile + ".mobileprovision") + if os.path.exists(profile_path): + provisioning_profiles = [profile_path] + if not provisioning_profiles: + provisioning_profiles = glob.glob( + os.path.join(profiles_dir, "*.mobileprovision") + ) + valid_provisioning_profiles = {} + for profile_path in provisioning_profiles: + profile_data = self._LoadProvisioningProfile(profile_path) + app_id_pattern = profile_data.get("Entitlements", {}).get( + "application-identifier", "" + ) + for team_identifier in profile_data.get("TeamIdentifier", []): + app_id = f"{team_identifier}.{bundle_identifier}" + if fnmatch.fnmatch(app_id, app_id_pattern): + valid_provisioning_profiles[app_id_pattern] = ( + profile_path, + profile_data, + team_identifier, + ) + if not valid_provisioning_profiles: + print( + "cannot find mobile provisioning for %s" % (bundle_identifier), + file=sys.stderr, + ) + sys.exit(1) + # If the user has multiple provisioning profiles installed that can be + # used for ${bundle_identifier}, pick the most specific one (ie. the + # provisioning profile whose pattern is the longest). + selected_key = max(valid_provisioning_profiles, key=lambda v: len(v)) + return valid_provisioning_profiles[selected_key] + + def _LoadProvisioningProfile(self, profile_path): + """Extracts the plist embedded in a provisioning profile. + + Args: + profile_path: string, path to the .mobileprovision file + + Returns: + Content of the plist embedded in the provisioning profile as a dictionary. + """ + with tempfile.NamedTemporaryFile() as temp: + subprocess.check_call( + ["security", "cms", "-D", "-i", profile_path, "-o", temp.name] + ) + return self._LoadPlistMaybeBinary(temp.name) + + def _MergePlist(self, merged_plist, plist): + """Merge |plist| into |merged_plist|.""" + for key, value in plist.items(): + if isinstance(value, dict): + merged_value = merged_plist.get(key, {}) + if isinstance(merged_value, dict): + self._MergePlist(merged_value, value) + merged_plist[key] = merged_value + else: + merged_plist[key] = value + else: + merged_plist[key] = value + + def _LoadPlistMaybeBinary(self, plist_path): + """Loads into a memory a plist possibly encoded in binary format. + + This is a wrapper around plistlib.readPlist that tries to convert the + plist to the XML format if it can't be parsed (assuming that it is in + the binary format). + + Args: + plist_path: string, path to a plist file, in XML or binary format + + Returns: + Content of the plist as a dictionary. + """ + try: + # First, try to read the file using plistlib that only supports XML, + # and if an exception is raised, convert a temporary copy to XML and + # load that copy. + return plistlib.readPlist(plist_path) + except Exception: + pass + with tempfile.NamedTemporaryFile() as temp: + shutil.copy2(plist_path, temp.name) + subprocess.check_call(["plutil", "-convert", "xml1", temp.name]) + return plistlib.readPlist(temp.name) + + def _GetSubstitutions(self, bundle_identifier, app_identifier_prefix): + """Constructs a dictionary of variable substitutions for Entitlements.plist. + + Args: + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + app_identifier_prefix: string, value for AppIdentifierPrefix + + Returns: + Dictionary of substitutions to apply when generating Entitlements.plist. + """ + return { + "CFBundleIdentifier": bundle_identifier, + "AppIdentifierPrefix": app_identifier_prefix, + } + + def _GetCFBundleIdentifier(self): + """Extracts CFBundleIdentifier value from Info.plist in the bundle. + + Returns: + Value of CFBundleIdentifier in the Info.plist located in the bundle. + """ + info_plist_path = os.path.join( + os.environ["TARGET_BUILD_DIR"], os.environ["INFOPLIST_PATH"] + ) + info_plist_data = self._LoadPlistMaybeBinary(info_plist_path) + return info_plist_data["CFBundleIdentifier"] + + def _InstallEntitlements(self, entitlements, substitutions, overrides): + """Generates and install the ${BundleName}.xcent entitlements file. + + Expands variables "$(variable)" pattern in the source entitlements file, + add extra entitlements defined in the .mobileprovision file and the copy + the generated plist to "${BundlePath}.xcent". + + Args: + entitlements: string, optional, path to the Entitlements.plist template + to use, defaults to "${SDKROOT}/Entitlements.plist" + substitutions: dictionary, variable substitutions + overrides: dictionary, values to add to the entitlements + + Returns: + Path to the generated entitlements file. + """ + source_path = entitlements + target_path = os.path.join( + os.environ["BUILT_PRODUCTS_DIR"], os.environ["PRODUCT_NAME"] + ".xcent" + ) + if not source_path: + source_path = os.path.join(os.environ["SDKROOT"], "Entitlements.plist") + shutil.copy2(source_path, target_path) + data = self._LoadPlistMaybeBinary(target_path) + data = self._ExpandVariables(data, substitutions) + if overrides: + for key in overrides: + if key not in data: + data[key] = overrides[key] + plistlib.writePlist(data, target_path) + return target_path + + def _ExpandVariables(self, data, substitutions): + """Expands variables "$(variable)" in data. + + Args: + data: object, can be either string, list or dictionary + substitutions: dictionary, variable substitutions to perform + + Returns: + Copy of data where each references to "$(variable)" has been replaced + by the corresponding value found in substitutions, or left intact if + the key was not found. + """ + if isinstance(data, str): + for key, value in substitutions.items(): + data = data.replace("$(%s)" % key, value) + return data + if isinstance(data, list): + return [self._ExpandVariables(v, substitutions) for v in data] + if isinstance(data, dict): + return {k: self._ExpandVariables(data[k], substitutions) for k in data} + return data + + +def NextGreaterPowerOf2(x): + return 2 ** (x).bit_length() + + +def WriteHmap(output_name, filelist): + """Generates a header map based on |filelist|. + + Per Mark Mentovai: + A header map is structured essentially as a hash table, keyed by names used + in #includes, and providing pathnames to the actual files. + + The implementation below and the comment above comes from inspecting: + http://www.opensource.apple.com/source/distcc/distcc-2503/distcc_dist/include_server/headermap.py?txt + while also looking at the implementation in clang in: + https://llvm.org/svn/llvm-project/cfe/trunk/lib/Lex/HeaderMap.cpp + """ + magic = 1751998832 + version = 1 + _reserved = 0 + count = len(filelist) + capacity = NextGreaterPowerOf2(count) + strings_offset = 24 + (12 * capacity) + max_value_length = max(len(value) for value in filelist.values()) + + out = open(output_name, "wb") + out.write( + struct.pack( + " - - - - Debug - x64 - - - Release - x64 - - - - {CA89C133-1032-EC19-8F42-31354B1BC90F} - Win32Proj - sage - true - x64 - 10.0.22621.0 - - - - DynamicLibrary - - - v143 - - - - - - - - - - $(ExecutablePath);$(MSBuildProjectDirectory)\..\bin\;$(MSBuildProjectDirectory)\..\bin\ - true - $(Configuration)\obj\$(ProjectName)\ - false - true - $(SolutionDir)$(Configuration)\ - .node - .node - .node - .node - $(ProjectName) - $(OutDir)\$(ProjectName).node - - - - C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\include\node;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\src;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\config;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\openssl\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\uv\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\zlib;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\v8\include;%(AdditionalIncludeDirectories) - /Zc:__cplusplus -std:c++20 /Zm2000 %(AdditionalOptions) - EnableFastChecks - true - OldStyle - 4351;4355;4800;4251;4275;4244;4267;%(DisableSpecificWarnings) - false - false - true - false - Disabled - NotUsing - NODE_GYP_MODULE_NAME=sage;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;_GLIBCXX_USE_CXX11_ABI=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;NOMINMAX;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";DEBUG;_DEBUG;%(PreprocessorDefinitions) - MultiThreadedDebug - true - true - false - Level3 - true - - - /LTCG:INCREMENTAL %(AdditionalOptions) - - - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;DelayImp.lib;"C:\\Users\\chris\\AppData\\Local\\node-gyp\\Cache\\22.14.0\\x64\\node.lib" - /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) - node.exe;%(DelayLoadDLLs) - true - true - true - $(OutDir)$(ProjectName).node - true - .node - MachineX64 - - - C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\include\node;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\src;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\config;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\openssl\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\uv\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\zlib;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\v8\include;%(AdditionalIncludeDirectories) - NODE_GYP_MODULE_NAME=sage;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;_GLIBCXX_USE_CXX11_ABI=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;NOMINMAX;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";DEBUG;_DEBUG;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - - - - - C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\include\node;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\src;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\config;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\openssl\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\uv\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\zlib;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\v8\include;%(AdditionalIncludeDirectories) - /Zc:__cplusplus -std:c++20 /Zm2000 %(AdditionalOptions) - true - OldStyle - 4351;4355;4800;4251;4275;4244;4267;%(DisableSpecificWarnings) - false - Speed - true - AnySuitable - true - true - true - Full - NotUsing - NODE_GYP_MODULE_NAME=sage;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;_GLIBCXX_USE_CXX11_ABI=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;NOMINMAX;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";%(PreprocessorDefinitions) - MultiThreaded - false - true - true - false - Level3 - true - - - /LTCG:INCREMENTAL %(AdditionalOptions) - - - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;DelayImp.lib;"C:\\Users\\chris\\AppData\\Local\\node-gyp\\Cache\\22.14.0\\x64\\node.lib" - /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) - node.exe;%(DelayLoadDLLs) - true - true - true - $(OutDir)$(ProjectName).node - true - .node - MachineX64 - - - C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\include\node;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\src;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\config;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\openssl\openssl\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\uv\include;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\zlib;C:\Users\chris\AppData\Local\node-gyp\Cache\22.14.0\deps\v8\include;%(AdditionalIncludeDirectories) - NODE_GYP_MODULE_NAME=sage;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;_GLIBCXX_USE_CXX11_ABI=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;NOMINMAX;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";%(PreprocessorDefinitions);%(PreprocessorDefinitions) - - - - - - - - - - - - - diff --git a/build/sage.vcxproj.filters b/build/sage.vcxproj.filters deleted file mode 100644 index de3611e4..00000000 --- a/build/sage.vcxproj.filters +++ /dev/null @@ -1,67 +0,0 @@ - - - - - {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} - - - {8CDEE807-BC53-E450-C8B8-4DEBB66742D4} - - - {7B735499-E5DD-1C2B-6C26-70023832A1CF} - - - {E9F714C1-DA89-54E2-60CF-39FEB20BF756} - - - {B71FC3D6-3F9C-77A3-BF2C-A47B891940C3} - - - {F852EB63-437C-846A-220F-8D9ED6DAEC1D} - - - {D51E5808-912B-5C70-4BB7-475D1DBFA067} - - - {32444292-0D0F-9718-E054-399674062C45} - - - {21C45271-02AD-7F00-716D-A535CE435014} - - - {36890C2C-DAFF-16EA-A2B8-3A765D4A0198} - - - {A1566883-8936-914F-8AFA-D0F4AAB8B5B2} - - - {56DF7A98-063D-FB9D-485C-089023B4C16A} - - - {741E0E76-39B2-B1AB-9FA1-F1A20B16F295} - - - {56DF7A98-063D-FB9D-485C-089023B4C16A} - - - {77348C0E-2034-7791-74D5-63C077DF5A3B} - - - {8CDEE807-BC53-E450-C8B8-4DEBB66742D4} - - - {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} - - - - - ..\src - - - C:\Users\chris\AppData\Roaming\fnm\node-versions\v22.14.0\installation\node_modules\npm\node_modules\node-gyp\src - - - .. - - - diff --git a/package-lock.json b/package-lock.json index 039e4bc1..f4dbebe8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/highlight": "^7.10.4" } @@ -57,7 +56,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -67,7 +65,6 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -83,7 +80,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -96,7 +92,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -111,7 +106,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -120,15 +114,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -138,7 +130,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -148,7 +139,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -160,7 +150,6 @@ "version": "1.10.1", "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.10.1.tgz", "integrity": "sha512-OWo1fY4ztL1/M/DUyRPShB4d/EzVfuUvPTRRHRIt/YxBrUYSz0a+JicD5F5zHFoNs2oTuWavxCOVFV1UljHTng==", - "license": "Apache-2.0", "dependencies": { "@discordjs/formatters": "^0.6.0", "@discordjs/util": "^1.1.1", @@ -181,7 +170,6 @@ "version": "1.5.3", "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==", - "license": "Apache-2.0", "engines": { "node": ">=16.11.0" } @@ -190,7 +178,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.0.tgz", "integrity": "sha512-YIruKw4UILt/ivO4uISmrGq2GdMY6EkoTtD0oS0GvkJFRZbTSdPhzYiUILbJ/QslsvC9H9nTgGgnarnIl4jMfw==", - "license": "Apache-2.0", "dependencies": { "discord-api-types": "^0.37.114" }, @@ -201,26 +188,6 @@ "url": "https://github.com/discordjs/discord.js?sponsor" } }, - "node_modules/@discordjs/node-pre-gyp": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.5.tgz", - "integrity": "sha512-YJOVVZ545x24mHzANfYoy0BJX5PDyeZlpiJjDkUBM/V/Ao7TFX9lcUvCN4nr0tbr5ubeaXxtEBILUrHtTphVeQ==", - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, "node_modules/@discordjs/node-pre-gyp": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.5.tgz", @@ -244,7 +211,6 @@ "version": "2.4.3", "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.3.tgz", "integrity": "sha512-+SO4RKvWsM+y8uFHgYQrcTl/3+cY02uQOH7/7bKbVZsTfrfpoE62o5p+mmV+s7FVhTX82/kQUGGbu4YlV60RtA==", - "license": "Apache-2.0", "dependencies": { "@discordjs/collection": "^2.1.1", "@discordjs/util": "^1.1.1", @@ -267,7 +233,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==", - "license": "Apache-2.0", "engines": { "node": ">=18" }, @@ -279,7 +244,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz", "integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==", - "license": "Apache-2.0", "engines": { "node": ">=18" }, @@ -291,7 +255,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.1.tgz", "integrity": "sha512-PBvenhZG56a6tMWF/f4P6f4GxZKJTBG95n7aiGSPTnodmz4N5g60t79rSIAq7ywMbv8A4jFtexMruH+oe51aQQ==", - "license": "Apache-2.0", "dependencies": { "@discordjs/collection": "^2.1.0", "@discordjs/rest": "^2.4.3", @@ -314,7 +277,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==", - "license": "Apache-2.0", "engines": { "node": ">=18" }, @@ -327,7 +289,6 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -348,7 +309,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -359,7 +319,6 @@ "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "deprecated": "Use @eslint/config-array instead", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -374,15 +333,13 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -396,7 +353,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -406,7 +362,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -419,7 +374,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "license": "MIT", "dependencies": { "@octokit/types": "^6.0.3" } @@ -428,7 +382,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "license": "MIT", "dependencies": { "@octokit/auth-token": "^2.4.4", "@octokit/graphql": "^4.5.8", @@ -443,7 +396,6 @@ "version": "6.0.12", "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "license": "MIT", "dependencies": { "@octokit/types": "^6.0.3", "is-plain-object": "^5.0.0", @@ -454,7 +406,6 @@ "version": "4.8.0", "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "license": "MIT", "dependencies": { "@octokit/request": "^5.6.0", "@octokit/types": "^6.0.3", @@ -464,14 +415,12 @@ "node_modules/@octokit/openapi-types": { "version": "12.11.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "license": "MIT" + "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==" }, "node_modules/@octokit/plugin-paginate-rest": { "version": "2.21.3", "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", - "license": "MIT", "dependencies": { "@octokit/types": "^6.40.0" }, @@ -483,7 +432,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "license": "MIT", "peerDependencies": { "@octokit/core": ">=3" } @@ -492,7 +440,6 @@ "version": "5.16.2", "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", - "license": "MIT", "dependencies": { "@octokit/types": "^6.39.0", "deprecation": "^2.3.1" @@ -505,7 +452,6 @@ "version": "5.6.3", "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "license": "MIT", "dependencies": { "@octokit/endpoint": "^6.0.1", "@octokit/request-error": "^2.1.0", @@ -519,7 +465,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "license": "MIT", "dependencies": { "@octokit/types": "^6.0.3", "deprecation": "^2.0.0", @@ -530,7 +475,6 @@ "version": "18.12.0", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", - "license": "MIT", "dependencies": { "@octokit/core": "^3.5.1", "@octokit/plugin-paginate-rest": "^2.16.8", @@ -542,7 +486,6 @@ "version": "6.41.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "license": "MIT", "dependencies": { "@octokit/openapi-types": "^12.11.0" } @@ -551,7 +494,6 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.5.tgz", "integrity": "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==", - "license": "MIT", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" @@ -561,7 +503,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz", "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" @@ -574,20 +515,19 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==", - "license": "MIT", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, "node_modules/@types/bson": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", - "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.4.tgz", + "integrity": "sha512-SG23E3JDH6y8qF20a4G9txLuUl+TCV16gxsKyntmGiJez2V9VBJr1Y8WxTBBD6OgBVcvspQ7sxgdNMkXFVcaEA==", + "deprecated": "This is a stub types definition. bson provides its own type definitions, so you do not need this installed.", "dev": true, - "license": "MIT", "dependencies": { - "@types/node": "*" + "bson": "*" } }, "node_modules/@types/console-stamp": { @@ -595,7 +535,6 @@ "resolved": "https://registry.npmjs.org/@types/console-stamp/-/console-stamp-0.2.33.tgz", "integrity": "sha512-ISAh9MXEnmW8eP6C0ItiMJX/cqqgUfom9W8XUwk9Ze51PRA01a9J3daWAUL1wDIVDovi7nD/AC6Efj2nJH6JdA==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -604,15 +543,13 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/mongodb": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/bson": "*", "@types/node": "*" @@ -621,15 +558,13 @@ "node_modules/@types/node": { "version": "14.18.63", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", - "license": "MIT" + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" }, "node_modules/@types/node-cron": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-2.0.8.tgz", "integrity": "sha512-YeoqKLt4ElsPHNIwc3tZ86yLRcyZ8GzUN1PbP4dnmBrwMISZfNaiH9OIqHdDq8fnhxxdjHN+G6HYYQ0MaRoDYA==", "dev": true, - "license": "MIT", "dependencies": { "@types/tz-offset": "*" } @@ -639,7 +574,6 @@ "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "form-data": "^4.0.0" @@ -650,7 +584,6 @@ "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.17.tgz", "integrity": "sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -659,14 +592,12 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/@types/tz-offset/-/tz-offset-0.0.3.tgz", "integrity": "sha512-JPieQFasx+g7DQE0jRf1Vw7k7ak9LCLWnzcis/fcVwnfTuGwo7XRI4q/BaBTxatAVI2Ea/+d/4thzdN3yOu19A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==", - "license": "MIT", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dependencies": { "@types/node": "*" } @@ -676,7 +607,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "4.33.0", "@typescript-eslint/scope-manager": "4.33.0", @@ -709,7 +639,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.7", "@typescript-eslint/scope-manager": "4.33.0", @@ -734,7 +663,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "4.33.0", "@typescript-eslint/types": "4.33.0", @@ -762,7 +690,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.33.0", "@typescript-eslint/visitor-keys": "4.33.0" @@ -780,7 +707,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", "dev": true, - "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -794,7 +720,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "4.33.0", "@typescript-eslint/visitor-keys": "4.33.0", @@ -822,7 +747,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.33.0", "eslint-visitor-keys": "^2.0.0" @@ -839,7 +763,6 @@ "version": "2.4.6", "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz", "integrity": "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==", - "license": "MIT", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" @@ -848,15 +771,13 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -869,7 +790,6 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -878,7 +798,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", "dependencies": { "debug": "4" }, @@ -891,7 +810,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -908,7 +826,6 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -917,7 +834,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -926,7 +842,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -940,15 +855,13 @@ "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "license": "ISC" + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "deprecated": "This package is no longer supported.", - "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -961,7 +874,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -976,7 +888,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -986,7 +897,6 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -996,7 +906,6 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1004,14 +913,12 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", - "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", - "license": "MIT", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -1021,8 +928,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -1041,20 +947,17 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "license": "Apache-2.0" + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, "node_modules/bl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "license": "MIT", "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -1064,7 +967,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1075,7 +977,6 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1084,12 +985,12 @@ } }, "node_modules/bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", - "license": "Apache-2.0", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz", + "integrity": "sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==", + "dev": true, "engines": { - "node": ">=0.6.19" + "node": ">=16.20.1" } }, "node_modules/buffer": { @@ -1110,7 +1011,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1120,7 +1020,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -1134,7 +1033,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -1144,7 +1042,6 @@ "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.1.0.tgz", "integrity": "sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.1" @@ -1157,7 +1054,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1173,7 +1069,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", "engines": { "node": ">=10" } @@ -1182,7 +1077,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1193,14 +1087,12 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", "bin": { "color-support": "bin.js" } @@ -1209,7 +1101,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1220,20 +1111,17 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "node_modules/console-stamp": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/console-stamp/-/console-stamp-3.1.2.tgz", "integrity": "sha512-ab66x3NxOTxPuq71dI6gXEiw2X6ql4Le5gZz0bm7FW3FSCB00eztra/oQUuCoCGlsyKOxtULnHwphzMrRtzMBg==", - "license": "MIT", "dependencies": { "chalk": "^4.1.2", "dateformat": "^4.6.3" @@ -1245,15 +1133,13 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1267,7 +1153,6 @@ "version": "4.6.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", - "license": "MIT", "engines": { "node": "*" } @@ -1276,7 +1161,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -1293,7 +1177,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -1308,7 +1191,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -1317,14 +1199,12 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -1332,14 +1212,12 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "node_modules/denque": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "license": "Apache-2.0", "engines": { "node": ">=0.10" } @@ -1347,14 +1225,12 @@ "node_modules/deprecation": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "license": "ISC" + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "license": "Apache-2.0", "engines": { "node": ">=8" } @@ -1364,7 +1240,6 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -1375,14 +1250,12 @@ "node_modules/discord-api-types": { "version": "0.37.119", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.119.tgz", - "integrity": "sha512-WasbGFXEB+VQWXlo6IpW3oUv73Yuau1Ig4AZF/m13tXcTKnMpc/mHjpztIlz4+BM9FG9BHQkEXiPto3bKduQUg==", - "license": "MIT" + "integrity": "sha512-WasbGFXEB+VQWXlo6IpW3oUv73Yuau1Ig4AZF/m13tXcTKnMpc/mHjpztIlz4+BM9FG9BHQkEXiPto3bKduQUg==" }, "node_modules/discord.js": { "version": "14.18.0", "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.18.0.tgz", "integrity": "sha512-SvU5kVUvwunQhN2/+0t55QW/1EHfB1lp0TtLZUSXVHDmyHTrdOj5LRKdR0zLcybaA15F+NtdWuWmGOX9lE+CAw==", - "license": "Apache-2.0", "dependencies": { "@discordjs/builders": "^1.10.1", "@discordjs/collection": "1.5.3", @@ -1409,7 +1282,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -1421,7 +1293,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -1435,20 +1306,17 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -1458,7 +1326,6 @@ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -1471,7 +1338,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1480,7 +1346,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1489,7 +1354,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -1501,7 +1365,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -1517,7 +1380,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -1531,7 +1393,6 @@ "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -1589,7 +1450,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -1603,7 +1463,6 @@ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -1622,7 +1481,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10" } @@ -1632,7 +1490,6 @@ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -1648,7 +1505,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -1658,7 +1514,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -1668,7 +1523,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -1683,7 +1537,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -1693,7 +1546,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -1707,7 +1559,6 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -1720,7 +1571,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1730,7 +1580,6 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -1743,7 +1592,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1753,7 +1601,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1763,7 +1610,6 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -1773,7 +1619,6 @@ "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", "dev": true, - "license": "MIT", "dependencies": { "duplexer": "~0.1.1", "from": "~0", @@ -1788,7 +1633,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", "engines": { "node": ">=6" } @@ -1796,15 +1640,13 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1820,15 +1662,13 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-uri": { "version": "3.0.6", @@ -1844,15 +1684,13 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -1862,7 +1700,6 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -1875,7 +1712,6 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1888,7 +1724,6 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -1902,8 +1737,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/follow-redirects": { "version": "1.15.9", @@ -1915,7 +1749,6 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1929,7 +1762,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1944,20 +1776,17 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -1969,7 +1798,6 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -1980,14 +1808,12 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1996,15 +1822,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "deprecated": "This package is no longer supported.", - "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -2024,7 +1848,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -2048,7 +1871,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -2060,15 +1882,13 @@ "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2089,7 +1909,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -2102,7 +1921,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -2118,7 +1936,6 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -2138,7 +1955,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2150,7 +1966,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -2159,7 +1974,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2171,7 +1985,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -2185,14 +1998,12 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -2204,7 +2015,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -2230,15 +2040,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -2248,7 +2056,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2265,7 +2072,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -2275,7 +2081,6 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2284,21 +2089,18 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2307,7 +2109,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", "engines": { "node": ">=8" } @@ -2317,7 +2118,6 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2330,7 +2130,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -2339,7 +2138,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2347,29 +2145,25 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -2382,29 +2176,25 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -2414,7 +2204,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -2426,40 +2215,34 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", - "license": "MIT" + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/magic-bytes.js": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", - "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==", - "license": "MIT" + "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==" }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -2474,7 +2257,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -2489,7 +2271,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -2498,7 +2279,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "license": "MIT", "optional": true }, "node_modules/merge2": { @@ -2506,7 +2286,6 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -2516,7 +2295,6 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -2529,7 +2307,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2538,7 +2315,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -2550,7 +2326,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -2562,7 +2337,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2574,7 +2348,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2583,7 +2356,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", "engines": { "node": ">=8" } @@ -2592,7 +2364,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -2605,7 +2376,6 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2617,7 +2387,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -2628,20 +2397,17 @@ "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/module-alias": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz", - "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==", - "license": "MIT" + "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==" }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", "engines": { "node": "*" } @@ -2650,7 +2416,6 @@ "version": "3.7.4", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", - "license": "Apache-2.0", "dependencies": { "bl": "^2.2.1", "bson": "^1.1.4", @@ -2685,30 +2450,34 @@ } } }, + "node_modules/mongodb/node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/napi-build-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==" }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/node-abi": { "version": "3.74.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", - "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -2719,22 +2488,19 @@ "node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT" + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" }, "node_modules/node-cleanup": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/node-cron": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-2.0.3.tgz", "integrity": "sha512-eJI+QitXlwcgiZwNNSRbqsjeZMp5shyajMR81RZCqeW0ZDEj4zU9tpd4nTh/1JsBiKbF8d08FCewiipDmVIYjg==", "hasInstallScript": true, - "license": "ISC", "dependencies": { "opencollective-postinstall": "^2.0.0", "tz-offset": "0.0.1" @@ -2747,7 +2513,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -2767,7 +2532,6 @@ "version": "6.10.0", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.0.tgz", "integrity": "sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA==", - "license": "MIT-0", "engines": { "node": ">=6.0.0" } @@ -2776,7 +2540,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", "dependencies": { "abbrev": "1" }, @@ -2792,7 +2555,6 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "deprecated": "This package is no longer supported.", - "license": "ISC", "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -2804,7 +2566,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2813,7 +2574,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -2822,7 +2582,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", - "license": "MIT", "bin": { "opencollective-postinstall": "index.js" } @@ -2831,7 +2590,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", - "license": "Apache-2.0", "dependencies": { "require-at": "^1.0.6" }, @@ -2844,7 +2602,6 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -2862,7 +2619,6 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -2873,14 +2629,12 @@ "node_modules/parse-duration": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.4.4.tgz", - "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==", - "license": "MIT" + "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==" }, "node_modules/parse-ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -2889,7 +2643,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2899,7 +2652,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -2909,7 +2661,6 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -2919,10 +2670,6 @@ "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", "dev": true, - "license": [ - "MIT", - "Apache2" - ], "dependencies": { "through": "~2.3" } @@ -2931,15 +2678,13 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -2951,7 +2696,6 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "license": "MIT", "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -2978,7 +2722,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -2987,7 +2730,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "license": "MIT", "dependencies": { "parse-ms": "^2.1.0" }, @@ -3001,15 +2743,13 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -3017,15 +2757,13 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/ps-tree": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", "dev": true, - "license": "MIT", "dependencies": { "event-stream": "=3.3.4" }, @@ -3040,7 +2778,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -3051,7 +2788,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -3074,14 +2810,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -3096,7 +2830,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3105,7 +2838,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3119,15 +2851,13 @@ "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -3139,7 +2869,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", - "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -3149,7 +2878,6 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3159,7 +2887,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -3169,7 +2896,6 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -3180,7 +2906,6 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -3210,7 +2935,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -3232,14 +2956,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/saslprep": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "license": "MIT", "optional": true, "dependencies": { "sparse-bitfield": "^3.0.3" @@ -3252,7 +2974,6 @@ "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3263,15 +2984,13 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3284,7 +3003,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3292,8 +3010,7 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/simple-concat": { "version": "1.0.1", @@ -3312,8 +3029,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/simple-get": { "version": "4.0.1", @@ -3333,7 +3049,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -3345,7 +3060,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3355,7 +3069,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -3372,7 +3085,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "license": "MIT", "optional": true, "dependencies": { "memory-pager": "^1.0.2" @@ -3383,7 +3095,6 @@ "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", "dev": true, - "license": "MIT", "dependencies": { "through": "2" }, @@ -3395,15 +3106,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/stream-combiner": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", "dev": true, - "license": "MIT", "dependencies": { "duplexer": "~0.1.1" } @@ -3412,7 +3121,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -3420,15 +3128,13 @@ "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/string-argv": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.1.2.tgz", "integrity": "sha512-mBqPGEOMNJKXRo7z0keX0wlAhbBAjilUdPW13nN0PecVryZxdHIeM7TqbsSUA7VYuS00HGC6mojP7DlQzfa9ZA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6.19" } @@ -3437,7 +3143,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3451,7 +3156,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3464,7 +3168,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -3476,7 +3179,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3489,7 +3191,6 @@ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -3506,7 +3207,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -3522,14 +3222,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -3546,7 +3244,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", - "license": "MIT", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -3557,14 +3254,12 @@ "node_modules/tar-fs/node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -3580,7 +3275,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -3591,7 +3285,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3605,22 +3298,19 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -3631,21 +3321,18 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/ts-mixer": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", - "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", - "license": "MIT" + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" }, "node_modules/tsc-watch": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-4.6.2.tgz", "integrity": "sha512-eHWzZGkPmzXVGQKbqQgf3BFpGiZZw1jQ29ZOJeaSe8JfyUvphbd221NfXmmsJUGGPGA/nnaSS01tXipUcyxAxg==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "node-cleanup": "^2.1.2", @@ -3666,15 +3353,13 @@ "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -3689,14 +3374,12 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" + "dev": true }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -3709,7 +3392,6 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -3722,7 +3404,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -3731,11 +3412,10 @@ } }, "node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3747,14 +3427,12 @@ "node_modules/tz-offset": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tz-offset/-/tz-offset-0.0.1.tgz", - "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==", - "license": "ISC" + "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==" }, "node_modules/undici": { "version": "6.21.1", "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.1.tgz", "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==", - "license": "MIT", "engines": { "node": ">=18.17" } @@ -3762,15 +3440,13 @@ "node_modules/universal-user-agent": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "license": "ISC" + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -3778,27 +3454,23 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/v8-compile-cache": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -3809,7 +3481,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3824,7 +3495,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -3834,7 +3504,6 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3842,14 +3511,12 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -3869,8 +3536,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/tsconfig.json b/tsconfig.json index 0fa4029d..26ae8e66 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,27 +6,28 @@ "esModuleInterop": true, "outDir": "./dist", "paths": { - "@root/*": ["*"], - "@lib/*": ["src/lib/*"], - "@pieces/*": ["src/pieces/*"] + "@root/*": ["*"], + "@lib/*": ["src/lib/*"], + "@pieces/*": ["src/pieces/*"] }, "resolveJsonModule": true, "rootDir": "./", - "skipLibCheck": true, - "target": "ES2019", - "types": [ - "node", - "discord.js" - ], + "skipLibCheck": true, + "target": "ES2019", + "lib": ["ES2020", "DOM"], + "types": [ + "node", + "discord.js" + ], "module": "commonjs" }, - "include": [ - "config.ts", - "src/**/*" - ], + "include": [ + "config.ts", + "src/**/*" + ], "exclude": [ "**/node_modules", - "**/node_modules/discord.js/typings/index.d.ts", // problematic in djs versions >13.1 - "**/dist" + "**/node_modules/discord.js/typings/index.d.ts", + "**/dist" ] }