From 65efe2ba8553b1e16248cfe4a8323e5d163a3bb4 Mon Sep 17 00:00:00 2001 From: rahul5400 Date: Wed, 2 Oct 2024 09:52:27 -0400 Subject: [PATCH 001/317] 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/317] 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/317] 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/317] 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/317] .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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] .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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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/317] 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 aac676c186c48cd8c06a0b938247398ced38c588 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 258/317] 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 a712acdf2cd372e009d6122ca06050bbc7b1fb5a Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Wed, 12 Mar 2025 12:59:59 -0400 Subject: [PATCH 259/317] 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 8786ef6636d2d1c6d490bfc493b39c51a2a1a8fb Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Mon, 17 Mar 2025 12:39:48 -0400 Subject: [PATCH 260/317] 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 6f6322ae63497a8c9213f813385147410a81e023 Mon Sep 17 00:00:00 2001 From: Nazmul Date: Mon, 17 Mar 2025 13:00:07 -0400 Subject: [PATCH 261/317] fixed sage --- binding.gyp | 8 + build/binding.sln | 19 + build/config.gypi | 71 +++- build/sage.vcxproj | 146 +++++++ build/sage.vcxproj.filters | 58 +++ npm | 0 package-lock.json | 812 +++++++++++++++++++++++++------------ package.json | 17 +- src/pieces/blacklist.ts | 2 +- 9 files changed, 836 insertions(+), 297 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 create mode 100644 npm 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..90860c61 --- /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", "{ABCF23AD-5F45-31AB-06B0-F71732B5BDE2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {ABCF23AD-5F45-31AB-06B0-F71732B5BDE2}.Debug|x64.ActiveCfg = Debug|x64 + {ABCF23AD-5F45-31AB-06B0-F71732B5BDE2}.Debug|x64.Build.0 = Debug|x64 + {ABCF23AD-5F45-31AB-06B0-F71732B5BDE2}.Release|x64.ActiveCfg = Release|x64 + {ABCF23AD-5F45-31AB-06B0-F71732B5BDE2}.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..758663c9 100644 --- a/build/config.gypi +++ b/build/config.gypi @@ -21,16 +21,16 @@ "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\\icudt74l.dat", "icu_endianness": "l", "icu_gyp_path": "tools/icu/icu-generic.gyp", "icu_path": "deps/icu-small", "icu_small": "false", - "icu_ver_major": "73", + "icu_ver_major": "74", "is_debug": 0, "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", @@ -80,6 +80,7 @@ "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", @@ -87,13 +88,15 @@ "lib/internal/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", @@ -135,11 +138,11 @@ "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/symbols.js", "lib/internal/file.js", "lib/internal/fixed_queue.js", "lib/internal/freelist.js", @@ -148,7 +151,7 @@ "lib/internal/fs/cp/cp.js", "lib/internal/fs/dir.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", @@ -167,7 +170,7 @@ "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,12 +179,10 @@ "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", @@ -189,6 +190,7 @@ "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", @@ -196,10 +198,14 @@ "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/navigator.js", "lib/internal/net.js", "lib/internal/options.js", "lib/internal/per_context/domexception.js", @@ -221,6 +227,7 @@ "lib/internal/process/esm_loader.js", "lib/internal/process/execution.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", @@ -247,7 +254,6 @@ "lib/internal/source_map/source_map_cache.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", @@ -264,13 +270,15 @@ "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/coverage.js", "lib/internal/test_runner/harness.js", - "lib/internal/test_runner/mock.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/v8-serializer.js", @@ -288,6 +296,7 @@ "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", @@ -329,6 +338,7 @@ "lib/readline.js", "lib/readline/promises.js", "lib/repl.js", + "lib/sea.js", "lib/stream.js", "lib/stream/consumers.js", "lib/stream/promises.js", @@ -351,7 +361,7 @@ "lib/worker_threads.js", "lib/zlib.js" ], - "node_module_version": 108, + "node_module_version": 115, "node_no_browser_globals": "false", "node_prefix": "\\usr\\local", "node_release_urlbase": "https://nodejs.org/download/release/", @@ -368,31 +378,34 @@ "node_tag": "", "node_target_type": "executable", "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.115", "single_executable_application": "true", "target_arch": "x64", + "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_shared_ro_heap": 1, "v8_enable_short_builtin_calls": 1, + "v8_enable_v8_checks": 0, "v8_enable_webassembly": 1, "v8_no_strict_aliasing": 1, "v8_optimized_debug": 1, @@ -401,10 +414,28 @@ "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\\Naz\\AppData\\Local\\node-gyp\\Cache\\20.12.2", + "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" + "fallback_to_build": "true", + "build_from_source": "true", + "module": "C:\\Users\\Naz\\OneDrive\\Desktop\\Junior Year 24-25\\CISC375\\Sage\\SageTeamY\\lib\\binding\\your_module.node", + "module_name": "your_module", + "module_path": "C:\\Users\\Naz\\OneDrive\\Desktop\\Junior Year 24-25\\CISC375\\Sage\\SageTeamY\\lib\\binding", + "napi_version": "9", + "node_abi_napi": "napi", + "node_napi_label": "node-v115", + "cache": "C:\\Users\\Naz\\AppData\\Local\\npm-cache", + "engine_strict": "true", + "globalconfig": "C:\\Users\\Naz\\AppData\\Roaming\\npm\\etc\\npmrc", + "global_prefix": "C:\\Users\\Naz\\AppData\\Roaming\\npm", + "init_module": "C:\\Users\\Naz\\.npm-init.js", + "local_prefix": "C:\\Users\\Naz\\OneDrive\\Desktop\\Junior Year 24-25\\CISC375\\Sage\\SageTeamY", + "node_gyp": "C:\\Users\\Naz\\AppData\\Roaming\\npm\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js", + "npm_version": "10.8.2", + "prefix": "C:\\Users\\Naz\\AppData\\Roaming\\npm", + "userconfig": "C:\\Users\\Naz\\.npmrc", + "user_agent": "npm/10.8.2 node/v20.12.2 win32 x64 workspaces/false" } } diff --git a/build/sage.vcxproj b/build/sage.vcxproj new file mode 100644 index 00000000..8aed67d0 --- /dev/null +++ b/build/sage.vcxproj @@ -0,0 +1,146 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {ABCF23AD-5F45-31AB-06B0-F71732B5BDE2} + 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\Naz\AppData\Local\node-gyp\Cache\20.12.2\include\node;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\src;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\config;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\openssl\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\uv\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\zlib;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\v8\include;%(AdditionalIncludeDirectories) + /Zc:__cplusplus -std:c++17 %(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;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\\Naz\\AppData\\Local\\node-gyp\\Cache\\20.12.2\\x64\\node.lib" + /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) + node.exe;%(DelayLoadDLLs) + true + true + true + $(OutDir)$(ProjectName).node + true + .node + MachineX64 + + + C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\include\node;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\src;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\config;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\openssl\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\uv\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\zlib;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\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;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";DEBUG;_DEBUG;%(PreprocessorDefinitions);%(PreprocessorDefinitions) + + + + + C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\include\node;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\src;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\config;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\openssl\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\uv\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\zlib;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\v8\include;%(AdditionalIncludeDirectories) + /Zc:__cplusplus -std:c++17 %(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;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\\Naz\\AppData\\Local\\node-gyp\\Cache\\20.12.2\\x64\\node.lib" + /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) + node.exe;%(DelayLoadDLLs) + true + true + true + $(OutDir)$(ProjectName).node + true + .node + MachineX64 + + + C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\include\node;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\src;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\config;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\openssl\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\uv\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\zlib;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\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;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..5ee8685b --- /dev/null +++ b/build/sage.vcxproj.filters @@ -0,0 +1,58 @@ + + + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8CDEE807-BC53-E450-C8B8-4DEBB66742D4} + + + {7B735499-E5DD-1C2B-6C26-70023832A1CF} + + + {E9F714C1-DA89-54E2-60CF-39FEB20BF756} + + + {68B4D816-2CE9-2FCC-DC15-716D2A403068} + + + {F852EB63-437C-846A-220F-8D9ED6DAEC1D} + + + {D51E5808-912B-5C70-4BB7-475D1DBFA067} + + + {741E0E76-39B2-B1AB-9FA1-F1A20B16F295} + + + {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\Naz\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\src + + + .. + + + diff --git a/npm b/npm new file mode 100644 index 00000000..e69de29b diff --git a/package-lock.json b/package-lock.json index 7bc2f023..07c48ae7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,20 +7,23 @@ "": { "name": "sage", "version": "3.3.0", + "hasInstallScript": true, "license": "MIT", "dependencies": { - "@octokit/rest": "^18.3.5", + "@discordjs/node-pre-gyp": "0.4.5", + "@octokit/rest": "^21.1.1", "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", + "node": "^23.9.0", "node-cron": "^2.0.3", "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", - "parse-duration": "^0.4.4", + "parse-duration": "^2.1.3", "pretty-ms": "^7.0.1" }, "devDependencies": { @@ -144,32 +147,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 +177,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 +222,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 +246,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 +259,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,12 +293,6 @@ "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", @@ -343,25 +342,6 @@ "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" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -398,129 +378,163 @@ } }, "node_modules/@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==", - "dependencies": { - "@octokit/types": "^6.0.3" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", + "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", + "license": "MIT", + "engines": { + "node": ">= 18" } }, "node_modules/@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.4.tgz", + "integrity": "sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg==", + "license": "MIT", "dependencies": { - "@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/auth-token": "^5.0.0", + "@octokit/graphql": "^8.1.2", + "@octokit/request": "^9.2.1", + "@octokit/request-error": "^6.1.7", + "@octokit/types": "^13.6.2", + "before-after-hook": "^3.0.2", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" } }, "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.3.tgz", + "integrity": "sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==", + "license": "MIT", "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "@octokit/types": "^13.6.2", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" } }, "node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.1.tgz", + "integrity": "sha512-n57hXtOoHrhwTWdvhVkdJHdhTv0JstjDbDRhJfwIRNfFqmSo1DaK/mD2syoNUoLCyqSjBpGAKOG0BuwF392slw==", + "license": "MIT", "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" + "@octokit/request": "^9.2.2", + "@octokit/types": "^13.8.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 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": "23.0.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz", + "integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==", + "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": "11.4.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.3.tgz", + "integrity": "sha512-tBXaAbXkqVJlRoA/zQVe9mUdb8rScmivqtpv3ovsC5xhje/a+NOCivs7eUhWBwCApJVsR4G5HMeaLbq7PxqZGA==", + "license": "MIT", "dependencies": { - "@octokit/types": "^6.34.0" + "@octokit/types": "^13.7.0" + }, + "engines": { + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=2" + "@octokit/core": ">=6" } }, "node_modules/@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==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", + "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": ">=6" } }, "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": "13.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.1.tgz", + "integrity": "sha512-o8uOBdsyR+WR8MK9Cco8dCgvG13H1RlM1nWnK/W7TEACQBFux/vPREgKucxUfuDQ5yi1T3hGf4C5ZmZXAERgwQ==", + "license": "MIT", "dependencies": { - "@octokit/types": "^6.34.0", - "deprecation": "^2.3.1" + "@octokit/types": "^13.8.0" + }, + "engines": { + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": ">=6" } }, "node_modules/@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==", - "dependencies": { - "@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" + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.2.tgz", + "integrity": "sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^10.1.3", + "@octokit/request-error": "^6.1.7", + "@octokit/types": "^13.6.2", + "fast-content-type-parse": "^2.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" } }, "node_modules/@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==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.7.tgz", + "integrity": "sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==", + "license": "MIT", "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "@octokit/types": "^13.6.2" + }, + "engines": { + "node": ">= 18" } }, "node_modules/@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", + "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", + "license": "MIT", "dependencies": { - "@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/core": "^6.1.4", + "@octokit/plugin-paginate-rest": "^11.4.2", + "@octokit/plugin-request-log": "^5.3.1", + "@octokit/plugin-rest-endpoint-methods": "^13.3.0" + }, + "engines": { + "node": ">= 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": "13.8.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz", + "integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==", + "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^11.2.0" + "@octokit/openapi-types": "^23.0.1" } }, "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", @@ -640,9 +654,9 @@ "dev": true }, "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": "*" @@ -980,11 +994,12 @@ "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.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" } @@ -998,7 +1013,6 @@ "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", @@ -1015,9 +1029,10 @@ ] }, "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": "3.0.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", + "license": "Apache-2.0" }, "node_modules/bl": { "version": "2.2.1", @@ -1038,12 +1053,13 @@ } }, "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" @@ -1065,7 +1081,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -1095,18 +1110,17 @@ } }, "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": { @@ -1195,10 +1209,11 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "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", @@ -1233,14 +1248,27 @@ } }, "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": { @@ -1270,11 +1298,6 @@ "node": ">=0.10" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" - }, "node_modules/detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", @@ -1296,29 +1319,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" @@ -1350,6 +1373,15 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "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" + } + }, "node_modules/enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -1597,6 +1629,31 @@ "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-content-type-parse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1652,10 +1709,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" }, @@ -1683,15 +1741,16 @@ "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", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1720,6 +1779,12 @@ "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", "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" + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -1761,6 +1826,12 @@ "node": ">=10" } }, + "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", @@ -1856,7 +1927,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", @@ -1920,6 +1990,12 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "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" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1954,18 +2030,11 @@ "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" } }, - "node_modules/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==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2044,17 +2113,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 +2134,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" } @@ -2105,12 +2164,13 @@ } }, "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": { @@ -2137,11 +2197,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" @@ -2158,6 +2219,15 @@ "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", @@ -2192,6 +2262,12 @@ "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", @@ -2257,10 +2333,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "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": { @@ -2269,6 +2345,46 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/node": { + "version": "23.9.0", + "resolved": "https://registry.npmjs.org/node/-/node-23.9.0.tgz", + "integrity": "sha512-G1UAqOInNxL2HkLV0i3ZEgnNsSsWsf4tlpMpR44s7jYPEH8sCXObnxgyphibOiHdyheRkUzE9lRJXJ/4n0/KdA==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "node-bin-setup": "^1.0.0" + }, + "bin": { + "node": "bin/node" + }, + "engines": { + "npm": ">=5.0.0" + } + }, + "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-bin-setup": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", + "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", + "license": "ISC" + }, "node_modules/node-cleanup": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", @@ -2308,9 +2424,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" } @@ -2405,9 +2522,10 @@ } }, "node_modules/parse-duration": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.4.4.tgz", - "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.3.tgz", + "integrity": "sha512-MtbharL7Bets65qDBXuDOHHWyY1BxTJZmJ/xGmS90iEbKE0gZ6yZpZtCda7O79GeOi/f0NwBaplIuReExIoVsw==", + "license": "MIT" }, "node_modules/parse-ms": { "version": "2.1.0", @@ -2464,6 +2582,32 @@ "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", @@ -2521,6 +2665,16 @@ "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", @@ -2550,6 +2704,30 @@ } ] }, + "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", @@ -2686,12 +2864,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" }, @@ -2747,14 +2923,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" } @@ -2929,19 +3121,88 @@ "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==", + "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/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" } }, "node_modules/text-table": { @@ -2961,6 +3222,7 @@ "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" }, @@ -3002,9 +3264,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": { @@ -3028,6 +3290,18 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "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" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3072,18 +3346,19 @@ "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==" }, "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": "7.0.2", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", + "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", + "license": "ISC" }, "node_modules/uri-js": { "version": "4.4.1", @@ -3143,10 +3418,11 @@ } }, "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" } @@ -3157,9 +3433,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "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" diff --git a/package.json b/package.json index 270b55ac..4d028b3f 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,19 +36,20 @@ }, "homepage": "https://github.com/ud-cis-discord/SageV2", "dependencies": { - "@octokit/rest": "^18.3.5", + "@discordjs/node-pre-gyp": "0.4.5", + "@octokit/rest": "^21.1.1", "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", + "mongodb": "^3.7.4", + "node": "^23.9.0", "node-cron": "^2.0.3", "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", - "parse-duration": "^0.4.4", + "parse-duration": "^2.1.3", "pretty-ms": "^7.0.1" }, "_moduleAliases": { diff --git a/src/pieces/blacklist.ts b/src/pieces/blacklist.ts index 6f698939..a7c1a90c 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 b69b5a4a51c7a4e97c9c25addbdb748e32ab0e48 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 17 Mar 2025 13:04:37 -0400 Subject: [PATCH 262/317] 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 21190b1dc9b32398410b2221f02c6387ac8db69f Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Wed, 19 Mar 2025 11:53:52 -0400 Subject: [PATCH 263/317] Additional filtering changes --- src/commands/jobs/jobs.ts | 97 ++++++++++++++++++--- src/lib/types/AdzunaJobResponse.d.ts | 2 + src/lib/types/JobResult.d.ts | 2 + src/lib/utils/jobUtils/Adzuna_job_search.ts | 7 +- 4 files changed, 91 insertions(+), 17 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index 2d0c5cfe..885e5a99 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -1,12 +1,14 @@ -import { ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; +import { ApplicationCommandOptionData, ApplicationCommandOptionType, AttachmentBuilder, 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'; -import { DB, BOT } from '@root/config'; +import { DB, BOT, MAP_KEY } from '@root/config'; import { Job } from '@root/src/lib/types/Job'; import { MongoClient } from 'mongodb'; +import { sendToFile } from '@root/src/lib/utils/generalUtils'; +import axios from 'axios'; export default class extends Command { @@ -23,7 +25,8 @@ export default class extends Command { choices: [ { name: 'Date Posted', value: 'date' }, { name: 'Salary', value: 'salary' }, - { name: 'Alphabetical', value: 'alphabetical' } + { name: 'Alphabetical', value: 'alphabetical' }, + {name: 'Distance', value: 'distance' } ] } ] @@ -63,14 +66,14 @@ export default class extends Command { const jobData: JobData = { city: 'New York', - preference: 'Software Engineer', + preference: 'Biology', jobType: 'Full Time', distance: '10', filterBy: 'date' }; const interests: Interest = { - interest1: 'Software', + interest1: 'Construction', interest2: 'Engineer', interest3: 'Full Time', interest4: 'New York', @@ -102,13 +105,18 @@ Here's your personalized list: 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. `; + const attachments: AttachmentBuilder[] = []; if (message.length > 2000) { - message = `${message.substring(0, 1997)}...`; + // message = `${message.substring(0, 1997)}...; + + attachments.push(await sendToFile(this.stripMarkdown(message.split('---')[0], userID), 'txt', 'list-of-jobs-internships', false)); + // interaction.user.send({ content: this.headerMessage(userID, 'default'), files: attachments as AttachmentBuilder[] }); } const pubChan = interaction.channel; if (pubChan) { - pubChan.send({ content: message }); + // pubChan.send({ content: message }); + pubChan.send({ content: this.headerMessage(userID, filterBy), files: attachments as AttachmentBuilder[] }); } else { console.error('Channel not found'); } @@ -120,40 +128,49 @@ 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) => new Date(a.created).getTime() - new Date(b.created).getTime()); + jobData.sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); + } + else if (filterBy === 'distance') { + jobData.sort((a, b) => { + const distanceA = this.calculateDistance(Number(a.latitude), Number(a.longitude), Number(a.latitude), Number(a.longitude)); + const distanceB = this.calculateDistance(Number(b.latitude), Number(b.longitude), Number(b.latitude), Number(b.longitude)); + return distanceA - distanceB; + }); } + 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* **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}) + \t\t* **Distance:** ${this.calculateDistance(Number(jobData[i].latitude), Number(jobData[i].longitude), Number(jobData[i].latitude), Number(jobData[i].longitude))} miles ${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.'; } @@ -163,6 +180,58 @@ Here's your personalized list: currency: 'USD' }).format(Number(currency))}`; } - + + + 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(/###|-\#\s*/g, '') + .trim(); + } + + 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. \ + 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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} + `; + } + + calculateDistance(lat1: number, lon1: number, lat2: number, lon2: number): number { + const toRadians = (degrees: number) => degrees * (Math.PI / 180); + + const R = 3958.8; // Radius of the Earth in miles + const dLat = toRadians(lat2 - lat1); + const dLon = toRadians(lon2 - lon1); + const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * + Math.sin(dLon / 2) * Math.sin(dLon / 2); + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + const distance = R * c; + + return distance; + } + + async queryCoordinates(location: string): Promise { // Change to appropriate type later + const preferredCity = encodeURIComponent(location); + + const baseURL = 'https://maps.google.com/maps/api/geocode/json?address=${preferredCity}&components=country:US&key=${MAP_KEY}'; + const response = await axios.get(baseURL); + const coordinates : {lat: number, lng: number } = { + lat: response.data.results[0].geometry.location.lat, + lng: response.data.results[0].geometry.location.lng + }; + + return coordinates; + } } diff --git a/src/lib/types/AdzunaJobResponse.d.ts b/src/lib/types/AdzunaJobResponse.d.ts index 9c9472e9..e9025ff3 100644 --- a/src/lib/types/AdzunaJobResponse.d.ts +++ b/src/lib/types/AdzunaJobResponse.d.ts @@ -13,4 +13,6 @@ export interface AdzunaJobResponse { salary_max: number | string; salary_min: number | string; redirect_url: string; + longitude: number; + latitude: number; } diff --git a/src/lib/types/JobResult.d.ts b/src/lib/types/JobResult.d.ts index 5b29d5ef..0c8025d4 100644 --- a/src/lib/types/JobResult.d.ts +++ b/src/lib/types/JobResult.d.ts @@ -1,4 +1,6 @@ export interface JobResult { + latitude: number + longitude: number company: string; title: string; description: string; diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index d72ebf0b..67cf981c 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -54,11 +54,12 @@ export default async function fetchJobListings(jobData: JobData, interests?: Int created: job.created || 'Unknown', salaryMax: job.salary_max || 'Not listed', salaryMin: job.salary_min || 'Not listed', - link: job.redirect_url || 'No link available' + link: job.redirect_url || 'No link available', + // Added latitude and longitude + longitude: job.longitude || 0, + latitude: job.latitude || 0 })); - jobCache[cacheKey] = jobResults; - return jobResults.sort(); } catch (error) { console.error('API error:', error); From 37ecd4d3466556dcffbf2deb434cadfd9ef3c3e0 Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Wed, 2 Apr 2025 12:59:24 -0400 Subject: [PATCH 264/317] MongoDb now works with job commands and changed command diff checker --- src/commands/jobs/jobs.ts | 134 ++++++++++++------------------ src/lib/types/JobPreferences.d.ts | 13 +++ src/lib/utils/generalUtils.ts | 12 ++- 3 files changed, 77 insertions(+), 82 deletions(-) create mode 100644 src/lib/types/JobPreferences.d.ts diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index 885e5a99..a74677b2 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -1,14 +1,14 @@ -import { ApplicationCommandOptionData, ApplicationCommandOptionType, AttachmentBuilder, ChatInputCommandInteraction, EmbedBuilder, InteractionResponse } from 'discord.js'; +import { ApplicationCommandOptionData, ApplicationCommandOptionType, AttachmentBuilder, ChatInputCommandInteraction, 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'; import { DB, BOT, MAP_KEY } from '@root/config'; -import { Job } from '@root/src/lib/types/Job'; import { MongoClient } from 'mongodb'; import { sendToFile } from '@root/src/lib/utils/generalUtils'; import axios from 'axios'; +import { JobPreferences } from '@root/src/lib/types/JobPreferences'; export default class extends Command { @@ -31,62 +31,36 @@ export default class extends Command { } ] - // options: ApplicationCommandOptionData[] = [ - // { - // name: 'question', - // description: 'The question you want to ask', - // type: ApplicationCommandOptionType.String, - // required: true - // } - // ] - - async run(interaction: ChatInputCommandInteraction): Promise> { 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 db = client.db(BOT.NAME).collection(DB.USERS); + const filterBy = interaction.options.getString('filter') ?? 'default'; + + + const jobformAnswers: JobPreferences | null = (await db.findOne({ discordId: userID }))?.jobPreferences; const jobData: JobData = { - city: 'New York', - preference: 'Biology', - jobType: 'Full Time', - distance: '10', - filterBy: 'date' + city: jobformAnswers.answers.city, + preference: jobformAnswers.answers.workType, + jobType: jobformAnswers.answers.employmentType, + distance: jobformAnswers.answers.travelDistance, + filterBy: 'default' }; const interests: Interest = { - interest1: 'Construction', - interest2: 'Engineer', - interest3: 'Full Time', - interest4: 'New York', - interest5: '10' + interest1: jobformAnswers.answers.interest1, + interest2: jobformAnswers.answers.interest2, + interest3: jobformAnswers.answers.interest3, + interest4: jobformAnswers.answers.interest4, + interest5: jobformAnswers.answers.interest5 }; - 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}>! + const 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\ @@ -94,7 +68,7 @@ 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], filterBy)} + ${await this.listJobs(jobFormData, filterBy)} --- ### **Disclaimer:** @@ -106,26 +80,22 @@ Here's your personalized list: `; const attachments: AttachmentBuilder[] = []; + const pubChan = interaction.channel; if (message.length > 2000) { - // message = `${message.substring(0, 1997)}...; - attachments.push(await sendToFile(this.stripMarkdown(message.split('---')[0], userID), 'txt', 'list-of-jobs-internships', false)); - // interaction.user.send({ content: this.headerMessage(userID, 'default'), files: attachments as AttachmentBuilder[] }); - } - - const pubChan = interaction.channel; - if (pubChan) { - // pubChan.send({ content: message }); pubChan.send({ content: this.headerMessage(userID, filterBy), files: attachments as AttachmentBuilder[] }); + // interaction.user.send({ content: this.headerMessage(userID, 'default'), files: attachments as AttachmentBuilder[] }); } else { - console.error('Channel not found'); + pubChan.send(message); } } - listJobs(jobData: JobResult[], filterBy: string): string { + async listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: string): Promise { // Conditionally sort jobs by salary if sortBy is 'salary' + const cityCoordinates = await this.queryCoordinates(jobForm[0].city); + if (filterBy === 'salary') { - jobData.sort((a, b) => { + jobForm[2].sort((a, b) => { const avgA = (Number(a.salaryMax) + Number(a.salaryMin)) / 2; const avgB = (Number(b.salaryMax) + Number(b.salaryMin)) / 2; @@ -136,39 +106,46 @@ Here's your personalized list: 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(b.created).getTime() - new Date(a.created).getTime()); - } - else if (filterBy === 'distance') { - jobData.sort((a, b) => { - const distanceA = this.calculateDistance(Number(a.latitude), Number(a.longitude), Number(a.latitude), Number(a.longitude)); - const distanceB = this.calculateDistance(Number(b.latitude), Number(b.longitude), Number(b.latitude), Number(b.longitude)); - return distanceA - distanceB; + jobForm[2].sort((a, b) => (a.title > b.title ? 1 : -1)); + } else if (filterBy === 'date') { + jobForm[2].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); + } else if (filterBy === 'distance') { + // cityCoordinates = await this.queryCoordinates(jobForm[0].city); + + jobForm[2].sort((a, b) => { + const distanceA = this.calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(a.latitude), Number(a.longitude)); + const distanceB = this.calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(b.latitude), Number(b.longitude)); + + if (distanceA === -1) { + return 1; // Treat jobs with no location as lowest + } + + return distanceA - distanceB; // Might have to account for negative distances }); } let jobList = ''; - for (let i = 0; i < jobData.length; i++) { - const avgSalary = (Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2; + for (let i = 0; i < jobForm[2].length; i++) { + const avgSalary = (Number(jobForm[2][i].salaryMax) + Number(jobForm[2][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 formattedSalaryMax = this.formatCurrency(Number(jobForm[2][i].salaryMax)) !== 'N/A' ? this.formatCurrency(Number(jobForm[2][i].salaryMax)) : ''; + const formattedSalaryMin = this.formatCurrency(Number(jobForm[2][i].salaryMin)) !== 'N/A' ? this.formatCurrency(Number(jobForm[2][i].salaryMin)) : ''; + const jobDistance = this.calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(jobForm[2][i].latitude), Number(jobForm[2][i].longitude)); + const formattedDistance = (jobDistance !== -1) ? `${jobDistance.toFixed(2)} miles` : 'N/A'; const salaryDetails = (formattedSalaryMin && formattedSalaryMax) ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` : formattedAvgSalary; - jobList += `${i + 1}. **${jobData[i].title}** + jobList += `${i + 1}. **${jobForm[2][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}) - \t\t* **Distance:** ${this.calculateDistance(Number(jobData[i].latitude), Number(jobData[i].longitude), Number(jobData[i].latitude), Number(jobData[i].longitude))} miles - ${i !== jobData.length - 1 ? '\n' : ''}`; + \t\t* **Location:** ${jobForm[2][i].location} + \t\t* **Date Posted:** ${new Date(jobForm[2][i].created).toDateString()} at ${new Date(jobForm[2][i].created).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })} + \t\t* **Apply here:** [read more about the job and apply here](${jobForm[2][i].link}) + \t\t* **Distance:** ${formattedDistance} + ${i !== jobForm[2].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.'; @@ -216,15 +193,14 @@ Here's your personalized list: Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - const distance = R * c; - + const distance = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 : R * c; return distance; } async queryCoordinates(location: string): Promise { // Change to appropriate type later const preferredCity = encodeURIComponent(location); - const baseURL = 'https://maps.google.com/maps/api/geocode/json?address=${preferredCity}&components=country:US&key=${MAP_KEY}'; + const baseURL = `https://maps.google.com/maps/api/geocode/json?address=${preferredCity}&components=country:US&key=${MAP_KEY}`; const response = await axios.get(baseURL); const coordinates : {lat: number, lng: number } = { lat: response.data.results[0].geometry.location.lat, diff --git a/src/lib/types/JobPreferences.d.ts b/src/lib/types/JobPreferences.d.ts new file mode 100644 index 00000000..f6600220 --- /dev/null +++ b/src/lib/types/JobPreferences.d.ts @@ -0,0 +1,13 @@ +export interface JobPreferences { + answers: { + city: string; + workType: string; + employmentType: string; + travelDistance: string; + interest1: string; + interest2: string; + interest3: string; + interest4: string; + interest5: string; + }; +} diff --git a/src/lib/utils/generalUtils.ts b/src/lib/utils/generalUtils.ts index f0ed3b85..f1ffa715 100644 --- a/src/lib/utils/generalUtils.ts +++ b/src/lib/utils/generalUtils.ts @@ -57,10 +57,16 @@ function checkOptions( list2Option: ApplicationCommandOptionData ): boolean { if ('required' in list1Option && 'required' in list2Option) { - // see note 1 comment block in help.ts - return list2Option.required === list1Option.required; + if (list1Option.required !== list2Option.required) return false; } - return false; + if ('choices' in list1Option && 'choices' in list2Option) { + if ( + JSON.stringify(list1Option.choices) !== JSON.stringify(list2Option.choices) + ) { + return false; + } + } // Updated so that both checks are done for equality + return true; } export function isPermissionEqual( From 9fde02654f3a1fb8389cce41060222c70f74589f Mon Sep 17 00:00:00 2001 From: Nazmul Date: Wed, 2 Apr 2025 13:06:35 -0400 Subject: [PATCH 265/317] changed job imbed --- src/commands/jobs/jobs.ts | 306 +++++++++++++++++++++++--------------- 1 file changed, 189 insertions(+), 117 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index 2d0c5cfe..f8990309 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -1,33 +1,43 @@ -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'; -import { DB, BOT } from '@root/config'; -import { Job } from '@root/src/lib/types/Job'; -import { MongoClient } from 'mongodb'; - +import { + ApplicationCommandOptionData, + ApplicationCommandOptionType, + ChatInputCommandInteraction, + EmbedBuilder, + ActionRowBuilder, + ButtonBuilder, + ButtonStyle, + ComponentType, + 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"; +import { DB, BOT } from "@root/config"; +import { Job } from "@root/src/lib/types/Job"; +import { MongoClient } from "mongodb"; + +// Temporary storage for user job data +const userJobData = new Map(); 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', + 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' } - ] - } - ] - + { name: "Date Posted", value: "date" }, + { name: "Salary", value: "salary" }, + { name: "Alphabetical", value: "alphabetical" }, + ], + }, + ]; // options: ApplicationCommandOptionData[] = [ // { // name: 'question', @@ -37,13 +47,12 @@ export default class extends Command { // } // ] - - async run(interaction: ChatInputCommandInteraction): Promise> { + async run( + interaction: ChatInputCommandInteraction + ): Promise> { 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 filterBy = interaction.options.getString("filter") ?? "default"; + //const client = await MongoClient.connect(DB.CONNECTION, { useUnifiedTopology: true }); // const jobData:JobData = { // city: jobformAnswers[0].answers[0], // preference: jobformAnswers[0].answers[1], @@ -52,7 +61,7 @@ export default class extends Command { // // filterBy: filterBy ?? 'default' // filterBy: 'default' // }; - + // Fetch job data (replace with your actual logic) // const interests:Interest = { // interest1: jobformAnswers[1].answers[0], // interest2: jobformAnswers[1].answers[1], @@ -60,109 +69,172 @@ export default class extends Command { // interest4: jobformAnswers[1].answers[3], // interest5: jobformAnswers[1].answers[4] // }; - const jobData: JobData = { - city: 'New York', - preference: 'Software Engineer', - jobType: 'Full Time', - distance: '10', - filterBy: 'date' + city: "New York", + preference: "Software Engineer", + jobType: "Full Time", + distance: "10", + filterBy: filterBy, }; const interests: Interest = { - interest1: 'Software', - interest2: 'Engineer', - interest3: 'Full Time', - interest4: 'New York', - interest5: '10' + interest1: "Software", + interest2: "Engineer", + interest3: "Full Time", + interest4: "New York", + interest5: "10", }; - - 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: - - ${this.listJobs(jobFormData[2], 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. - `; - - if (message.length > 2000) { - message = `${message.substring(0, 1997)}...`; + 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'; + + if (APIResponse.length === 0) { + await interaction.reply("No jobs found based on your interests."); + return; } - const pubChan = interaction.channel; - if (pubChan) { - pubChan.send({ content: message }); - } else { - console.error('Channel not found'); - } + // Store job data for the user + userJobData.set(userID, { jobs: APIResponse, index: 0 }); + + // Create embed and buttons for the first job + const { embed, row } = this.createJobEmbed( + APIResponse[0], + 0, + APIResponse.length + ); + await interaction.reply({ embeds: [embed], components: [row] }); + + // Listen for button interactions + const collector = interaction.channel?.createMessageComponentCollector({ + componentType: ComponentType.Button, + time: 60000, // 1 minute timeout + }); + + collector?.on("collect", async (i) => { + if (i.user.id !== userID) { + await i.reply({ + content: "This is not your interaction!", + ephemeral: true, + }); + return; + } + + const userData = userJobData.get(userID); + if (!userData) return; + + let { jobs, index } = userData; + + switch (i.customId) { + case "previous": + index = index > 0 ? index - 1 : jobs.length - 1; + break; + case "next": + index = index < jobs.length - 1 ? index + 1 : 0; + break; + case "remove": + jobs.splice(index, 1); + if (jobs.length === 0) { + await i.update({ + content: "No more jobs to display.", + embeds: [], + components: [], + }); + userJobData.delete(userID); + return; + } + index = index >= jobs.length ? 0 : index; + break; + } + + // Update user data + userJobData.set(userID, { jobs, index }); + + // Update embed and buttons + const { embed, row } = this.createJobEmbed( + jobs[index], + index, + jobs.length + ); + await i.update({ embeds: [embed], components: [row] }); + }); + + collector?.on("end", () => { + userJobData.delete(userID); + }); } - 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 - }); - } 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()); - } - + createJobEmbed( + job: JobResult, + index: number, + totalJobs: number + ): { embed: EmbedBuilder; row: ActionRowBuilder } { + const embed = new EmbedBuilder() + .setTitle(job.title) + .setDescription( + `**Location:** ${job.location}\n**Date Posted:** ${new Date( + job.created + ).toDateString()}` + ) + .addFields( + { name: "Salary", value: this.formatSalary(job), inline: true }, + { + name: "Apply Here", + value: `[Click here](${job.link})`, + inline: true, + } + ) + .setFooter({ text: `Job ${index + 1} of ${totalJobs}` }) + .setColor("#0099ff"); + + const row = new ActionRowBuilder().addComponents( + new ButtonBuilder() + .setCustomId("previous") + .setLabel("Previous") + .setStyle(ButtonStyle.Primary) + .setDisabled(totalJobs === 1), + new ButtonBuilder() + .setCustomId("remove") + .setLabel("Remove") + .setStyle(ButtonStyle.Danger) + .setDisabled(totalJobs === 1), + new ButtonBuilder() + .setCustomId("next") + .setLabel("Next") + .setStyle(ButtonStyle.Primary) + .setDisabled(totalJobs === 1) + ); + + return { embed, row }; + } - 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* **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' : ''}`; - } - - return jobList || '### Unfortunately, there were no jobs found based on your interests :(. Consider updating your interests or waiting until something is found.'; + formatSalary(job: JobResult): string { + const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; + const formattedAvgSalary = this.formatCurrency(avgSalary); + const formattedSalaryMax = + this.formatCurrency(Number(job.salaryMax)) !== "N/A" + ? this.formatCurrency(Number(job.salaryMax)) + : ""; + const formattedSalaryMin = + this.formatCurrency(Number(job.salaryMin)) !== "N/A" + ? this.formatCurrency(Number(job.salaryMin)) + : ""; + + return formattedSalaryMin && formattedSalaryMax + ? `Avg: ${formattedAvgSalary}\nMin: ${formattedSalaryMin}\nMax: ${formattedSalaryMax}` + : formattedAvgSalary; } formatCurrency(currency: number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).format(Number(currency))}`; + return isNaN(currency) + ? "N/A" + : `${new Intl.NumberFormat("en-US", { + style: "currency", + currency: "USD", + }).format(Number(currency))}`; } - - } From 185ed7a5ebdc30d21a3fc902d64eccc40cfff62e Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Sun, 6 Apr 2025 20:50:33 -0400 Subject: [PATCH 266/317] Refactored the Reminder Code in order to accept different modals and text inputs. --- package-lock.json | 47 +++- package.json | 9 +- src/commands/reminders/remind.ts | 409 ++++++++++++++++++++----------- 3 files changed, 323 insertions(+), 142 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7bc2f023..f129d321 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,8 @@ "discord.js": "^14.16.3", "module-alias": "^2.2.2", "moment": "^2.29.1", - "mongodb": "^3.7.4", + "mongodb": "^3.6.3", + "node": "^20.19.0", "node-cron": "^2.0.3", "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", @@ -200,6 +203,26 @@ "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", @@ -2269,6 +2292,28 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/node": { + "version": "20.19.0", + "resolved": "https://registry.npmjs.org/node/-/node-20.19.0.tgz", + "integrity": "sha512-upEH46DT6+wF3J8Q7tnmB8Kh0m+xYcBdaIluOxjR9ZnM5lpabfZIBfXNYWUxOhxTQLu23J4MiNXkUOeFHPrqdA==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "node-bin-setup": "^1.0.0" + }, + "bin": { + "node": "bin/node" + }, + "engines": { + "npm": ">=5.0.0" + } + }, + "node_modules/node-bin-setup": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", + "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", + "license": "ISC" + }, "node_modules/node-cleanup": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", diff --git a/package.json b/package.json index 270b55ac..c4ad313c 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,15 +36,16 @@ }, "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", "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", + "node": "^20.19.0", "node-cron": "^2.0.3", "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 3ec3c308..1eab560f 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -1,149 +1,284 @@ import { BOT, DB } from '@root/config'; import { - ApplicationCommandOptionData, - ApplicationCommandOptionType, - ChatInputCommandInteraction, - InteractionResponse + ApplicationCommandOptionData, + ChatInputCommandInteraction, + InteractionResponse, + ActionRowBuilder, + ButtonBuilder, + ButtonStyle, + ComponentType, + ModalBuilder, + TextInputBuilder, + TextInputStyle, + ModalSubmitInteraction } from 'discord.js'; import { Reminder } from '@lib/types/Reminder'; import parse from 'parse-duration'; import { checkJobReminder, 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 = 'Choose to create either a regular reminder or a job reminder.'; + options: ApplicationCommandOptionData[] = []; // No options needed as we're using buttons + + + async run( + interaction: ChatInputCommandInteraction + ): Promise | void> { + // Create buttons for the two options + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId('create_reminder') + .setLabel('CREATE REMINDER') + .setStyle(ButtonStyle.Primary), + new ButtonBuilder() + .setCustomId('create_job_reminder') + .setLabel('CREATE JOB REMINDER') + .setStyle(ButtonStyle.Secondary) + ); + + + // Send the initial message with buttons + const response = await interaction.reply({ + content: 'What type of reminder would you like to create?', + components: [row], + ephemeral: true + }); + + + // Create collector for button interactions + const collector = response.createMessageComponentCollector({ + componentType: ComponentType.Button, + time: 60000 // 1 minute timeout + }); + + + collector.on('collect', async (buttonInteraction) => { + // Handle button clicks + if (buttonInteraction.customId === 'create_reminder') { + await this.handleCreateReminder(buttonInteraction); + } else if (buttonInteraction.customId === 'create_job_reminder') { + await this.handleCreateJobReminder(buttonInteraction); + } + }); + + + collector.on('end', async (collected) => { + if (collected.size === 0) { + await interaction.editReply({ + content: 'Reminder creation timed out.', + components: [] + }); + } + }); + } + + + // Handle creating a standard reminder via a modal + private async handleCreateReminder(buttonInteraction: any) { + // Create modal for reminder details + const modal = new ModalBuilder() + .setCustomId('reminder_modal') + .setTitle('Create Reminder'); + + + // Add inputs for content and duration + const contentInput = new TextInputBuilder() + .setCustomId('content') + .setLabel("What would you like to be reminded of") + .setStyle(TextInputStyle.Paragraph) + .setRequired(true); + + + const durationInput = new TextInputBuilder() + .setCustomId('duration') + .setLabel("When would you like to be reminded") + .setPlaceholder('e.g. 1 hour, 30 minutes, 2 days') + .setStyle(TextInputStyle.Short) + .setRequired(true); + + + // Create action rows with inputs + const contentRow = new ActionRowBuilder().addComponents(contentInput); + const durationRow = new ActionRowBuilder().addComponents(durationInput); + + + // Add action rows to the modal + modal.addComponents(contentRow, durationRow); + + + // Show the modal + await buttonInteraction.showModal(modal); + + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 120000, // 2 minutes + filter: (i: ModalSubmitInteraction) => + i.customId === 'reminder_modal' && + i.user.id === buttonInteraction.user.id + }); + + + // Process modal submission + const content = modalInteraction.fields.getTextInputValue('content'); + const rawDuration = modalInteraction.fields.getTextInputValue('duration'); + const duration = parse(rawDuration); + + + if (!duration) { + return modalInteraction.reply({ + content: `**${rawDuration}** is not a valid duration. You can use words like hours, minutes, seconds, days, weeks, months, or years.`, + ephemeral: true + }); + } + + + // Calculate the expiry date + const expiryDate = new Date(duration + Date.now()); - description = `Have ${BOT.NAME} give you a reminder.`; - extendedHelp = 'Reminders can be set to repeat daily or weekly.'; - options: ApplicationCommandOptionData[] = [ - { - 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 - } - ] - }, - // added by Fried Sage Leaves - handles what happens when /remind jobs is run - { - name: 'jobs', - description: 'Create a job reminder', - type: ApplicationCommandOptionType.Subcommand, - options: [ - { - name: 'job-repeat', - description: 'How often you want the reminder to repeat', - choices: [ - { name: 'Daily', value: 'daily' }, - { name: 'Weekly', value: 'weekly' } - ], - 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' }, - { name: 'Default', value: 'default' } - ], - type: ApplicationCommandOptionType.String - } - ] - } - ]; - - async run( - interaction: ChatInputCommandInteraction - ): Promise | void> { - const subcommand: string = interaction.options.getSubcommand(); - - if (subcommand === 'jobs') { - const jobReminderRepeat = interaction.options.getString('job-repeat') as - | 'daily' - | 'weekly' || null; - - const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date' | 'default' | null; - - const jobReminder: Reminder = { - owner: interaction.user.id, - content: 'Job Reminder', - mode: 'private', - expires: new Date(), - repeat: jobReminderRepeat, - filterBy - }; - // handling duplicate job reminders - 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.', - ephemeral: true - }); - } else { - interaction.client.mongo - .collection(DB.REMINDERS) - .insertOne(jobReminder); - return interaction.reply({ - content: `I'll remind you about job offers ${jobReminderRepeat} at ${reminderTime( - jobReminder - )}.`, - ephemeral: true - }); - } - } else { - 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: `I'll remind you about that at ${reminderTime( - reminder - )}.`, - ephemeral: true - }); - } - } + // Create and store the reminder directly + const reminder: Reminder = { + owner: modalInteraction.user.id, + content, + mode: 'public', // could be changed to private if needed + expires: expiryDate, + repeat: null // No repeat by default + }; + + + await modalInteraction.client.mongo + .collection(DB.REMINDERS) + .insertOne(reminder); + + + await modalInteraction.reply({ + content: `I'll remind you about that at ${reminderTime(reminder)}.`, + ephemeral: true + }); + + + } catch (error) { + console.error('Error in modal submission:', error); + await buttonInteraction.followUp({ + content: 'Reminder creation timed out or failed.', + ephemeral: true + }); + } + } + + + // Handle creating a job reminder using a modal + private async handleCreateJobReminder(buttonInteraction: any) { + // Check for existing job reminder + if (await checkJobReminder(buttonInteraction)) { + return buttonInteraction.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 + }); + } + + + // Create modal for job reminder settings + const modal = new ModalBuilder() + .setCustomId('job_reminder_modal') + .setTitle('Create Job Reminder'); + + + // Add inputs for repeat frequency and filter type + const repeatInput = new TextInputBuilder() + .setCustomId('repeat') + .setLabel('Repeat frequency (daily or weekly)') + .setPlaceholder('Type "daily" or "weekly"') + .setStyle(TextInputStyle.Short) + .setRequired(true); + + + const filterInput = new TextInputBuilder() + .setCustomId('filter') + .setLabel('Filter by (default, relevance, salary, date)') + .setPlaceholder('Type one of the options') + .setStyle(TextInputStyle.Short) + .setRequired(true) + .setValue('default'); // Default value + + + // Create action rows with inputs + const repeatRow = new ActionRowBuilder().addComponents(repeatInput); + const filterRow = new ActionRowBuilder().addComponents(filterInput); + + + // Add action rows to the modal + modal.addComponents(repeatRow, filterRow); + + + // Show the modal + await buttonInteraction.showModal(modal); + + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 120000, // 2 minutes + filter: (i: ModalSubmitInteraction) => + i.customId === 'job_reminder_modal' && + i.user.id === buttonInteraction.user.id + }); + + + // Process modal submission + let repeatValue = modalInteraction.fields.getTextInputValue('repeat').toLowerCase(); + let filterValue = modalInteraction.fields.getTextInputValue('filter').toLowerCase(); + + // Validate repeat input + if (repeatValue !== 'daily' && repeatValue !== 'weekly' && repeatValue !== 'monthly') { + return modalInteraction.reply({ + content: `**${repeatValue}** is not a valid repeat option. Please use "daily" or "weekly".`, + ephemeral: true + }); + } + + // Validate filter input + const validFilters = ['default', 'relevance', 'salary', 'date']; + if (!validFilters.includes(filterValue)) { + filterValue = 'default'; // Fallback to default if invalid + } + + // Create and store the job reminder + const jobReminder: Reminder = { + owner: modalInteraction.user.id, + content: 'Job Reminder', + mode: 'private', + expires: new Date(), // Set to now, will be handled by the job scheduler + repeat: repeatValue as 'daily' | 'weekly', + filterBy: filterValue as 'default' | 'relevance' | 'salary' | 'date' + }; + + + await modalInteraction.client.mongo + .collection(DB.REMINDERS) + .insertOne(jobReminder); + + + await modalInteraction.reply({ + content: `I'll remind you about job offers ${repeatValue} at ${reminderTime(jobReminder)}, filtered by ${filterValue}.`, + ephemeral: true + }); + + + } catch (error) { + console.error('Error in modal submission:', error); + await buttonInteraction.followUp({ + content: 'Job reminder creation timed out or failed.', + ephemeral: true + }); + } + } } + From 7d4a573d7d0374eba40027070f7999e094b8435f Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Mon, 7 Apr 2025 00:19:51 -0400 Subject: [PATCH 267/317] New Reminder testing command /newreminder has changes including visual differences and refactors --- src/commands/reminders/newremind.ts | 535 ++++++++++++++++++++++++++++ 1 file changed, 535 insertions(+) create mode 100644 src/commands/reminders/newremind.ts diff --git a/src/commands/reminders/newremind.ts b/src/commands/reminders/newremind.ts new file mode 100644 index 00000000..f5d5b522 --- /dev/null +++ b/src/commands/reminders/newremind.ts @@ -0,0 +1,535 @@ +import { BOT, DB } from '@root/config'; +import { + ApplicationCommandOptionData, + ChatInputCommandInteraction, + InteractionResponse, + ActionRowBuilder, + ButtonBuilder, + ButtonStyle, + ComponentType, + ModalBuilder, + TextInputBuilder, + TextInputStyle, + ModalSubmitInteraction, + EmbedBuilder +} from 'discord.js'; +import { Reminder } from '@lib/types/Reminder'; +import parse from 'parse-duration'; +import { checkJobReminder, reminderTime } from '@root/src/lib/utils/generalUtils'; +import { Command } from '@lib/types/Command'; + +// Emoji constants for button icons +const EMOJI = { + REMINDER: '⏰', + JOB: '💼', + VIEW: '📋', + CANCEL: '❌', + TIME: '🕒', + REPEAT: '🔄' +}; + +// Color constants for embeds (using Discord.js ColorResolvable) +const COLORS = { + PRIMARY: 0x5865F2, // Discord Blurple + SUCCESS: 0x57F287, // Green + DANGER: 0xED4245, // Red + WARNING: 0xFEE75C, // Yellow + SECONDARY: 0x9BA4EC, // Light Blurple + INFO: 0x5CBEFE // Light Blue +}; + +export default class extends Command { + description = `Have ${BOT.NAME} give you a reminder.`; + extendedHelp = 'Create reminders for anything - one-time or recurring job alerts.'; + options: ApplicationCommandOptionData[] = []; // No options needed as we're using buttons + + async run( + interaction: ChatInputCommandInteraction + ): Promise | void> { + // Create a stylish initial embed + const embed = new EmbedBuilder() + .setColor(COLORS.PRIMARY) + .setTitle(`${EMOJI.REMINDER} Reminder System`) + .setDescription('What would you like to do?') + .setFooter({ + text: `Requested by ${interaction.user.username}`, + iconURL: interaction.user.displayAvatarURL() + }) + .setTimestamp(); + + // Create buttons with emojis and clear labels + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId('create_reminder') + .setLabel('Create Reminder') + .setEmoji(EMOJI.REMINDER) + .setStyle(ButtonStyle.Primary), + new ButtonBuilder() + .setCustomId('create_job_reminder') + .setLabel('Job Alert') + .setEmoji(EMOJI.JOB) + .setStyle(ButtonStyle.Secondary), + new ButtonBuilder() + .setCustomId('view_reminders') + .setLabel('View All') + .setEmoji(EMOJI.VIEW) + .setStyle(ButtonStyle.Success), + new ButtonBuilder() + .setCustomId('cancel_reminder') + .setLabel('Cancel') + .setEmoji(EMOJI.CANCEL) + .setStyle(ButtonStyle.Danger) + ); + + // Send the initial message with embed and buttons + const response = await interaction.reply({ + embeds: [embed], + components: [row], + ephemeral: true + }); + + // Create collector for button interactions + const collector = response.createMessageComponentCollector({ + componentType: ComponentType.Button, + time: 120000 // 2 minute timeout (extended) + }); + + collector.on('collect', async (buttonInteraction) => { + // Handle button clicks + if (buttonInteraction.customId === 'create_reminder') { + await this.handleCreateReminder(buttonInteraction); + } else if (buttonInteraction.customId === 'create_job_reminder') { + await this.handleCreateJobReminder(buttonInteraction); + } else if (buttonInteraction.customId === 'view_reminders') { + await this.handleViewReminders(buttonInteraction); + } else if (buttonInteraction.customId === 'cancel_reminder') { + await this.handleCancelReminder(buttonInteraction); + } + }); + + collector.on('end', async (collected) => { + if (collected.size === 0) { + const timeoutEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.TIME} Reminder Action Timed Out`) + .setDescription('You can run the command again to set up a reminder.') + .setTimestamp(); + + await interaction.editReply({ + embeds: [timeoutEmbed], + components: [] + }); + } + }); + } + + // Handle creating a standard reminder via a modal + private async handleCreateReminder(buttonInteraction: any) { + // Create modal for reminder details + const modal = new ModalBuilder() + .setCustomId('reminder_modal') + .setTitle(`${EMOJI.REMINDER} Create New Reminder`); + + // Add inputs for content and duration + const contentInput = new TextInputBuilder() + .setCustomId('content') + .setLabel("What would you like to be reminded of?") + .setStyle(TextInputStyle.Paragraph) + .setPlaceholder("Enter your reminder message here...") + .setRequired(true); + + const durationInput = new TextInputBuilder() + .setCustomId('duration') + .setLabel("When would you like to be reminded?") + .setPlaceholder('e.g. 1 hour, 30 minutes, 2 days, tomorrow at 3pm') + .setStyle(TextInputStyle.Short) + .setRequired(true); + + // Create action rows with inputs + const contentRow = new ActionRowBuilder().addComponents(contentInput); + const durationRow = new ActionRowBuilder().addComponents(durationInput); + + // Add action rows to the modal + modal.addComponents(contentRow, durationRow); + + // Show the modal + await buttonInteraction.showModal(modal); + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 180000, // 3 minutes (extended) + filter: (i: ModalSubmitInteraction) => + i.customId === 'reminder_modal' && + i.user.id === buttonInteraction.user.id + }); + + // Process modal submission + const content = modalInteraction.fields.getTextInputValue('content'); + const rawDuration = modalInteraction.fields.getTextInputValue('duration'); + const duration = parse(rawDuration); + + if (!duration) { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.TIME} Invalid Time Format`) + .setDescription(`**"${rawDuration}"** is not a valid duration.\nYou can use words like hours, minutes, seconds, days, weeks, months, or years.`) + .setFooter({ text: 'Try something like "3 hours" or "2 days"' }); + + return modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } + + // Calculate the expiry date + const expiryDate = new Date(duration + Date.now()); + + // Create and store the reminder directly + const reminder: Reminder = { + owner: modalInteraction.user.id, + content, + mode: 'public', // could be changed to private if needed + expires: expiryDate, + repeat: null // No repeat by default + }; + + await modalInteraction.client.mongo + .collection(DB.REMINDERS) + .insertOne(reminder); + + const successEmbed = new EmbedBuilder() + .setColor(COLORS.SUCCESS) + .setTitle(`${EMOJI.REMINDER} Reminder Set!`) + .setDescription(`I'll remind you about that at **${reminderTime(reminder)}**.`) + .addFields({ + name: 'Reminder Content', + value: `> ${content}` + }) + .setTimestamp(); + + await modalInteraction.reply({ + embeds: [successEmbed], + ephemeral: true + }); + + } catch (error) { + console.error('Error in modal submission:', error); + + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Reminder Creation Failed`) + .setDescription('The reminder creation process timed out or an error occurred.') + .setTimestamp(); + + await buttonInteraction.followUp({ + embeds: [errorEmbed], + ephemeral: true + }); + } + } + + // Handle creating a job reminder using a modal + private async handleCreateJobReminder(buttonInteraction: any) { + // Check for existing job reminder + if (await checkJobReminder(buttonInteraction)) { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.WARNING) + .setTitle(`${EMOJI.JOB} Job Reminder Already Exists`) + .setDescription( + 'You currently already have a job reminder set. To clear your existing job reminder, use the CANCEL button and provide the reminder number.' + ); + + return buttonInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } + + // Create modal for job reminder settings + const modal = new ModalBuilder() + .setCustomId('job_reminder_modal') + .setTitle(`${EMOJI.JOB} Create Job Alert`); + + // Add inputs for repeat frequency and filter type + const repeatInput = new TextInputBuilder() + .setCustomId('repeat') + .setLabel('How often would you like to receive alerts?') + .setPlaceholder('Type "daily", "weekly", or "monthly"') + .setStyle(TextInputStyle.Short) + .setRequired(true); + + const filterInput = new TextInputBuilder() + .setCustomId('filter') + .setLabel('Sort jobs by?') + .setPlaceholder('default, relevance, salary, or date') + .setStyle(TextInputStyle.Short) + .setRequired(true) + .setValue('default'); // Default value + + // Create action rows with inputs + const repeatRow = new ActionRowBuilder().addComponents(repeatInput); + const filterRow = new ActionRowBuilder().addComponents(filterInput); + + // Add action rows to the modal + modal.addComponents(repeatRow, filterRow); + + // Show the modal + await buttonInteraction.showModal(modal); + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 180000, // 3 minutes (extended) + filter: (i: ModalSubmitInteraction) => + i.customId === 'job_reminder_modal' && + i.user.id === buttonInteraction.user.id + }); + + // Process modal submission + let repeatValue = modalInteraction.fields.getTextInputValue('repeat').toLowerCase(); + let filterValue = modalInteraction.fields.getTextInputValue('filter').toLowerCase(); + + // Validate repeat input + if (repeatValue !== 'daily' && repeatValue !== 'weekly' && repeatValue !== 'monthly') { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.REPEAT} Invalid Repeat Option`) + .setDescription(`**"${repeatValue}"** is not a valid repeat option. Please use "daily", "weekly", or "monthly".`); + + return modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } + + // Validate filter input + const validFilters = ['default', 'relevance', 'salary', 'date']; + if (!validFilters.includes(filterValue)) { + filterValue = 'default'; // Fallback to default if invalid + } + + // Create and store the job reminder + const jobReminder: Reminder = { + owner: modalInteraction.user.id, + content: 'Job Reminder', + mode: 'private', + expires: new Date(), // Set to now, will be handled by the job scheduler + repeat: repeatValue as 'daily' | 'weekly', + filterBy: filterValue as 'default' | 'relevance' | 'salary' | 'date' + }; + + await modalInteraction.client.mongo + .collection(DB.REMINDERS) + .insertOne(jobReminder); + + const successEmbed = new EmbedBuilder() + .setColor(COLORS.SECONDARY) + .setTitle(`${EMOJI.JOB} Job Alert Created`) + .setDescription( + `I'll send you job opportunities **${repeatValue}** starting at **${reminderTime(jobReminder)}**.` + ) + .addFields( + { name: 'Frequency', value: `${repeatValue.charAt(0).toUpperCase() + repeatValue.slice(1)}`, inline: true }, + { name: 'Sorted By', value: `${filterValue.charAt(0).toUpperCase() + filterValue.slice(1)}`, inline: true } + ) + .setFooter({ text: 'You can update your preferences anytime' }) + .setTimestamp(); + + await modalInteraction.reply({ + embeds: [successEmbed], + ephemeral: true + }); + + } catch (error) { + console.error('Error in modal submission:', error); + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Job Alert Creation Failed`) + .setDescription('The job alert creation process timed out or an error occurred.') + .setTimestamp(); + + await buttonInteraction.followUp({ + embeds: [errorEmbed], + ephemeral: true + }); + } + } + + // Handle viewing reminders + private async handleViewReminders(buttonInteraction: any) { + const reminders: Array = await buttonInteraction.client.mongo + .collection(DB.REMINDERS) + .find({ owner: buttonInteraction.user.id }) + .toArray(); + + reminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); + + if (reminders.length < 1) { + const noRemindersEmbed = new EmbedBuilder() + .setColor(COLORS.INFO) + .setTitle(`${EMOJI.VIEW} No Reminders Found`) + .setDescription('You don\'t have any pending reminders!') + .setFooter({ text: 'Use the CREATE REMINDER button to set one up' }) + .setTimestamp(); + + return buttonInteraction.reply({ + embeds: [noRemindersEmbed], + ephemeral: true + }); + } + + const embeds: Array = []; + reminders.forEach((reminder, i) => { + if (i % 10 === 0) { // Reduced to 10 reminders per embed for better readability + embeds.push( + new EmbedBuilder() + .setTitle(`${EMOJI.VIEW} Your Reminders (${reminders.length})`) + .setColor(COLORS.INFO) + .setDescription('Here are all your pending reminders:') + .setFooter({ + text: `Page ${Math.floor(i / 10) + 1}/${Math.ceil(reminders.length / 10)}` + }) + .setTimestamp() + ); + } + + const hidden = reminder.mode === 'private'; + const isJobReminder = reminder.content === 'Job Reminder'; + const icon = isJobReminder ? EMOJI.JOB : EMOJI.REMINDER; + + embeds[Math.floor(i / 10)].addFields({ + name: `${i + 1}. ${icon} ${ + hidden + ? isJobReminder + ? 'Job Alert' + : 'Private Reminder' + : reminder.content + }`, + value: hidden + ? `${EMOJI.REPEAT} **${reminder.repeat}** job reminder filtered by **${reminder.filterBy}**` + : `${EMOJI.TIME} Due: **${reminderTime(reminder)}**` + }); + }); + + await buttonInteraction.reply({ + embeds, + ephemeral: true + }); + } + + // Handle canceling a reminder + private async handleCancelReminder(buttonInteraction: any) { + // Create modal for reminder cancellation + const modal = new ModalBuilder() + .setCustomId('cancel_reminder_modal') + .setTitle(`${EMOJI.CANCEL} Cancel Reminder`); + + // Add input for reminder number + const reminderNumInput = new TextInputBuilder() + .setCustomId('reminder_number') + .setLabel("Which reminder would you like to cancel?") + .setPlaceholder('Enter the number (e.g. 1, 2, 3)') + .setStyle(TextInputStyle.Short) + .setRequired(true); + + // Create action row with input + const reminderNumRow = new ActionRowBuilder().addComponents(reminderNumInput); + + // Add action row to the modal + modal.addComponents(reminderNumRow); + + // Show the modal + await buttonInteraction.showModal(modal); + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 60000, // 1 minute + filter: (i: ModalSubmitInteraction) => + i.customId === 'cancel_reminder_modal' && + i.user.id === buttonInteraction.user.id + }); + + // Process modal submission + const reminderNumStr = modalInteraction.fields.getTextInputValue('reminder_number'); + const reminderNum = parseInt(reminderNumStr) - 1; // Convert to 0-based index + + if (isNaN(reminderNum) || reminderNum < 0) { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Invalid Reminder Number`) + .setDescription(`**"${reminderNumStr}"** is not a valid reminder number. Please enter a positive integer.`) + .setFooter({ text: 'Use the VIEW REMINDERS button to see your reminders and their numbers' }); + + return modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } + + // Get user's reminders and sort them + const reminders: Array = await modalInteraction.client.mongo + .collection(DB.REMINDERS) + .find({ owner: modalInteraction.user.id }) + .toArray(); + + reminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); + + // Check if the reminder exists + const reminder = reminders[reminderNum]; + if (!reminder) { + const notFoundEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Reminder Not Found`) + .setDescription(`I couldn't find reminder **#${reminderNum + 1}**.`) + .setFooter({ text: 'Use the VIEW REMINDERS button to see your current reminders' }); + + return modalInteraction.reply({ + embeds: [notFoundEmbed], + ephemeral: true + }); + } + + // Delete the reminder + await modalInteraction.client.mongo + .collection(DB.REMINDERS) + .findOneAndDelete(reminder); + + const hidden = reminder.mode === 'private'; + const isJobReminder = reminder.content === 'Job Reminder'; + + const successEmbed = new EmbedBuilder() + .setColor(COLORS.SUCCESS) + .setTitle(`${EMOJI.CANCEL} Reminder Cancelled`) + .setDescription( + `Successfully cancelled reminder **#${reminderNum + 1}**: ${ + hidden + ? (isJobReminder ? 'Job Alert' : 'Private Reminder') + : `"${reminder.content}"` + }` + ) + .setTimestamp(); + + return modalInteraction.reply({ + embeds: [successEmbed], + ephemeral: true + }); + + } catch (error) { + console.error('Error in modal submission:', error); + + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Cancellation Failed`) + .setDescription('The reminder cancellation process timed out or an error occurred.') + .setTimestamp(); + + await buttonInteraction.followUp({ + embeds: [errorEmbed], + ephemeral: true + }); + } + } +} \ No newline at end of file From 782bce23a22cff722ab6f90a1b420d107c8dbe2b Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Mon, 7 Apr 2025 23:19:56 -0400 Subject: [PATCH 268/317] Removed deprecated commands and error causing commands that served no purpose/ --- src/commands/jobs/jobDatabase.ts | 0 src/commands/reminders/cancelreminder.ts | 44 -- src/commands/reminders/newremind.ts | 535 ----------------------- src/commands/reminders/remind.ts | 284 ------------ src/commands/reminders/viewreminders.ts | 61 --- 5 files changed, 924 deletions(-) delete mode 100644 src/commands/jobs/jobDatabase.ts delete mode 100644 src/commands/reminders/cancelreminder.ts delete mode 100644 src/commands/reminders/newremind.ts delete mode 100644 src/commands/reminders/remind.ts delete mode 100644 src/commands/reminders/viewreminders.ts diff --git a/src/commands/jobs/jobDatabase.ts b/src/commands/jobs/jobDatabase.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/src/commands/reminders/cancelreminder.ts b/src/commands/reminders/cancelreminder.ts deleted file mode 100644 index 5ec67c16..00000000 --- a/src/commands/reminders/cancelreminder.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Reminder } from '@lib/types/Reminder'; -import { DB } from '@root/config'; -import { ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, InteractionResponse } from 'discord.js'; -import { Command } from '@lib/types/Command'; - -export default class extends Command { - - description = 'Cancel any pending reminders you may have.'; - extendedHelp = 'You can only cancel one reminder at a time'; - - options: ApplicationCommandOptionData[] = [ - { - name: 'remindernumber', - type: ApplicationCommandOptionType.Integer, - required: true, - description: 'ID of the reminder to cancel' - } - ] - - async run(interaction: ChatInputCommandInteraction): Promise | void> { - const remindNum = interaction.options.getInteger('remindernumber') - 1; - - 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()); - const reminder = reminders[remindNum]; - - if (!reminder) { - interaction.reply({ - content: `I couldn't find reminder **${remindNum}**. Use the \`viewremind\` command to see your current reminders.`, - ephemeral: true - }); - } - - interaction.client.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - - const hidden = reminder.mode === 'private'; - return interaction.reply({ - content: `Canceled reminder: **${reminder.content}**`, - ephemeral: hidden - }); - } - -} diff --git a/src/commands/reminders/newremind.ts b/src/commands/reminders/newremind.ts deleted file mode 100644 index f5d5b522..00000000 --- a/src/commands/reminders/newremind.ts +++ /dev/null @@ -1,535 +0,0 @@ -import { BOT, DB } from '@root/config'; -import { - ApplicationCommandOptionData, - ChatInputCommandInteraction, - InteractionResponse, - ActionRowBuilder, - ButtonBuilder, - ButtonStyle, - ComponentType, - ModalBuilder, - TextInputBuilder, - TextInputStyle, - ModalSubmitInteraction, - EmbedBuilder -} from 'discord.js'; -import { Reminder } from '@lib/types/Reminder'; -import parse from 'parse-duration'; -import { checkJobReminder, reminderTime } from '@root/src/lib/utils/generalUtils'; -import { Command } from '@lib/types/Command'; - -// Emoji constants for button icons -const EMOJI = { - REMINDER: '⏰', - JOB: '💼', - VIEW: '📋', - CANCEL: '❌', - TIME: '🕒', - REPEAT: '🔄' -}; - -// Color constants for embeds (using Discord.js ColorResolvable) -const COLORS = { - PRIMARY: 0x5865F2, // Discord Blurple - SUCCESS: 0x57F287, // Green - DANGER: 0xED4245, // Red - WARNING: 0xFEE75C, // Yellow - SECONDARY: 0x9BA4EC, // Light Blurple - INFO: 0x5CBEFE // Light Blue -}; - -export default class extends Command { - description = `Have ${BOT.NAME} give you a reminder.`; - extendedHelp = 'Create reminders for anything - one-time or recurring job alerts.'; - options: ApplicationCommandOptionData[] = []; // No options needed as we're using buttons - - async run( - interaction: ChatInputCommandInteraction - ): Promise | void> { - // Create a stylish initial embed - const embed = new EmbedBuilder() - .setColor(COLORS.PRIMARY) - .setTitle(`${EMOJI.REMINDER} Reminder System`) - .setDescription('What would you like to do?') - .setFooter({ - text: `Requested by ${interaction.user.username}`, - iconURL: interaction.user.displayAvatarURL() - }) - .setTimestamp(); - - // Create buttons with emojis and clear labels - const row = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId('create_reminder') - .setLabel('Create Reminder') - .setEmoji(EMOJI.REMINDER) - .setStyle(ButtonStyle.Primary), - new ButtonBuilder() - .setCustomId('create_job_reminder') - .setLabel('Job Alert') - .setEmoji(EMOJI.JOB) - .setStyle(ButtonStyle.Secondary), - new ButtonBuilder() - .setCustomId('view_reminders') - .setLabel('View All') - .setEmoji(EMOJI.VIEW) - .setStyle(ButtonStyle.Success), - new ButtonBuilder() - .setCustomId('cancel_reminder') - .setLabel('Cancel') - .setEmoji(EMOJI.CANCEL) - .setStyle(ButtonStyle.Danger) - ); - - // Send the initial message with embed and buttons - const response = await interaction.reply({ - embeds: [embed], - components: [row], - ephemeral: true - }); - - // Create collector for button interactions - const collector = response.createMessageComponentCollector({ - componentType: ComponentType.Button, - time: 120000 // 2 minute timeout (extended) - }); - - collector.on('collect', async (buttonInteraction) => { - // Handle button clicks - if (buttonInteraction.customId === 'create_reminder') { - await this.handleCreateReminder(buttonInteraction); - } else if (buttonInteraction.customId === 'create_job_reminder') { - await this.handleCreateJobReminder(buttonInteraction); - } else if (buttonInteraction.customId === 'view_reminders') { - await this.handleViewReminders(buttonInteraction); - } else if (buttonInteraction.customId === 'cancel_reminder') { - await this.handleCancelReminder(buttonInteraction); - } - }); - - collector.on('end', async (collected) => { - if (collected.size === 0) { - const timeoutEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.TIME} Reminder Action Timed Out`) - .setDescription('You can run the command again to set up a reminder.') - .setTimestamp(); - - await interaction.editReply({ - embeds: [timeoutEmbed], - components: [] - }); - } - }); - } - - // Handle creating a standard reminder via a modal - private async handleCreateReminder(buttonInteraction: any) { - // Create modal for reminder details - const modal = new ModalBuilder() - .setCustomId('reminder_modal') - .setTitle(`${EMOJI.REMINDER} Create New Reminder`); - - // Add inputs for content and duration - const contentInput = new TextInputBuilder() - .setCustomId('content') - .setLabel("What would you like to be reminded of?") - .setStyle(TextInputStyle.Paragraph) - .setPlaceholder("Enter your reminder message here...") - .setRequired(true); - - const durationInput = new TextInputBuilder() - .setCustomId('duration') - .setLabel("When would you like to be reminded?") - .setPlaceholder('e.g. 1 hour, 30 minutes, 2 days, tomorrow at 3pm') - .setStyle(TextInputStyle.Short) - .setRequired(true); - - // Create action rows with inputs - const contentRow = new ActionRowBuilder().addComponents(contentInput); - const durationRow = new ActionRowBuilder().addComponents(durationInput); - - // Add action rows to the modal - modal.addComponents(contentRow, durationRow); - - // Show the modal - await buttonInteraction.showModal(modal); - - // Wait for modal submission - try { - const modalInteraction = await buttonInteraction.awaitModalSubmit({ - time: 180000, // 3 minutes (extended) - filter: (i: ModalSubmitInteraction) => - i.customId === 'reminder_modal' && - i.user.id === buttonInteraction.user.id - }); - - // Process modal submission - const content = modalInteraction.fields.getTextInputValue('content'); - const rawDuration = modalInteraction.fields.getTextInputValue('duration'); - const duration = parse(rawDuration); - - if (!duration) { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.TIME} Invalid Time Format`) - .setDescription(`**"${rawDuration}"** is not a valid duration.\nYou can use words like hours, minutes, seconds, days, weeks, months, or years.`) - .setFooter({ text: 'Try something like "3 hours" or "2 days"' }); - - return modalInteraction.reply({ - embeds: [errorEmbed], - ephemeral: true - }); - } - - // Calculate the expiry date - const expiryDate = new Date(duration + Date.now()); - - // Create and store the reminder directly - const reminder: Reminder = { - owner: modalInteraction.user.id, - content, - mode: 'public', // could be changed to private if needed - expires: expiryDate, - repeat: null // No repeat by default - }; - - await modalInteraction.client.mongo - .collection(DB.REMINDERS) - .insertOne(reminder); - - const successEmbed = new EmbedBuilder() - .setColor(COLORS.SUCCESS) - .setTitle(`${EMOJI.REMINDER} Reminder Set!`) - .setDescription(`I'll remind you about that at **${reminderTime(reminder)}**.`) - .addFields({ - name: 'Reminder Content', - value: `> ${content}` - }) - .setTimestamp(); - - await modalInteraction.reply({ - embeds: [successEmbed], - ephemeral: true - }); - - } catch (error) { - console.error('Error in modal submission:', error); - - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Reminder Creation Failed`) - .setDescription('The reminder creation process timed out or an error occurred.') - .setTimestamp(); - - await buttonInteraction.followUp({ - embeds: [errorEmbed], - ephemeral: true - }); - } - } - - // Handle creating a job reminder using a modal - private async handleCreateJobReminder(buttonInteraction: any) { - // Check for existing job reminder - if (await checkJobReminder(buttonInteraction)) { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.WARNING) - .setTitle(`${EMOJI.JOB} Job Reminder Already Exists`) - .setDescription( - 'You currently already have a job reminder set. To clear your existing job reminder, use the CANCEL button and provide the reminder number.' - ); - - return buttonInteraction.reply({ - embeds: [errorEmbed], - ephemeral: true - }); - } - - // Create modal for job reminder settings - const modal = new ModalBuilder() - .setCustomId('job_reminder_modal') - .setTitle(`${EMOJI.JOB} Create Job Alert`); - - // Add inputs for repeat frequency and filter type - const repeatInput = new TextInputBuilder() - .setCustomId('repeat') - .setLabel('How often would you like to receive alerts?') - .setPlaceholder('Type "daily", "weekly", or "monthly"') - .setStyle(TextInputStyle.Short) - .setRequired(true); - - const filterInput = new TextInputBuilder() - .setCustomId('filter') - .setLabel('Sort jobs by?') - .setPlaceholder('default, relevance, salary, or date') - .setStyle(TextInputStyle.Short) - .setRequired(true) - .setValue('default'); // Default value - - // Create action rows with inputs - const repeatRow = new ActionRowBuilder().addComponents(repeatInput); - const filterRow = new ActionRowBuilder().addComponents(filterInput); - - // Add action rows to the modal - modal.addComponents(repeatRow, filterRow); - - // Show the modal - await buttonInteraction.showModal(modal); - - // Wait for modal submission - try { - const modalInteraction = await buttonInteraction.awaitModalSubmit({ - time: 180000, // 3 minutes (extended) - filter: (i: ModalSubmitInteraction) => - i.customId === 'job_reminder_modal' && - i.user.id === buttonInteraction.user.id - }); - - // Process modal submission - let repeatValue = modalInteraction.fields.getTextInputValue('repeat').toLowerCase(); - let filterValue = modalInteraction.fields.getTextInputValue('filter').toLowerCase(); - - // Validate repeat input - if (repeatValue !== 'daily' && repeatValue !== 'weekly' && repeatValue !== 'monthly') { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.REPEAT} Invalid Repeat Option`) - .setDescription(`**"${repeatValue}"** is not a valid repeat option. Please use "daily", "weekly", or "monthly".`); - - return modalInteraction.reply({ - embeds: [errorEmbed], - ephemeral: true - }); - } - - // Validate filter input - const validFilters = ['default', 'relevance', 'salary', 'date']; - if (!validFilters.includes(filterValue)) { - filterValue = 'default'; // Fallback to default if invalid - } - - // Create and store the job reminder - const jobReminder: Reminder = { - owner: modalInteraction.user.id, - content: 'Job Reminder', - mode: 'private', - expires: new Date(), // Set to now, will be handled by the job scheduler - repeat: repeatValue as 'daily' | 'weekly', - filterBy: filterValue as 'default' | 'relevance' | 'salary' | 'date' - }; - - await modalInteraction.client.mongo - .collection(DB.REMINDERS) - .insertOne(jobReminder); - - const successEmbed = new EmbedBuilder() - .setColor(COLORS.SECONDARY) - .setTitle(`${EMOJI.JOB} Job Alert Created`) - .setDescription( - `I'll send you job opportunities **${repeatValue}** starting at **${reminderTime(jobReminder)}**.` - ) - .addFields( - { name: 'Frequency', value: `${repeatValue.charAt(0).toUpperCase() + repeatValue.slice(1)}`, inline: true }, - { name: 'Sorted By', value: `${filterValue.charAt(0).toUpperCase() + filterValue.slice(1)}`, inline: true } - ) - .setFooter({ text: 'You can update your preferences anytime' }) - .setTimestamp(); - - await modalInteraction.reply({ - embeds: [successEmbed], - ephemeral: true - }); - - } catch (error) { - console.error('Error in modal submission:', error); - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Job Alert Creation Failed`) - .setDescription('The job alert creation process timed out or an error occurred.') - .setTimestamp(); - - await buttonInteraction.followUp({ - embeds: [errorEmbed], - ephemeral: true - }); - } - } - - // Handle viewing reminders - private async handleViewReminders(buttonInteraction: any) { - const reminders: Array = await buttonInteraction.client.mongo - .collection(DB.REMINDERS) - .find({ owner: buttonInteraction.user.id }) - .toArray(); - - reminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); - - if (reminders.length < 1) { - const noRemindersEmbed = new EmbedBuilder() - .setColor(COLORS.INFO) - .setTitle(`${EMOJI.VIEW} No Reminders Found`) - .setDescription('You don\'t have any pending reminders!') - .setFooter({ text: 'Use the CREATE REMINDER button to set one up' }) - .setTimestamp(); - - return buttonInteraction.reply({ - embeds: [noRemindersEmbed], - ephemeral: true - }); - } - - const embeds: Array = []; - reminders.forEach((reminder, i) => { - if (i % 10 === 0) { // Reduced to 10 reminders per embed for better readability - embeds.push( - new EmbedBuilder() - .setTitle(`${EMOJI.VIEW} Your Reminders (${reminders.length})`) - .setColor(COLORS.INFO) - .setDescription('Here are all your pending reminders:') - .setFooter({ - text: `Page ${Math.floor(i / 10) + 1}/${Math.ceil(reminders.length / 10)}` - }) - .setTimestamp() - ); - } - - const hidden = reminder.mode === 'private'; - const isJobReminder = reminder.content === 'Job Reminder'; - const icon = isJobReminder ? EMOJI.JOB : EMOJI.REMINDER; - - embeds[Math.floor(i / 10)].addFields({ - name: `${i + 1}. ${icon} ${ - hidden - ? isJobReminder - ? 'Job Alert' - : 'Private Reminder' - : reminder.content - }`, - value: hidden - ? `${EMOJI.REPEAT} **${reminder.repeat}** job reminder filtered by **${reminder.filterBy}**` - : `${EMOJI.TIME} Due: **${reminderTime(reminder)}**` - }); - }); - - await buttonInteraction.reply({ - embeds, - ephemeral: true - }); - } - - // Handle canceling a reminder - private async handleCancelReminder(buttonInteraction: any) { - // Create modal for reminder cancellation - const modal = new ModalBuilder() - .setCustomId('cancel_reminder_modal') - .setTitle(`${EMOJI.CANCEL} Cancel Reminder`); - - // Add input for reminder number - const reminderNumInput = new TextInputBuilder() - .setCustomId('reminder_number') - .setLabel("Which reminder would you like to cancel?") - .setPlaceholder('Enter the number (e.g. 1, 2, 3)') - .setStyle(TextInputStyle.Short) - .setRequired(true); - - // Create action row with input - const reminderNumRow = new ActionRowBuilder().addComponents(reminderNumInput); - - // Add action row to the modal - modal.addComponents(reminderNumRow); - - // Show the modal - await buttonInteraction.showModal(modal); - - // Wait for modal submission - try { - const modalInteraction = await buttonInteraction.awaitModalSubmit({ - time: 60000, // 1 minute - filter: (i: ModalSubmitInteraction) => - i.customId === 'cancel_reminder_modal' && - i.user.id === buttonInteraction.user.id - }); - - // Process modal submission - const reminderNumStr = modalInteraction.fields.getTextInputValue('reminder_number'); - const reminderNum = parseInt(reminderNumStr) - 1; // Convert to 0-based index - - if (isNaN(reminderNum) || reminderNum < 0) { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Invalid Reminder Number`) - .setDescription(`**"${reminderNumStr}"** is not a valid reminder number. Please enter a positive integer.`) - .setFooter({ text: 'Use the VIEW REMINDERS button to see your reminders and their numbers' }); - - return modalInteraction.reply({ - embeds: [errorEmbed], - ephemeral: true - }); - } - - // Get user's reminders and sort them - const reminders: Array = await modalInteraction.client.mongo - .collection(DB.REMINDERS) - .find({ owner: modalInteraction.user.id }) - .toArray(); - - reminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); - - // Check if the reminder exists - const reminder = reminders[reminderNum]; - if (!reminder) { - const notFoundEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Reminder Not Found`) - .setDescription(`I couldn't find reminder **#${reminderNum + 1}**.`) - .setFooter({ text: 'Use the VIEW REMINDERS button to see your current reminders' }); - - return modalInteraction.reply({ - embeds: [notFoundEmbed], - ephemeral: true - }); - } - - // Delete the reminder - await modalInteraction.client.mongo - .collection(DB.REMINDERS) - .findOneAndDelete(reminder); - - const hidden = reminder.mode === 'private'; - const isJobReminder = reminder.content === 'Job Reminder'; - - const successEmbed = new EmbedBuilder() - .setColor(COLORS.SUCCESS) - .setTitle(`${EMOJI.CANCEL} Reminder Cancelled`) - .setDescription( - `Successfully cancelled reminder **#${reminderNum + 1}**: ${ - hidden - ? (isJobReminder ? 'Job Alert' : 'Private Reminder') - : `"${reminder.content}"` - }` - ) - .setTimestamp(); - - return modalInteraction.reply({ - embeds: [successEmbed], - ephemeral: true - }); - - } catch (error) { - console.error('Error in modal submission:', error); - - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Cancellation Failed`) - .setDescription('The reminder cancellation process timed out or an error occurred.') - .setTimestamp(); - - await buttonInteraction.followUp({ - embeds: [errorEmbed], - ephemeral: true - }); - } - } -} \ No newline at end of file diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts deleted file mode 100644 index 1eab560f..00000000 --- a/src/commands/reminders/remind.ts +++ /dev/null @@ -1,284 +0,0 @@ -import { BOT, DB } from '@root/config'; -import { - ApplicationCommandOptionData, - ChatInputCommandInteraction, - InteractionResponse, - ActionRowBuilder, - ButtonBuilder, - ButtonStyle, - ComponentType, - ModalBuilder, - TextInputBuilder, - TextInputStyle, - ModalSubmitInteraction -} from 'discord.js'; -import { Reminder } from '@lib/types/Reminder'; -import parse from 'parse-duration'; -import { checkJobReminder, 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 = 'Choose to create either a regular reminder or a job reminder.'; - options: ApplicationCommandOptionData[] = []; // No options needed as we're using buttons - - - async run( - interaction: ChatInputCommandInteraction - ): Promise | void> { - // Create buttons for the two options - const row = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId('create_reminder') - .setLabel('CREATE REMINDER') - .setStyle(ButtonStyle.Primary), - new ButtonBuilder() - .setCustomId('create_job_reminder') - .setLabel('CREATE JOB REMINDER') - .setStyle(ButtonStyle.Secondary) - ); - - - // Send the initial message with buttons - const response = await interaction.reply({ - content: 'What type of reminder would you like to create?', - components: [row], - ephemeral: true - }); - - - // Create collector for button interactions - const collector = response.createMessageComponentCollector({ - componentType: ComponentType.Button, - time: 60000 // 1 minute timeout - }); - - - collector.on('collect', async (buttonInteraction) => { - // Handle button clicks - if (buttonInteraction.customId === 'create_reminder') { - await this.handleCreateReminder(buttonInteraction); - } else if (buttonInteraction.customId === 'create_job_reminder') { - await this.handleCreateJobReminder(buttonInteraction); - } - }); - - - collector.on('end', async (collected) => { - if (collected.size === 0) { - await interaction.editReply({ - content: 'Reminder creation timed out.', - components: [] - }); - } - }); - } - - - // Handle creating a standard reminder via a modal - private async handleCreateReminder(buttonInteraction: any) { - // Create modal for reminder details - const modal = new ModalBuilder() - .setCustomId('reminder_modal') - .setTitle('Create Reminder'); - - - // Add inputs for content and duration - const contentInput = new TextInputBuilder() - .setCustomId('content') - .setLabel("What would you like to be reminded of") - .setStyle(TextInputStyle.Paragraph) - .setRequired(true); - - - const durationInput = new TextInputBuilder() - .setCustomId('duration') - .setLabel("When would you like to be reminded") - .setPlaceholder('e.g. 1 hour, 30 minutes, 2 days') - .setStyle(TextInputStyle.Short) - .setRequired(true); - - - // Create action rows with inputs - const contentRow = new ActionRowBuilder().addComponents(contentInput); - const durationRow = new ActionRowBuilder().addComponents(durationInput); - - - // Add action rows to the modal - modal.addComponents(contentRow, durationRow); - - - // Show the modal - await buttonInteraction.showModal(modal); - - - // Wait for modal submission - try { - const modalInteraction = await buttonInteraction.awaitModalSubmit({ - time: 120000, // 2 minutes - filter: (i: ModalSubmitInteraction) => - i.customId === 'reminder_modal' && - i.user.id === buttonInteraction.user.id - }); - - - // Process modal submission - const content = modalInteraction.fields.getTextInputValue('content'); - const rawDuration = modalInteraction.fields.getTextInputValue('duration'); - const duration = parse(rawDuration); - - - if (!duration) { - return modalInteraction.reply({ - content: `**${rawDuration}** is not a valid duration. You can use words like hours, minutes, seconds, days, weeks, months, or years.`, - ephemeral: true - }); - } - - - // Calculate the expiry date - const expiryDate = new Date(duration + Date.now()); - - - // Create and store the reminder directly - const reminder: Reminder = { - owner: modalInteraction.user.id, - content, - mode: 'public', // could be changed to private if needed - expires: expiryDate, - repeat: null // No repeat by default - }; - - - await modalInteraction.client.mongo - .collection(DB.REMINDERS) - .insertOne(reminder); - - - await modalInteraction.reply({ - content: `I'll remind you about that at ${reminderTime(reminder)}.`, - ephemeral: true - }); - - - } catch (error) { - console.error('Error in modal submission:', error); - await buttonInteraction.followUp({ - content: 'Reminder creation timed out or failed.', - ephemeral: true - }); - } - } - - - // Handle creating a job reminder using a modal - private async handleCreateJobReminder(buttonInteraction: any) { - // Check for existing job reminder - if (await checkJobReminder(buttonInteraction)) { - return buttonInteraction.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 - }); - } - - - // Create modal for job reminder settings - const modal = new ModalBuilder() - .setCustomId('job_reminder_modal') - .setTitle('Create Job Reminder'); - - - // Add inputs for repeat frequency and filter type - const repeatInput = new TextInputBuilder() - .setCustomId('repeat') - .setLabel('Repeat frequency (daily or weekly)') - .setPlaceholder('Type "daily" or "weekly"') - .setStyle(TextInputStyle.Short) - .setRequired(true); - - - const filterInput = new TextInputBuilder() - .setCustomId('filter') - .setLabel('Filter by (default, relevance, salary, date)') - .setPlaceholder('Type one of the options') - .setStyle(TextInputStyle.Short) - .setRequired(true) - .setValue('default'); // Default value - - - // Create action rows with inputs - const repeatRow = new ActionRowBuilder().addComponents(repeatInput); - const filterRow = new ActionRowBuilder().addComponents(filterInput); - - - // Add action rows to the modal - modal.addComponents(repeatRow, filterRow); - - - // Show the modal - await buttonInteraction.showModal(modal); - - - // Wait for modal submission - try { - const modalInteraction = await buttonInteraction.awaitModalSubmit({ - time: 120000, // 2 minutes - filter: (i: ModalSubmitInteraction) => - i.customId === 'job_reminder_modal' && - i.user.id === buttonInteraction.user.id - }); - - - // Process modal submission - let repeatValue = modalInteraction.fields.getTextInputValue('repeat').toLowerCase(); - let filterValue = modalInteraction.fields.getTextInputValue('filter').toLowerCase(); - - // Validate repeat input - if (repeatValue !== 'daily' && repeatValue !== 'weekly' && repeatValue !== 'monthly') { - return modalInteraction.reply({ - content: `**${repeatValue}** is not a valid repeat option. Please use "daily" or "weekly".`, - ephemeral: true - }); - } - - // Validate filter input - const validFilters = ['default', 'relevance', 'salary', 'date']; - if (!validFilters.includes(filterValue)) { - filterValue = 'default'; // Fallback to default if invalid - } - - // Create and store the job reminder - const jobReminder: Reminder = { - owner: modalInteraction.user.id, - content: 'Job Reminder', - mode: 'private', - expires: new Date(), // Set to now, will be handled by the job scheduler - repeat: repeatValue as 'daily' | 'weekly', - filterBy: filterValue as 'default' | 'relevance' | 'salary' | 'date' - }; - - - await modalInteraction.client.mongo - .collection(DB.REMINDERS) - .insertOne(jobReminder); - - - await modalInteraction.reply({ - content: `I'll remind you about job offers ${repeatValue} at ${reminderTime(jobReminder)}, filtered by ${filterValue}.`, - ephemeral: true - }); - - - } catch (error) { - console.error('Error in modal submission:', error); - await buttonInteraction.followUp({ - content: 'Job reminder creation timed out or failed.', - ephemeral: true - }); - } - } -} - diff --git a/src/commands/reminders/viewreminders.ts b/src/commands/reminders/viewreminders.ts deleted file mode 100644 index 5152df69..00000000 --- a/src/commands/reminders/viewreminders.ts +++ /dev/null @@ -1,61 +0,0 @@ -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(); - 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 - }); - } - - const embeds: Array = []; - - reminders.forEach((reminder, i) => { - if (i % 25 === 0) { - embeds.push( - new EmbedBuilder() - .setTitle('Pending reminders') - .setColor('DarkAqua') - ); - } - 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 - ? `This is a **${reminder.repeat}** job reminder` - : reminderTime(reminder) - }); - }); - - interaction.reply({ embeds }); - } - -} From 64a32406cce6f2d2ae46a73f1a41e9f39d0e8c37 Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Mon, 7 Apr 2025 23:24:57 -0400 Subject: [PATCH 269/317] Fixed an error where a depracated interaction was used. --- 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 04f4c9d4..a7eef4d2 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -38,7 +38,7 @@ async function register(bot: Client): Promise { bot.on('interactionCreate', async interaction => { if (interaction.isChatInputCommand() || interaction.isContextMenuCommand()) runCommand(interaction as ChatInputCommandInteraction, bot); - if (interaction.isSelectMenu()) handleDropdown(interaction); + if (interaction.isStringSelectMenu()) handleDropdown(interaction); if (interaction.isModalSubmit()) handleModalBuilder(interaction, bot); if (interaction.isButton()) handleButton(interaction); }); From 0dd948b6829f4c3b605be2743c740593b622d81b Mon Sep 17 00:00:00 2001 From: Nazmul Date: Tue, 8 Apr 2025 17:42:04 -0400 Subject: [PATCH 270/317] resolved merge issues --- src/commands/jobs/jobs.ts | 296 ++++++++++++++++++-------------------- 1 file changed, 143 insertions(+), 153 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index eed6403a..66c0d396 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -8,26 +8,18 @@ import { ButtonStyle, ComponentType, InteractionResponse, + AttachmentBuilder, } 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"; -import { DB, BOT } from "@root/config"; -import { Job } from "@root/src/lib/types/Job"; +import { DB, BOT, MAP_KEY } from "@root/config"; import { MongoClient } from "mongodb"; -import { ApplicationCommandOptionData, ApplicationCommandOptionType, AttachmentBuilder, ChatInputCommandInteraction, 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'; -import { DB, BOT, MAP_KEY } from '@root/config'; -import { MongoClient } from 'mongodb'; -import { sendToFile } from '@root/src/lib/utils/generalUtils'; -import axios from 'axios'; -import { JobPreferences } from '@root/src/lib/types/JobPreferences'; +import { sendToFile } from "@root/src/lib/utils/generalUtils"; +import axios from "axios"; +import { JobPreferences } from "@root/src/lib/types/JobPreferences"; // Temporary storage for user job data const userJobData = new Map(); @@ -46,85 +38,52 @@ export default class extends Command { { name: "Date Posted", value: "date" }, { name: "Salary", value: "salary" }, { name: "Alphabetical", value: "alphabetical" }, + { name: "Distance", value: "distance" }, ], }, ]; - // options: ApplicationCommandOptionData[] = [ - // { - // name: 'question', - // description: 'The question you want to ask', - // type: ApplicationCommandOptionType.String, - // required: true - // } - // ] async run( interaction: ChatInputCommandInteraction ): Promise> { - { name: 'Date Posted', value: 'date' }, - { name: 'Salary', value: 'salary' }, - { name: 'Alphabetical', value: 'alphabetical' }, - {name: 'Distance', value: 'distance' } - ] - } - ] - - async run(interaction: ChatInputCommandInteraction): Promise> { const userID = interaction.user.id; const filterBy = interaction.options.getString("filter") ?? "default"; - //const client = await MongoClient.connect(DB.CONNECTION, { useUnifiedTopology: true }); - // 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' - // }; - // Fetch job data (replace with your actual logic) - // 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 client = await MongoClient.connect(DB.CONNECTION, { useUnifiedTopology: true }); - const db = client.db(BOT.NAME).collection(DB.USERS); - const filterBy = interaction.options.getString('filter') ?? 'default'; + const client = await MongoClient.connect(DB.CONNECTION, { + useUnifiedTopology: true, + }); + const db = client.db(BOT.NAME).collection(DB.USERS); + const jobformAnswers: JobPreferences | null = ( + await db.findOne({ discordId: userID }) + )?.jobPreferences; - const jobformAnswers: JobPreferences | null = (await db.findOne({ discordId: userID }))?.jobPreferences; + if (!jobformAnswers) { + await interaction.reply( + "You haven't set up your job preferences yet. Please use `/jobform` first." + ); + return; + } const jobData: JobData = { - city: "New York", - preference: "Software Engineer", - jobType: "Full Time", - distance: "10", + city: "New York", // You might want to get this from jobformAnswers + preference: "Software Engineer", // You might want to get this from jobformAnswers + jobType: "Full Time", // You might want to get this from jobformAnswers + distance: "10", // You might want to get this from jobformAnswers filterBy: filterBy, }; const interests: Interest = { - interest1: "Software", - interest2: "Engineer", - interest3: "Full Time", - interest4: "New York", - interest5: "10", interest1: jobformAnswers.answers.interest1, interest2: jobformAnswers.answers.interest2, interest3: jobformAnswers.answers.interest3, interest4: jobformAnswers.answers.interest4, - interest5: jobformAnswers.answers.interest5 + interest5: jobformAnswers.answers.interest5, }; 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'; if (APIResponse.length === 0) { await interaction.reply("No jobs found based on your interests."); @@ -260,95 +219,106 @@ export default class extends Command { return formattedSalaryMin && formattedSalaryMax ? `Avg: ${formattedAvgSalary}\nMin: ${formattedSalaryMin}\nMax: ${formattedSalaryMax}` : formattedAvgSalary; - const 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: - - ${await this.listJobs(jobFormData, 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. - `; - - const attachments: AttachmentBuilder[] = []; - const pubChan = interaction.channel; - if (message.length > 2000) { - attachments.push(await sendToFile(this.stripMarkdown(message.split('---')[0], userID), 'txt', 'list-of-jobs-internships', false)); - pubChan.send({ content: this.headerMessage(userID, filterBy), files: attachments as AttachmentBuilder[] }); - // interaction.user.send({ content: this.headerMessage(userID, 'default'), files: attachments as AttachmentBuilder[] }); - } else { - pubChan.send(message); - } } - async listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: string): Promise { - // Conditionally sort jobs by salary if sortBy is 'salary' + async listJobs( + jobForm: [JobData, Interest, JobResult[]], + filterBy: string + ): Promise { const cityCoordinates = await this.queryCoordinates(jobForm[0].city); - if (filterBy === 'salary') { + if (filterBy === "salary") { jobForm[2].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(avgA)) return 1; if (isNaN(avgB)) return -1; - return avgB - avgA; // Descending order + return avgB - avgA; }); - } else if (filterBy === 'alphabetical') { + } else if (filterBy === "alphabetical") { jobForm[2].sort((a, b) => (a.title > b.title ? 1 : -1)); - } else if (filterBy === 'date') { - jobForm[2].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); - } else if (filterBy === 'distance') { - // cityCoordinates = await this.queryCoordinates(jobForm[0].city); - + } else if (filterBy === "date") { + jobForm[2].sort( + (a, b) => + new Date(b.created).getTime() - + new Date(a.created).getTime() + ); + } else if (filterBy === "distance") { jobForm[2].sort((a, b) => { - const distanceA = this.calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(a.latitude), Number(a.longitude)); - const distanceB = this.calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(b.latitude), Number(b.longitude)); + const distanceA = this.calculateDistance( + cityCoordinates.lat, + cityCoordinates.lng, + Number(a.latitude), + Number(a.longitude) + ); + const distanceB = this.calculateDistance( + cityCoordinates.lat, + cityCoordinates.lng, + Number(b.latitude), + Number(b.longitude) + ); if (distanceA === -1) { - return 1; // Treat jobs with no location as lowest + return 1; } - return distanceA - distanceB; // Might have to account for negative distances + return distanceA - distanceB; }); } - - - let jobList = ''; + let jobList = ""; for (let i = 0; i < jobForm[2].length; i++) { - const avgSalary = (Number(jobForm[2][i].salaryMax) + Number(jobForm[2][i].salaryMin)) / 2; + const avgSalary = + (Number(jobForm[2][i].salaryMax) + + Number(jobForm[2][i].salaryMin)) / + 2; const formattedAvgSalary = this.formatCurrency(avgSalary); - const formattedSalaryMax = this.formatCurrency(Number(jobForm[2][i].salaryMax)) !== 'N/A' ? this.formatCurrency(Number(jobForm[2][i].salaryMax)) : ''; - const formattedSalaryMin = this.formatCurrency(Number(jobForm[2][i].salaryMin)) !== 'N/A' ? this.formatCurrency(Number(jobForm[2][i].salaryMin)) : ''; - const jobDistance = this.calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(jobForm[2][i].latitude), Number(jobForm[2][i].longitude)); - const formattedDistance = (jobDistance !== -1) ? `${jobDistance.toFixed(2)} miles` : 'N/A'; + const formattedSalaryMax = + this.formatCurrency(Number(jobForm[2][i].salaryMax)) !== "N/A" + ? this.formatCurrency(Number(jobForm[2][i].salaryMax)) + : ""; + const formattedSalaryMin = + this.formatCurrency(Number(jobForm[2][i].salaryMin)) !== "N/A" + ? this.formatCurrency(Number(jobForm[2][i].salaryMin)) + : ""; + const jobDistance = this.calculateDistance( + cityCoordinates.lat, + cityCoordinates.lng, + Number(jobForm[2][i].latitude), + Number(jobForm[2][i].longitude) + ); + const formattedDistance = + jobDistance !== -1 ? `${jobDistance.toFixed(2)} miles` : "N/A"; - const salaryDetails = (formattedSalaryMin && formattedSalaryMax) - ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` - : formattedAvgSalary; + const salaryDetails = + formattedSalaryMin && formattedSalaryMax + ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` + : formattedAvgSalary; jobList += `${i + 1}. **${jobForm[2][i].title}** - \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} - \t\t* **Location:** ${jobForm[2][i].location} - \t\t* **Date Posted:** ${new Date(jobForm[2][i].created).toDateString()} at ${new Date(jobForm[2][i].created).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })} - \t\t* **Apply here:** [read more about the job and apply here](${jobForm[2][i].link}) - \t\t* **Distance:** ${formattedDistance} - ${i !== jobForm[2].length - 1 ? '\n' : ''}`; + \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} + \t\t* **Location:** ${jobForm[2][i].location} + \t\t* **Date Posted:** ${new Date( + jobForm[2][i].created + ).toDateString()} at ${new Date( + jobForm[2][i].created + ).toLocaleTimeString("en-US", { + hour: "2-digit", + minute: "2-digit", + })} + \t\t* **Apply here:** [read more about the job and apply here](${ + jobForm[2][i].link + }) + \t\t* **Distance:** ${formattedDistance} + ${i !== jobForm[2].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.'; + 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 { @@ -360,56 +330,76 @@ Here's your personalized list: }).format(Number(currency))}`; } - 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(/###|-\#\s*/g, '') + .replace( + new RegExp( + `## Hey <@${owner}>!\\s*## Here's your list of job/internship recommendations:?`, + "g" + ), + "" + ) + .replace(/\[read more about the job and apply here\]/g, "") + .replace(/\((https?:\/\/[^\s)]+)\)/g, "$1") + .replace(/\*\*([^*]+)\*\*/g, "$1") + .replace(/##+\s*/g, "") + .replace(/###|-\#\s*/g, "") .trim(); } - headerMessage(owner:string, filterBy:string):string { + 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. \ - 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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; + ### **__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${ + filterBy && filterBy !== "default" + ? ` (filtered based on ${ + filterBy === "date" ? "date posted" : filterBy + }):` + : ":" + } + `; } - calculateDistance(lat1: number, lon1: number, lat2: number, lon2: number): number { + calculateDistance( + lat1: number, + lon1: number, + lat2: number, + lon2: number + ): number { const toRadians = (degrees: number) => degrees * (Math.PI / 180); const R = 3958.8; // Radius of the Earth in miles const dLat = toRadians(lat2 - lat1); const dLon = toRadians(lon2 - lon1); - const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * - Math.sin(dLon / 2) * Math.sin(dLon / 2); + const a = + Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(toRadians(lat1)) * + Math.cos(toRadians(lat2)) * + Math.sin(dLon / 2) * + Math.sin(dLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - const distance = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 : R * c; + const distance = + (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) + ? -1 + : R * c; return distance; } - async queryCoordinates(location: string): Promise { // Change to appropriate type later + async queryCoordinates(location: string): Promise { const preferredCity = encodeURIComponent(location); const baseURL = `https://maps.google.com/maps/api/geocode/json?address=${preferredCity}&components=country:US&key=${MAP_KEY}`; const response = await axios.get(baseURL); - const coordinates : {lat: number, lng: number } = { + const coordinates: { lat: number; lng: number } = { lat: response.data.results[0].geometry.location.lat, - lng: response.data.results[0].geometry.location.lng + lng: response.data.results[0].geometry.location.lng, }; return coordinates; } - } From 9e0b66a754697a740e2d791fd6e566a9b570b0dc Mon Sep 17 00:00:00 2001 From: Nazmul Date: Tue, 8 Apr 2025 18:50:19 -0400 Subject: [PATCH 271/317] added download button and functionality --- package-lock.json | 1178 +++++++++++++++++++++++++++++++++++-- package.json | 5 +- src/commands/jobs/jobs.ts | 87 ++- 3 files changed, 1235 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 07c48ae7..f86c1338 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "canvas": "^3.1.0", "console-stamp": "^3.0.2", "discord.js": "^14.16.3", + "html-pdf-node": "^1.0.7", "module-alias": "^2.2.2", "moment": "^2.29.1", "mongodb": "^3.7.4", @@ -24,7 +25,9 @@ "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", "parse-duration": "^2.1.3", - "pretty-ms": "^7.0.1" + "pdf-lib": "^1.17.1", + "pretty-ms": "^7.0.1", + "puppeteer": "^24.6.0" }, "devDependencies": { "@types/console-stamp": "^0.2.33", @@ -47,7 +50,6 @@ "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, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -56,7 +58,6 @@ "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, "engines": { "node": ">=6.9.0" } @@ -65,7 +66,6 @@ "version": "7.17.12", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -79,7 +79,6 @@ "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, "dependencies": { "color-convert": "^1.9.0" }, @@ -91,7 +90,6 @@ "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, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -105,7 +103,6 @@ "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, "dependencies": { "color-name": "1.1.3" } @@ -113,14 +110,12 @@ "node_modules/@babel/highlight/node_modules/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 + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "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, "engines": { "node": ">=0.8.0" } @@ -129,7 +124,6 @@ "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, "engines": { "node": ">=4" } @@ -138,7 +132,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -531,6 +524,93 @@ "@octokit/openapi-types": "^23.0.1" } }, + "node_modules/@pdf-lib/standard-fonts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "license": "MIT", + "dependencies": { + "pako": "^1.0.6" + } + }, + "node_modules/@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "license": "MIT", + "dependencies": { + "pako": "^1.0.10" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.9.0.tgz", + "integrity": "sha512-8+xM+cFydYET4X/5/3yZMHs7sjS6c9I6H5I3xJdb6cinzxWUT/I2QVw4avxCQ8QDndwdHkG/FiSZIrCjAbaKvQ==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.0", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.1", + "tar-fs": "^3.0.8", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@puppeteer/browsers/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@puppeteer/browsers/node_modules/tar-fs": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/@puppeteer/browsers/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/@sapphire/async-queue": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.5.tgz", @@ -564,6 +644,12 @@ "npm": ">=7.0.0" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, "node_modules/@types/bson": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.2.0.tgz", @@ -662,6 +748,16 @@ "@types/node": "*" } }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", @@ -979,6 +1075,18 @@ "node": ">=8" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -1004,11 +1112,89 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" + }, "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==" }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.2.tgz", + "integrity": "sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1028,6 +1214,15 @@ } ] }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/before-after-hook": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", @@ -1043,6 +1238,12 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1100,11 +1301,19 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "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, "engines": { "node": ">=6" } @@ -1146,6 +1355,33 @@ "node": ">=10" } }, + "node_modules/chromium-bidi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-3.0.0.tgz", + "integrity": "sha512-ZOGRDAhBMX1uxL2Cm2TDuhImbrsEz5A/tTcVU6RpXEWaTNUNwsHW6njUXizh51Ir6iqHbKAfhA2XK33uBcLo5A==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1208,6 +1444,50 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1223,6 +1503,15 @@ "node": ">= 8" } }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/dateformat": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", @@ -1277,6 +1566,20 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1306,6 +1609,12 @@ "node": ">=8" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1425554", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", + "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==", + "license": "BSD-3-Clause" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1394,6 +1703,33 @@ "node": ">=8.6" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1406,6 +1742,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", @@ -1545,7 +1911,6 @@ "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, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -1609,7 +1974,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1638,6 +2002,26 @@ "node": ">=6" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, "node_modules/fast-content-type-parse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", @@ -1659,6 +2043,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", @@ -1696,6 +2086,15 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1721,6 +2120,19 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -1826,16 +2238,54 @@ "node": ">=10" } }, - "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/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", + "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1898,6 +2348,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1911,6 +2382,113 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, + "node_modules/html-pdf-node": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/html-pdf-node/-/html-pdf-node-1.0.7.tgz", + "integrity": "sha512-fBvV3/+GxqEuyZuYGPou9aKEP84VbN/1wmL1ujF1UsLSy10srESfQelbOrSgJkOHs23yPfUG9uGMajat6+1UfQ==", + "license": "ISC", + "dependencies": { + "bluebird": "^3.7.2", + "handlebars": "^4.7.6", + "puppeteer": "^5.1.0" + } + }, + "node_modules/html-pdf-node/node_modules/agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/html-pdf-node/node_modules/devtools-protocol": { + "version": "0.0.818844", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", + "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==", + "license": "BSD-3-Clause" + }, + "node_modules/html-pdf-node/node_modules/https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "license": "MIT", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/html-pdf-node/node_modules/puppeteer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz", + "integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==", + "deprecated": "< 22.8.2 is no longer supported", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0", + "devtools-protocol": "0.0.818844", + "extract-zip": "^2.0.0", + "https-proxy-agent": "^4.0.0", + "node-fetch": "^2.6.1", + "pkg-dir": "^4.2.0", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" + }, + "engines": { + "node": ">=10.18.1" + } + }, + "node_modules/html-pdf-node/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -1955,7 +2533,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1996,6 +2573,31 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2049,8 +2651,7 @@ "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 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "3.14.1", @@ -2065,6 +2666,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "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", @@ -2090,6 +2703,24 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2113,6 +2744,15 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/magic-bytes.js": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", @@ -2251,6 +2891,12 @@ "node": ">= 8" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -2345,6 +2991,21 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/node": { "version": "23.9.0", "resolved": "https://registry.npmjs.org/node/-/node-23.9.0.tgz", @@ -2509,11 +3170,106 @@ "node": ">= 0.8.0" } }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, "node_modules/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, "dependencies": { "callsites": "^3.0.0" }, @@ -2527,6 +3283,24 @@ "integrity": "sha512-MtbharL7Bets65qDBXuDOHHWyY1BxTJZmJ/xGmS90iEbKE0gZ6yZpZtCda7O79GeOi/f0NwBaplIuReExIoVsw==", "license": "MIT" }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse-ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", @@ -2535,6 +3309,15 @@ "node": ">=6" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2570,6 +3353,30 @@ "through": "~2.3" } }, + "node_modules/pdf-lib": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "license": "MIT", + "dependencies": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + } + }, + "node_modules/pdf-lib/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2582,6 +3389,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -2640,11 +3459,51 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, "engines": { "node": ">=0.4.0" } }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -2684,6 +3543,67 @@ "node": ">=6" } }, + "node_modules/puppeteer": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.6.0.tgz", + "integrity": "sha512-wYTB8WkzAr7acrlsp+0at1PZjOJPOxe6dDWKOG/kaX4Zjck9RXCFx3CtsxsAGzPn/Yv6AzgJC/CW1P5l+qxsqw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.9.0", + "chromium-bidi": "3.0.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1425554", + "puppeteer-core": "24.6.0", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.6.0.tgz", + "integrity": "sha512-Cukxysy12m0v350bhl/Gzof0XQYmtON9l2VvGp3D4BOQZVgyf+y5wIpcjDZQ/896Okoi95dKRGRV8E6a7SYAQQ==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.9.0", + "chromium-bidi": "3.0.0", + "debug": "^4.4.0", + "devtools-protocol": "0.0.1425554", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -2767,6 +3687,15 @@ "node": ">=4" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -2780,7 +3709,6 @@ "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, "engines": { "node": ">=4" } @@ -2977,6 +3905,62 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -3013,6 +3997,19 @@ "duplexer": "~0.1.1" } }, + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3205,6 +4202,15 @@ "node": ">=8" } }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -3214,8 +4220,7 @@ "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 + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -3326,11 +4331,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "license": "MIT" + }, "node_modules/typescript": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -3345,6 +4356,29 @@ "resolved": "https://registry.npmjs.org/tz-offset/-/tz-offset-0.0.1.tgz", "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==" }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, "node_modules/undici": { "version": "6.21.1", "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.1.tgz", @@ -3427,6 +4461,29 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3453,10 +4510,65 @@ } } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zod": { + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index 4d028b3f..fa2c2c1f 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "canvas": "^3.1.0", "console-stamp": "^3.0.2", "discord.js": "^14.16.3", + "html-pdf-node": "^1.0.7", "module-alias": "^2.2.2", "moment": "^2.29.1", "mongodb": "^3.7.4", @@ -50,7 +51,9 @@ "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", "parse-duration": "^2.1.3", - "pretty-ms": "^7.0.1" + "pdf-lib": "^1.17.1", + "pretty-ms": "^7.0.1", + "puppeteer": "^24.6.0" }, "_moduleAliases": { "@root": "dist", diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index 66c0d396..a0a56821 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -20,6 +20,7 @@ import { MongoClient } from "mongodb"; import { sendToFile } from "@root/src/lib/utils/generalUtils"; import axios from "axios"; import { JobPreferences } from "@root/src/lib/types/JobPreferences"; +import { PDFDocument, StandardFonts, rgb } from "pdf-lib"; // Temporary storage for user job data const userJobData = new Map(); @@ -43,6 +44,63 @@ export default class extends Command { }, ]; + //-------------------ADDED PDF GENERATATOR METHOD---------------------- + private async generateJobPDF(jobs: JobResult[]): Promise { + // Create a new PDF document. + const pdfDoc = await PDFDocument.create(); + let currentPage = pdfDoc.addPage(); + const { width, height } = currentPage.getSize(); + const margin = 50; + let yPosition = height - margin; + const fontSize = 12; + const titleFontSize = 20; + + // Embed a standard font. + const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman); + + // Draw the title. + currentPage.drawText("Job Listings", { + x: margin, + y: yPosition, + size: titleFontSize, + font: timesRomanFont, + color: rgb(0, 0, 0), + }); + yPosition -= 30; + + // Loop through each job and add its details. + for (let i = 0; i < jobs.length; i++) { + const job = jobs[i]; + // Use your existing formatter or adjust as needed. + const jobText = `${i + 1}. ${job.title}\nLocation: ${ + job.location + }\nSalary: ${this.formatSalary(job)}\nApply Here: ${job.link}\n\n`; + + // Estimate the text height. + const lines = jobText.split("\n").length; + const textHeight = lines * fontSize + 10; + + // Check for space and add a new page if needed. + if (yPosition - textHeight < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin; + } + + currentPage.drawText(jobText, { + x: margin, + y: yPosition, + size: fontSize, + font: timesRomanFont, + color: rgb(0, 0, 0), + maxWidth: currentPage.getWidth() - margin * 2, + }); + yPosition -= textHeight; + } + + const pdfBytes = await pdfDoc.save(); + return Buffer.from(pdfBytes); + } + async run( interaction: ChatInputCommandInteraction ): Promise> { @@ -141,6 +199,28 @@ export default class extends Command { } index = index >= jobs.length ? 0 : index; break; + //----------------ADDED DOWNLOAD BUTTON-------------------- + case "download": + await i.deferReply({ ephemeral: true }); + try { + // Generate the PDF from all stored jobs. + const pdfBuffer = await this.generateJobPDF(jobs); + const attachment = new AttachmentBuilder( + pdfBuffer + ).setName("jobs.pdf"); + await i.editReply({ + content: + "Here is your PDF file with all job listings:", + files: [attachment], + }); + } catch (error) { + console.error("Error generating PDF:", error); + await i.editReply({ + content: + "An error occurred while generating the PDF. Please try again later.", + }); + } + return; // Exit early so we don't update the embed. } // Update user data @@ -198,7 +278,12 @@ export default class extends Command { .setCustomId("next") .setLabel("Next") .setStyle(ButtonStyle.Primary) - .setDisabled(totalJobs === 1) + .setDisabled(totalJobs === 1), + //----------------ADDED DOWNLOAD BUTTON------------------- + new ButtonBuilder() + .setCustomId("download") + .setLabel("Download") + .setStyle(ButtonStyle.Success) ); return { embed, row }; From e81f2dcae5ca300093b83623513cff3ecc3ebab0 Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Tue, 8 Apr 2025 20:55:59 -0400 Subject: [PATCH 272/317] changed jobData const to actual answers vs test date --- src/commands/jobs/jobs.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index a0a56821..1685cb34 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -105,7 +105,7 @@ export default class extends Command { interaction: ChatInputCommandInteraction ): Promise> { const userID = interaction.user.id; - const filterBy = interaction.options.getString("filter") ?? "default"; + const filterBy = interaction.options.getString("filter") ?? "salary"; const client = await MongoClient.connect(DB.CONNECTION, { useUnifiedTopology: true, @@ -123,10 +123,10 @@ export default class extends Command { } const jobData: JobData = { - city: "New York", // You might want to get this from jobformAnswers - preference: "Software Engineer", // You might want to get this from jobformAnswers - jobType: "Full Time", // You might want to get this from jobformAnswers - distance: "10", // You might want to get this from jobformAnswers + city: jobformAnswers.answers.city, + preference: jobformAnswers.answers.employmentType, + jobType: jobformAnswers.answers.workType, + distance: jobformAnswers.answers.travelDistance, filterBy: filterBy, }; From eb30407f008e7c8ebfcc5efd4acaeaf73b7f88b6 Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Tue, 8 Apr 2025 23:55:38 -0400 Subject: [PATCH 273/317] Command to test new email functionality of the bot --- src/commands/reminders/emailtest.ts | 68 +++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/commands/reminders/emailtest.ts diff --git a/src/commands/reminders/emailtest.ts b/src/commands/reminders/emailtest.ts new file mode 100644 index 00000000..9ffd0f36 --- /dev/null +++ b/src/commands/reminders/emailtest.ts @@ -0,0 +1,68 @@ +import { ApplicationCommandPermissions, ChatInputCommandInteraction, ApplicationCommandOptionData, ApplicationCommandOptionType, InteractionResponse, Message } from 'discord.js'; +import { BOTMASTER_PERMS } from '@lib/permissions'; +import { Command } from '@lib/types/Command'; +import nodemailer from 'nodemailer'; +import { GMAIL } from '@root/config'; // Import the Gmail config + +export default class extends Command { + description = 'Sends a test email from Gmail to verify email functionality.'; + permissions: ApplicationCommandPermissions[] = BOTMASTER_PERMS; + + options: ApplicationCommandOptionData[] = [ + { + name: 'recipient', + description: 'Email address to send the test email to', + type: ApplicationCommandOptionType.String, + required: true + }, + { + name: 'subject', + description: 'Subject line of the test email', + type: ApplicationCommandOptionType.String, + required: false + } + ] + + async run(interaction: ChatInputCommandInteraction): Promise | void | Message> { + // Immediately defer the reply to prevent the "Unknown interaction" error + await interaction.deferReply({ ephemeral: true }); + + const recipient = interaction.options.getString('recipient'); + const subject = interaction.options.getString('subject') || 'Test Email from Discord Bot'; + + // Create Gmail transporter using credentials from config + const mailer = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: GMAIL.USER, + pass: GMAIL.APP_PASSWORD + } + }); + + try { + await mailer.sendMail({ + from: GMAIL.USER, + to: recipient, + subject: subject, + html: ` + + +

Discord Bot Test Email

+

This is a test email sent by the Discord bot to verify email functionality.

+

Sent by: ${interaction.user.tag} (${interaction.user.id})

+

Time: ${new Date().toLocaleString()}

+ + ` + }); + + return interaction.editReply({ + content: `✅ Test email successfully sent to ${recipient}!` + }); + } catch (error) { + console.error('Email sending error:', error); + return interaction.editReply({ + content: `❌ Failed to send test email: ${error.message}` + }); + } + } +} \ No newline at end of file From b77f5fa8d42f604df1e7ac48ab5024b8bf6ef8c7 Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Tue, 8 Apr 2025 23:56:09 -0400 Subject: [PATCH 274/317] Visual improvements to reminder & added the other commands to it. --- src/commands/reminders/reminders.ts | 535 ++++++++++++++++++++++++++++ 1 file changed, 535 insertions(+) create mode 100644 src/commands/reminders/reminders.ts diff --git a/src/commands/reminders/reminders.ts b/src/commands/reminders/reminders.ts new file mode 100644 index 00000000..7e992433 --- /dev/null +++ b/src/commands/reminders/reminders.ts @@ -0,0 +1,535 @@ +import { BOT, DB } from '@root/config'; +import { + ApplicationCommandOptionData, + ChatInputCommandInteraction, + InteractionResponse, + ActionRowBuilder, + ButtonBuilder, + ButtonStyle, + ComponentType, + ModalBuilder, + TextInputBuilder, + TextInputStyle, + ModalSubmitInteraction, + EmbedBuilder +} from 'discord.js'; +import { Reminder } from '@lib/types/Reminder'; +import parse from 'parse-duration'; +import { checkJobReminder, reminderTime } from '@root/src/lib/utils/generalUtils'; +import { Command } from '@lib/types/Command'; + +// Emoji constants for button icons +const EMOJI = { + REMINDER: '⏰', + JOB: '💼', + VIEW: '📋', + CANCEL: '✖️', + TIME: '🕒', + REPEAT: '🔄' +}; + +// Color constants for embeds (using Discord.js ColorResolvable) +const COLORS = { + PRIMARY: 0x5865F2, // Discord Blurple + SUCCESS: 0x57F287, // Green + DANGER: 0xED4245, // Red + WARNING: 0xFEE75C, // Yellow + SECONDARY: 0x9BA4EC, // Light Blurple + INFO: 0x5CBEFE // Light Blue +}; + +export default class extends Command { + description = `Have ${BOT.NAME} give you a reminder.`; + extendedHelp = 'Create reminders for anything - one-time or recurring job alerts.'; + options: ApplicationCommandOptionData[] = []; // No options needed as we're using buttons + + async run( + interaction: ChatInputCommandInteraction + ): Promise | void> { + // Create a stylish initial embed + const embed = new EmbedBuilder() + .setColor(COLORS.PRIMARY) + .setTitle(`${EMOJI.REMINDER} Reminder System`) + .setDescription('What would you like to do?') + .setFooter({ + text: `Requested by ${interaction.user.username}`, + iconURL: interaction.user.displayAvatarURL() + }) + .setTimestamp(); + + // Create buttons with emojis and clear labels + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId('create_reminder') + .setLabel('Create Reminder') + .setEmoji(EMOJI.REMINDER) + .setStyle(ButtonStyle.Primary), + new ButtonBuilder() + .setCustomId('create_job_reminder') + .setLabel('Job Alert') + .setEmoji(EMOJI.JOB) + .setStyle(ButtonStyle.Secondary), + new ButtonBuilder() + .setCustomId('view_reminders') + .setLabel('View All') + .setEmoji(EMOJI.VIEW) + .setStyle(ButtonStyle.Success), + new ButtonBuilder() + .setCustomId('cancel_reminder') + .setLabel('Cancel') + .setEmoji(EMOJI.CANCEL) + .setStyle(ButtonStyle.Danger) + ); + + // Send the initial message with embed and buttons + const response = await interaction.reply({ + embeds: [embed], + components: [row], + ephemeral: true + }); + + // Create collector for button interactions + const collector = response.createMessageComponentCollector({ + componentType: ComponentType.Button, + time: 120000 // 2 minute timeout (extended) + }); + + collector.on('collect', async (buttonInteraction) => { + // Handle button clicks + if (buttonInteraction.customId === 'create_reminder') { + await this.handleCreateReminder(buttonInteraction); + } else if (buttonInteraction.customId === 'create_job_reminder') { + await this.handleCreateJobReminder(buttonInteraction); + } else if (buttonInteraction.customId === 'view_reminders') { + await this.handleViewReminders(buttonInteraction); + } else if (buttonInteraction.customId === 'cancel_reminder') { + await this.handleCancelReminder(buttonInteraction); + } + }); + + collector.on('end', async (collected) => { + if (collected.size === 0) { + const timeoutEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.TIME} Reminder Action Timed Out`) + .setDescription('You can run the command again to set up a reminder.') + .setTimestamp(); + + await interaction.editReply({ + embeds: [timeoutEmbed], + components: [] + }); + } + }); + } + + // Handle creating a standard reminder via a modal + private async handleCreateReminder(buttonInteraction: any) { + // Create modal for reminder details + const modal = new ModalBuilder() + .setCustomId('reminder_modal') + .setTitle(`${EMOJI.REMINDER} Create New Reminder`); + + // Add inputs for content and duration + const contentInput = new TextInputBuilder() + .setCustomId('content') + .setLabel("What would you like to be reminded of?") + .setStyle(TextInputStyle.Paragraph) + .setPlaceholder("Enter your reminder message here...") + .setRequired(true); + + const durationInput = new TextInputBuilder() + .setCustomId('duration') + .setLabel("When would you like to be reminded?") + .setPlaceholder('e.g. 1 hour, 30 minutes, 2 days, tomorrow at 3pm') + .setStyle(TextInputStyle.Short) + .setRequired(true); + + // Create action rows with inputs + const contentRow = new ActionRowBuilder().addComponents(contentInput); + const durationRow = new ActionRowBuilder().addComponents(durationInput); + + // Add action rows to the modal + modal.addComponents(contentRow, durationRow); + + // Show the modal + await buttonInteraction.showModal(modal); + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 180000, // 3 minutes (extended) + filter: (i: ModalSubmitInteraction) => + i.customId === 'reminder_modal' && + i.user.id === buttonInteraction.user.id + }); + + // Process modal submission + const content = modalInteraction.fields.getTextInputValue('content'); + const rawDuration = modalInteraction.fields.getTextInputValue('duration'); + const duration = parse(rawDuration); + + if (!duration) { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.TIME} Invalid Time Format`) + .setDescription(`**"${rawDuration}"** is not a valid duration.\nYou can use words like hours, minutes, seconds, days, weeks, months, or years.`) + .setFooter({ text: 'Try something like "3 hours" or "2 days"' }); + + return modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } + + // Calculate the expiry date + const expiryDate = new Date(duration + Date.now()); + + // Create and store the reminder directly + const reminder: Reminder = { + owner: modalInteraction.user.id, + content, + mode: 'public', // could be changed to private if needed + expires: expiryDate, + repeat: null // No repeat by default + }; + + await modalInteraction.client.mongo + .collection(DB.REMINDERS) + .insertOne(reminder); + + const successEmbed = new EmbedBuilder() + .setColor(COLORS.SUCCESS) + .setTitle(`${EMOJI.REMINDER} Reminder Set!`) + .setDescription(`I'll remind you about that at **${reminderTime(reminder)}**.`) + .addFields({ + name: 'Reminder Content', + value: `> ${content}` + }) + .setTimestamp(); + + await modalInteraction.reply({ + embeds: [successEmbed], + ephemeral: true + }); + + } catch (error) { + console.error('Error in modal submission:', error); + + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Reminder Creation Failed`) + .setDescription('The reminder creation process timed out or an error occurred.') + .setTimestamp(); + + await buttonInteraction.followUp({ + embeds: [errorEmbed], + ephemeral: true + }); + } + } + + // Handle creating a job reminder using a modal + private async handleCreateJobReminder(buttonInteraction: any) { + // Check for existing job reminder + if (await checkJobReminder(buttonInteraction)) { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.WARNING) + .setTitle(`${EMOJI.JOB} Job Reminder Already Exists`) + .setDescription( + 'You currently already have a job reminder set. To clear your existing job reminder, use the CANCEL button and provide the reminder number.' + ); + + return buttonInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } + + // Create modal for job reminder settings + const modal = new ModalBuilder() + .setCustomId('job_reminder_modal') + .setTitle(`${EMOJI.JOB} Create Job Alert`); + + // Add inputs for repeat frequency and filter type + const repeatInput = new TextInputBuilder() + .setCustomId('repeat') + .setLabel('How often would you like to receive alerts?') + .setPlaceholder('Type "daily", "weekly", or "monthly"') + .setStyle(TextInputStyle.Short) + .setRequired(true); + + const filterInput = new TextInputBuilder() + .setCustomId('filter') + .setLabel('Sort jobs by?') + .setPlaceholder('default, relevance, salary, or date') + .setStyle(TextInputStyle.Short) + .setRequired(true) + .setValue('default'); // Default value + + // Create action rows with inputs + const repeatRow = new ActionRowBuilder().addComponents(repeatInput); + const filterRow = new ActionRowBuilder().addComponents(filterInput); + + // Add action rows to the modal + modal.addComponents(repeatRow, filterRow); + + // Show the modal + await buttonInteraction.showModal(modal); + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 180000, // 3 minutes (extended) + filter: (i: ModalSubmitInteraction) => + i.customId === 'job_reminder_modal' && + i.user.id === buttonInteraction.user.id + }); + + // Process modal submission + let repeatValue = modalInteraction.fields.getTextInputValue('repeat').toLowerCase(); + let filterValue = modalInteraction.fields.getTextInputValue('filter').toLowerCase(); + + // Validate repeat input + if (repeatValue !== 'daily' && repeatValue !== 'weekly' && repeatValue !== 'monthly') { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.REPEAT} Invalid Repeat Option`) + .setDescription(`**"${repeatValue}"** is not a valid repeat option. Please use "daily", "weekly", or "monthly".`); + + return modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } + + // Validate filter input + const validFilters = ['default', 'relevance', 'salary', 'date']; + if (!validFilters.includes(filterValue)) { + filterValue = 'default'; // Fallback to default if invalid + } + + // Create and store the job reminder + const jobReminder: Reminder = { + owner: modalInteraction.user.id, + content: 'Job Reminder', + mode: 'private', + expires: new Date(), // Set to now, will be handled by the job scheduler + repeat: repeatValue as 'daily' | 'weekly', + filterBy: filterValue as 'default' | 'relevance' | 'salary' | 'date' + }; + + await modalInteraction.client.mongo + .collection(DB.REMINDERS) + .insertOne(jobReminder); + + const successEmbed = new EmbedBuilder() + .setColor(COLORS.SECONDARY) + .setTitle(`${EMOJI.JOB} Job Alert Created`) + .setDescription( + `I'll send you job opportunities **${repeatValue}** starting at **${reminderTime(jobReminder)}**.` + ) + .addFields( + { name: 'Frequency', value: `${repeatValue.charAt(0).toUpperCase() + repeatValue.slice(1)}`, inline: true }, + { name: 'Sorted By', value: `${filterValue.charAt(0).toUpperCase() + filterValue.slice(1)}`, inline: true } + ) + .setFooter({ text: 'You can update your preferences anytime' }) + .setTimestamp(); + + await modalInteraction.reply({ + embeds: [successEmbed], + ephemeral: true + }); + + } catch (error) { + console.error('Error in modal submission:', error); + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Job Alert Creation Failed`) + .setDescription('The job alert creation process timed out or an error occurred.') + .setTimestamp(); + + await buttonInteraction.followUp({ + embeds: [errorEmbed], + ephemeral: true + }); + } + } + + // Handle viewing reminders + private async handleViewReminders(buttonInteraction: any) { + const reminders: Array = await buttonInteraction.client.mongo + .collection(DB.REMINDERS) + .find({ owner: buttonInteraction.user.id }) + .toArray(); + + reminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); + + if (reminders.length < 1) { + const noRemindersEmbed = new EmbedBuilder() + .setColor(COLORS.INFO) + .setTitle(`${EMOJI.VIEW} No Reminders Found`) + .setDescription('You don\'t have any pending reminders!') + .setFooter({ text: 'Use the CREATE REMINDER button to set one up' }) + .setTimestamp(); + + return buttonInteraction.reply({ + embeds: [noRemindersEmbed], + ephemeral: true + }); + } + + const embeds: Array = []; + reminders.forEach((reminder, i) => { + if (i % 10 === 0) { // Reduced to 10 reminders per embed for better readability + embeds.push( + new EmbedBuilder() + .setTitle(`${EMOJI.VIEW} Your Reminders (${reminders.length})`) + .setColor(COLORS.INFO) + .setDescription('Here are all your pending reminders:') + .setFooter({ + text: `Page ${Math.floor(i / 10) + 1}/${Math.ceil(reminders.length / 10)}` + }) + .setTimestamp() + ); + } + + const hidden = reminder.mode === 'private'; + const isJobReminder = reminder.content === 'Job Reminder'; + const icon = isJobReminder ? EMOJI.JOB : EMOJI.REMINDER; + + embeds[Math.floor(i / 10)].addFields({ + name: `${i + 1}. ${icon} ${ + hidden + ? isJobReminder + ? 'Job Alert' + : 'Private Reminder' + : reminder.content + }`, + value: hidden + ? `${EMOJI.REPEAT} **${reminder.repeat}** job reminder filtered by **${reminder.filterBy}**` + : `${EMOJI.TIME} Due: **${reminderTime(reminder)}**` + }); + }); + + await buttonInteraction.reply({ + embeds, + ephemeral: true + }); + } + + // Handle canceling a reminder + private async handleCancelReminder(buttonInteraction: any) { + // Create modal for reminder cancellation + const modal = new ModalBuilder() + .setCustomId('cancel_reminder_modal') + .setTitle(`${EMOJI.CANCEL} Cancel Reminder`); + + // Add input for reminder number + const reminderNumInput = new TextInputBuilder() + .setCustomId('reminder_number') + .setLabel("Which reminder would you like to cancel?") + .setPlaceholder('Enter the number (e.g. 1, 2, 3)') + .setStyle(TextInputStyle.Short) + .setRequired(true); + + // Create action row with input + const reminderNumRow = new ActionRowBuilder().addComponents(reminderNumInput); + + // Add action row to the modal + modal.addComponents(reminderNumRow); + + // Show the modal + await buttonInteraction.showModal(modal); + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 60000, // 1 minute + filter: (i: ModalSubmitInteraction) => + i.customId === 'cancel_reminder_modal' && + i.user.id === buttonInteraction.user.id + }); + + // Process modal submission + const reminderNumStr = modalInteraction.fields.getTextInputValue('reminder_number'); + const reminderNum = parseInt(reminderNumStr) - 1; // Convert to 0-based index + + if (isNaN(reminderNum) || reminderNum < 0) { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Invalid Reminder Number`) + .setDescription(`**"${reminderNumStr}"** is not a valid reminder number. Please enter a positive integer.`) + .setFooter({ text: 'Use the VIEW REMINDERS button to see your reminders and their numbers' }); + + return modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } + + // Get user's reminders and sort them + const reminders: Array = await modalInteraction.client.mongo + .collection(DB.REMINDERS) + .find({ owner: modalInteraction.user.id }) + .toArray(); + + reminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); + + // Check if the reminder exists + const reminder = reminders[reminderNum]; + if (!reminder) { + const notFoundEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Reminder Not Found`) + .setDescription(`I couldn't find reminder **#${reminderNum + 1}**.`) + .setFooter({ text: 'Use the VIEW REMINDERS button to see your current reminders' }); + + return modalInteraction.reply({ + embeds: [notFoundEmbed], + ephemeral: true + }); + } + + // Delete the reminder + await modalInteraction.client.mongo + .collection(DB.REMINDERS) + .findOneAndDelete(reminder); + + const hidden = reminder.mode === 'private'; + const isJobReminder = reminder.content === 'Job Reminder'; + + const successEmbed = new EmbedBuilder() + .setColor(COLORS.SUCCESS) + .setTitle(`${EMOJI.CANCEL} Reminder Cancelled`) + .setDescription( + `Successfully cancelled reminder **#${reminderNum + 1}**: ${ + hidden + ? (isJobReminder ? 'Job Alert' : 'Private Reminder') + : `"${reminder.content}"` + }` + ) + .setTimestamp(); + + return modalInteraction.reply({ + embeds: [successEmbed], + ephemeral: true + }); + + } catch (error) { + console.error('Error in modal submission:', error); + + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Cancellation Failed`) + .setDescription('The reminder cancellation process timed out or an error occurred.') + .setTimestamp(); + + await buttonInteraction.followUp({ + embeds: [errorEmbed], + ephemeral: true + }); + } + } +} \ No newline at end of file From bd541df62e8772b6bb1f91083ae9afc0190dab0f Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Wed, 9 Apr 2025 00:47:24 -0400 Subject: [PATCH 275/317] made the pdf look really great, the links on the pdf also work ! --- assets/images/header.png | Bin 0 -> 252 bytes src/commands/jobs/jobs.ts | 236 ++++++++++++++++++++++++++++++++------ 2 files changed, 203 insertions(+), 33 deletions(-) create mode 100644 assets/images/header.png diff --git a/assets/images/header.png b/assets/images/header.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e3b3dd8a90f07c56040719f75ba2a526d49e00 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0y~yU@Zr-g*cdiJ!V4+StVT-?T1&?xLuvWlsvWSyeO1_frph!+JX{a;jb`+EHtES~<{3#1gb_3#0WV))l`8bq1IumQ;h4~;+^-sy}$GGhl1kaRel3KEji lV+N8J3M7GKLmTN@j`5q(); + 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.`; @@ -36,10 +37,10 @@ export default class extends Command { type: ApplicationCommandOptionType.String, required: false, choices: [ - { name: "Date Posted", value: "date" }, - { name: "Salary", value: "salary" }, - { name: "Alphabetical", value: "alphabetical" }, - { name: "Distance", value: "distance" }, + { name: "Date Posted: recent", value: "date" }, + { name: "Salary: high-low average", value: "salary" }, + { name: "Alphabetical: A-Z", value: "alphabetical" }, + { name: "Distance: shortest-longest", value: "distance" }, ], }, ]; @@ -50,52 +51,168 @@ export default class extends Command { const pdfDoc = await PDFDocument.create(); let currentPage = pdfDoc.addPage(); const { width, height } = currentPage.getSize(); - const margin = 50; - let yPosition = height - margin; - const fontSize = 12; - const titleFontSize = 20; + const margin = 40; + let yPosition = height - margin- 50; + const fontSize = 10; + const titleFontSize = 30; + const bulletPointIndent = 20; + const subBulletPointIndent = 30; // Indentation for sub-bullet points + + // Embed a standard font. const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman); + const HelveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold ); + const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica ); + + + // Draw the title. - currentPage.drawText("Job Listings", { + const lineHeight = 10; // Height of the line + const lineWidth = (width - margin * 2) / 3; + + currentPage.drawRectangle({ x: margin, - y: yPosition, + y: yPosition+50, + width: lineWidth, + height: lineHeight, + color: rgb(135 / 255, 59 / 255, 29 / 255), // red color + }); + + // Draw the second color segment + currentPage.drawRectangle({ + x: margin + lineWidth, + y: yPosition+50, + width: lineWidth, + height: lineHeight, + color: rgb(237 / 255, 118 / 255, 71 / 255), // orangey color + }); + + // Draw the third color segment + currentPage.drawRectangle({ + x: margin + lineWidth * 2, + y: yPosition+50, + width: lineWidth, + height: lineHeight, + color: rgb(13/255, 158/255, 198/255), // Blue color + }); + + yPosition -= 40; // Adjust spacing below the line + + + + currentPage.drawText("List of Jobs PDF", { + x: margin, + y: yPosition+50, size: titleFontSize, - font: timesRomanFont, - color: rgb(0, 0, 0), + font: HelveticaBold, + + color: rgb(114/255, 53/255, 9/255), }); - yPosition -= 30; + yPosition -= 50; // Loop through each job and add its details. for (let i = 0; i < jobs.length; i++) { const job = jobs[i]; - // Use your existing formatter or adjust as needed. - const jobText = `${i + 1}. ${job.title}\nLocation: ${ - job.location - }\nSalary: ${this.formatSalary(job)}\nApply Here: ${job.link}\n\n`; - - // Estimate the text height. - const lines = jobText.split("\n").length; - const textHeight = lines * fontSize + 10; - // Check for space and add a new page if needed. - if (yPosition - textHeight < margin) { + if (yPosition - fontSize < margin) { currentPage = pdfDoc.addPage(); yPosition = currentPage.getHeight() - margin; } + + const maxWidth = width - margin * 2; // Calculate available width + const wrappedTitle = this.wrapText(`${i + 1}. ${job.title}`, HelveticaBold, fontSize + 10, maxWidth); - currentPage.drawText(jobText, { - x: margin, - y: yPosition, - size: fontSize, - font: timesRomanFont, - color: rgb(0, 0, 0), - maxWidth: currentPage.getWidth() - margin * 2, - }); - yPosition -= textHeight; + + + for (const line of wrappedTitle) { + // Check if there's enough space for the line + if (yPosition - fontSize < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin; + } + + currentPage.drawText(line, { + x: margin, + y: yPosition+30, + size: fontSize + 10, + font: HelveticaBold, + color: rgb(241 / 255, 113 / 255, 34 / 255), + }); + + yPosition -= 30; // Adjust spacing between lines + } + + // Draw the bullet points for location, salary, and apply link. + const bulletPoints = [ + { label: "Location", value: job.location }, + { label: "Salary", value: this.formatSalaryforPDF(job) }, + { label: "Apply Here", value: job.link }, + ]; + + for (const point of bulletPoints) { + // Check if there's enough space on the page, and add a new page if needed. + if (yPosition - fontSize *2 < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin; + } + + const maxLabelWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; + const wrappedLabel = this.wrapText(`• ${point.label}`, HelveticaBold, fontSize + 5, maxLabelWidth); + + // Draw the wrapped label + for (const line of wrappedLabel) { + // Check if there's enough space for the line + if (yPosition - fontSize < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin; + } + + currentPage.drawText(line, { + x: margin + bulletPointIndent, + y: yPosition+25, + size: fontSize + 5, + font: HelveticaBold, + color: rgb(94 / 255, 74 / 255, 74 / 255), + }); + + yPosition -= fontSize + 10; // Adjust spacing between lines + } + + + const combinedText = `• ${point.value}`; + const maxValueWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; + const wrappedValue = this.wrapText(combinedText, HelveticaBold, fontSize+4, maxValueWidth); + + + for (const line of wrappedValue) { + // Check if there's enough space for the line + if (yPosition - fontSize < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin; + } + + currentPage.drawText(line, { + x: margin + bulletPointIndent + subBulletPointIndent, + y: yPosition+20, + size: fontSize+3, + font: HelveticaBold, + color: rgb(13 / 255, 158 / 255, 198 / 255), + }); + + yPosition -= fontSize + 5; // Adjust spacing between lines + } + + yPosition -= 20; // Add extra spacing between items + } + + yPosition -= 40; // Add extra spacing between jobs. + + + } + const pdfBytes = await pdfDoc.save(); return Buffer.from(pdfBytes); @@ -240,6 +357,42 @@ export default class extends Command { }); } + wrapText(text: string, font: PDFFont, fontSize: number, maxWidth: number): string[] { + const words = text.split(" "); + const lines: string[] = []; + let currentLine = ""; + + for (const word of words) { + const testLine = currentLine ? `${currentLine} ${word}` : word; + const textWidth = font.widthOfTextAtSize(testLine, fontSize); + + if (textWidth <= maxWidth) { + currentLine = testLine; + } else { + if (currentLine) { + lines.push(currentLine); + } + currentLine = ""; + + // Handle long words that exceed maxWidth + let remainingWord = word; + while (font.widthOfTextAtSize(remainingWord, fontSize) > maxWidth) { + let splitIndex = Math.floor((maxWidth / font.widthOfTextAtSize(remainingWord, fontSize)) * remainingWord.length); + const chunk = remainingWord.slice(0, splitIndex); + lines.push(chunk); + remainingWord = remainingWord.slice(splitIndex); + } + currentLine = remainingWord; + } + } + + if (currentLine) { + lines.push(currentLine); + } + + return lines; + } + createJobEmbed( job: JobResult, index: number, @@ -306,6 +459,23 @@ export default class extends Command { : formattedAvgSalary; } + formatSalaryforPDF(job: JobResult): string { + const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; + const formattedAvgSalary = this.formatCurrency(avgSalary); + const formattedSalaryMax = + this.formatCurrency(Number(job.salaryMax)) !== "N/A" + ? this.formatCurrency(Number(job.salaryMax)) + : ""; + const formattedSalaryMin = + this.formatCurrency(Number(job.salaryMin)) !== "N/A" + ? this.formatCurrency(Number(job.salaryMin)) + : ""; + + return formattedSalaryMin && formattedSalaryMax + ? `Avg: ${formattedAvgSalary}, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` + : formattedAvgSalary; + } + async listJobs( jobForm: [JobData, Interest, JobResult[]], filterBy: string From 24d11ef92b0bac9422dd6e65e6fa85b024bcda93 Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Wed, 9 Apr 2025 01:00:35 -0400 Subject: [PATCH 276/317] NOT TOUCHING IT ANYMORE... fixed bulletin points and added another decorative line under header --- src/commands/jobs/jobs.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index 7f7cbbbf..ac9c6f75 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -110,7 +110,16 @@ export default class extends Command { color: rgb(114/255, 53/255, 9/255), }); - yPosition -= 50; + yPosition -= 40; + + currentPage.drawRectangle({ + x: margin, + y: yPosition+50, + width: lineWidth/2, + height: lineHeight-8, + color: rgb(135 / 255, 59 / 255, 29 / 255), // red color + }); + yPosition -= 10; // Loop through each job and add its details. for (let i = 0; i < jobs.length; i++) { @@ -181,7 +190,7 @@ export default class extends Command { } - const combinedText = `• ${point.value}`; + const combinedText = `•${point.value}`; const maxValueWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; const wrappedValue = this.wrapText(combinedText, HelveticaBold, fontSize+4, maxValueWidth); From 0c34c27526c846c51c7d93567cf302e9742f3aeb Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Wed, 9 Apr 2025 11:06:22 -0400 Subject: [PATCH 277/317] fixed weird case of half the job being pushed to a next page bc of not enough space and being formatted weirdly on to the top margin, all jobs should be easily seen on all pages now, even the top+bottom edges ! --- src/commands/jobs/jobs.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index ac9c6f75..ffaf653b 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -125,9 +125,9 @@ export default class extends Command { for (let i = 0; i < jobs.length; i++) { const job = jobs[i]; - if (yPosition - fontSize < margin) { + if (yPosition - fontSize*2 < margin) { currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin; + yPosition = currentPage.getHeight() - margin-20; } const maxWidth = width - margin * 2; // Calculate available width @@ -137,9 +137,9 @@ export default class extends Command { for (const line of wrappedTitle) { // Check if there's enough space for the line - if (yPosition - fontSize < margin) { + if (yPosition - fontSize*2 < margin) { currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin; + yPosition = currentPage.getHeight() - margin-20; } currentPage.drawText(line, { @@ -164,7 +164,7 @@ export default class extends Command { // Check if there's enough space on the page, and add a new page if needed. if (yPosition - fontSize *2 < margin) { currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin; + yPosition = currentPage.getHeight() - margin-20; } const maxLabelWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; @@ -173,9 +173,9 @@ export default class extends Command { // Draw the wrapped label for (const line of wrappedLabel) { // Check if there's enough space for the line - if (yPosition - fontSize < margin) { + if (yPosition - fontSize*2 < margin) { currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin; + yPosition = currentPage.getHeight() - margin-20; } currentPage.drawText(line, { @@ -197,9 +197,9 @@ export default class extends Command { for (const line of wrappedValue) { // Check if there's enough space for the line - if (yPosition - fontSize < margin) { + if (yPosition - fontSize*2 < margin) { currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin; + yPosition = currentPage.getHeight() - margin-20; } currentPage.drawText(line, { From ebd2cf94cb8458c3a552904cb4e2f0dcfa696d1a Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Wed, 9 Apr 2025 13:27:59 -0400 Subject: [PATCH 278/317] Integrated /jobs with reminder system --- src/commands/jobs/jobs.ts | 180 ++------------------------------------ src/pieces/tasks.ts | 127 +++++++++++++++++++-------- 2 files changed, 97 insertions(+), 210 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index a74677b2..94e015f4 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -9,6 +9,8 @@ import { MongoClient } from 'mongodb'; import { sendToFile } from '@root/src/lib/utils/generalUtils'; import axios from 'axios'; import { JobPreferences } from '@root/src/lib/types/JobPreferences'; +import { jobMessage, stripMarkdown, headerMessage } from '@root/src/pieces/tasks'; + export default class extends Command { @@ -32,182 +34,12 @@ export default class extends Command { ] async run(interaction: ChatInputCommandInteraction): Promise> { - const userID = interaction.user.id; - - const client = await MongoClient.connect(DB.CONNECTION, { useUnifiedTopology: true }); - const db = client.db(BOT.NAME).collection(DB.USERS); - const filterBy = interaction.options.getString('filter') ?? 'default'; - - - const jobformAnswers: JobPreferences | null = (await db.findOne({ discordId: userID }))?.jobPreferences; - - const jobData: JobData = { - city: jobformAnswers.answers.city, - preference: jobformAnswers.answers.workType, - jobType: jobformAnswers.answers.employmentType, - distance: jobformAnswers.answers.travelDistance, - filterBy: 'default' - }; - - const interests: Interest = { - interest1: jobformAnswers.answers.interest1, - interest2: jobformAnswers.answers.interest2, - interest3: jobformAnswers.answers.interest3, - interest4: jobformAnswers.answers.interest4, - interest5: jobformAnswers.answers.interest5 - }; - - const APIResponse:JobResult[] = await fetchJobListings(jobData, interests); - const jobFormData: [JobData, Interest, JobResult[]] = [jobData, interests, APIResponse]; - - const 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: - - ${await this.listJobs(jobFormData, 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. - `; - + const filter = interaction.options.getString('filter') ?? 'default'; + const message = await jobMessage(filter, interaction.user.id); const attachments: AttachmentBuilder[] = []; + attachments.push(await sendToFile(stripMarkdown(message.split('---')[0], interaction.user.id), 'txt', 'list-of-jobs-internships', false)); const pubChan = interaction.channel; - if (message.length > 2000) { - attachments.push(await sendToFile(this.stripMarkdown(message.split('---')[0], userID), 'txt', 'list-of-jobs-internships', false)); - pubChan.send({ content: this.headerMessage(userID, filterBy), files: attachments as AttachmentBuilder[] }); - // interaction.user.send({ content: this.headerMessage(userID, 'default'), files: attachments as AttachmentBuilder[] }); - } else { - pubChan.send(message); - } - } - - async listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: string): Promise { - // Conditionally sort jobs by salary if sortBy is 'salary' - const cityCoordinates = await this.queryCoordinates(jobForm[0].city); - - if (filterBy === 'salary') { - jobForm[2].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') { - jobForm[2].sort((a, b) => (a.title > b.title ? 1 : -1)); - } else if (filterBy === 'date') { - jobForm[2].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); - } else if (filterBy === 'distance') { - // cityCoordinates = await this.queryCoordinates(jobForm[0].city); - - jobForm[2].sort((a, b) => { - const distanceA = this.calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(a.latitude), Number(a.longitude)); - const distanceB = this.calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(b.latitude), Number(b.longitude)); - - if (distanceA === -1) { - return 1; // Treat jobs with no location as lowest - } - - return distanceA - distanceB; // Might have to account for negative distances - }); - } - - - - let jobList = ''; - for (let i = 0; i < jobForm[2].length; i++) { - const avgSalary = (Number(jobForm[2][i].salaryMax) + Number(jobForm[2][i].salaryMin)) / 2; - const formattedAvgSalary = this.formatCurrency(avgSalary); - const formattedSalaryMax = this.formatCurrency(Number(jobForm[2][i].salaryMax)) !== 'N/A' ? this.formatCurrency(Number(jobForm[2][i].salaryMax)) : ''; - const formattedSalaryMin = this.formatCurrency(Number(jobForm[2][i].salaryMin)) !== 'N/A' ? this.formatCurrency(Number(jobForm[2][i].salaryMin)) : ''; - const jobDistance = this.calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(jobForm[2][i].latitude), Number(jobForm[2][i].longitude)); - const formattedDistance = (jobDistance !== -1) ? `${jobDistance.toFixed(2)} miles` : 'N/A'; - - const salaryDetails = (formattedSalaryMin && formattedSalaryMax) - ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` - : formattedAvgSalary; - - jobList += `${i + 1}. **${jobForm[2][i].title}** - \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} - \t\t* **Location:** ${jobForm[2][i].location} - \t\t* **Date Posted:** ${new Date(jobForm[2][i].created).toDateString()} at ${new Date(jobForm[2][i].created).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })} - \t\t* **Apply here:** [read more about the job and apply here](${jobForm[2][i].link}) - \t\t* **Distance:** ${formattedDistance} - ${i !== jobForm[2].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))}`; - } - - - 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(/###|-\#\s*/g, '') - .trim(); - } - - 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. \ - 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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; - } - - calculateDistance(lat1: number, lon1: number, lat2: number, lon2: number): number { - const toRadians = (degrees: number) => degrees * (Math.PI / 180); - - const R = 3958.8; // Radius of the Earth in miles - const dLat = toRadians(lat2 - lat1); - const dLon = toRadians(lon2 - lon1); - const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * - Math.sin(dLon / 2) * Math.sin(dLon / 2); - const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - const distance = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 : R * c; - return distance; - } - - async queryCoordinates(location: string): Promise { // Change to appropriate type later - const preferredCity = encodeURIComponent(location); - - const baseURL = `https://maps.google.com/maps/api/geocode/json?address=${preferredCity}&components=country:US&key=${MAP_KEY}`; - const response = await axios.get(baseURL); - const coordinates : {lat: number, lng: number } = { - lat: response.data.results[0].geometry.location.lat, - lng: response.data.results[0].geometry.location.lng - }; - - return coordinates; + pubChan.send({ content: headerMessage(interaction.user.id, 'default'), files: attachments as AttachmentBuilder[] }); } } diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index cb4a1d4d..c613294f 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -1,4 +1,4 @@ -import { BOT, CHANNELS, DB } from '@root/config'; +import { BOT, CHANNELS, DB, MAP_KEY } from '@root/config'; import { AttachmentBuilder, ChannelType, Client, EmbedBuilder, TextChannel } from 'discord.js'; import { schedule } from 'node-cron'; import { Reminder } from '@lib/types/Reminder'; @@ -10,6 +10,8 @@ import { sendToFile } from '../lib/utils/generalUtils'; import { JobData } from '../lib/types/JobData'; import { Interest } from '../lib/types/Interest'; import { JobResult } from '../lib/types/JobResult'; +import { JobPreferences } from '../lib/types/JobPreferences'; +import axios from 'axios'; async function register(bot: Client): Promise { schedule('0/30 * * * * *', () => { @@ -87,22 +89,22 @@ 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 }); - 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' + const db = client.db(BOT.NAME).collection(DB.USERS); + const jobformAnswers: JobPreferences | null = (await db.findOne({ discordId: userID }))?.jobPreferences; + const jobData: JobData = { + city: jobformAnswers.answers.city, + preference: jobformAnswers.answers.workType, + jobType: jobformAnswers.answers.employmentType, + distance: jobformAnswers.answers.travelDistance, + 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 interests: Interest = { + interest1: jobformAnswers.answers.interest1, + interest2: jobformAnswers.answers.interest2, + interest3: jobformAnswers.answers.interest3, + interest4: jobformAnswers.answers.interest4, + interest5: jobformAnswers.answers.interest5 }; const APIResponse:JobResult[] = await fetchJobListings(jobData, interests); @@ -116,14 +118,43 @@ function formatCurrency(currency:number): string { }).format(Number(currency))}`; } +function calculateDistance(lat1: number, lon1: number, lat2: number, lon2: number): number { + const toRadians = (degrees: number) => degrees * (Math.PI / 180); + + const R = 3958.8; // Radius of the Earth in miles + const dLat = toRadians(lat2 - lat1); + const dLon = toRadians(lon2 - lon1); + const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * + Math.sin(dLon / 2) * Math.sin(dLon / 2); + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + const distance = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 : R * c; + return distance; +} + +async function queryCoordinates(location: string): Promise<{lat: number, lng: number}> { + const preferredCity = encodeURIComponent(location); + + const baseURL = `https://maps.google.com/maps/api/geocode/json?address=${preferredCity}&components=country:US&key=${MAP_KEY}`; + const response = await axios.get(baseURL); + const coordinates : {lat: number, lng: number } = { + lat: response.data.results[0].geometry.location.lat, + lng: response.data.results[0].geometry.location.lng + }; + + return coordinates; +} + 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[], filterBy: string): string { +async function listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: string): Promise { // Conditionally sort jobs by salary if sortBy is 'salary' + const cityCoordinates = await queryCoordinates(jobForm[0].city); + if (filterBy === 'salary') { - jobData.sort((a, b) => { + jobForm[2].sort((a, b) => { const avgA = (Number(a.salaryMax) + Number(a.salaryMin)) / 2; const avgB = (Number(b.salaryMax) + Number(b.salaryMin)) / 2; @@ -133,40 +164,64 @@ function listJobs(jobData: JobResult[], filterBy: string): string { return avgB - avgA; // Descending order }); + } else if (filterBy === 'alphabetical') { + jobForm[2].sort((a, b) => (a.title > b.title ? 1 : -1)); + } else if (filterBy === 'date') { + jobForm[2].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); + } else if (filterBy === 'distance') { + // cityCoordinates = await this.queryCoordinates(jobForm[0].city); + + jobForm[2].sort((a, b) => { + const distanceA = calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(a.latitude), Number(a.longitude)); + const distanceB = calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(b.latitude), Number(b.longitude)); + + if (distanceA === -1) { + return 1; // Treat jobs with no location as lowest + } + + return distanceA - distanceB; // Might have to account for negative distances + }); } + + let jobList = ''; - for (let i = 0; i < jobData.length; i++) { - const avgSalary = (Number(jobData[i].salaryMax) + Number(jobData[i].salaryMin)) / 2; + for (let i = 0; i < jobForm[2].length; i++) { + const avgSalary = (Number(jobForm[2][i].salaryMax) + Number(jobForm[2][i].salaryMin)) / 2; const formattedAvgSalary = formatCurrency(avgSalary); - 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 formattedSalaryMax = formatCurrency(Number(jobForm[2][i].salaryMax)) !== 'N/A' ? formatCurrency(Number(jobForm[2][i].salaryMax)) : ''; + const formattedSalaryMin = formatCurrency(Number(jobForm[2][i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobForm[2][i].salaryMin)) : ''; + const jobDistance = calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(jobForm[2][i].latitude), Number(jobForm[2][i].longitude)); + const formattedDistance = (jobDistance !== -1) ? `${jobDistance.toFixed(2)} miles` : 'N/A'; const salaryDetails = (formattedSalaryMin && formattedSalaryMax) ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` : formattedAvgSalary; - jobList += `${i + 1}. **${titleCase(jobData[i].title)}** + jobList += `${i + 1}. **${jobForm[2][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* **Location:** ${jobForm[2][i].location} + \t\t* **Date Posted:** ${new Date(jobForm[2][i].created).toDateString()} at ${new Date(jobForm[2][i].created).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })} + \t\t* **Apply here:** [read more about the job and apply here](${jobForm[2][i].link}) + \t\t* **Distance:** ${formattedDistance} + ${i !== jobForm[2].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); - const message = `## Hey <@${reminder.owner}>! +export async function jobMessage(reminder: Reminder | string, userID: string): Promise { + const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, typeof reminder === 'object' && 'filterBy' in reminder ? reminder.filterBy : 'default'); + const filterBy = typeof reminder === 'object' && 'filterBy' in reminder ? String((reminder as Reminder).filterBy) : String(reminder); + const 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: - ${listJobs(jobFormData[2], reminder.filterBy)} + ${await listJobs(jobFormData, filterBy)} --- ### **Disclaimer:** -# Please be aware that the job listings displayed are retrieved from a third-party API. \ @@ -178,7 +233,7 @@ async function jobMessage(reminder: Reminder, userID: string): Promise { return message; } -function stripMarkdown(message: string, owner: string): string { +export 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, '') @@ -190,7 +245,7 @@ function stripMarkdown(message: string, owner: string): string { .trim(); } -function headerMessage(owner:string, filterBy:string):string { +export 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. \ From cbf0439bd3f1d601c48b08326dba894dcc57b12d Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Wed, 16 Apr 2025 13:28:04 -0400 Subject: [PATCH 279/317] Histogram command --- src/commands/jobs/histogram.ts | 94 ++++++++++++++++++++++++++++++++++ src/pieces/tasks.ts | 3 +- 2 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/commands/jobs/histogram.ts diff --git a/src/commands/jobs/histogram.ts b/src/commands/jobs/histogram.ts new file mode 100644 index 00000000..6afe72d4 --- /dev/null +++ b/src/commands/jobs/histogram.ts @@ -0,0 +1,94 @@ +import { APP_ID, APP_KEY } from '@root/config'; +import { Command } from '@root/src/lib/types/Command'; +import axios from 'axios'; +import { ChatInputCommandInteraction, InteractionResponse } from 'discord.js'; +import { ChartJSNodeCanvas } from 'chartjs-node-canvas'; +import fs from 'fs'; +import { ChartConfiguration } from 'chart.js'; + +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.`; + + async run(interaction: ChatInputCommandInteraction): Promise> { + await interaction.deferReply(); // Defer the reply first + + const jobTitle = 'Accountant'; // Example job title + + const test = encodeURIComponent(jobTitle); // Encode the job title for the URL + + const URL_BASE = `https://api.adzuna.com/v1/api/jobs/us/histogram?app_id=${APP_ID}&app_key=${APP_KEY}&what=${test}`; + + const response = await axios.get(URL_BASE); + const data = Object.entries(response.data.histogram).map(([value, frequency]: [string, number]) => ({ + value, + frequency + })); + + const image = await generateHistogram(data, jobTitle); + + + await interaction.followUp({ files: [{ attachment: image, name: 'histogram.png' }] }); // Send the file as a follow-up + } + +} + + +// Function to generate a histogram image +export async function generateHistogram(data: { value: string; frequency: number }[], jobTitle: string): Promise { + // Extract labels (values) and data (frequencies) from the JSON object + const labels = data.map(item => item.value); + const frequencies = data.map(item => item.frequency); + + // Set up Chart.js configuration + const width = 800; // Width of the chart + const height = 600; // Height of the chart + const chartJSNodeCanvas = new ChartJSNodeCanvas({ width, height, backgroundColour: 'white' }); + + + const configuration: ChartConfiguration<'line'> = { + type: 'line', + data: { + labels: labels, + datasets: [ + { + label: `Salary Range of ${jobTitle}`, + data: frequencies, + backgroundColor: '#0096FF', // Color of points (if any) + borderColor: 'black', // Color of the line + borderWidth: 2, // Thickness of the line + fill: true, // Ensures no area under the line is filled + cubicInterpolationMode: 'default', // Smooth line + tension: 0.4, // Smoothness of the line + segment: { + backgroundColor: (ctx) => { + const colors = ['#C47AFF', '#7978FF', '#4649FF', '#1D1CE5']; + return colors[ctx.p0DataIndex % colors.length]; // Cycle through colors based on data index + } + } + } + ] + }, + options: { + scales: { + x: { + title: { + display: true, + text: 'Annual Salary (USD)' + } + }, + y: { + title: { + display: true, + text: 'Job Count' + } + } + } + } + }; + + + const imageBuffer = await chartJSNodeCanvas.renderToBuffer(configuration); + return imageBuffer; +} diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index c613294f..c87d62cb 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -212,7 +212,8 @@ async function listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: str export async function jobMessage(reminder: Reminder | string, userID: string): Promise { const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, typeof reminder === 'object' && 'filterBy' in reminder ? reminder.filterBy : 'default'); - const filterBy = typeof reminder === 'object' && 'filterBy' in reminder ? String((reminder as Reminder).filterBy) : String(reminder); + // const filterBy = typeof reminder === 'object' && 'filterBy' in reminder ? String((reminder as Reminder).filterBy) : String(reminder); + const filterBy = (typeof reminder === 'object' && 'filterBy' in reminder && reminder.filterBy) ? String(reminder.filterBy) : 'default'; const message = `## Hey <@${userID}>! ## Here's your list of job/internship recommendations: Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ From b7e758a282fb794523c49ac11aa9b7462f6a6018 Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Sun, 20 Apr 2025 19:02:29 -0400 Subject: [PATCH 280/317] Reminders command now is implemented into a single message and doesn't repeat which fills up the entire channel. --- src/commands/reminders/reminders.ts | 156 +++++++++++++++++++++------- 1 file changed, 119 insertions(+), 37 deletions(-) diff --git a/src/commands/reminders/reminders.ts b/src/commands/reminders/reminders.ts index 7e992433..96e30155 100644 --- a/src/commands/reminders/reminders.ts +++ b/src/commands/reminders/reminders.ts @@ -25,7 +25,8 @@ const EMOJI = { VIEW: '📋', CANCEL: '✖️', TIME: '🕒', - REPEAT: '🔄' + REPEAT: '🔄', + BACK: '↩️' // Added back button emoji }; // Color constants for embeds (using Discord.js ColorResolvable) @@ -46,6 +47,11 @@ export default class extends Command { async run( interaction: ChatInputCommandInteraction ): Promise | void> { + await this.showMainMenu(interaction); + } + + // Create and display the main menu + private async showMainMenu(interaction: ChatInputCommandInteraction | any) { // Create a stylish initial embed const embed = new EmbedBuilder() .setColor(COLORS.PRIMARY) @@ -82,14 +88,28 @@ export default class extends Command { .setStyle(ButtonStyle.Danger) ); - // Send the initial message with embed and buttons - const response = await interaction.reply({ - embeds: [embed], - components: [row], - ephemeral: true - }); + // Check if this is the initial interaction or a follow-up + if (interaction instanceof ChatInputCommandInteraction) { + // Initial command interaction + const response = await interaction.reply({ + embeds: [embed], + components: [row], + ephemeral: true + }); - // Create collector for button interactions + // Create collector for button interactions + this.createButtonCollector(response); + } else { + // A button interaction (going back to main menu) + await interaction.update({ + embeds: [embed], + components: [row] + }); + } + } + + // Create button collector for the main menu + private createButtonCollector(response: any) { const collector = response.createMessageComponentCollector({ componentType: ComponentType.Button, time: 120000 // 2 minute timeout (extended) @@ -105,6 +125,9 @@ export default class extends Command { await this.handleViewReminders(buttonInteraction); } else if (buttonInteraction.customId === 'cancel_reminder') { await this.handleCancelReminder(buttonInteraction); + } else if (buttonInteraction.customId === 'back_to_menu') { + // Handle going back to the main menu + await this.showMainMenu(buttonInteraction); } }); @@ -116,7 +139,7 @@ export default class extends Command { .setDescription('You can run the command again to set up a reminder.') .setTimestamp(); - await interaction.editReply({ + await response.interaction.editReply({ embeds: [timeoutEmbed], components: [] }); @@ -124,8 +147,23 @@ export default class extends Command { }); } + // Helper function to create a back button + private createBackButton() { + return new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId('back_to_menu') + .setLabel('Back to Menu') + .setEmoji(EMOJI.BACK) + .setStyle(ButtonStyle.Secondary) + ); + } + // Handle creating a standard reminder via a modal private async handleCreateReminder(buttonInteraction: any) { + // Store reference to original message + const originalMessage = buttonInteraction.message; + // Create modal for reminder details const modal = new ModalBuilder() .setCustomId('reminder_modal') @@ -176,11 +214,17 @@ export default class extends Command { .setTitle(`${EMOJI.TIME} Invalid Time Format`) .setDescription(`**"${rawDuration}"** is not a valid duration.\nYou can use words like hours, minutes, seconds, days, weeks, months, or years.`) .setFooter({ text: 'Try something like "3 hours" or "2 days"' }); - - return modalInteraction.reply({ + + // Defer the modal reply to acknowledge it without sending a visible message + await modalInteraction.deferUpdate(); + + // Update the original message with the error + await buttonInteraction.editReply({ embeds: [errorEmbed], - ephemeral: true + components: [this.createBackButton()], // Add back button }); + + return; } // Calculate the expiry date @@ -208,10 +252,14 @@ export default class extends Command { value: `> ${content}` }) .setTimestamp(); + + // Defer the modal reply to acknowledge it without sending a visible message + await modalInteraction.deferUpdate(); - await modalInteraction.reply({ + // Update the original message with the success info + await buttonInteraction.editReply({ embeds: [successEmbed], - ephemeral: true + components: [this.createBackButton()], // Add back button }); } catch (error) { @@ -223,9 +271,10 @@ export default class extends Command { .setDescription('The reminder creation process timed out or an error occurred.') .setTimestamp(); - await buttonInteraction.followUp({ + // Update the original button interaction + await buttonInteraction.editReply({ embeds: [errorEmbed], - ephemeral: true + components: [this.createBackButton()], // Add back button }); } } @@ -241,9 +290,9 @@ export default class extends Command { 'You currently already have a job reminder set. To clear your existing job reminder, use the CANCEL button and provide the reminder number.' ); - return buttonInteraction.reply({ + return buttonInteraction.update({ embeds: [errorEmbed], - ephemeral: true + components: [this.createBackButton()], // Add back button }); } @@ -298,10 +347,16 @@ export default class extends Command { .setTitle(`${EMOJI.REPEAT} Invalid Repeat Option`) .setDescription(`**"${repeatValue}"** is not a valid repeat option. Please use "daily", "weekly", or "monthly".`); - return modalInteraction.reply({ + // Defer the modal reply to acknowledge it without sending a visible message + await modalInteraction.deferUpdate(); + + // Update the original message with the error + await buttonInteraction.editReply({ embeds: [errorEmbed], - ephemeral: true + components: [this.createBackButton()], // Add back button }); + + return; } // Validate filter input @@ -337,9 +392,13 @@ export default class extends Command { .setFooter({ text: 'You can update your preferences anytime' }) .setTimestamp(); - await modalInteraction.reply({ + // Defer the modal reply to acknowledge it without sending a visible message + await modalInteraction.deferUpdate(); + + // Update the original message with the success info + await buttonInteraction.editReply({ embeds: [successEmbed], - ephemeral: true + components: [this.createBackButton()], // Add back button }); } catch (error) { @@ -350,9 +409,10 @@ export default class extends Command { .setDescription('The job alert creation process timed out or an error occurred.') .setTimestamp(); - await buttonInteraction.followUp({ + // Update the original button interaction instead of creating a new message + await buttonInteraction.editReply({ embeds: [errorEmbed], - ephemeral: true + components: [this.createBackButton()], // Add back button }); } } @@ -374,9 +434,10 @@ export default class extends Command { .setFooter({ text: 'Use the CREATE REMINDER button to set one up' }) .setTimestamp(); - return buttonInteraction.reply({ + // Update instead of reply to replace the message + return buttonInteraction.update({ embeds: [noRemindersEmbed], - ephemeral: true + components: [this.createBackButton()], // Add back button }); } @@ -413,9 +474,13 @@ export default class extends Command { }); }); - await buttonInteraction.reply({ + // Add back button to the response + const backButton = this.createBackButton(); + + // Update instead of reply to replace the message + await buttonInteraction.update({ embeds, - ephemeral: true + components: [backButton], // Add back button }); } @@ -463,10 +528,16 @@ export default class extends Command { .setDescription(`**"${reminderNumStr}"** is not a valid reminder number. Please enter a positive integer.`) .setFooter({ text: 'Use the VIEW REMINDERS button to see your reminders and their numbers' }); - return modalInteraction.reply({ + // Defer the modal reply to acknowledge it without sending a visible message + await modalInteraction.deferUpdate(); + + // Update the original message with the error + await buttonInteraction.editReply({ embeds: [errorEmbed], - ephemeral: true + components: [this.createBackButton()], // Add back button }); + + return; } // Get user's reminders and sort them @@ -485,11 +556,17 @@ export default class extends Command { .setTitle(`${EMOJI.CANCEL} Reminder Not Found`) .setDescription(`I couldn't find reminder **#${reminderNum + 1}**.`) .setFooter({ text: 'Use the VIEW REMINDERS button to see your current reminders' }); - - return modalInteraction.reply({ + + // Defer the modal reply to acknowledge it without sending a visible message + await modalInteraction.deferUpdate(); + + // Update the original message with the error + await buttonInteraction.editReply({ embeds: [notFoundEmbed], - ephemeral: true + components: [this.createBackButton()], // Add back button }); + + return; } // Delete the reminder @@ -512,9 +589,13 @@ export default class extends Command { ) .setTimestamp(); - return modalInteraction.reply({ + // Defer the modal reply to acknowledge it without sending a visible message + await modalInteraction.deferUpdate(); + + // Update the original message with the success info + await buttonInteraction.editReply({ embeds: [successEmbed], - ephemeral: true + components: [this.createBackButton()], // Add back button }); } catch (error) { @@ -526,9 +607,10 @@ export default class extends Command { .setDescription('The reminder cancellation process timed out or an error occurred.') .setTimestamp(); - await buttonInteraction.followUp({ + // Update the original button interaction + await buttonInteraction.editReply({ embeds: [errorEmbed], - ephemeral: true + components: [this.createBackButton()], // Add back button }); } } From 545132583782f719159eeb2a156edf8398d99b4b Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Sun, 20 Apr 2025 21:48:12 -0400 Subject: [PATCH 281/317] alpha email functionality added -needs testing --- src/commands/reminders/reminders.ts | 477 ++++++++++++++++++++++++---- src/lib/types/Reminder.d.ts | 16 +- src/pieces/tasks.ts | 76 ++++- 3 files changed, 494 insertions(+), 75 deletions(-) diff --git a/src/commands/reminders/reminders.ts b/src/commands/reminders/reminders.ts index 96e30155..81cd7165 100644 --- a/src/commands/reminders/reminders.ts +++ b/src/commands/reminders/reminders.ts @@ -1,4 +1,4 @@ -import { BOT, DB } from '@root/config'; +import { BOT, DB, GMAIL } from '@root/config'; import { ApplicationCommandOptionData, ChatInputCommandInteraction, @@ -17,6 +17,7 @@ import { Reminder } from '@lib/types/Reminder'; import parse from 'parse-duration'; import { checkJobReminder, reminderTime } from '@root/src/lib/utils/generalUtils'; import { Command } from '@lib/types/Command'; +import nodemailer from 'nodemailer'; // Emoji constants for button icons const EMOJI = { @@ -26,7 +27,8 @@ const EMOJI = { CANCEL: '✖️', TIME: '🕒', REPEAT: '🔄', - BACK: '↩️' // Added back button emoji + BACK: '↩️', + EMAIL: '📧' // Added email emoji }; // Color constants for embeds (using Discord.js ColorResolvable) @@ -41,7 +43,7 @@ const COLORS = { export default class extends Command { description = `Have ${BOT.NAME} give you a reminder.`; - extendedHelp = 'Create reminders for anything - one-time or recurring job alerts.'; + extendedHelp = 'Create reminders for anything - one-time or recurring job alerts with optional email notifications.'; options: ApplicationCommandOptionData[] = []; // No options needed as we're using buttons async run( @@ -128,6 +130,12 @@ export default class extends Command { } else if (buttonInteraction.customId === 'back_to_menu') { // Handle going back to the main menu await this.showMainMenu(buttonInteraction); + } else if (buttonInteraction.customId === 'email_yes') { + // Handle yes for email notification + await this.showEmailModal(buttonInteraction); + } else if (buttonInteraction.customId === 'email_no') { + // Handle no for email notification + await this.finalizeReminderCreation(buttonInteraction, false, null); } }); @@ -230,45 +238,141 @@ export default class extends Command { // Calculate the expiry date const expiryDate = new Date(duration + Date.now()); - // Create and store the reminder directly - const reminder: Reminder = { - owner: modalInteraction.user.id, + // Store the reminder data temporarily + const reminderData = { content, - mode: 'public', // could be changed to private if needed - expires: expiryDate, - repeat: null // No repeat by default + expiryDate, + buttonInteraction, + modalInteraction }; - await modalInteraction.client.mongo - .collection(DB.REMINDERS) - .insertOne(reminder); + // Ask the user if they want email notifications + await this.askForEmailNotification(reminderData); - const successEmbed = new EmbedBuilder() - .setColor(COLORS.SUCCESS) - .setTitle(`${EMOJI.REMINDER} Reminder Set!`) - .setDescription(`I'll remind you about that at **${reminderTime(reminder)}**.`) - .addFields({ - name: 'Reminder Content', - value: `> ${content}` - }) - .setTimestamp(); + } catch (error) { + console.error('Error in modal submission:', error); - // Defer the modal reply to acknowledge it without sending a visible message - await modalInteraction.deferUpdate(); + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Reminder Creation Failed`) + .setDescription('The reminder creation process timed out or an error occurred.') + .setTimestamp(); - // Update the original message with the success info + // Update the original button interaction await buttonInteraction.editReply({ - embeds: [successEmbed], + embeds: [errorEmbed], components: [this.createBackButton()], // Add back button }); + } + } + + // Ask if the user wants email notifications + private async askForEmailNotification(reminderData: any) { + const { buttonInteraction, modalInteraction } = reminderData; + + // Create embed asking about email notifications + const emailEmbed = new EmbedBuilder() + .setColor(COLORS.INFO) + .setTitle(`${EMOJI.EMAIL} Would you like to receive this reminder by email too?`) + .setDescription('Choose whether you want to also receive this reminder via email when it triggers.') + .setFooter({ text: 'Email notifications are optional' }) + .setTimestamp(); + + // Create Yes/No buttons + const emailRow = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId('email_yes') + .setLabel('Yes, send email') + .setEmoji(EMOJI.EMAIL) + .setStyle(ButtonStyle.Success), + new ButtonBuilder() + .setCustomId('email_no') + .setLabel('No, Discord only') + .setStyle(ButtonStyle.Secondary) + ); + + // Store the reminder data in the client's temporary collection + // This way we can access it when the user makes a choice + modalInteraction.client.reminderTemp = reminderData; + + // Defer the modal reply to acknowledge it + await modalInteraction.deferUpdate(); + + // Update original message to ask about email + await buttonInteraction.editReply({ + embeds: [emailEmbed], + components: [emailRow] + }); + } + + // Show modal to collect email address + private async showEmailModal(buttonInteraction: any) { + // Create modal for email address + const modal = new ModalBuilder() + .setCustomId('email_modal') + .setTitle(`${EMOJI.EMAIL} Email Notification`); + + // Add input for email address + const emailInput = new TextInputBuilder() + .setCustomId('email') + .setLabel("Email address for notifications:") + .setStyle(TextInputStyle.Short) + .setPlaceholder("Enter your email address here...") + .setRequired(true); + + // Create action row with input + const emailRow = new ActionRowBuilder().addComponents(emailInput); + + // Add action row to the modal + modal.addComponents(emailRow); + + // Show the modal + await buttonInteraction.showModal(modal); + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 180000, // 3 minutes (extended) + filter: (i: ModalSubmitInteraction) => + i.customId === 'email_modal' && + i.user.id === buttonInteraction.user.id + }); + + // Process modal submission + const email = modalInteraction.fields.getTextInputValue('email'); + + // Simple email validation + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(email)) { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Invalid Email Address`) + .setDescription(`**"${email}"** does not appear to be a valid email address.`) + .setFooter({ text: 'Please try again with a valid email address' }); + + // Defer the modal reply + await modalInteraction.deferUpdate(); + + // Update the original message with the error + await buttonInteraction.editReply({ + embeds: [errorEmbed], + components: [this.createBackButton()], // Add back button + }); + + return; + } + + // Finalize the reminder creation with email + await this.finalizeReminderCreation(buttonInteraction, true, email, modalInteraction); } catch (error) { - console.error('Error in modal submission:', error); + console.error('Error in email modal submission:', error); const errorEmbed = new EmbedBuilder() .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Reminder Creation Failed`) - .setDescription('The reminder creation process timed out or an error occurred.') + .setTitle(`${EMOJI.CANCEL} Email Collection Failed`) + .setDescription('The email collection process timed out or an error occurred.') .setTimestamp(); // Update the original button interaction @@ -279,6 +383,63 @@ export default class extends Command { } } + // Create and store the reminder with or without email + private async finalizeReminderCreation(buttonInteraction: any, withEmail: boolean, email: string | null, modalInteraction?: ModalSubmitInteraction) { + // Get the reminder data + const reminderData = buttonInteraction.client.reminderTemp; + const { content, expiryDate } = reminderData; + + // Create the reminder object + const reminder: Reminder = { + owner: buttonInteraction.user.id, + content, + mode: 'public', // could be changed to private if needed + expires: expiryDate, + repeat: null, // No repeat by default + emailNotification: withEmail, + emailAddress: withEmail ? email : null + }; + + // Store the reminder in the database + await buttonInteraction.client.mongo + .collection(DB.REMINDERS) + .insertOne(reminder); + + // Create success embed + const successEmbed = new EmbedBuilder() + .setColor(COLORS.SUCCESS) + .setTitle(`${EMOJI.REMINDER} Reminder Set!`) + .setDescription(`I'll remind you about that at **${reminderTime(reminder)}**.`) + .addFields({ + name: 'Reminder Content', + value: `> ${content}` + }); + + // Add email info if applicable + if (withEmail) { + successEmbed.addFields({ + name: 'Email Notification', + value: `You'll also receive an email at **${email}** when this reminder triggers.` + }); + } + + successEmbed.setTimestamp(); + + // Defer the modal reply if provided + if (modalInteraction) { + await modalInteraction.deferUpdate(); + } + + // Update the original message with success info + await buttonInteraction.editReply({ + embeds: [successEmbed], + components: [this.createBackButton()], // Add back button + }); + + // Clean up temporary data + delete buttonInteraction.client.reminderTemp; + } + // Handle creating a job reminder using a modal private async handleCreateJobReminder(buttonInteraction: any) { // Check for existing job reminder @@ -365,51 +526,172 @@ export default class extends Command { filterValue = 'default'; // Fallback to default if invalid } - // Create and store the job reminder - const jobReminder: Reminder = { - owner: modalInteraction.user.id, - content: 'Job Reminder', - mode: 'private', - expires: new Date(), // Set to now, will be handled by the job scheduler - repeat: repeatValue as 'daily' | 'weekly', - filterBy: filterValue as 'default' | 'relevance' | 'salary' | 'date' + // Store job reminder data + const jobReminderData = { + repeatValue, + filterValue, + buttonInteraction, + modalInteraction }; + + // Ask about email notifications + await this.askForJobEmailNotification(jobReminderData); - await modalInteraction.client.mongo - .collection(DB.REMINDERS) - .insertOne(jobReminder); - - const successEmbed = new EmbedBuilder() - .setColor(COLORS.SECONDARY) - .setTitle(`${EMOJI.JOB} Job Alert Created`) - .setDescription( - `I'll send you job opportunities **${repeatValue}** starting at **${reminderTime(jobReminder)}**.` - ) - .addFields( - { name: 'Frequency', value: `${repeatValue.charAt(0).toUpperCase() + repeatValue.slice(1)}`, inline: true }, - { name: 'Sorted By', value: `${filterValue.charAt(0).toUpperCase() + filterValue.slice(1)}`, inline: true } - ) - .setFooter({ text: 'You can update your preferences anytime' }) + } catch (error) { + console.error('Error in modal submission:', error); + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Job Alert Creation Failed`) + .setDescription('The job alert creation process timed out or an error occurred.') .setTimestamp(); - // Defer the modal reply to acknowledge it without sending a visible message - await modalInteraction.deferUpdate(); - - // Update the original message with the success info + // Update the original button interaction instead of creating a new message await buttonInteraction.editReply({ - embeds: [successEmbed], + embeds: [errorEmbed], components: [this.createBackButton()], // Add back button }); + } + } + + // Ask if the user wants email notifications for job reminders + private async askForJobEmailNotification(jobReminderData: any) { + const { buttonInteraction, modalInteraction } = jobReminderData; + + // Create embed asking about email notifications + const emailEmbed = new EmbedBuilder() + .setColor(COLORS.INFO) + .setTitle(`${EMOJI.EMAIL} Would you like to receive job alerts by email too?`) + .setDescription('Choose whether you want to also receive job alerts via email when they trigger.') + .setFooter({ text: 'Email notifications are optional' }) + .setTimestamp(); + + // Create Yes/No buttons + const emailRow = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId('job_email_yes') + .setLabel('Yes, send email') + .setEmoji(EMOJI.EMAIL) + .setStyle(ButtonStyle.Success), + new ButtonBuilder() + .setCustomId('job_email_no') + .setLabel('No, Discord only') + .setStyle(ButtonStyle.Secondary) + ); + + // Store the job reminder data in the client's temporary collection + modalInteraction.client.jobReminderTemp = jobReminderData; + + // Defer the modal reply to acknowledge it + await modalInteraction.deferUpdate(); + + // Update original message to ask about email + await buttonInteraction.editReply({ + embeds: [emailEmbed], + components: [emailRow] + }); + + // Create collector for the email choice buttons + const collector = buttonInteraction.message.createMessageComponentCollector({ + componentType: ComponentType.Button, + time: 60000, // 1 minute timeout + filter: (i) => + (i.customId === 'job_email_yes' || i.customId === 'job_email_no') && + i.user.id === buttonInteraction.user.id + }); + + // Handle button collection + collector.on('collect', async (i) => { + // Clear the collector + collector.stop(); + + if (i.customId === 'job_email_yes') { + // Show email modal for job reminders + await this.showJobEmailModal(buttonInteraction); + } else { + // Finalize job reminder without email + await this.finalizeJobReminderCreation(buttonInteraction, false, null); + } + }); + + collector.on('end', (collected) => { + if (collected.size === 0) { + // Timeout - just create the reminder without email + this.finalizeJobReminderCreation(buttonInteraction, false, null); + } + }); + } + + // Show modal to collect email address for job reminders + private async showJobEmailModal(buttonInteraction: any) { + // Create modal for email address + const modal = new ModalBuilder() + .setCustomId('job_email_modal') + .setTitle(`${EMOJI.EMAIL} Email Notification for Job Alerts`); + + // Add input for email address + const emailInput = new TextInputBuilder() + .setCustomId('email') + .setLabel("What email address should receive job alerts?") + .setStyle(TextInputStyle.Short) + .setPlaceholder("Enter your email address here...") + .setRequired(true); + + // Create action row with input + const emailRow = new ActionRowBuilder().addComponents(emailInput); + + // Add action row to the modal + modal.addComponents(emailRow); + + // Show the modal + await buttonInteraction.showModal(modal); + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 180000, // 3 minutes (extended) + filter: (i: ModalSubmitInteraction) => + i.customId === 'job_email_modal' && + i.user.id === buttonInteraction.user.id + }); + + // Process modal submission + const email = modalInteraction.fields.getTextInputValue('email'); + + // Simple email validation + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(email)) { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Invalid Email Address`) + .setDescription(`**"${email}"** does not appear to be a valid email address.`) + .setFooter({ text: 'Please try again with a valid email address' }); + + // Defer the modal reply + await modalInteraction.deferUpdate(); + + // Update the original message with the error + await buttonInteraction.editReply({ + embeds: [errorEmbed], + components: [this.createBackButton()], // Add back button + }); + + return; + } + + // Finalize the job reminder creation with email + await this.finalizeJobReminderCreation(buttonInteraction, true, email, modalInteraction); } catch (error) { - console.error('Error in modal submission:', error); + console.error('Error in job email modal submission:', error); + const errorEmbed = new EmbedBuilder() .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Job Alert Creation Failed`) - .setDescription('The job alert creation process timed out or an error occurred.') + .setTitle(`${EMOJI.CANCEL} Email Collection Failed`) + .setDescription('The email collection process timed out or an error occurred.') .setTimestamp(); - // Update the original button interaction instead of creating a new message + // Update the original button interaction await buttonInteraction.editReply({ embeds: [errorEmbed], components: [this.createBackButton()], // Add back button @@ -417,6 +699,67 @@ export default class extends Command { } } + // Create and store the job reminder with or without email + private async finalizeJobReminderCreation(buttonInteraction: any, withEmail: boolean, email: string | null, modalInteraction?: ModalSubmitInteraction) { + // Get the job reminder data + const jobReminderData = buttonInteraction.client.jobReminderTemp; + const { repeatValue, filterValue } = jobReminderData; + + // Create the job reminder object + const jobReminder: Reminder = { + owner: buttonInteraction.user.id, + content: 'Job Reminder', + mode: 'private', + expires: new Date(), // Set to now, will be handled by the job scheduler + repeat: repeatValue as 'daily' | 'weekly', + filterBy: filterValue as 'default' | 'relevance' | 'salary' | 'date', + emailNotification: withEmail, + emailAddress: withEmail ? email : null + }; + + // Store the job reminder in the database + await buttonInteraction.client.mongo + .collection(DB.REMINDERS) + .insertOne(jobReminder); + + // Create success embed + const successEmbed = new EmbedBuilder() + .setColor(COLORS.SECONDARY) + .setTitle(`${EMOJI.JOB} Job Alert Created`) + .setDescription( + `I'll send you job opportunities **${repeatValue}** starting at **${reminderTime(jobReminder)}**.` + ) + .addFields( + { name: 'Frequency', value: `${repeatValue.charAt(0).toUpperCase() + repeatValue.slice(1)}`, inline: true }, + { name: 'Sorted By', value: `${filterValue.charAt(0).toUpperCase() + filterValue.slice(1)}`, inline: true } + ); + + // Add email info if applicable + if (withEmail) { + successEmbed.addFields({ + name: 'Email Notification', + value: `You'll also receive job alerts at **${email}** when they trigger.` + }); + } + + successEmbed.setFooter({ text: 'You can update your preferences anytime' }) + .setTimestamp(); + + // Defer the modal reply if provided + if (modalInteraction) { + await modalInteraction.deferUpdate(); + } + + // Update the original message with the success info + await buttonInteraction.editReply({ + embeds: [successEmbed], + components: [this.createBackButton()], // Add back button + }); + + // Clean up temporary data + delete buttonInteraction.client.jobReminderTemp; + } + // Handle viewing reminders private async handleViewReminders(buttonInteraction: any) { const reminders: Array = await buttonInteraction.client.mongo @@ -459,9 +802,10 @@ export default class extends Command { const hidden = reminder.mode === 'private'; const isJobReminder = reminder.content === 'Job Reminder'; const icon = isJobReminder ? EMOJI.JOB : EMOJI.REMINDER; + const emailIcon = reminder.emailNotification ? ` ${EMOJI.EMAIL}` : ''; embeds[Math.floor(i / 10)].addFields({ - name: `${i + 1}. ${icon} ${ + name: `${i + 1}. ${icon}${emailIcon} ${ hidden ? isJobReminder ? 'Job Alert' @@ -469,8 +813,12 @@ export default class extends Command { : reminder.content }`, value: hidden - ? `${EMOJI.REPEAT} **${reminder.repeat}** job reminder filtered by **${reminder.filterBy}**` - : `${EMOJI.TIME} Due: **${reminderTime(reminder)}**` + ? `${EMOJI.REPEAT} **${reminder.repeat}** job reminder filtered by **${reminder.filterBy}**${ + reminder.emailNotification ? `\n${EMOJI.EMAIL} Email notifications to: ${reminder.emailAddress}` : '' + }` + : `${EMOJI.TIME} Due: **${reminderTime(reminder)}**${ + reminder.emailNotification ? `\n${EMOJI.EMAIL} Email notifications to: ${reminder.emailAddress}` : '' + }` }); }); @@ -576,6 +924,7 @@ export default class extends Command { const hidden = reminder.mode === 'private'; const isJobReminder = reminder.content === 'Job Reminder'; + const emailInfo = reminder.emailNotification ? `\nEmail notifications to ${reminder.emailAddress} have been canceled.` : ''; const successEmbed = new EmbedBuilder() .setColor(COLORS.SUCCESS) @@ -585,7 +934,7 @@ export default class extends Command { hidden ? (isJobReminder ? 'Job Alert' : 'Private Reminder') : `"${reminder.content}"` - }` + }${emailInfo}` ) .setTimestamp(); diff --git a/src/lib/types/Reminder.d.ts b/src/lib/types/Reminder.d.ts index e572ee51..2eab37ef 100644 --- a/src/lib/types/Reminder.d.ts +++ b/src/lib/types/Reminder.d.ts @@ -1,8 +1,10 @@ export interface Reminder { - owner: string; - expires: Date; - content: string; - repeat: null | 'daily' | 'weekly'; - mode: 'public' | 'private'; - filterBy?: 'relevance' | 'salary' | 'date' | 'default' | null -} + owner: string; + expires: Date; + content: string; + repeat: null | 'daily' | 'weekly'; + mode: 'public' | 'private'; + filterBy?: 'relevance' | 'salary' | 'date' | 'default' | null; + emailNotification?: boolean; + emailAddress?: string; +} \ No newline at end of file diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index cb4a1d4d..ab065dd5 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -1,4 +1,4 @@ -import { BOT, CHANNELS, DB } from '@root/config'; +import { BOT, CHANNELS, DB, GMAIL } from '@root/config'; import { AttachmentBuilder, ChannelType, Client, EmbedBuilder, TextChannel } from 'discord.js'; import { schedule } from 'node-cron'; import { Reminder } from '@lib/types/Reminder'; @@ -10,6 +10,7 @@ import { sendToFile } from '../lib/utils/generalUtils'; import { JobData } from '../lib/types/JobData'; import { Interest } from '../lib/types/Interest'; import { JobResult } from '../lib/types/JobResult'; +import nodemailer from 'nodemailer'; async function register(bot: Client): Promise { schedule('0/30 * * * * *', () => { @@ -202,11 +203,75 @@ some job postings may contain inaccuracies due to API limitations, which are bey `; } +// Function to send an email notification for a reminder +async function sendEmailNotification(reminder: Reminder): Promise { + // Skip if email notification isn't enabled for this reminder + if (!reminder.emailNotification || !reminder.emailAddress) { + return; + } + + // Create Gmail transporter using credentials from config + const mailer = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: GMAIL.USER, + pass: GMAIL.APP_PASSWORD + } + }); + + try { + // Determine subject and content based on reminder type + let subject: string; + let htmlContent: string; + + const isJobReminder = reminder.content === 'Job Reminder'; + + if (isJobReminder) { + subject = `Job Alert from ${BOT.NAME}`; + // For job reminders, we could create a simplified version of the job listing + // This would need to be developed further to extract job data properly + htmlContent = ` +

Your Job Alert from ${BOT.NAME}

+

This is your scheduled job alert. New job opportunities matching your interests are available!

+

Please check your Discord messages for the full list of job opportunities.

+

Frequency: ${reminder.repeat}

+

Filter: ${reminder.filterBy}

+
+

This is an automated message from the ${BOT.NAME} Discord bot.

+ `; + } else { + subject = `Reminder from ${BOT.NAME}`; + htmlContent = ` +

Your Reminder from ${BOT.NAME}

+

Reminder content: ${reminder.content}

+

This is an automated message from the ${BOT.NAME} Discord bot.

+ `; + } + + // Send the email + await mailer.sendMail({ + from: GMAIL.USER, + to: reminder.emailAddress, + subject: subject, + html: htmlContent + }); + + console.log(`Email notification sent to ${reminder.emailAddress} for reminder: ${reminder.content}`); + } catch (error) { + console.error('Failed to send email notification:', error); + } +} + 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) => { + reminders.forEach(async (reminder) => { + // Send email notification if enabled + if (reminder.emailNotification && reminder.emailAddress) { + await sendEmailNotification(reminder); + } + if (reminder.mode === 'public') { pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); } else { @@ -236,7 +301,10 @@ async function checkReminders(bot: Client): Promise { expires: new Date(reminder.expires), mode: reminder.mode, repeat: reminder.repeat, - owner: reminder.owner + owner: reminder.owner, + // Preserve email notification settings for repeated reminders + emailNotification: reminder.emailNotification, + emailAddress: reminder.emailAddress }; if (reminder.repeat === 'daily') { @@ -251,4 +319,4 @@ async function checkReminders(bot: Client): Promise { }); } -export default register; +export default register; \ No newline at end of file From fbb6110a6f3d344fc98b9292818e35c866592b1e Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Mon, 21 Apr 2025 12:54:11 -0400 Subject: [PATCH 282/317] Added pdf stuff --- src/commands/jobs/jobs.ts | 14 +- src/pieces/tasks.ts | 282 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 280 insertions(+), 16 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index 94e015f4..803a4abb 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -9,8 +9,7 @@ import { MongoClient } from 'mongodb'; import { sendToFile } from '@root/src/lib/utils/generalUtils'; import axios from 'axios'; import { JobPreferences } from '@root/src/lib/types/JobPreferences'; -import { jobMessage, stripMarkdown, headerMessage } from '@root/src/pieces/tasks'; - +import { jobMessage, stripMarkdown, headerMessage, generateJobPDF } from '@root/src/pieces/tasks'; export default class extends Command { @@ -28,18 +27,23 @@ export default class extends Command { { name: 'Date Posted', value: 'date' }, { name: 'Salary', value: 'salary' }, { name: 'Alphabetical', value: 'alphabetical' }, - {name: 'Distance', value: 'distance' } + { name: 'Distance', value: 'distance' } ] } ] async run(interaction: ChatInputCommandInteraction): Promise> { + await interaction.deferReply(); // Defer the reply first + const filter = interaction.options.getString('filter') ?? 'default'; - const message = await jobMessage(filter, interaction.user.id); + const result = await jobMessage(filter, interaction.user.id); + const { message } = result; + const { pdfBuffer } = result; const attachments: AttachmentBuilder[] = []; attachments.push(await sendToFile(stripMarkdown(message.split('---')[0], interaction.user.id), 'txt', 'list-of-jobs-internships', false)); + attachments.push(new AttachmentBuilder(pdfBuffer).setName('jobs.pdf')); const pubChan = interaction.channel; - pubChan.send({ content: headerMessage(interaction.user.id, 'default'), files: attachments as AttachmentBuilder[] }); + interaction.followUp({ content: headerMessage(interaction.user.id, 'default'), files: attachments as AttachmentBuilder[] }); } } diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index c87d62cb..8ffd0883 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -1,4 +1,4 @@ -import { BOT, CHANNELS, DB, MAP_KEY } from '@root/config'; +import { APP_ID, APP_KEY, BOT, CHANNELS, DB, MAP_KEY } from '@root/config'; import { AttachmentBuilder, ChannelType, Client, EmbedBuilder, TextChannel } from 'discord.js'; import { schedule } from 'node-cron'; import { Reminder } from '@lib/types/Reminder'; @@ -12,6 +12,8 @@ import { Interest } from '../lib/types/Interest'; import { JobResult } from '../lib/types/JobResult'; import { JobPreferences } from '../lib/types/JobPreferences'; import axios from 'axios'; +import { PDFDocument, PDFFont, rgb, StandardFonts } from 'pdf-lib'; +import { generateHistogram } from '../commands/jobs/histogram'; async function register(bot: Client): Promise { schedule('0/30 * * * * *', () => { @@ -125,8 +127,8 @@ function calculateDistance(lat1: number, lon1: number, lat2: number, lon2: numbe const dLat = toRadians(lat2 - lat1); const dLon = toRadians(lon2 - lon1); const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * - Math.sin(dLon / 2) * Math.sin(dLon / 2); + Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) + * Math.sin(dLon / 2) * Math.sin(dLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); const distance = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 : R * c; return distance; @@ -165,7 +167,7 @@ async function listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: str return avgB - avgA; // Descending order }); } else if (filterBy === 'alphabetical') { - jobForm[2].sort((a, b) => (a.title > b.title ? 1 : -1)); + jobForm[2].sort((a, b) => a.title > b.title ? 1 : -1); } else if (filterBy === 'date') { jobForm[2].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); } else if (filterBy === 'distance') { @@ -184,7 +186,6 @@ async function listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: str } - let jobList = ''; for (let i = 0; i < jobForm[2].length; i++) { const avgSalary = (Number(jobForm[2][i].salaryMax) + Number(jobForm[2][i].salaryMin)) / 2; @@ -192,9 +193,9 @@ async function listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: str const formattedSalaryMax = formatCurrency(Number(jobForm[2][i].salaryMax)) !== 'N/A' ? formatCurrency(Number(jobForm[2][i].salaryMax)) : ''; const formattedSalaryMin = formatCurrency(Number(jobForm[2][i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobForm[2][i].salaryMin)) : ''; const jobDistance = calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(jobForm[2][i].latitude), Number(jobForm[2][i].longitude)); - const formattedDistance = (jobDistance !== -1) ? `${jobDistance.toFixed(2)} miles` : 'N/A'; + const formattedDistance = jobDistance !== -1 ? `${jobDistance.toFixed(2)} miles` : 'N/A'; - const salaryDetails = (formattedSalaryMin && formattedSalaryMax) + const salaryDetails = formattedSalaryMin && formattedSalaryMax ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` : formattedAvgSalary; @@ -210,10 +211,15 @@ async function listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: str return jobList || '### Unfortunately, there were no jobs found based on your interests :(. Consider updating your interests or waiting until something is found.'; } -export async function jobMessage(reminder: Reminder | string, userID: string): Promise { +export async function jobMessage(reminder: Reminder | string, userID: string): Promise<{ message: string; pdfBuffer: Buffer }> { const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, typeof reminder === 'object' && 'filterBy' in reminder ? reminder.filterBy : 'default'); // const filterBy = typeof reminder === 'object' && 'filterBy' in reminder ? String((reminder as Reminder).filterBy) : String(reminder); - const filterBy = (typeof reminder === 'object' && 'filterBy' in reminder && reminder.filterBy) ? String(reminder.filterBy) : 'default'; + const filterBy = typeof reminder === 'object' && 'filterBy' in reminder && reminder.filterBy ? String(reminder.filterBy) : 'default'; + + + const pdfBuffer = await generateJobPDF(jobFormData[2]); + + const message = `## Hey <@${userID}>! ## Here's your list of job/internship recommendations: Based on your interests in **${jobFormData[1].interest1}**, **${jobFormData[1].interest2}**, \ @@ -231,7 +237,7 @@ Here's your personalized list: 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; + return { message, pdfBuffer }; } export function stripMarkdown(message: string, owner: string): string { @@ -267,7 +273,9 @@ async function checkReminders(bot: Client): Promise { pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); } else { bot.users.fetch(reminder.owner).then(async (user) => { - const message = await jobMessage(reminder, user.id); + const result = await jobMessage(reminder, user.id); + const { message } = result; + const { pdfBuffer } = result; if (message.length < 2000) { user.send(message).catch((err) => { console.log('ERROR:', err); @@ -307,4 +315,256 @@ async function checkReminders(bot: Client): Promise { }); } +export async function generateJobPDF(jobs: JobResult[]): Promise { + // Create a new PDF document. + const pdfDoc = await PDFDocument.create(); + let currentPage = pdfDoc.addPage(); + const { width, height } = currentPage.getSize(); + const margin = 40; + let yPosition = height - margin - 50; + const fontSize = 10; + const titleFontSize = 30; + const bulletPointIndent = 20; + const subBulletPointIndent = 30; // Indentation for sub-bullet points + + + // Embed a standard font. + const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman); + const HelveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold); + const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica); + + + // Draw the title. + const lineHeight = 10; // Height of the line + const lineWidth = (width - margin * 2) / 3; + + currentPage.drawRectangle({ + x: margin, + y: yPosition + 50, + width: lineWidth, + height: lineHeight, + color: rgb(135 / 255, 59 / 255, 29 / 255) // red color + }); + + // Draw the second color segment + currentPage.drawRectangle({ + x: margin + lineWidth, + y: yPosition + 50, + width: lineWidth, + height: lineHeight, + color: rgb(237 / 255, 118 / 255, 71 / 255) // orangey color + }); + + // Draw the third color segment + currentPage.drawRectangle({ + x: margin + lineWidth * 2, + y: yPosition + 50, + width: lineWidth, + height: lineHeight, + color: rgb(13 / 255, 158 / 255, 198 / 255) // Blue color + }); + + yPosition -= 40; // Adjust spacing below the line + + + currentPage.drawText('List of Jobs PDF', { + x: margin, + y: yPosition + 50, + size: titleFontSize, + font: HelveticaBold, + + color: rgb(114 / 255, 53 / 255, 9 / 255) + }); + yPosition -= 40; + + currentPage.drawRectangle({ + x: margin, + y: yPosition + 50, + width: lineWidth / 2, + height: lineHeight - 8, + color: rgb(135 / 255, 59 / 255, 29 / 255) // red color + }); + yPosition -= 10; + + // Loop through each job and add its details. + for (let i = 0; i < jobs.length; i++) { + const job = jobs[i]; + + if (yPosition - fontSize * 2 < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin - 20; + } + + const maxWidth = width - margin * 2; // Calculate available width + const wrappedTitle = wrapText(`${i + 1}. ${job.title}`, HelveticaBold, fontSize + 10, maxWidth); + + + for (const line of wrappedTitle) { + // Check if there's enough space for the line + if (yPosition - fontSize * 2 < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin - 20; + } + + currentPage.drawText(line, { + x: margin, + y: yPosition + 30, + size: fontSize + 10, + font: HelveticaBold, + color: rgb(241 / 255, 113 / 255, 34 / 255) + }); + + yPosition -= 30; // Adjust spacing between lines + } + + // Draw the bullet points for location, salary, and apply link. + const bulletPoints = [ + { label: 'Location', value: job.location }, + { label: 'Salary', value: formatSalaryforPDF(job) }, + { label: 'Apply Here', value: job.link } + ]; + + const test = 'C++ developer'; // Replace with the actual job title you want to use for the histogram + const URL_BASE = `https://api.adzuna.com/v1/api/jobs/us/histogram?app_id=${APP_ID}&app_key=${APP_KEY}&what=${test}`; + + const response = await axios.get(URL_BASE); + const data = Object.entries(response.data.histogram).map(([value, frequency]: [string, number]) => ({ + value, + frequency + })); + + const image = await generateHistogram(data, job.title); + const imageBytes = await pdfDoc.embedPng(image); + const imageDims = imageBytes.scale(0.5); // Scale the image to 50% of its original size + const imageX = margin + bulletPointIndent + subBulletPointIndent; + const imageY = yPosition + 20 - imageDims.height; // Adjust Y position to place the image above the text + const imageField = currentPage.drawImage(imageBytes, { + x: imageX, + y: imageY, + width: imageDims.width, + height: imageDims.height + }); + + + + + + for (const point of bulletPoints) { + // Check if there's enough space on the page, and add a new page if needed. + if (yPosition - fontSize * 2 < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin - 20; + } + + const maxLabelWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; + const wrappedLabel = wrapText(`• ${point.label}`, HelveticaBold, fontSize + 5, maxLabelWidth); + + // Draw the wrapped label + for (const line of wrappedLabel) { + // Check if there's enough space for the line + if (yPosition - fontSize * 2 < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin - 20; + } + + currentPage.drawText(line, { + x: margin + bulletPointIndent, + y: yPosition + 25, + size: fontSize + 5, + font: HelveticaBold, + color: rgb(94 / 255, 74 / 255, 74 / 255) + }); + + yPosition -= fontSize + 10; // Adjust spacing between lines + } + + + const combinedText = `•${point.value}`; + const maxValueWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; + const wrappedValue = wrapText(combinedText, HelveticaBold, fontSize + 4, maxValueWidth); + + + for (const line of wrappedValue) { + // Check if there's enough space for the line + if (yPosition - fontSize * 2 < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin - 20; + } + + currentPage.drawText(line, { + x: margin + bulletPointIndent + subBulletPointIndent, + y: yPosition + 20, + size: fontSize + 3, + font: HelveticaBold, + color: rgb(13 / 255, 158 / 255, 198 / 255) + }); + + yPosition -= fontSize + 5; // Adjust spacing between lines + } + + yPosition -= 20; // Add extra spacing between items + } + + yPosition -= 40; // Add extra spacing between jobs. + } + + + const pdfBytes = await pdfDoc.save(); + return Buffer.from(pdfBytes); +} + +function wrapText(text: string, font: PDFFont, fontSize: number, maxWidth: number): string[] { + const words = text.split(' '); + const lines: string[] = []; + let currentLine = ''; + + for (const word of words) { + const testLine = currentLine ? `${currentLine} ${word}` : word; + const textWidth = font.widthOfTextAtSize(testLine, fontSize); + + if (textWidth <= maxWidth) { + currentLine = testLine; + } else { + if (currentLine) { + lines.push(currentLine); + } + currentLine = ''; + + // Handle long words that exceed maxWidth + let remainingWord = word; + while (font.widthOfTextAtSize(remainingWord, fontSize) > maxWidth) { + const splitIndex = Math.floor((maxWidth / font.widthOfTextAtSize(remainingWord, fontSize)) * remainingWord.length); + const chunk = remainingWord.slice(0, splitIndex); + lines.push(chunk); + remainingWord = remainingWord.slice(splitIndex); + } + currentLine = remainingWord; + } + } + + if (currentLine) { + lines.push(currentLine); + } + + return lines; +} + +function formatSalaryforPDF(job: JobResult): string { + const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; + const formattedAvgSalary = formatCurrency(avgSalary); + const formattedSalaryMax + = formatCurrency(Number(job.salaryMax)) !== 'N/A' + ? formatCurrency(Number(job.salaryMax)) + : ''; + const formattedSalaryMin + = formatCurrency(Number(job.salaryMin)) !== 'N/A' + ? formatCurrency(Number(job.salaryMin)) + : ''; + + return formattedSalaryMin && formattedSalaryMax + ? `Avg: ${formattedAvgSalary}, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` + : formattedAvgSalary; +} + + export default register; From 95ca57e45606c11bd1039ad211c51e3c73c9482a Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Mon, 21 Apr 2025 23:11:14 -0400 Subject: [PATCH 283/317] fixed crashing on "no" button by fixing button handler --- src/commands/reminders/emailtest.ts | 68 ---- src/commands/reminders/reminders.ts | 470 +++++++++++++++++++--------- 2 files changed, 320 insertions(+), 218 deletions(-) delete mode 100644 src/commands/reminders/emailtest.ts diff --git a/src/commands/reminders/emailtest.ts b/src/commands/reminders/emailtest.ts deleted file mode 100644 index 9ffd0f36..00000000 --- a/src/commands/reminders/emailtest.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { ApplicationCommandPermissions, ChatInputCommandInteraction, ApplicationCommandOptionData, ApplicationCommandOptionType, InteractionResponse, Message } from 'discord.js'; -import { BOTMASTER_PERMS } from '@lib/permissions'; -import { Command } from '@lib/types/Command'; -import nodemailer from 'nodemailer'; -import { GMAIL } from '@root/config'; // Import the Gmail config - -export default class extends Command { - description = 'Sends a test email from Gmail to verify email functionality.'; - permissions: ApplicationCommandPermissions[] = BOTMASTER_PERMS; - - options: ApplicationCommandOptionData[] = [ - { - name: 'recipient', - description: 'Email address to send the test email to', - type: ApplicationCommandOptionType.String, - required: true - }, - { - name: 'subject', - description: 'Subject line of the test email', - type: ApplicationCommandOptionType.String, - required: false - } - ] - - async run(interaction: ChatInputCommandInteraction): Promise | void | Message> { - // Immediately defer the reply to prevent the "Unknown interaction" error - await interaction.deferReply({ ephemeral: true }); - - const recipient = interaction.options.getString('recipient'); - const subject = interaction.options.getString('subject') || 'Test Email from Discord Bot'; - - // Create Gmail transporter using credentials from config - const mailer = nodemailer.createTransport({ - service: 'gmail', - auth: { - user: GMAIL.USER, - pass: GMAIL.APP_PASSWORD - } - }); - - try { - await mailer.sendMail({ - from: GMAIL.USER, - to: recipient, - subject: subject, - html: ` - - -

Discord Bot Test Email

-

This is a test email sent by the Discord bot to verify email functionality.

-

Sent by: ${interaction.user.tag} (${interaction.user.id})

-

Time: ${new Date().toLocaleString()}

- - ` - }); - - return interaction.editReply({ - content: `✅ Test email successfully sent to ${recipient}!` - }); - } catch (error) { - console.error('Email sending error:', error); - return interaction.editReply({ - content: `❌ Failed to send test email: ${error.message}` - }); - } - } -} \ No newline at end of file diff --git a/src/commands/reminders/reminders.ts b/src/commands/reminders/reminders.ts index 81cd7165..518739b1 100644 --- a/src/commands/reminders/reminders.ts +++ b/src/commands/reminders/reminders.ts @@ -134,8 +134,42 @@ export default class extends Command { // Handle yes for email notification await this.showEmailModal(buttonInteraction); } else if (buttonInteraction.customId === 'email_no') { - // Handle no for email notification - await this.finalizeReminderCreation(buttonInteraction, false, null); + // Handle no for email notification - retrieve the reminder data + const reminderData = buttonInteraction.client.reminderTemp; + if (reminderData) { + await this.finalizeReminderCreation(buttonInteraction, false, null); + } else { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Error Processing Reminder`) + .setDescription('Something went wrong while processing your reminder. Please try creating it again.') + .setTimestamp(); + + await buttonInteraction.update({ + embeds: [errorEmbed], + components: [this.createBackButton()] + }); + } + } else if (buttonInteraction.customId === 'job_email_yes') { + // Handle yes for job email notification + await this.showJobEmailModal(buttonInteraction); + } else if (buttonInteraction.customId === 'job_email_no') { + // Handle no for job email notification - retrieve the job reminder data + const jobReminderData = buttonInteraction.client.jobReminderTemp; + if (jobReminderData) { + await this.finalizeJobReminderCreation(buttonInteraction, false, null); + } else { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Error Processing Job Reminder`) + .setDescription('Something went wrong while processing your job reminder. Please try creating it again.') + .setTimestamp(); + + await buttonInteraction.update({ + embeds: [errorEmbed], + components: [this.createBackButton()] + }); + } } }); @@ -330,8 +364,8 @@ export default class extends Command { // Show the modal await buttonInteraction.showModal(modal); - // Wait for modal submission try { + // Wait for modal submission const modalInteraction = await buttonInteraction.awaitModalSubmit({ time: 180000, // 3 minutes (extended) filter: (i: ModalSubmitInteraction) => @@ -351,93 +385,161 @@ export default class extends Command { .setDescription(`**"${email}"** does not appear to be a valid email address.`) .setFooter({ text: 'Please try again with a valid email address' }); - // Defer the modal reply - await modalInteraction.deferUpdate(); - - // Update the original message with the error - await buttonInteraction.editReply({ - embeds: [errorEmbed], - components: [this.createBackButton()], // Add back button + // Defer the modal reply to acknowledge it + await modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true }); - return; } // Finalize the reminder creation with email await this.finalizeReminderCreation(buttonInteraction, true, email, modalInteraction); - } catch (error) { console.error('Error in email modal submission:', error); - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Email Collection Failed`) - .setDescription('The email collection process timed out or an error occurred.') - .setTimestamp(); + // Only try to update if we haven't already replied + try { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Email Collection Issue`) + .setDescription('There was a problem processing your email. Your reminder has been created without email notifications.') + .setTimestamp(); - // Update the original button interaction - await buttonInteraction.editReply({ - embeds: [errorEmbed], - components: [this.createBackButton()], // Add back button - }); + // Update the original button interaction in a way that's safer + await this.finalizeReminderCreation(buttonInteraction, false, null); + } catch (updateError) { + console.error('Error updating after email modal error:', updateError); + } } } // Create and store the reminder with or without email private async finalizeReminderCreation(buttonInteraction: any, withEmail: boolean, email: string | null, modalInteraction?: ModalSubmitInteraction) { - // Get the reminder data - const reminderData = buttonInteraction.client.reminderTemp; - const { content, expiryDate } = reminderData; - - // Create the reminder object - const reminder: Reminder = { - owner: buttonInteraction.user.id, - content, - mode: 'public', // could be changed to private if needed - expires: expiryDate, - repeat: null, // No repeat by default - emailNotification: withEmail, - emailAddress: withEmail ? email : null - }; - - // Store the reminder in the database - await buttonInteraction.client.mongo - .collection(DB.REMINDERS) - .insertOne(reminder); - - // Create success embed - const successEmbed = new EmbedBuilder() - .setColor(COLORS.SUCCESS) - .setTitle(`${EMOJI.REMINDER} Reminder Set!`) - .setDescription(`I'll remind you about that at **${reminderTime(reminder)}**.`) - .addFields({ - name: 'Reminder Content', - value: `> ${content}` - }); + try { + // Get the reminder data + const reminderData = buttonInteraction.client.reminderTemp; - // Add email info if applicable - if (withEmail) { - successEmbed.addFields({ - name: 'Email Notification', - value: `You'll also receive an email at **${email}** when this reminder triggers.` - }); - } - - successEmbed.setTimestamp(); - - // Defer the modal reply if provided - if (modalInteraction) { - await modalInteraction.deferUpdate(); + // Check if we have valid reminder data + if (!reminderData || !reminderData.content || !reminderData.expiryDate) { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Error Creating Reminder`) + .setDescription('Missing reminder information. Please try creating your reminder again.') + .setTimestamp(); + + // If we have a modal interaction, respond to that + if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { + await modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } else { + // Otherwise try to update the button interaction + await buttonInteraction.update({ + embeds: [errorEmbed], + components: [this.createBackButton()] + }); + } + return; + } + + const { content, expiryDate } = reminderData; + + // Create the reminder object + const reminder: Reminder = { + owner: buttonInteraction.user.id, + content, + mode: 'public', // could be changed to private if needed + expires: expiryDate, + repeat: null, // No repeat by default + emailNotification: withEmail, + emailAddress: withEmail ? email : null + }; + + // Store the reminder in the database + await buttonInteraction.client.mongo + .collection(DB.REMINDERS) + .insertOne(reminder); + + // Create success embed + const successEmbed = new EmbedBuilder() + .setColor(COLORS.SUCCESS) + .setTitle(`${EMOJI.REMINDER} Reminder Set!`) + .setDescription(`I'll remind you about that at **${reminderTime(reminder)}**.`) + .addFields({ + name: 'Reminder Content', + value: `> ${content}` + }); + + // Add email info if applicable + if (withEmail) { + successEmbed.addFields({ + name: 'Email Notification', + value: `You'll also receive an email at **${email}** when this reminder triggers.` + }); + } + + successEmbed.setTimestamp(); + + // Handle the response based on which interaction is available + if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { + // If we have a modal interaction that hasn't been replied to yet + await modalInteraction.reply({ + content: "Your reminder has been created successfully!", + ephemeral: true + }); + + // Update the original message + await buttonInteraction.editReply({ + embeds: [successEmbed], + components: [this.createBackButton()] + }); + } else { + // Otherwise try to update the button interaction + // First check if we can update + if (!buttonInteraction.replied) { + await buttonInteraction.update({ + embeds: [successEmbed], + components: [this.createBackButton()] + }); + } else { + // If we can't update, try to edit the reply + await buttonInteraction.editReply({ + embeds: [successEmbed], + components: [this.createBackButton()] + }); + } + } + + // Clean up temporary data + delete buttonInteraction.client.reminderTemp; + } catch (error) { + console.error('Error in finalizeReminderCreation:', error); + + // Try to give feedback through any available channel + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.WARNING) + .setTitle(`${EMOJI.REMINDER} Reminder Process Completed`) + .setDescription("Your reminder has been created, but there was an issue updating the display.") + .setTimestamp(); + + try { + if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { + await modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } else if (!buttonInteraction.replied) { + await buttonInteraction.update({ + embeds: [errorEmbed], + components: [this.createBackButton()] + }); + } + } catch (secondError) { + console.error('Even the error handler failed:', secondError); + } } - - // Update the original message with success info - await buttonInteraction.editReply({ - embeds: [successEmbed], - components: [this.createBackButton()], // Add back button - }); - - // Clean up temporary data - delete buttonInteraction.client.reminderTemp; } // Handle creating a job reminder using a modal @@ -632,7 +734,7 @@ export default class extends Command { // Add input for email address const emailInput = new TextInputBuilder() .setCustomId('email') - .setLabel("What email address should receive job alerts?") + .setLabel("Email address for job alerts:") .setStyle(TextInputStyle.Short) .setPlaceholder("Enter your email address here...") .setRequired(true); @@ -646,8 +748,8 @@ export default class extends Command { // Show the modal await buttonInteraction.showModal(modal); - // Wait for modal submission try { + // Wait for modal submission const modalInteraction = await buttonInteraction.awaitModalSubmit({ time: 180000, // 3 minutes (extended) filter: (i: ModalSubmitInteraction) => @@ -667,97 +769,165 @@ export default class extends Command { .setDescription(`**"${email}"** does not appear to be a valid email address.`) .setFooter({ text: 'Please try again with a valid email address' }); - // Defer the modal reply - await modalInteraction.deferUpdate(); - - // Update the original message with the error - await buttonInteraction.editReply({ - embeds: [errorEmbed], - components: [this.createBackButton()], // Add back button + // Reply to the modal + await modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true }); - return; } // Finalize the job reminder creation with email await this.finalizeJobReminderCreation(buttonInteraction, true, email, modalInteraction); - } catch (error) { console.error('Error in job email modal submission:', error); - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Email Collection Failed`) - .setDescription('The email collection process timed out or an error occurred.') - .setTimestamp(); - - // Update the original button interaction - await buttonInteraction.editReply({ - embeds: [errorEmbed], - components: [this.createBackButton()], // Add back button - }); + try { + // Create a reminder without email as a fallback + await this.finalizeJobReminderCreation(buttonInteraction, false, null); + } catch (fallbackError) { + console.error('Failed even with fallback approach:', fallbackError); + } } } // Create and store the job reminder with or without email private async finalizeJobReminderCreation(buttonInteraction: any, withEmail: boolean, email: string | null, modalInteraction?: ModalSubmitInteraction) { - // Get the job reminder data - const jobReminderData = buttonInteraction.client.jobReminderTemp; - const { repeatValue, filterValue } = jobReminderData; - - // Create the job reminder object - const jobReminder: Reminder = { - owner: buttonInteraction.user.id, - content: 'Job Reminder', - mode: 'private', - expires: new Date(), // Set to now, will be handled by the job scheduler - repeat: repeatValue as 'daily' | 'weekly', - filterBy: filterValue as 'default' | 'relevance' | 'salary' | 'date', - emailNotification: withEmail, - emailAddress: withEmail ? email : null - }; - - // Store the job reminder in the database - await buttonInteraction.client.mongo - .collection(DB.REMINDERS) - .insertOne(jobReminder); - - // Create success embed - const successEmbed = new EmbedBuilder() - .setColor(COLORS.SECONDARY) - .setTitle(`${EMOJI.JOB} Job Alert Created`) - .setDescription( - `I'll send you job opportunities **${repeatValue}** starting at **${reminderTime(jobReminder)}**.` - ) - .addFields( - { name: 'Frequency', value: `${repeatValue.charAt(0).toUpperCase() + repeatValue.slice(1)}`, inline: true }, - { name: 'Sorted By', value: `${filterValue.charAt(0).toUpperCase() + filterValue.slice(1)}`, inline: true } - ); + try { + // Get the job reminder data + const jobReminderData = buttonInteraction.client.jobReminderTemp; - // Add email info if applicable - if (withEmail) { - successEmbed.addFields({ - name: 'Email Notification', - value: `You'll also receive job alerts at **${email}** when they trigger.` - }); - } - - successEmbed.setFooter({ text: 'You can update your preferences anytime' }) - .setTimestamp(); - - // Defer the modal reply if provided - if (modalInteraction) { - await modalInteraction.deferUpdate(); + // Check if we have valid job reminder data + if (!jobReminderData || !jobReminderData.repeatValue || !jobReminderData.filterValue) { + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} Error Creating Job Alert`) + .setDescription('Missing job alert information. Please try creating your job alert again.') + .setTimestamp(); + + // If we have a modal interaction, respond to that + if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { + await modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } else { + // Otherwise try to update the button interaction + try { + await buttonInteraction.update({ + embeds: [errorEmbed], + components: [this.createBackButton()] + }); + } catch (updateError) { + // If updating fails, try editing + await buttonInteraction.editReply({ + embeds: [errorEmbed], + components: [this.createBackButton()] + }); + } + } + return; + } + + const { repeatValue, filterValue } = jobReminderData; + + // Create the job reminder object + const jobReminder: Reminder = { + owner: buttonInteraction.user.id, + content: 'Job Reminder', + mode: 'private', + expires: new Date(), // Set to now, will be handled by the job scheduler + repeat: repeatValue as 'daily' | 'weekly', + filterBy: filterValue as 'default' | 'relevance' | 'salary' | 'date', + emailNotification: withEmail, + emailAddress: withEmail ? email : null + }; + + // Store the job reminder in the database + await buttonInteraction.client.mongo + .collection(DB.REMINDERS) + .insertOne(jobReminder); + + // Create success embed + const successEmbed = new EmbedBuilder() + .setColor(COLORS.SECONDARY) + .setTitle(`${EMOJI.JOB} Job Alert Created`) + .setDescription( + `I'll send you job opportunities **${repeatValue}** starting at **${reminderTime(jobReminder)}**.` + ) + .addFields( + { name: 'Frequency', value: `${repeatValue.charAt(0).toUpperCase() + repeatValue.slice(1)}`, inline: true }, + { name: 'Sorted By', value: `${filterValue.charAt(0).toUpperCase() + filterValue.slice(1)}`, inline: true } + ); + + // Add email info if applicable + if (withEmail) { + successEmbed.addFields({ + name: 'Email Notification', + value: `You'll also receive job alerts at **${email}** when they trigger.` + }); + } + + successEmbed.setFooter({ text: 'You can update your preferences anytime' }) + .setTimestamp(); + + // Handle the response based on which interaction is available + if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { + // If we have a modal interaction that hasn't been replied to yet + await modalInteraction.reply({ + content: "Your job alert has been created successfully!", + ephemeral: true + }); + + // Update the original message + await buttonInteraction.editReply({ + embeds: [successEmbed], + components: [this.createBackButton()] + }); + } else { + // Otherwise try to update the button interaction + try { + await buttonInteraction.update({ + embeds: [successEmbed], + components: [this.createBackButton()] + }); + } catch (updateError) { + // If updating fails, try editing + await buttonInteraction.editReply({ + embeds: [successEmbed], + components: [this.createBackButton()] + }); + } + } + + // Clean up temporary data + delete buttonInteraction.client.jobReminderTemp; + } catch (error) { + console.error('Error in finalizeJobReminderCreation:', error); + + // Try to give feedback through any available channel + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.WARNING) + .setTitle(`${EMOJI.JOB} Job Alert Process Completed`) + .setDescription("Your job alert has been created, but there was an issue updating the display.") + .setTimestamp(); + + try { + if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { + await modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } else { + await buttonInteraction.editReply({ + embeds: [errorEmbed], + components: [this.createBackButton()] + }); + } + } catch (secondError) { + console.error('Even the error handler failed:', secondError); + } } - - // Update the original message with the success info - await buttonInteraction.editReply({ - embeds: [successEmbed], - components: [this.createBackButton()], // Add back button - }); - - // Clean up temporary data - delete buttonInteraction.client.jobReminderTemp; } // Handle viewing reminders From 84e47e1fcc559416f5eeb71982ca40dbeec96254 Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Mon, 21 Apr 2025 23:30:54 -0400 Subject: [PATCH 284/317] used the same method for fixing reminders to fix job reminders --- src/commands/reminders/reminders.ts | 171 +++++++++++----------------- 1 file changed, 69 insertions(+), 102 deletions(-) diff --git a/src/commands/reminders/reminders.ts b/src/commands/reminders/reminders.ts index 518739b1..30f5c419 100644 --- a/src/commands/reminders/reminders.ts +++ b/src/commands/reminders/reminders.ts @@ -145,32 +145,13 @@ export default class extends Command { .setDescription('Something went wrong while processing your reminder. Please try creating it again.') .setTimestamp(); - await buttonInteraction.update({ - embeds: [errorEmbed], - components: [this.createBackButton()] - }); - } - } else if (buttonInteraction.customId === 'job_email_yes') { - // Handle yes for job email notification - await this.showJobEmailModal(buttonInteraction); - } else if (buttonInteraction.customId === 'job_email_no') { - // Handle no for job email notification - retrieve the job reminder data - const jobReminderData = buttonInteraction.client.jobReminderTemp; - if (jobReminderData) { - await this.finalizeJobReminderCreation(buttonInteraction, false, null); - } else { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Error Processing Job Reminder`) - .setDescription('Something went wrong while processing your job reminder. Please try creating it again.') - .setTimestamp(); - await buttonInteraction.update({ embeds: [errorEmbed], components: [this.createBackButton()] }); } } + // We'll handle job email buttons through a different collector }); collector.on('end', async (collected) => { @@ -688,109 +669,95 @@ export default class extends Command { await modalInteraction.deferUpdate(); // Update original message to ask about email - await buttonInteraction.editReply({ + const message = await buttonInteraction.editReply({ embeds: [emailEmbed], components: [emailRow] }); - // Create collector for the email choice buttons - const collector = buttonInteraction.message.createMessageComponentCollector({ + // Create a dedicated collector for this specific message + const collector = message.createMessageComponentCollector({ componentType: ComponentType.Button, - time: 60000, // 1 minute timeout - filter: (i) => - (i.customId === 'job_email_yes' || i.customId === 'job_email_no') && - i.user.id === buttonInteraction.user.id + time: 60000 // 1 minute timeout }); - // Handle button collection collector.on('collect', async (i) => { - // Clear the collector + // Make sure it's the right user + if (i.user.id !== buttonInteraction.user.id) { + await i.reply({ + content: 'This button is not for you.', + ephemeral: true + }); + return; + } + + // Stop the collector since we've handled the interaction collector.stop(); if (i.customId === 'job_email_yes') { - // Show email modal for job reminders - await this.showJobEmailModal(buttonInteraction); - } else { - // Finalize job reminder without email + // Create modal for email address + const modal = new ModalBuilder() + .setCustomId('job_email_modal') + .setTitle(`${EMOJI.EMAIL} Email Notification for Job Alerts`); + + // Add input for email address + const emailInput = new TextInputBuilder() + .setCustomId('email') + .setLabel("Email address for job alerts:") + .setStyle(TextInputStyle.Short) + .setPlaceholder("Enter your email address here...") + .setRequired(true); + + // Create action row with input + const emailRow = new ActionRowBuilder().addComponents(emailInput); + + // Add action row to the modal + modal.addComponents(emailRow); + + // Show the modal using the NEW interaction from collector + await i.showModal(modal); + + try { + // Wait for modal submission + const modalSubmit = await i.awaitModalSubmit({ + time: 180000, // 3 minutes + filter: (mi) => mi.customId === 'job_email_modal' && mi.user.id === i.user.id + }); + + // Process the email and finalize + const email = modalSubmit.fields.getTextInputValue('email'); + + // Email validation + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(email)) { + await modalSubmit.reply({ + content: `Invalid email address format. Please try again.`, + ephemeral: true + }); + return; + } + + // Finalize job reminder creation with email + await this.finalizeJobReminderCreation(buttonInteraction, true, email, modalSubmit); + } catch (error) { + console.error('Error in modal submission:', error); + // Fallback to no email + await this.finalizeJobReminderCreation(buttonInteraction, false, null); + } + } else if (i.customId === 'job_email_no') { + // Handle "No, Discord only" option await this.finalizeJobReminderCreation(buttonInteraction, false, null); } }); - collector.on('end', (collected) => { + // Handle collector end (timeout) + collector.on('end', collected => { if (collected.size === 0) { - // Timeout - just create the reminder without email + // If no buttons were pressed, create without email this.finalizeJobReminderCreation(buttonInteraction, false, null); } }); } - // Show modal to collect email address for job reminders - private async showJobEmailModal(buttonInteraction: any) { - // Create modal for email address - const modal = new ModalBuilder() - .setCustomId('job_email_modal') - .setTitle(`${EMOJI.EMAIL} Email Notification for Job Alerts`); - - // Add input for email address - const emailInput = new TextInputBuilder() - .setCustomId('email') - .setLabel("Email address for job alerts:") - .setStyle(TextInputStyle.Short) - .setPlaceholder("Enter your email address here...") - .setRequired(true); - - // Create action row with input - const emailRow = new ActionRowBuilder().addComponents(emailInput); - - // Add action row to the modal - modal.addComponents(emailRow); - - // Show the modal - await buttonInteraction.showModal(modal); - - try { - // Wait for modal submission - const modalInteraction = await buttonInteraction.awaitModalSubmit({ - time: 180000, // 3 minutes (extended) - filter: (i: ModalSubmitInteraction) => - i.customId === 'job_email_modal' && - i.user.id === buttonInteraction.user.id - }); - - // Process modal submission - const email = modalInteraction.fields.getTextInputValue('email'); - - // Simple email validation - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - if (!emailRegex.test(email)) { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Invalid Email Address`) - .setDescription(`**"${email}"** does not appear to be a valid email address.`) - .setFooter({ text: 'Please try again with a valid email address' }); - - // Reply to the modal - await modalInteraction.reply({ - embeds: [errorEmbed], - ephemeral: true - }); - return; - } - - // Finalize the job reminder creation with email - await this.finalizeJobReminderCreation(buttonInteraction, true, email, modalInteraction); - } catch (error) { - console.error('Error in job email modal submission:', error); - - try { - // Create a reminder without email as a fallback - await this.finalizeJobReminderCreation(buttonInteraction, false, null); - } catch (fallbackError) { - console.error('Failed even with fallback approach:', fallbackError); - } - } - } - // Create and store the job reminder with or without email private async finalizeJobReminderCreation(buttonInteraction: any, withEmail: boolean, email: string | null, modalInteraction?: ModalSubmitInteraction) { try { From af0c1fbd7acc2a051ef6b9a902e69d31c7e9e5bd Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Mon, 28 Apr 2025 13:37:49 -0400 Subject: [PATCH 285/317] added distance field back to pdf --- src/lib/types/JobResult.d.ts | 1 + src/pieces/tasks.ts | 179 +++++++++++++++++++++++++++-------- 2 files changed, 138 insertions(+), 42 deletions(-) diff --git a/src/lib/types/JobResult.d.ts b/src/lib/types/JobResult.d.ts index 0c8025d4..af8bcac2 100644 --- a/src/lib/types/JobResult.d.ts +++ b/src/lib/types/JobResult.d.ts @@ -9,4 +9,5 @@ export interface JobResult { salaryMax: string; salaryMin: string; link: string; + distance?: number; } diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 8ffd0883..1ea88b79 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -14,6 +14,7 @@ import { JobPreferences } from '../lib/types/JobPreferences'; import axios from 'axios'; import { PDFDocument, PDFFont, rgb, StandardFonts } from 'pdf-lib'; import { generateHistogram } from '../commands/jobs/histogram'; +import jobform from '../commands/jobs/jobform'; async function register(bot: Client): Promise { schedule('0/30 * * * * *', () => { @@ -174,8 +175,8 @@ async function listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: str // cityCoordinates = await this.queryCoordinates(jobForm[0].city); jobForm[2].sort((a, b) => { - const distanceA = calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(a.latitude), Number(a.longitude)); - const distanceB = calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(b.latitude), Number(b.longitude)); + const distanceA = a.distance; + const distanceB = b.distance; if (distanceA === -1) { return 1; // Treat jobs with no location as lowest @@ -211,32 +212,74 @@ async function listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: str return jobList || '### Unfortunately, there were no jobs found based on your interests :(. Consider updating your interests or waiting until something is found.'; } -export async function jobMessage(reminder: Reminder | string, userID: string): Promise<{ message: string; pdfBuffer: Buffer }> { +export async function jobMessage(reminder: Reminder | string, userID: string): Promise<{ message: string, pdfBuffer: Buffer }> { const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, typeof reminder === 'object' && 'filterBy' in reminder ? reminder.filterBy : 'default'); - // const filterBy = typeof reminder === 'object' && 'filterBy' in reminder ? String((reminder as Reminder).filterBy) : String(reminder); - const filterBy = typeof reminder === 'object' && 'filterBy' in reminder && reminder.filterBy ? String(reminder.filterBy) : 'default'; - - - const pdfBuffer = await generateJobPDF(jobFormData[2]); + let filterBy: string; + if (typeof reminder === 'object' && 'filterBy' in reminder && reminder.filterBy) { + filterBy = String(reminder.filterBy); + } else if (typeof reminder === 'object') { + filterBy = 'default'; + } else { + filterBy = typeof reminder === 'string' && reminder ? reminder : 'default'; + } + const cityCoordinates = await queryCoordinates(jobFormData[0].city); + for (let i = 0; i < jobFormData[2].length; i++) { + const job = jobFormData[2][i]; + const distance = Math.round(calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(job.latitude), Number(job.longitude)) + Number.EPSILON) * 100 / 100; // Round to 2 decimal places + jobFormData[2][i].distance = distance; + } - const 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: + const jobResults : JobResult[] = await sortJobResults(jobFormData, filterBy); + + + const pdfBuffer = await generateJobPDF(jobFormData); + const embedList: EmbedBuilder[] = []; + + // for (let i = 0; i < jobFormData[2].length; i++) { + // const job = jobFormData[2][i]; + // const cityCoordinates = await queryCoordinates(jobFormData[0].city); + // const distance = Math.round(calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(job.latitude), Number(job.longitude)) + Number.EPSILON) * 100 / 100; // Round to 2 decimal places + + // const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; + // const formattedAvgSalary = formatCurrency(avgSalary); + + // const postedDate = new Date(job.created).toDateString(); + // const postedTime = new Date(job.created).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' }); + + // embedList.push(new EmbedBuilder() + // .setTitle(job.title) + // .setURL(job.link) + // .setDescription(`Job oppourtunity found for you!`) + // .addFields( + // { name: 'Salary', value: formattedAvgSalary, inline: true }, + // { name: 'Location', value: job.location, inline: true }, + // { name: 'Date Posted', value: `${postedDate} at ${postedTime}`, inline: true }, + // { name: 'Distance', value: `${distance} miles`, inline: true } + // ) + // .setColor(0x00AE86) + // .setFooter({ text: 'Powered by SageBot & Adzuna' }) + // ); + // } + + + const 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: + + ${await listJobs(jobFormData, 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.`; - ${await listJobs(jobFormData, 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. - `; return { message, pdfBuffer }; } @@ -274,7 +317,8 @@ async function checkReminders(bot: Client): Promise { } else { bot.users.fetch(reminder.owner).then(async (user) => { const result = await jobMessage(reminder, user.id); - const { message } = result; + // const { message } = result; + const message = 'placeholder'; // Placeholder for the message variable const { pdfBuffer } = result; if (message.length < 2000) { user.send(message).catch((err) => { @@ -315,8 +359,13 @@ async function checkReminders(bot: Client): Promise { }); } -export async function generateJobPDF(jobs: JobResult[]): Promise { +export async function generateJobPDF(jobForm: [JobData, Interest, JobResult[]]): Promise { // Create a new PDF document. + + // Seperate sorting in listjobs into its own function, call function here so sorting maintained + + const jobs = jobForm[2]; + const pdfDoc = await PDFDocument.create(); let currentPage = pdfDoc.addPage(); const { width, height } = currentPage.getSize(); @@ -419,34 +468,32 @@ export async function generateJobPDF(jobs: JobResult[]): Promise { // Draw the bullet points for location, salary, and apply link. const bulletPoints = [ - { label: 'Location', value: job.location }, + { label: 'Location', value: `${job.location}, ${job.distance} miles from ${jobForm[0].city} ` }, { label: 'Salary', value: formatSalaryforPDF(job) }, { label: 'Apply Here', value: job.link } ]; - const test = 'C++ developer'; // Replace with the actual job title you want to use for the histogram - const URL_BASE = `https://api.adzuna.com/v1/api/jobs/us/histogram?app_id=${APP_ID}&app_key=${APP_KEY}&what=${test}`; - + const jobTitle = encodeURIComponent(job.title); + const URL_BASE = `https://api.adzuna.com/v1/api/jobs/us/histogram?app_id=${APP_ID}&app_key=${APP_KEY}&what=${jobTitle}`; + const response = await axios.get(URL_BASE); const data = Object.entries(response.data.histogram).map(([value, frequency]: [string, number]) => ({ value, frequency })); + let noValues = true; - const image = await generateHistogram(data, job.title); - const imageBytes = await pdfDoc.embedPng(image); - const imageDims = imageBytes.scale(0.5); // Scale the image to 50% of its original size - const imageX = margin + bulletPointIndent + subBulletPointIndent; - const imageY = yPosition + 20 - imageDims.height; // Adjust Y position to place the image above the text - const imageField = currentPage.drawImage(imageBytes, { - x: imageX, - y: imageY, - width: imageDims.width, - height: imageDims.height - }); + for (const item of data) { + if (item.frequency > 0) { + noValues = false; + break; + } + } - + const image = await generateHistogram(data, job.title); + const imageBytes = await pdfDoc.embedPng(image); + const imageDims = imageBytes.scale(0.2); for (const point of bulletPoints) { @@ -475,6 +522,18 @@ export async function generateJobPDF(jobs: JobResult[]): Promise { color: rgb(94 / 255, 74 / 255, 74 / 255) }); + if (point.label === 'Salary' && !noValues) { + currentPage.drawImage(imageBytes, { + x: currentPage.getWidth() / 2 - imageDims.width / 2, + y: yPosition - imageDims.height - 10, + width: imageDims.width, + height: imageDims.height + }); + + yPosition -= imageDims.height + 30; // Adjust spacing for the image + } + + yPosition -= fontSize + 10; // Adjust spacing between lines } @@ -566,5 +625,41 @@ function formatSalaryforPDF(job: JobResult): string { : formattedAvgSalary; } +async function sortJobResults(jobForm: [JobData, Interest, JobResult[]], filterBy: string): Promise { + const cityCoordinates = await queryCoordinates(jobForm[0].city); + + if (filterBy === 'salary') { + jobForm[2].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') { + jobForm[2].sort((a, b) => a.title > b.title ? 1 : -1); + } else if (filterBy === 'date') { + jobForm[2].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); + } else if (filterBy === 'distance') { + // cityCoordinates = await this.queryCoordinates(jobForm[0].city); + + jobForm[2].sort((a, b) => { + const distanceA = a.distance; + const distanceB = b.distance; + + if (distanceA === -1) { + return 1; // Treat jobs with no location as lowest + } + + return distanceA - distanceB; // Might have to account for negative distances + }); + } + + return jobForm[2]; +} + export default register; From 622cb46df1ba05d9410d37a62b3c5ab894927f8a Mon Sep 17 00:00:00 2001 From: Karanvir Date: Mon, 28 Apr 2025 15:45:10 -0400 Subject: [PATCH 286/317] fix: successful npm install and sync package-lock.json --- binding.gyp | 8 + build/Makefile | 347 ++++++++++++++++++ build/binding.Makefile | 6 + build/config.gypi | 86 +++-- build/gyp-mac-tool | 772 +++++++++++++++++++++++++++++++++++++++++ build/sage.target.mk | 161 +++++++++ package-lock.json | 23 +- 7 files changed, 1373 insertions(+), 30 deletions(-) create mode 100644 binding.gyp create mode 100644 build/Makefile create mode 100644 build/binding.Makefile create mode 100755 build/gyp-mac-tool create mode 100644 build/sage.target.mk diff --git a/binding.gyp b/binding.gyp new file mode 100644 index 00000000..fc3134fa --- /dev/null +++ b/binding.gyp @@ -0,0 +1,8 @@ +{ + "targets": [ + { + "target_name": "sage", + "sources": ["src/sage.ts"] + } + ] +} diff --git a/build/Makefile b/build/Makefile new file mode 100644 index 00000000..2ecade92 --- /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)/build/config.gypi $(srcdir)/binding.gyp $(srcdir)/../Library/Caches/node-gyp/20.11.0/include/node/common.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/config.gypi b/build/config.gypi index e9edeef1..e4f951ca 100644 --- a/build/config.gypi +++ b/build/config.gypi @@ -6,10 +6,11 @@ "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, "coverage": "false", "dcheck_always_on": 0, @@ -20,8 +21,8 @@ "enable_pgo_use": "false", "error_on_warn": "false", "force_dynamic_crt": 0, - "host_arch": "x64", - "icu_data_in": "..\\..\\deps\\icu-tmp\\icudt73l.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", @@ -29,9 +30,8 @@ "icu_ver_major": "73", "is_debug": 0, "libdir": "lib", - "llvm_version": "0.0", - "napi_build_version": "9", - "nasm_version": "2.16", + "llvm_version": "13.0", + "napi_build_version": "0", "node_builtin_shareable_builtins": [ "deps/cjs-module-lexer/lexer.js", "deps/cjs-module-lexer/dist/lexer.js", @@ -80,6 +80,7 @@ "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", @@ -87,13 +88,15 @@ "lib/internal/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", @@ -135,11 +138,11 @@ "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/symbols.js", "lib/internal/file.js", "lib/internal/fixed_queue.js", "lib/internal/freelist.js", @@ -148,7 +151,7 @@ "lib/internal/fs/cp/cp.js", "lib/internal/fs/dir.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", @@ -167,7 +170,7 @@ "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,12 +179,10 @@ "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", @@ -189,6 +190,7 @@ "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", @@ -196,10 +198,14 @@ "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/navigator.js", "lib/internal/net.js", "lib/internal/options.js", "lib/internal/per_context/domexception.js", @@ -221,6 +227,7 @@ "lib/internal/process/esm_loader.js", "lib/internal/process/execution.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", @@ -247,7 +254,6 @@ "lib/internal/source_map/source_map_cache.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", @@ -264,13 +270,15 @@ "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/coverage.js", "lib/internal/test_runner/harness.js", - "lib/internal/test_runner/mock.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/v8-serializer.js", @@ -288,6 +296,7 @@ "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", @@ -351,9 +360,9 @@ "lib/worker_threads.js", "lib/zlib.js" ], - "node_module_version": 108, + "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_brotli": "false", @@ -368,31 +377,32 @@ "node_tag": "", "node_target_type": "executable", "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_with_ltcg": "false", "node_without_node_options": "false", + "node_write_snapshot_as_array_literals": "false", "openssl_is_fips": "false", "openssl_quic": "true", "ossfuzz": "false", - "shlib_suffix": "so.108", + "shlib_suffix": "115.dylib", "single_executable_application": "true", - "target_arch": "x64", + "target_arch": "arm64", "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_shared_ro_heap": 1, - "v8_enable_short_builtin_calls": 1, + "v8_enable_v8_checks": 0, "v8_enable_webassembly": 1, "v8_no_strict_aliasing": 1, "v8_optimized_debug": 1, @@ -401,10 +411,28 @@ "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", + "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\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\MSBuild.exe", - "configfile": "configure.gypi" + "fallback_to_build": "true", + "build_from_source": "true", + "module": "/Users/karansingh/SageTeamY/lib/binding/your_module.node", + "module_name": "your_module", + "module_path": "/Users/karansingh/SageTeamY/lib/binding", + "napi_version": "9", + "node_abi_napi": "napi", + "node_napi_label": "node-v115", + "global_prefix": "/usr/local", + "local_prefix": "/Users/karansingh/SageTeamY", + "globalconfig": "/usr/local/etc/npmrc", + "engine_strict": "true", + "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( + " Date: Mon, 28 Apr 2025 15:47:05 -0400 Subject: [PATCH 287/317] Mostly finished input dm implementation --- src/commands/jobs/histogram.ts | 17 ++- src/commands/jobs/jobform.ts | 146 ++++++++++++++++---------- src/lib/utils/jobUtils/jobDatabase.ts | 39 +++---- src/pieces/commandManager.ts | 2 +- src/pieces/tasks.ts | 6 +- 5 files changed, 121 insertions(+), 89 deletions(-) diff --git a/src/commands/jobs/histogram.ts b/src/commands/jobs/histogram.ts index 6afe72d4..435ca6f4 100644 --- a/src/commands/jobs/histogram.ts +++ b/src/commands/jobs/histogram.ts @@ -1,7 +1,7 @@ import { APP_ID, APP_KEY } from '@root/config'; import { Command } from '@root/src/lib/types/Command'; import axios from 'axios'; -import { ChatInputCommandInteraction, InteractionResponse } from 'discord.js'; +import { Application, ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, InteractionResponse } from 'discord.js'; import { ChartJSNodeCanvas } from 'chartjs-node-canvas'; import fs from 'fs'; import { ChartConfiguration } from 'chart.js'; @@ -10,15 +10,22 @@ 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: 'job', + description: 'Input the job title you want salary data for', + type: ApplicationCommandOptionType.String, + required: true + } + ]; async run(interaction: ChatInputCommandInteraction): Promise> { await interaction.deferReply(); // Defer the reply first - const jobTitle = 'Accountant'; // Example job title - - const test = encodeURIComponent(jobTitle); // Encode the job title for the URL + const jobTitle = interaction.options.getString('job'); + const encodedJobTitle = encodeURIComponent(jobTitle); // Encode the job title for the URL - const URL_BASE = `https://api.adzuna.com/v1/api/jobs/us/histogram?app_id=${APP_ID}&app_key=${APP_KEY}&what=${test}`; + const URL_BASE = `https://api.adzuna.com/v1/api/jobs/us/histogram?app_id=${APP_ID}&app_key=${APP_KEY}&what=${encodedJobTitle}`; const response = await axios.get(URL_BASE); const data = Object.entries(response.data.histogram).map(([value, frequency]: [string, number]) => ({ diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index aab47985..976f8fe3 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -4,13 +4,16 @@ import { ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, + DMChannel, InteractionResponse, + MessageFlags, ModalBuilder, ModalSubmitFields, TextInputBuilder, TextInputStyle } from 'discord.js'; import { validatePreferences } from '../../lib/utils/jobUtils/validatePreferences'; +import { JobPreferenceAPI } from '@root/src/lib/utils/jobUtils/jobDatabase'; // prettier-ignore // Questions users will be asked to input into the API @@ -28,75 +31,102 @@ const questions = [ export default class extends Command { name = 'jobform'; - description = 'Form to get your preferences for jobs to be used with the Job Alert System!'; + description = 'Starts a job preferences form via direct message.'; // Gives option to command to choose what question set user is answering. - options: ApplicationCommandOptionData[] = [ - { - name: 'qset', - description: 'Which question set do you want to view (1 or 2).', - type: ApplicationCommandOptionType.Number, - required: true, - choices: [ - { name: 'qset 1', value: 1 }, - { name: 'qset 2', value: 2 } - ] - } - ]; + options: ApplicationCommandOptionData[] = []; 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; - } + const dm = await interaction.user.createDM(); + await interaction.reply({ + content: 'I’ve sent you a DM with the job form questions.', + flags: MessageFlags.Ephemeral + }); + this.collectAnswers(dm, interaction.user.id, interaction); + } - // 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)`); + private async collectAnswers(channel: DMChannel, userId: string, interaction: ChatInputCommandInteraction): Promise { + const answers: string[] = []; + const splitAnswers: string[] = []; + let current = 0; - const askedQuestions = questions[questionSet]; - const rows = askedQuestions.map((question) => - this.getAnswerField(question, askedQuestions.indexOf(question)) + await channel.send( + 'Welcome to the job form!\n' + + 'Type **skip** to skip a question, **back** to return to the previous one.' ); - for (const row of rows) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - modal.addComponents(row); - } + const ask = () => { + channel.send(`**Question ${current + 1}/${questions.length}:** ${questions[current]}`); + }; - await interaction.showModal(modal); - return; - } + const collector = channel.createMessageCollector({ + filter: (m) => m.author.id === userId, + time: 5 * 60 * 1000 // 5 minutes + }); - 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) - ] }); - } - // Handles validation for qset1 - 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; - } - await interaction.reply({ - content: 'Form submitted successfully!', - ephemeral: true + collector.on('collect', async msg => { + const content = msg.content.trim(); + + if (content.toLowerCase() === 'skip') { + answers[current] = ''; + } else if (content.toLowerCase() === 'back') { + if (current > 0) current--; + return ask(); + } else { + answers[current] = content; + // Validate formatting immediately + for (let i = 0; i < questions.length; i++) { + if (answers[i]) { + const newAnswers = answers[i].split(',').map((a) => a.trim()); + splitAnswers.push(...newAnswers); + } + + + const { isValid, errors } = validatePreferences(splitAnswers, 0, true); + if (!isValid) { + // Show errors and re-ask same question + await channel.send(`**Formatting error:**\n${errors.join('\n')}`); + answers[current] = ''; + return ask(); + } + } + } + + // Move on or finish + if (current < questions.length - 1) { + current++; + ask(); + } else { + collector.stop('completed'); + } + }); + + collector.on('end', async (_collected, reason) => { + if (reason !== 'completed') { + await channel.send('Form timed out. Please run `/jobform` again to restart.'); + return; + } + + // Final validation + const { isValid, errors } = validatePreferences(splitAnswers, 0, true); + if (!isValid) { + await channel.send(`Form validation failed:\n${errors.join('\n')}`); + return; + } + + // Persist into Mongo + const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); + const result = await jobPreferenceAPI.storeFormResponses(userId, answers); + + await channel.send( + `${`✅ Preferences saved! `}\n` + + `You can now use the /jobs command to find job listings based on your preferences.` + ); }); + + // Kick off the first question + ask(); } } + diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index 737a38be..126ad924 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -1,6 +1,7 @@ import { Collection, Db } from 'mongodb'; import { DB } from '@root/config'; import { validatePreferences } from './validatePreferences'; +import { titleCase } from '@root/src/pieces/tasks'; // Class to store the info of the preferences the user previously put in to match to jobs in the database. export class JobPreferenceAPI { @@ -12,7 +13,7 @@ export class JobPreferenceAPI { 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 }> { + async storeFormResponses(userID: string, answers: string[]): Promise<{ success: boolean; message: string }> { // If user id does not exist, then nothing will be stored. if (!userID?.trim()) { return { success: false, message: 'Invalid User ID' }; @@ -20,27 +21,21 @@ export class JobPreferenceAPI { try { const updateObject = {}; // Checks if the answer provided is accuate. - const { isValid, errors } = validatePreferences(answers, questionSet, true); - if (!isValid) { - console.error('Validation failed', errors); - return { success: false, message: 'Invalid preferences provided' }; - } - // Adds answers to questions. - if (questionSet === 0) { - 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) { - 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.answers.interest3'] = interest3; - if (interest4?.trim()) updateObject['jobPreferences.answers.interest4'] = interest4; - if (interest5?.trim()) updateObject['jobPreferences.answers.interest5'] = interest5; - } + + const [city, workType, employmentType, travelDistance] = answers[0].split(',').map((a) => titleCase(a.trim())); + const [interest1, interest2, interest3, interest4, interest5] = answers[1].split(',').map((a) => titleCase(a.trim())); + + if (city) { updateObject['jobPreferences.answers.city'] = city; } + if (workType) { updateObject['jobPreferences.answers.workType'] = workType; } + if (employmentType) { updateObject['jobPreferences.answers.employmentType'] = employmentType; } + if (travelDistance) { updateObject['jobPreferences.answers.travelDistance'] = travelDistance; } + if (interest1) { updateObject['jobPreferences.answers.interest1'] = interest1; } + if (interest2) { updateObject['jobPreferences.answers.interest2'] = interest2; } + if (interest3) { updateObject['jobPreferences.answers.interest3'] = interest3; } + if (interest4) { updateObject['jobPreferences.answers.interest4'] = interest4; } + if (interest5) { 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 { success: false, message: 'No valid answers provided' }; if (Object.keys(updateObject).length > 0) { diff --git a/src/pieces/commandManager.ts b/src/pieces/commandManager.ts index 04f4c9d4..d5c406e9 100644 --- a/src/pieces/commandManager.ts +++ b/src/pieces/commandManager.ts @@ -168,7 +168,7 @@ 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 success = await jobPreferenceAPI.storeFormResponses(interaction.user.id, answers); const isUpdate = customId.replace(/[0-9]/g, '') === 'updateModal'; const mess = isUpdate ? `Success: Your preferences have been updated! ${formNumber === 0 ? 'Please use /update_preferences qset:2 to complete your interests.' : ''}` diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 1ea88b79..6881ab73 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -148,7 +148,7 @@ async function queryCoordinates(location: string): Promise<{lat: number, lng: nu return coordinates; } -function titleCase(jobTitle:string): string { +export function titleCase(jobTitle:string): string { return jobTitle.toLowerCase().replace(/[()]/g, '').split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' '); } @@ -468,7 +468,7 @@ export async function generateJobPDF(jobForm: [JobData, Interest, JobResult[]]): // Draw the bullet points for location, salary, and apply link. const bulletPoints = [ - { label: 'Location', value: `${job.location}, ${job.distance} miles from ${jobForm[0].city} ` }, + { label: 'Location', value: `${job.location}, ${(job.distance >= 0) ? `${job.distance} miles from ${titleCase(jobForm[0].city)}` : ''} ` }, { label: 'Salary', value: formatSalaryforPDF(job) }, { label: 'Apply Here', value: job.link } ]; @@ -523,7 +523,7 @@ export async function generateJobPDF(jobForm: [JobData, Interest, JobResult[]]): }); if (point.label === 'Salary' && !noValues) { - currentPage.drawImage(imageBytes, { + currentPage.drawImage(imageBytes, { // Change space check so it doesn't go off the page x: currentPage.getWidth() / 2 - imageDims.width / 2, y: yPosition - imageDims.height - 10, width: imageDims.width, From bed73302cadcac51c3cc7deb600d2bf8e6adca74 Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 13:18:27 -0400 Subject: [PATCH 288/317] got rid of everything in the .vcxproj stuff --- build/sage.vcxproj | 146 ------------------------------------- build/sage.vcxproj.filters | 126 -------------------------------- 2 files changed, 272 deletions(-) diff --git a/build/sage.vcxproj b/build/sage.vcxproj index 8aed67d0..e69de29b 100644 --- a/build/sage.vcxproj +++ b/build/sage.vcxproj @@ -1,146 +0,0 @@ - - - - - Debug - x64 - - - Release - x64 - - - - {ABCF23AD-5F45-31AB-06B0-F71732B5BDE2} - 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\Naz\AppData\Local\node-gyp\Cache\20.12.2\include\node;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\src;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\config;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\openssl\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\uv\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\zlib;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\v8\include;%(AdditionalIncludeDirectories) - /Zc:__cplusplus -std:c++17 %(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;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\\Naz\\AppData\\Local\\node-gyp\\Cache\\20.12.2\\x64\\node.lib" - /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) - node.exe;%(DelayLoadDLLs) - true - true - true - $(OutDir)$(ProjectName).node - true - .node - MachineX64 - - - C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\include\node;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\src;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\config;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\openssl\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\uv\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\zlib;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\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;OPENSSL_NO_PINSHARED;OPENSSL_THREADS;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";DEBUG;_DEBUG;%(PreprocessorDefinitions);%(PreprocessorDefinitions) - - - - - C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\include\node;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\src;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\config;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\openssl\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\uv\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\zlib;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\v8\include;%(AdditionalIncludeDirectories) - /Zc:__cplusplus -std:c++17 %(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;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\\Naz\\AppData\\Local\\node-gyp\\Cache\\20.12.2\\x64\\node.lib" - /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) - node.exe;%(DelayLoadDLLs) - true - true - true - $(OutDir)$(ProjectName).node - true - .node - MachineX64 - - - C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\include\node;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\src;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\config;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\openssl\openssl\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\uv\include;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\deps\zlib;C:\Users\Naz\AppData\Local\node-gyp\Cache\20.12.2\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;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 index ad0a6a32..e69de29b 100644 --- a/build/sage.vcxproj.filters +++ b/build/sage.vcxproj.filters @@ -1,126 +0,0 @@ - - - - - {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} - - - {8CDEE807-BC53-E450-C8B8-4DEBB66742D4} - - - {7B735499-E5DD-1C2B-6C26-70023832A1CF} - - - {E9F714C1-DA89-54E2-60CF-39FEB20BF756} - - - {68B4D816-2CE9-2FCC-DC15-716D2A403068} - - - {F852EB63-437C-846A-220F-8D9ED6DAEC1D} - - - {D51E5808-912B-5C70-4BB7-475D1DBFA067} - - - {741E0E76-39B2-B1AB-9FA1-F1A20B16F295} - - - {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\Naz\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\src - - - .. - - - - - - - - - {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 - - - .. - - - From 7689cf9f7cd07109ba6370686ded7b2c23dc9090 Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 13:24:26 -0400 Subject: [PATCH 289/317] added build folder into .gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 23593b77..d072299c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,11 @@ resources/* !resources/.exists src/commands/admin/eval.ts - +build config.ts + + # macOS stuff .DS_Store From 48dfb505238872f81e62335ae32cfb657025cbfc Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 13:40:32 -0400 Subject: [PATCH 290/317] there was merge issues in package-locke, fixed now --- package-lock.json | 412 ---------------------------------------------- 1 file changed, 412 deletions(-) diff --git a/package-lock.json b/package-lock.json index 885c2216..5ff58692 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,11 +11,7 @@ "license": "MIT", "dependencies": { "@discordjs/node-pre-gyp": "0.4.5", -<<<<<<< HEAD - "@octokit/rest": "^18.3.5", -======= "@octokit/rest": "^21.1.1", ->>>>>>> Job-Output-Imbed "axios": "^1.4.0", "canvas": "^3.1.0", "console-stamp": "^3.0.2", @@ -23,12 +19,8 @@ "html-pdf-node": "^1.0.7", "module-alias": "^2.2.2", "moment": "^2.29.1", -<<<<<<< HEAD - "mongodb": "^3.6.3", -======= "mongodb": "^3.7.4", "node": "^23.9.0", ->>>>>>> Job-Output-Imbed "node-cron": "^2.0.3", "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", @@ -58,43 +50,22 @@ "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", -<<<<<<< HEAD - "dev": true, - "license": "MIT", -======= ->>>>>>> Job-Output-Imbed "dependencies": { "@babel/highlight": "^7.10.4" } }, "node_modules/@babel/helper-validator-identifier": { -<<<<<<< HEAD - "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", -======= "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==", ->>>>>>> Job-Output-Imbed "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { -<<<<<<< HEAD - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "dev": true, - "license": "MIT", -======= "version": "7.17.12", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", ->>>>>>> Job-Output-Imbed "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -109,11 +80,6 @@ "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==", -<<<<<<< HEAD - "dev": true, - "license": "MIT", -======= ->>>>>>> Job-Output-Imbed "dependencies": { "color-convert": "^1.9.0" }, @@ -125,11 +91,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", -<<<<<<< HEAD - "dev": true, - "license": "MIT", -======= ->>>>>>> Job-Output-Imbed "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -143,11 +104,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", -<<<<<<< HEAD - "dev": true, - "license": "MIT", -======= ->>>>>>> Job-Output-Imbed "dependencies": { "color-name": "1.1.3" } @@ -155,23 +111,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", -<<<<<<< HEAD - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" -======= "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" ->>>>>>> Job-Output-Imbed }, "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==", -<<<<<<< HEAD - "dev": true, - "license": "MIT", -======= ->>>>>>> Job-Output-Imbed "engines": { "node": ">=0.8.0" } @@ -180,11 +125,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", -<<<<<<< HEAD - "dev": true, - "license": "MIT", -======= ->>>>>>> Job-Output-Imbed "engines": { "node": ">=4" } @@ -193,11 +133,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", -<<<<<<< HEAD - "dev": true, - "license": "MIT", -======= ->>>>>>> Job-Output-Imbed "dependencies": { "has-flag": "^3.0.0" }, @@ -403,13 +338,7 @@ "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==", -<<<<<<< HEAD - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" -======= "dev": true ->>>>>>> Job-Output-Imbed }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -450,20 +379,6 @@ } }, "node_modules/@octokit/auth-token": { -<<<<<<< HEAD - "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" - } - }, - "node_modules/@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", -======= "version": "5.1.2", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", @@ -476,7 +391,6 @@ "version": "6.1.4", "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.4.tgz", "integrity": "sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg==", ->>>>>>> Job-Output-Imbed "license": "MIT", "dependencies": { "@octokit/auth-token": "^5.0.0", @@ -492,15 +406,9 @@ } }, "node_modules/@octokit/endpoint": { -<<<<<<< HEAD - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", -======= "version": "10.1.3", "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.3.tgz", "integrity": "sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==", ->>>>>>> Job-Output-Imbed "license": "MIT", "dependencies": { "@octokit/types": "^13.6.2", @@ -511,15 +419,9 @@ } }, "node_modules/@octokit/graphql": { -<<<<<<< HEAD - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", -======= "version": "8.2.1", "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.1.tgz", "integrity": "sha512-n57hXtOoHrhwTWdvhVkdJHdhTv0JstjDbDRhJfwIRNfFqmSo1DaK/mD2syoNUoLCyqSjBpGAKOG0BuwF392slw==", ->>>>>>> Job-Output-Imbed "license": "MIT", "dependencies": { "@octokit/request": "^9.2.2", @@ -531,20 +433,6 @@ } }, "node_modules/@octokit/openapi-types": { -<<<<<<< HEAD - "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.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" -======= "version": "23.0.1", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz", "integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==", @@ -560,19 +448,12 @@ }, "engines": { "node": ">= 18" ->>>>>>> Job-Output-Imbed }, "peerDependencies": { "@octokit/core": ">=6" } }, "node_modules/@octokit/plugin-request-log": { -<<<<<<< HEAD - "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", -======= "version": "5.3.1", "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", @@ -580,21 +461,11 @@ "engines": { "node": ">= 18" }, ->>>>>>> Job-Output-Imbed "peerDependencies": { "@octokit/core": ">=6" } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { -<<<<<<< HEAD - "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" -======= "version": "13.3.1", "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.1.tgz", "integrity": "sha512-o8uOBdsyR+WR8MK9Cco8dCgvG13H1RlM1nWnK/W7TEACQBFux/vPREgKucxUfuDQ5yi1T3hGf4C5ZmZXAERgwQ==", @@ -604,22 +475,15 @@ }, "engines": { "node": ">= 18" ->>>>>>> Job-Output-Imbed }, "peerDependencies": { "@octokit/core": ">=6" } }, "node_modules/@octokit/request": { -<<<<<<< HEAD - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", -======= "version": "9.2.2", "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.2.tgz", "integrity": "sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==", ->>>>>>> Job-Output-Imbed "license": "MIT", "dependencies": { "@octokit/endpoint": "^10.1.3", @@ -633,15 +497,9 @@ } }, "node_modules/@octokit/request-error": { -<<<<<<< HEAD - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", -======= "version": "6.1.7", "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.7.tgz", "integrity": "sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==", ->>>>>>> Job-Output-Imbed "license": "MIT", "dependencies": { "@octokit/types": "^13.6.2" @@ -651,15 +509,9 @@ } }, "node_modules/@octokit/rest": { -<<<<<<< HEAD - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", -======= "version": "21.1.1", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", ->>>>>>> Job-Output-Imbed "license": "MIT", "dependencies": { "@octokit/core": "^6.1.4", @@ -672,14 +524,6 @@ } }, "node_modules/@octokit/types": { -<<<<<<< HEAD - "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" -======= "version": "13.8.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz", "integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==", @@ -773,7 +617,6 @@ "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" ->>>>>>> Job-Output-Imbed } }, "node_modules/@sapphire/async-queue": { @@ -1363,8 +1206,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", -<<<<<<< HEAD -======= "funding": [ { "type": "github", @@ -1448,7 +1289,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", ->>>>>>> Job-Output-Imbed "funding": [ { "type": "github", @@ -1537,19 +1377,6 @@ "ieee754": "^1.1.13" } }, -<<<<<<< HEAD - "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/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -1557,18 +1384,12 @@ "license": "MIT", "engines": { "node": "*" ->>>>>>> Job-Output-Imbed } }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", -<<<<<<< HEAD - "dev": true, - "license": "MIT", -======= ->>>>>>> Job-Output-Imbed "engines": { "node": ">=6" } @@ -1872,15 +1693,6 @@ "node": ">=0.10" } }, -<<<<<<< HEAD - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "license": "ISC" - }, -======= ->>>>>>> Job-Output-Imbed "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", @@ -2013,51 +1825,6 @@ "node": ">=8.6" } }, -<<<<<<< HEAD - "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/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -2083,7 +1850,6 @@ "license": "MIT", "engines": { "node": ">=6" ->>>>>>> Job-Output-Imbed } }, "node_modules/escape-string-regexp": { @@ -2296,11 +2062,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", -<<<<<<< HEAD - "dev": true, - "license": "BSD-2-Clause", -======= ->>>>>>> Job-Output-Imbed "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -2369,11 +2130,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", -<<<<<<< HEAD - "dev": true, - "license": "BSD-2-Clause", -======= ->>>>>>> Job-Output-Imbed "engines": { "node": ">=0.10.0" } @@ -2403,8 +2159,6 @@ "node": ">=6" } }, -<<<<<<< HEAD -======= "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -2441,7 +2195,6 @@ ], "license": "MIT" }, ->>>>>>> Job-Output-Imbed "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2703,43 +2456,6 @@ "node": ">=10" } }, -<<<<<<< HEAD - "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/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2776,7 +2492,6 @@ }, "engines": { "node": ">= 14" ->>>>>>> Job-Output-Imbed } }, "node_modules/github-from-package": { @@ -2856,18 +2571,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, -<<<<<<< HEAD - "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/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -2887,7 +2590,6 @@ }, "optionalDependencies": { "uglify-js": "^3.1.4" ->>>>>>> Job-Output-Imbed } }, "node_modules/has-flag": { @@ -3095,17 +2797,9 @@ } }, "node_modules/import-fresh": { -<<<<<<< HEAD - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", -======= "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", ->>>>>>> Job-Output-Imbed "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3223,18 +2917,6 @@ "node": ">=0.12.0" } }, -<<<<<<< HEAD - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, -======= ->>>>>>> Job-Output-Imbed "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -3251,13 +2933,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", -<<<<<<< HEAD - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" -======= "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" ->>>>>>> Job-Output-Imbed }, "node_modules/js-yaml": { "version": "3.14.1", @@ -3273,13 +2949,6 @@ "js-yaml": "bin/js-yaml.js" } }, -<<<<<<< HEAD - "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, -======= "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", @@ -3290,7 +2959,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", ->>>>>>> Job-Output-Imbed "license": "MIT" }, "node_modules/json-schema-traverse": { @@ -3372,10 +3040,6 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", -<<<<<<< HEAD - "dev": true, - "license": "MIT" -======= "dev": true }, "node_modules/lru-cache": { @@ -3386,7 +3050,6 @@ "engines": { "node": ">=12" } ->>>>>>> Job-Output-Imbed }, "node_modules/magic-bytes.js": { "version": "1.10.0", @@ -3540,25 +3203,11 @@ "node": ">= 8" } }, -<<<<<<< HEAD - "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/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "license": "MIT" ->>>>>>> Job-Output-Imbed }, "node_modules/mkdirp": { "version": "1.0.4", @@ -3959,11 +3608,6 @@ "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==", -<<<<<<< HEAD - "dev": true, - "license": "MIT", -======= ->>>>>>> Job-Output-Imbed "dependencies": { "callsites": "^3.0.0" }, @@ -3972,12 +3616,6 @@ } }, "node_modules/parse-duration": { -<<<<<<< HEAD - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.4.4.tgz", - "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==", - "license": "MIT" -======= "version": "2.1.3", "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.3.tgz", "integrity": "sha512-MtbharL7Bets65qDBXuDOHHWyY1BxTJZmJ/xGmS90iEbKE0gZ6yZpZtCda7O79GeOi/f0NwBaplIuReExIoVsw==", @@ -4000,7 +3638,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } ->>>>>>> Job-Output-Imbed }, "node_modules/parse-ms": { "version": "2.1.0", @@ -4062,14 +3699,6 @@ "through": "~2.3" } }, -<<<<<<< HEAD - "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/pdf-lib": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", @@ -4093,7 +3722,6 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" ->>>>>>> Job-Output-Imbed }, "node_modules/picomatch": { "version": "2.3.1", @@ -4108,8 +3736,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, -<<<<<<< HEAD -======= "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -4122,7 +3748,6 @@ "node": ">=8" } }, ->>>>>>> Job-Output-Imbed "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -4184,11 +3809,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", -<<<<<<< HEAD - "dev": true, - "license": "MIT", -======= ->>>>>>> Job-Output-Imbed "engines": { "node": ">=0.4.0" } @@ -4472,11 +4092,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", -<<<<<<< HEAD - "dev": true, - "license": "MIT", -======= ->>>>>>> Job-Output-Imbed "engines": { "node": ">=4" } @@ -4985,8 +4600,6 @@ }, "engines": { "node": ">= 6" -<<<<<<< HEAD -======= } }, "node_modules/tar/node_modules/minipass": { @@ -5005,7 +4618,6 @@ "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.4" ->>>>>>> Job-Output-Imbed } }, "node_modules/text-table": { @@ -5018,13 +4630,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", -<<<<<<< HEAD - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" -======= "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" ->>>>>>> Job-Output-Imbed }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -5160,17 +4766,10 @@ "license": "MIT" }, "node_modules/typescript": { -<<<<<<< HEAD - "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, -======= "version": "5.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", "devOptional": true, ->>>>>>> Job-Output-Imbed "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -5219,15 +4818,9 @@ } }, "node_modules/universal-user-agent": { -<<<<<<< HEAD - "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==", -======= "version": "7.0.2", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", ->>>>>>> Job-Output-Imbed "license": "ISC" }, "node_modules/uri-js": { @@ -5366,10 +4959,6 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", -<<<<<<< HEAD - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" -======= "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { @@ -5417,7 +5006,6 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } ->>>>>>> Job-Output-Imbed } } } From efab6dcd31887a2ef5a11ce02ee0dc87f5701bb5 Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 13:47:54 -0400 Subject: [PATCH 291/317] fixed ?? --- build/binding.sln | 10 +- build/config.gypi | 94 ++++++++---- build/sage.vcxproj | 146 ++++++++++++++++++ build/sage.vcxproj.filters | 58 ++++++++ package-lock.json | 294 +++++++++++++++++-------------------- 5 files changed, 412 insertions(+), 190 deletions(-) diff --git a/build/binding.sln b/build/binding.sln index 90860c61..faa27849 100644 --- a/build/binding.sln +++ b/build/binding.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2015 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sage", "sage.vcxproj", "{ABCF23AD-5F45-31AB-06B0-F71732B5BDE2}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sage", "sage.vcxproj", "{27A859CD-4D6B-679F-943D-8D47ADCCBA5E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -8,10 +8,10 @@ Global Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {ABCF23AD-5F45-31AB-06B0-F71732B5BDE2}.Debug|x64.ActiveCfg = Debug|x64 - {ABCF23AD-5F45-31AB-06B0-F71732B5BDE2}.Debug|x64.Build.0 = Debug|x64 - {ABCF23AD-5F45-31AB-06B0-F71732B5BDE2}.Release|x64.ActiveCfg = Release|x64 - {ABCF23AD-5F45-31AB-06B0-F71732B5BDE2}.Release|x64.Build.0 = Release|x64 + {27A859CD-4D6B-679F-943D-8D47ADCCBA5E}.Debug|x64.ActiveCfg = Debug|x64 + {27A859CD-4D6B-679F-943D-8D47ADCCBA5E}.Debug|x64.Build.0 = Debug|x64 + {27A859CD-4D6B-679F-943D-8D47ADCCBA5E}.Release|x64.ActiveCfg = Release|x64 + {27A859CD-4D6B-679F-943D-8D47ADCCBA5E}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/build/config.gypi b/build/config.gypi index 125c60df..9868362f 100644 --- a/build/config.gypi +++ b/build/config.gypi @@ -32,13 +32,12 @@ "error_on_warn": "false", "force_dynamic_crt": 0, "host_arch": "x64", - "icu_data_in": "..\\..\\deps\\icu-tmp\\icudt74l.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": "74", - "is_debug": 0, + "icu_ver_major": "76", "libdir": "lib", "llvm_version": "0.0", "napi_build_version": "0", @@ -50,6 +49,38 @@ "deps/amaro/dist/index.js" ], "node_byteorder": "little", + "node_cctest_sources": [ + "src/node_snapshot_stub.cc", + "test/cctest/inspector/test_node_protocol.cc", + "test/cctest/node_test_fixture.cc", + "test/cctest/test_aliased_buffer.cc", + "test/cctest/test_base64.cc", + "test/cctest/test_base_object_ptr.cc", + "test/cctest/test_cppgc.cc", + "test/cctest/test_crypto_clienthello.cc", + "test/cctest/test_dataqueue.cc", + "test/cctest/test_environment.cc", + "test/cctest/test_inspector_socket.cc", + "test/cctest/test_inspector_socket_server.cc", + "test/cctest/test_json_utils.cc", + "test/cctest/test_linked_binding.cc", + "test/cctest/test_node_api.cc", + "test/cctest/test_node_crypto.cc", + "test/cctest/test_node_crypto_env.cc", + "test/cctest/test_node_postmortem_metadata.cc", + "test/cctest/test_node_task_runner.cc", + "test/cctest/test_path.cc", + "test/cctest/test_per_process.cc", + "test/cctest/test_platform.cc", + "test/cctest/test_quic_cid.cc", + "test/cctest/test_quic_error.cc", + "test/cctest/test_quic_tokens.cc", + "test/cctest/test_report.cc", + "test/cctest/test_sockaddr.cc", + "test/cctest/test_traced_value.cc", + "test/cctest/test_util.cc", + "test/cctest/node_test_fixture.h" + ], "node_debug_lib": "false", "node_enable_d8": "false", "node_enable_v8_vtunejit": "false", @@ -160,6 +191,7 @@ "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", @@ -206,12 +238,11 @@ "lib/internal/main/worker_thread.js", "lib/internal/mime.js", "lib/internal/modules/cjs/loader.js", + "lib/internal/modules/customization_hooks.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", @@ -226,6 +257,7 @@ "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", @@ -247,7 +279,6 @@ "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", @@ -300,6 +331,7 @@ "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", @@ -324,7 +356,6 @@ "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/parse_args/parse_args.js", @@ -364,10 +395,12 @@ "lib/process.js", "lib/punycode.js", "lib/querystring.js", + "lib/quic.js", "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,9 +423,10 @@ "lib/worker_threads.js", "lib/zlib.js" ], - "node_module_version": 115, + "node_module_version": 131, "node_no_browser_globals": "false", "node_prefix": "\\usr\\local", + "node_quic": "false", "node_release_urlbase": "https://nodejs.org/download/release/", "node_shared": "false", "node_shared_ada": "false", @@ -409,6 +443,7 @@ "node_shared_sqlite": "false", "node_shared_uvwasi": "false", "node_shared_zlib": "false", + "node_shared_zstd": "false", "node_tag": "", "node_target_type": "executable", "node_use_amaro": "true", @@ -421,11 +456,14 @@ "node_without_node_options": "false", "node_write_snapshot_as_array_literals": "true", "openssl_is_fips": "false", - "openssl_quic": "true", + "openssl_quic": "false", "ossfuzz": "false", - "shlib_suffix": "so.115", + "shlib_suffix": "so.131", "single_executable_application": "true", + "suppress_all_error_on_warn": "false", "target_arch": "x64", + "ubsan": 0, + "use_ccache_win": 0, "use_prefix_to_find_headers": "false", "v8_enable_31bit_smis_on_64bit_arch": 0, "v8_enable_extensible_ro_snapshot": 0, @@ -435,13 +473,13 @@ "v8_enable_inspector": 1, "v8_enable_javascript_promise_hooks": 1, "v8_enable_lite_mode": 0, - "v8_enable_maglev": 0, + "v8_enable_maglev": 1, "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_v8_checks": 0, + "v8_enable_wasm_simd256_revec": 1, "v8_enable_webassembly": 1, "v8_optimized_debug": 1, "v8_promise_internal_field_count": 1, @@ -449,28 +487,28 @@ "v8_trace_maps": 0, "v8_use_siphash": 1, "want_separate_host_toolset": 0, - "nodedir": "C:\\Users\\Naz\\AppData\\Local\\node-gyp\\Cache\\20.12.2", + "nodedir": "C:\\Users\\selin\\AppData\\Local\\node-gyp\\Cache\\23.9.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", + "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\\Naz\\OneDrive\\Desktop\\Junior Year 24-25\\CISC375\\Sage\\SageTeamY\\lib\\binding\\your_module.node", + "module": "C:\\Users\\selin\\Desktop\\cisc classes\\cisc367\\SageTeamY\\lib\\binding\\your_module.node", "module_name": "your_module", - "module_path": "C:\\Users\\Naz\\OneDrive\\Desktop\\Junior Year 24-25\\CISC375\\Sage\\SageTeamY\\lib\\binding", - "napi_version": "9", + "module_path": "C:\\Users\\selin\\Desktop\\cisc classes\\cisc367\\SageTeamY\\lib\\binding", + "napi_version": "10", "node_abi_napi": "napi", - "node_napi_label": "node-v115", - "cache": "C:\\Users\\Naz\\AppData\\Local\\npm-cache", + "node_napi_label": "node-v131", + "cache": "C:\\Users\\selin\\AppData\\Local\\npm-cache", "engine_strict": "true", - "globalconfig": "C:\\Users\\Naz\\AppData\\Roaming\\npm\\etc\\npmrc", - "global_prefix": "C:\\Users\\Naz\\AppData\\Roaming\\npm", - "init_module": "C:\\Users\\Naz\\.npm-init.js", - "local_prefix": "C:\\Users\\Naz\\OneDrive\\Desktop\\Junior Year 24-25\\CISC375\\Sage\\SageTeamY", - "node_gyp": "C:\\Users\\Naz\\AppData\\Roaming\\npm\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js", - "npm_version": "10.8.2", - "prefix": "C:\\Users\\Naz\\AppData\\Roaming\\npm", - "userconfig": "C:\\Users\\Naz\\.npmrc", - "user_agent": "npm/10.8.2 node/v20.12.2 win32 x64 workspaces/false" + "globalconfig": "C:\\Users\\selin\\AppData\\Roaming\\npm\\etc\\npmrc", + "global_prefix": "C:\\Users\\selin\\AppData\\Roaming\\npm", + "init_module": "C:\\Users\\selin\\.npm-init.js", + "local_prefix": "C:\\Users\\selin\\Desktop\\cisc classes\\cisc367\\SageTeamY", + "node_gyp": "C:\\Users\\selin\\AppData\\Roaming\\npm\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js", + "npm_version": "11.1.0", + "prefix": "C:\\Users\\selin\\AppData\\Roaming\\npm", + "userconfig": "C:\\Users\\selin\\.npmrc", + "user_agent": "npm/11.1.0 node/v22.14.0 win32 x64 workspaces/false" } } diff --git a/build/sage.vcxproj b/build/sage.vcxproj index e69de29b..2fdfdfcc 100644 --- a/build/sage.vcxproj +++ b/build/sage.vcxproj @@ -0,0 +1,146 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {27A859CD-4D6B-679F-943D-8D47ADCCBA5E} + 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\selin\AppData\Local\node-gyp\Cache\23.9.0\include\node;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\src;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\config;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\openssl\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\uv\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\zlib;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.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\\selin\\AppData\\Local\\node-gyp\\Cache\\23.9.0\\x64\\node.lib" + /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) + node.exe;%(DelayLoadDLLs) + true + true + true + $(OutDir)$(ProjectName).node + true + .node + MachineX64 + + + C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\include\node;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\src;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\config;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\openssl\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\uv\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\zlib;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.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\selin\AppData\Local\node-gyp\Cache\23.9.0\include\node;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\src;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\config;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\openssl\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\uv\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\zlib;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.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\\selin\\AppData\\Local\\node-gyp\\Cache\\23.9.0\\x64\\node.lib" + /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) + node.exe;%(DelayLoadDLLs) + true + true + true + $(OutDir)$(ProjectName).node + true + .node + MachineX64 + + + C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\include\node;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\src;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\config;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\openssl\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\uv\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\zlib;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.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 index e69de29b..25be227f 100644 --- a/build/sage.vcxproj.filters +++ b/build/sage.vcxproj.filters @@ -0,0 +1,58 @@ + + + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8CDEE807-BC53-E450-C8B8-4DEBB66742D4} + + + {7B735499-E5DD-1C2B-6C26-70023832A1CF} + + + {E9F714C1-DA89-54E2-60CF-39FEB20BF756} + + + {45B03FE7-4348-5CE5-27CA-49253FE45921} + + + {F852EB63-437C-846A-220F-8D9ED6DAEC1D} + + + {D51E5808-912B-5C70-4BB7-475D1DBFA067} + + + {741E0E76-39B2-B1AB-9FA1-F1A20B16F295} + + + {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\selin\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\src + + + .. + + + diff --git a/package-lock.json b/package-lock.json index 5ff58692..01334b14 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,9 +55,10 @@ } }, "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==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1240,6 +1241,7 @@ "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" @@ -1251,76 +1253,6 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "license": "MIT" }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "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" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "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" - }, - "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" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1386,6 +1318,19 @@ "node": "*" } }, + "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", @@ -1802,15 +1747,6 @@ "once": "^1.4.0" } }, - "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.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", @@ -1843,6 +1779,51 @@ "is-arrayish": "^0.2.1" } }, + "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/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2383,12 +2364,6 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "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", @@ -2465,6 +2440,43 @@ "node": "6.* || 8.* || >= 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/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -2571,6 +2583,18 @@ "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/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -2844,12 +2868,6 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "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/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -2955,6 +2973,13 @@ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "license": "MIT" }, + "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-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -3181,15 +3206,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -3203,6 +3219,18 @@ "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/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -3300,24 +3328,6 @@ "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/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -3723,6 +3733,12 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -4002,30 +4018,6 @@ "node": ">=0.10.0" } }, - "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.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -4721,18 +4713,6 @@ "node": "*" } }, - "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", From f5f17460144362414363ffc45f9316a8b5d60f94 Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 14:10:57 -0400 Subject: [PATCH 292/317] trying to fix eslint issues --- src/commands/jobs/jobs.ts | 382 +++++++++++++++++++------------------- src/pieces/tasks.ts | 2 +- 2 files changed, 189 insertions(+), 195 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index ffaf653b..13427797 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -8,64 +8,62 @@ import { ButtonStyle, ComponentType, InteractionResponse, - AttachmentBuilder, -} 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"; -import { DB, BOT, MAP_KEY } from "@root/config"; -import { MongoClient } from "mongodb"; -import { sendToFile } from "@root/src/lib/utils/generalUtils"; -import axios from "axios"; -import { JobPreferences } from "@root/src/lib/types/JobPreferences"; -import { PDFDocument, PDFFont, StandardFonts, rgb } from "pdf-lib"; + AttachmentBuilder +} 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'; +import { DB, BOT, MAP_KEY } from '@root/config'; +import { MongoClient } from 'mongodb'; +import { sendToFile } from '@root/src/lib/utils/generalUtils'; +import axios from 'axios'; +import { JobPreferences } from '@root/src/lib/types/JobPreferences'; +import { PDFDocument, PDFFont, StandardFonts, rgb } from 'pdf-lib'; // Temporary storage for user job data const userJobData = new Map(); 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", + name: 'filter', + description: 'Filter options for job listings', type: ApplicationCommandOptionType.String, required: false, choices: [ - { name: "Date Posted: recent", value: "date" }, - { name: "Salary: high-low average", value: "salary" }, - { name: "Alphabetical: A-Z", value: "alphabetical" }, - { name: "Distance: shortest-longest", value: "distance" }, - ], - }, + { name: 'Date Posted: recent', value: 'date' }, + { name: 'Salary: high-low average', value: 'salary' }, + { name: 'Alphabetical: A-Z', value: 'alphabetical' }, + { name: 'Distance: shortest-longest', value: 'distance' } + ] + } ]; - //-------------------ADDED PDF GENERATATOR METHOD---------------------- + // -------------------ADDED PDF GENERATATOR METHOD---------------------- private async generateJobPDF(jobs: JobResult[]): Promise { // Create a new PDF document. const pdfDoc = await PDFDocument.create(); let currentPage = pdfDoc.addPage(); const { width, height } = currentPage.getSize(); const margin = 40; - let yPosition = height - margin- 50; + let yPosition = height - margin - 50; const fontSize = 10; const titleFontSize = 30; const bulletPointIndent = 20; const subBulletPointIndent = 30; // Indentation for sub-bullet points - // Embed a standard font. const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman); - const HelveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold ); - const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica ); - - + const HelveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold); + const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica); // Draw the title. @@ -74,50 +72,49 @@ export default class extends Command { currentPage.drawRectangle({ x: margin, - y: yPosition+50, + y: yPosition + 50, width: lineWidth, height: lineHeight, - color: rgb(135 / 255, 59 / 255, 29 / 255), // red color + color: rgb(135 / 255, 59 / 255, 29 / 255) // red color }); - + // Draw the second color segment currentPage.drawRectangle({ x: margin + lineWidth, - y: yPosition+50, + y: yPosition + 50, width: lineWidth, height: lineHeight, - color: rgb(237 / 255, 118 / 255, 71 / 255), // orangey color + color: rgb(237 / 255, 118 / 255, 71 / 255) // orangey color }); - + // Draw the third color segment currentPage.drawRectangle({ x: margin + lineWidth * 2, - y: yPosition+50, + y: yPosition + 50, width: lineWidth, height: lineHeight, - color: rgb(13/255, 158/255, 198/255), // Blue color + color: rgb(13 / 255, 158 / 255, 198 / 255) // Blue color }); - - yPosition -= 40; // Adjust spacing below the line + yPosition -= 40; // Adjust spacing below the line - currentPage.drawText("List of Jobs PDF", { + currentPage.drawText('List of Jobs PDF', { x: margin, - y: yPosition+50, + y: yPosition + 50, size: titleFontSize, font: HelveticaBold, - - color: rgb(114/255, 53/255, 9/255), + + color: rgb(114 / 255, 53 / 255, 9 / 255) }); yPosition -= 40; currentPage.drawRectangle({ x: margin, - y: yPosition+50, - width: lineWidth/2, - height: lineHeight-8, - color: rgb(135 / 255, 59 / 255, 29 / 255), // red color + y: yPosition + 50, + width: lineWidth / 2, + height: lineHeight - 8, + color: rgb(135 / 255, 59 / 255, 29 / 255) // red color }); yPosition -= 10; @@ -125,46 +122,45 @@ export default class extends Command { for (let i = 0; i < jobs.length; i++) { const job = jobs[i]; - if (yPosition - fontSize*2 < margin) { + if (yPosition - fontSize * 2 < margin) { currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin-20; + yPosition = currentPage.getHeight() - margin - 20; } - + const maxWidth = width - margin * 2; // Calculate available width const wrappedTitle = this.wrapText(`${i + 1}. ${job.title}`, HelveticaBold, fontSize + 10, maxWidth); - for (const line of wrappedTitle) { // Check if there's enough space for the line - if (yPosition - fontSize*2 < margin) { + if (yPosition - fontSize * 2 < margin) { currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin-20; + yPosition = currentPage.getHeight() - margin - 20; } currentPage.drawText(line, { x: margin, - y: yPosition+30, + y: yPosition + 30, size: fontSize + 10, font: HelveticaBold, - color: rgb(241 / 255, 113 / 255, 34 / 255), + color: rgb(241 / 255, 113 / 255, 34 / 255) }); yPosition -= 30; // Adjust spacing between lines } - + // Draw the bullet points for location, salary, and apply link. const bulletPoints = [ - { label: "Location", value: job.location }, - { label: "Salary", value: this.formatSalaryforPDF(job) }, - { label: "Apply Here", value: job.link }, + { label: 'Location', value: job.location }, + { label: 'Salary', value: this.formatSalaryforPDF(job) }, + { label: 'Apply Here', value: job.link } ]; - + for (const point of bulletPoints) { // Check if there's enough space on the page, and add a new page if needed. - if (yPosition - fontSize *2 < margin) { + if (yPosition - fontSize * 2 < margin) { currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin-20; + yPosition = currentPage.getHeight() - margin - 20; } const maxLabelWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; @@ -173,41 +169,41 @@ export default class extends Command { // Draw the wrapped label for (const line of wrappedLabel) { // Check if there's enough space for the line - if (yPosition - fontSize*2 < margin) { + if (yPosition - fontSize * 2 < margin) { currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin-20; + yPosition = currentPage.getHeight() - margin - 20; } currentPage.drawText(line, { x: margin + bulletPointIndent, - y: yPosition+25, + y: yPosition + 25, size: fontSize + 5, font: HelveticaBold, - color: rgb(94 / 255, 74 / 255, 74 / 255), + color: rgb(94 / 255, 74 / 255, 74 / 255) }); yPosition -= fontSize + 10; // Adjust spacing between lines } - + const combinedText = `•${point.value}`; const maxValueWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; - const wrappedValue = this.wrapText(combinedText, HelveticaBold, fontSize+4, maxValueWidth); + const wrappedValue = this.wrapText(combinedText, HelveticaBold, fontSize + 4, maxValueWidth); + - for (const line of wrappedValue) { // Check if there's enough space for the line - if (yPosition - fontSize*2 < margin) { + if (yPosition - fontSize * 2 < margin) { currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin-20; + yPosition = currentPage.getHeight() - margin - 20; } currentPage.drawText(line, { x: margin + bulletPointIndent + subBulletPointIndent, - y: yPosition+20, - size: fontSize+3, + y: yPosition + 20, + size: fontSize + 3, font: HelveticaBold, - color: rgb(13 / 255, 158 / 255, 198 / 255), + color: rgb(13 / 255, 158 / 255, 198 / 255) }); yPosition -= fontSize + 5; // Adjust spacing between lines @@ -217,11 +213,8 @@ export default class extends Command { } yPosition -= 40; // Add extra spacing between jobs. - - - } - + const pdfBytes = await pdfDoc.save(); return Buffer.from(pdfBytes); @@ -231,10 +224,10 @@ export default class extends Command { interaction: ChatInputCommandInteraction ): Promise> { const userID = interaction.user.id; - const filterBy = interaction.options.getString("filter") ?? "salary"; + const filterBy = interaction.options.getString('filter') ?? 'salary'; const client = await MongoClient.connect(DB.CONNECTION, { - useUnifiedTopology: true, + useUnifiedTopology: true }); const db = client.db(BOT.NAME).collection(DB.USERS); const jobformAnswers: JobPreferences | null = ( @@ -249,11 +242,11 @@ export default class extends Command { } const jobData: JobData = { - city: jobformAnswers.answers.city, - preference: jobformAnswers.answers.employmentType, - jobType: jobformAnswers.answers.workType, - distance: jobformAnswers.answers.travelDistance, - filterBy: filterBy, + city: jobformAnswers.answers.city, + preference: jobformAnswers.answers.employmentType, + jobType: jobformAnswers.answers.workType, + distance: jobformAnswers.answers.travelDistance, + filterBy: filterBy }; const interests: Interest = { @@ -261,7 +254,7 @@ export default class extends Command { interest2: jobformAnswers.answers.interest2, interest3: jobformAnswers.answers.interest3, interest4: jobformAnswers.answers.interest4, - interest5: jobformAnswers.answers.interest5, + interest5: jobformAnswers.answers.interest5 }; const APIResponse: JobResult[] = await fetchJobListings( @@ -270,7 +263,7 @@ export default class extends Command { ); if (APIResponse.length === 0) { - await interaction.reply("No jobs found based on your interests."); + await interaction.reply('No jobs found based on your interests.'); return; } @@ -288,14 +281,14 @@ export default class extends Command { // Listen for button interactions const collector = interaction.channel?.createMessageComponentCollector({ componentType: ComponentType.Button, - time: 60000, // 1 minute timeout + time: 60000 // 1 minute timeout }); - collector?.on("collect", async (i) => { + collector?.on('collect', async (i) => { if (i.user.id !== userID) { await i.reply({ - content: "This is not your interaction!", - ephemeral: true, + content: 'This is not your interaction!', + ephemeral: true }); return; } @@ -306,44 +299,44 @@ export default class extends Command { let { jobs, index } = userData; switch (i.customId) { - case "previous": + case 'previous': index = index > 0 ? index - 1 : jobs.length - 1; break; - case "next": + case 'next': index = index < jobs.length - 1 ? index + 1 : 0; break; - case "remove": + case 'remove': jobs.splice(index, 1); if (jobs.length === 0) { await i.update({ - content: "No more jobs to display.", + content: 'No more jobs to display.', embeds: [], - components: [], + components: [] }); userJobData.delete(userID); return; } index = index >= jobs.length ? 0 : index; break; - //----------------ADDED DOWNLOAD BUTTON-------------------- - case "download": + // ----------------ADDED DOWNLOAD BUTTON-------------------- + case 'download': await i.deferReply({ ephemeral: true }); try { // Generate the PDF from all stored jobs. const pdfBuffer = await this.generateJobPDF(jobs); const attachment = new AttachmentBuilder( pdfBuffer - ).setName("jobs.pdf"); + ).setName('jobs.pdf'); await i.editReply({ content: - "Here is your PDF file with all job listings:", - files: [attachment], + 'Here is your PDF file with all job listings:', + files: [attachment] }); } catch (error) { - console.error("Error generating PDF:", error); + console.error('Error generating PDF:', error); await i.editReply({ content: - "An error occurred while generating the PDF. Please try again later.", + 'An error occurred while generating the PDF. Please try again later.' }); } return; // Exit early so we don't update the embed. @@ -361,32 +354,32 @@ export default class extends Command { await i.update({ embeds: [embed], components: [row] }); }); - collector?.on("end", () => { + collector?.on('end', () => { userJobData.delete(userID); }); } wrapText(text: string, font: PDFFont, fontSize: number, maxWidth: number): string[] { - const words = text.split(" "); + const words = text.split(' '); const lines: string[] = []; - let currentLine = ""; - + let currentLine = ''; + for (const word of words) { const testLine = currentLine ? `${currentLine} ${word}` : word; const textWidth = font.widthOfTextAtSize(testLine, fontSize); - + if (textWidth <= maxWidth) { currentLine = testLine; } else { if (currentLine) { lines.push(currentLine); } - currentLine = ""; - + currentLine = ''; + // Handle long words that exceed maxWidth let remainingWord = word; while (font.widthOfTextAtSize(remainingWord, fontSize) > maxWidth) { - let splitIndex = Math.floor((maxWidth / font.widthOfTextAtSize(remainingWord, fontSize)) * remainingWord.length); + const splitIndex = Math.floor((maxWidth / font.widthOfTextAtSize(remainingWord, fontSize)) * remainingWord.length); const chunk = remainingWord.slice(0, splitIndex); lines.push(chunk); remainingWord = remainingWord.slice(splitIndex); @@ -394,11 +387,11 @@ export default class extends Command { currentLine = remainingWord; } } - + if (currentLine) { lines.push(currentLine); } - + return lines; } @@ -415,36 +408,36 @@ export default class extends Command { ).toDateString()}` ) .addFields( - { name: "Salary", value: this.formatSalary(job), inline: true }, + { name: 'Salary', value: this.formatSalary(job), inline: true }, { - name: "Apply Here", + name: 'Apply Here', value: `[Click here](${job.link})`, - inline: true, + inline: true } ) .setFooter({ text: `Job ${index + 1} of ${totalJobs}` }) - .setColor("#0099ff"); + .setColor('#0099ff'); const row = new ActionRowBuilder().addComponents( new ButtonBuilder() - .setCustomId("previous") - .setLabel("Previous") + .setCustomId('previous') + .setLabel('Previous') .setStyle(ButtonStyle.Primary) .setDisabled(totalJobs === 1), new ButtonBuilder() - .setCustomId("remove") - .setLabel("Remove") + .setCustomId('remove') + .setLabel('Remove') .setStyle(ButtonStyle.Danger) .setDisabled(totalJobs === 1), new ButtonBuilder() - .setCustomId("next") - .setLabel("Next") + .setCustomId('next') + .setLabel('Next') .setStyle(ButtonStyle.Primary) .setDisabled(totalJobs === 1), - //----------------ADDED DOWNLOAD BUTTON------------------- + // ----------------ADDED DOWNLOAD BUTTON------------------- new ButtonBuilder() - .setCustomId("download") - .setLabel("Download") + .setCustomId('download') + .setLabel('Download') .setStyle(ButtonStyle.Success) ); @@ -454,14 +447,14 @@ export default class extends Command { formatSalary(job: JobResult): string { const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; const formattedAvgSalary = this.formatCurrency(avgSalary); - const formattedSalaryMax = - this.formatCurrency(Number(job.salaryMax)) !== "N/A" + const formattedSalaryMax + = this.formatCurrency(Number(job.salaryMax)) !== 'N/A' ? this.formatCurrency(Number(job.salaryMax)) - : ""; - const formattedSalaryMin = - this.formatCurrency(Number(job.salaryMin)) !== "N/A" + : ''; + const formattedSalaryMin + = this.formatCurrency(Number(job.salaryMin)) !== 'N/A' ? this.formatCurrency(Number(job.salaryMin)) - : ""; + : ''; return formattedSalaryMin && formattedSalaryMax ? `Avg: ${formattedAvgSalary}\nMin: ${formattedSalaryMin}\nMax: ${formattedSalaryMax}` @@ -471,14 +464,14 @@ export default class extends Command { formatSalaryforPDF(job: JobResult): string { const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; const formattedAvgSalary = this.formatCurrency(avgSalary); - const formattedSalaryMax = - this.formatCurrency(Number(job.salaryMax)) !== "N/A" + const formattedSalaryMax + = this.formatCurrency(Number(job.salaryMax)) !== 'N/A' ? this.formatCurrency(Number(job.salaryMax)) - : ""; - const formattedSalaryMin = - this.formatCurrency(Number(job.salaryMin)) !== "N/A" + : ''; + const formattedSalaryMin + = this.formatCurrency(Number(job.salaryMin)) !== 'N/A' ? this.formatCurrency(Number(job.salaryMin)) - : ""; + : ''; return formattedSalaryMin && formattedSalaryMax ? `Avg: ${formattedAvgSalary}, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` @@ -491,7 +484,7 @@ export default class extends Command { ): Promise { const cityCoordinates = await this.queryCoordinates(jobForm[0].city); - if (filterBy === "salary") { + if (filterBy === 'salary') { jobForm[2].sort((a, b) => { const avgA = (Number(a.salaryMax) + Number(a.salaryMin)) / 2; const avgB = (Number(b.salaryMax) + Number(b.salaryMin)) / 2; @@ -501,15 +494,15 @@ export default class extends Command { return avgB - avgA; }); - } else if (filterBy === "alphabetical") { - jobForm[2].sort((a, b) => (a.title > b.title ? 1 : -1)); - } else if (filterBy === "date") { + } else if (filterBy === 'alphabetical') { + jobForm[2].sort((a, b) => a.title > b.title ? 1 : -1); + } else if (filterBy === 'date') { jobForm[2].sort( (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime() ); - } else if (filterBy === "distance") { + } else if (filterBy === 'distance') { jobForm[2].sort((a, b) => { const distanceA = this.calculateDistance( cityCoordinates.lat, @@ -532,32 +525,32 @@ export default class extends Command { }); } - let jobList = ""; + let jobList = ''; for (let i = 0; i < jobForm[2].length; i++) { - const avgSalary = - (Number(jobForm[2][i].salaryMax) + - Number(jobForm[2][i].salaryMin)) / - 2; + const avgSalary + = (Number(jobForm[2][i].salaryMax) + + Number(jobForm[2][i].salaryMin)) + / 2; const formattedAvgSalary = this.formatCurrency(avgSalary); - const formattedSalaryMax = - this.formatCurrency(Number(jobForm[2][i].salaryMax)) !== "N/A" + const formattedSalaryMax + = this.formatCurrency(Number(jobForm[2][i].salaryMax)) !== 'N/A' ? this.formatCurrency(Number(jobForm[2][i].salaryMax)) - : ""; - const formattedSalaryMin = - this.formatCurrency(Number(jobForm[2][i].salaryMin)) !== "N/A" + : ''; + const formattedSalaryMin + = this.formatCurrency(Number(jobForm[2][i].salaryMin)) !== 'N/A' ? this.formatCurrency(Number(jobForm[2][i].salaryMin)) - : ""; + : ''; const jobDistance = this.calculateDistance( cityCoordinates.lat, cityCoordinates.lng, Number(jobForm[2][i].latitude), Number(jobForm[2][i].longitude) ); - const formattedDistance = - jobDistance !== -1 ? `${jobDistance.toFixed(2)} miles` : "N/A"; + const formattedDistance + = jobDistance !== -1 ? `${jobDistance.toFixed(2)} miles` : 'N/A'; - const salaryDetails = - formattedSalaryMin && formattedSalaryMax + const salaryDetails + = formattedSalaryMin && formattedSalaryMax ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` : formattedAvgSalary; @@ -565,32 +558,32 @@ export default class extends Command { \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} \t\t* **Location:** ${jobForm[2][i].location} \t\t* **Date Posted:** ${new Date( - jobForm[2][i].created - ).toDateString()} at ${new Date( - jobForm[2][i].created - ).toLocaleTimeString("en-US", { - hour: "2-digit", - minute: "2-digit", - })} + jobForm[2][i].created + ).toDateString()} at ${new Date( + jobForm[2][i].created +).toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit' +})} \t\t* **Apply here:** [read more about the job and apply here](${ - jobForm[2][i].link - }) + jobForm[2][i].link +}) \t\t* **Distance:** ${formattedDistance} - ${i !== jobForm[2].length - 1 ? "\n" : ""}`; + ${i !== jobForm[2].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." + 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", + ? 'N/A' + : `${new Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD' }).format(Number(currency))}`; } @@ -599,15 +592,15 @@ export default class extends Command { .replace( new RegExp( `## Hey <@${owner}>!\\s*## Here's your list of job/internship recommendations:?`, - "g" + 'g' ), - "" + '' ) - .replace(/\[read more about the job and apply here\]/g, "") - .replace(/\((https?:\/\/[^\s)]+)\)/g, "$1") - .replace(/\*\*([^*]+)\*\*/g, "$1") - .replace(/##+\s*/g, "") - .replace(/###|-\#\s*/g, "") + .replace(/\[read more about the job and apply here\]/g, '') + .replace(/\((https?:\/\/[^\s)]+)\)/g, '$1') + .replace(/\*\*([^*]+)\*\*/g, '$1') + .replace(/##+\s*/g, '') + .replace(/###|-\#\s*/g, '') .trim(); } @@ -620,12 +613,12 @@ export default class extends Command { 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 === "date" ? "date posted" : filterBy + filterBy && filterBy !== 'default' + ? ` (filtered based on ${ + filterBy === 'date' ? 'date posted' : filterBy }):` - : ":" - } + : ':' +} `; } @@ -640,15 +633,15 @@ export default class extends Command { const R = 3958.8; // Radius of the Earth in miles const dLat = toRadians(lat2 - lat1); const dLon = toRadians(lon2 - lon1); - const a = - Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(toRadians(lat1)) * - Math.cos(toRadians(lat2)) * - Math.sin(dLon / 2) * - Math.sin(dLon / 2); + const a + = Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(toRadians(lat1)) + * Math.cos(toRadians(lat2)) + * Math.sin(dLon / 2) + * Math.sin(dLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - const distance = - (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) + const distance + = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 : R * c; return distance; @@ -661,9 +654,10 @@ export default class extends Command { const response = await axios.get(baseURL); const coordinates: { lat: number; lng: number } = { lat: response.data.results[0].geometry.location.lat, - lng: response.data.results[0].geometry.location.lng, + lng: response.data.results[0].geometry.location.lng }; return coordinates; } + } diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index cb4a1d4d..c85abec9 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -142,7 +142,7 @@ function listJobs(jobData: JobResult[], filterBy: string): string { 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 = (formattedSalaryMin && formattedSalaryMax) + const salaryDetails = formattedSalaryMin && formattedSalaryMax ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` : formattedAvgSalary; From f2a5891ba308c87b1753facbb04da87cbd4f0727 Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 14:33:51 -0400 Subject: [PATCH 293/317] fixing eslint issues... AGAIN --- src/commands/jobs/jobs.ts | 47 ++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index 13427797..3778631b 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -17,7 +17,7 @@ import { JobData } from '@root/src/lib/types/JobData'; import { Command } from '@lib/types/Command'; import { DB, BOT, MAP_KEY } from '@root/config'; import { MongoClient } from 'mongodb'; -import { sendToFile } from '@root/src/lib/utils/generalUtils'; +//import { sendToFile } from '@root/src/lib/utils/generalUtils'; import axios from 'axios'; import { JobPreferences } from '@root/src/lib/types/JobPreferences'; import { PDFDocument, PDFFont, StandardFonts, rgb } from 'pdf-lib'; @@ -63,12 +63,12 @@ export default class extends Command { // Embed a standard font. const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman); const HelveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold); - const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica); + //const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica); // Draw the title. const lineHeight = 10; // Height of the line - const lineWidth = (width - margin * 2) / 3; + const lineWidth = (width - (margin * 2)) / 3; currentPage.drawRectangle({ x: margin, @@ -89,7 +89,7 @@ export default class extends Command { // Draw the third color segment currentPage.drawRectangle({ - x: margin + lineWidth * 2, + x: margin + (lineWidth * 2), y: yPosition + 50, width: lineWidth, height: lineHeight, @@ -122,18 +122,18 @@ export default class extends Command { for (let i = 0; i < jobs.length; i++) { const job = jobs[i]; - if (yPosition - fontSize * 2 < margin) { + if (yPosition - (fontSize * 2) < margin) { currentPage = pdfDoc.addPage(); yPosition = currentPage.getHeight() - margin - 20; } - const maxWidth = width - margin * 2; // Calculate available width + const maxWidth = width - (margin * 2); // Calculate available width const wrappedTitle = this.wrapText(`${i + 1}. ${job.title}`, HelveticaBold, fontSize + 10, maxWidth); for (const line of wrappedTitle) { // Check if there's enough space for the line - if (yPosition - fontSize * 2 < margin) { + if (yPosition - (fontSize * 2) < margin) { currentPage = pdfDoc.addPage(); yPosition = currentPage.getHeight() - margin - 20; } @@ -158,18 +158,18 @@ export default class extends Command { for (const point of bulletPoints) { // Check if there's enough space on the page, and add a new page if needed. - if (yPosition - fontSize * 2 < margin) { + if (yPosition - (fontSize * 2) < margin) { currentPage = pdfDoc.addPage(); yPosition = currentPage.getHeight() - margin - 20; } - const maxLabelWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; - const wrappedLabel = this.wrapText(`• ${point.label}`, HelveticaBold, fontSize + 5, maxLabelWidth); + const maxLabelWidth = width - (margin * 2) - bulletPointIndent - subBulletPointIndent; + const wrappedLabel = this.wrapText(`• ${point.label}`, HelveticaBold, fontSize + 5, maxLabelWidth); // Draw the wrapped label for (const line of wrappedLabel) { // Check if there's enough space for the line - if (yPosition - fontSize * 2 < margin) { + if (yPosition - (fontSize * 2) < margin) { currentPage = pdfDoc.addPage(); yPosition = currentPage.getHeight() - margin - 20; } @@ -187,13 +187,13 @@ export default class extends Command { const combinedText = `•${point.value}`; - const maxValueWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; + const maxValueWidth = width - (margin * 2) - bulletPointIndent - subBulletPointIndent; const wrappedValue = this.wrapText(combinedText, HelveticaBold, fontSize + 4, maxValueWidth); for (const line of wrappedValue) { // Check if there's enough space for the line - if (yPosition - fontSize * 2 < margin) { + if (yPosition - (fontSize * 2) < margin) { currentPage = pdfDoc.addPage(); yPosition = currentPage.getHeight() - margin - 20; } @@ -296,7 +296,8 @@ export default class extends Command { const userData = userJobData.get(userID); if (!userData) return; - let { jobs, index } = userData; + const { jobs} = userData; + let { index } = userData; switch (i.customId) { case 'previous': @@ -346,11 +347,7 @@ export default class extends Command { userJobData.set(userID, { jobs, index }); // Update embed and buttons - const { embed, row } = this.createJobEmbed( - jobs[index], - index, - jobs.length - ); + await i.update({ embeds: [embed], components: [row] }); }); @@ -630,20 +627,20 @@ export default class extends Command { ): number { const toRadians = (degrees: number) => degrees * (Math.PI / 180); - const R = 3958.8; // Radius of the Earth in miles + const Radius = 3958.8; // Radius of the Earth in miles const dLat = toRadians(lat2 - lat1); const dLon = toRadians(lon2 - lon1); - const a + const equation = Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(toRadians(lat1)) + (Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * Math.sin(dLon / 2) - * Math.sin(dLon / 2); - const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + * Math.sin(dLon / 2)); + const cLetter = 2 * Math.atan2(Math.sqrt(equation), Math.sqrt(1 - equation)); const distance = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 - : R * c; + : (Radius * cLetter); return distance; } From 94af2b776d2e74e1e40cc886feb901d8eab45ee6 Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 14:40:14 -0400 Subject: [PATCH 294/317] okokok actually fixed all eslint errors now i think --- src/commands/jobs/jobs.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index 3778631b..e18b1765 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -17,7 +17,7 @@ import { JobData } from '@root/src/lib/types/JobData'; import { Command } from '@lib/types/Command'; import { DB, BOT, MAP_KEY } from '@root/config'; import { MongoClient } from 'mongodb'; -//import { sendToFile } from '@root/src/lib/utils/generalUtils'; +// import { sendToFile } from '@root/src/lib/utils/generalUtils'; import axios from 'axios'; import { JobPreferences } from '@root/src/lib/types/JobPreferences'; import { PDFDocument, PDFFont, StandardFonts, rgb } from 'pdf-lib'; @@ -61,9 +61,9 @@ export default class extends Command { // Embed a standard font. - const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman); + // const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman); const HelveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold); - //const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica); + // const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica); // Draw the title. @@ -166,7 +166,7 @@ export default class extends Command { const maxLabelWidth = width - (margin * 2) - bulletPointIndent - subBulletPointIndent; const wrappedLabel = this.wrapText(`• ${point.label}`, HelveticaBold, fontSize + 5, maxLabelWidth); - // Draw the wrapped label + // Draw the wrapped label for (const line of wrappedLabel) { // Check if there's enough space for the line if (yPosition - (fontSize * 2) < margin) { @@ -296,7 +296,7 @@ export default class extends Command { const userData = userJobData.get(userID); if (!userData) return; - const { jobs} = userData; + const { jobs } = userData; let { index } = userData; switch (i.customId) { @@ -347,7 +347,7 @@ export default class extends Command { userJobData.set(userID, { jobs, index }); // Update embed and buttons - + await i.update({ embeds: [embed], components: [row] }); }); @@ -581,7 +581,7 @@ export default class extends Command { : `${new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' - }).format(Number(currency))}`; + }).format(Number(currency))}`; } stripMarkdown(message: string, owner: string): string { @@ -597,7 +597,7 @@ export default class extends Command { .replace(/\((https?:\/\/[^\s)]+)\)/g, '$1') .replace(/\*\*([^*]+)\*\*/g, '$1') .replace(/##+\s*/g, '') - .replace(/###|-\#\s*/g, '') + .replace(/###|- \s*/g, '') .trim(); } @@ -613,7 +613,7 @@ export default class extends Command { filterBy && filterBy !== 'default' ? ` (filtered based on ${ filterBy === 'date' ? 'date posted' : filterBy - }):` + }):` : ':' } `; @@ -631,7 +631,7 @@ export default class extends Command { const dLat = toRadians(lat2 - lat1); const dLon = toRadians(lon2 - lon1); const equation - = Math.sin(dLat / 2) * Math.sin(dLat / 2) + + = (Math.sin(dLat / 2) * Math.sin(dLat / 2)) + (Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * Math.sin(dLon / 2) @@ -640,11 +640,11 @@ export default class extends Command { const distance = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 - : (Radius * cLetter); + : Radius * cLetter; return distance; } - async queryCoordinates(location: string): Promise { + async queryCoordinates(location: string): Promise<{ lat: number; lng: number }> { const preferredCity = encodeURIComponent(location); const baseURL = `https://maps.google.com/maps/api/geocode/json?address=${preferredCity}&components=country:US&key=${MAP_KEY}`; From e14ebf7beabca83987828eaf38d6c8755d449404 Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 15:04:28 -0400 Subject: [PATCH 295/317] trying to fix why buttons arent working --- config.example.ts | 6 ++++++ src/commands/jobs/jobs.ts | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/config.example.ts b/config.example.ts index 5eb2e8d7..5f517293 100644 --- a/config.example.ts +++ b/config.example.ts @@ -1,4 +1,7 @@ interface Config { + APP_ID: string; + APP_KEY: string; + MAP_KEY: string; DB_CONNECTION: string; BOT_NAME: string; BOT_TOKEN: string; @@ -54,6 +57,9 @@ function getEnvVar(name: keyof Config): string { } export const config: Config = { + APP_ID: getEnvVar('APP_ID'), + APP_KEY: getEnvVar('APP_KEY'), + MAP_KEY: getEnvVar('MAP_KEY'), DB_CONNECTION: getEnvVar('DB_CONNECTION'), BOT_NAME: getEnvVar('BOT_NAME'), BOT_TOKEN: getEnvVar('BOT_TOKEN'), diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index e18b1765..e7af624f 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -596,7 +596,7 @@ export default class extends Command { .replace(/\[read more about the job and apply here\]/g, '') .replace(/\((https?:\/\/[^\s)]+)\)/g, '$1') .replace(/\*\*([^*]+)\*\*/g, '$1') - .replace(/##+\s*/g, '') + .replace(/##+ \s*/g, '') .replace(/###|- \s*/g, '') .trim(); } From 61f8a6a8b30ddbb12d2102a052640bf6e2e11d91 Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 15:14:25 -0400 Subject: [PATCH 296/317] fixed button issue, works now --- src/commands/jobs/jobs.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index e7af624f..3c115911 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -347,8 +347,12 @@ export default class extends Command { userJobData.set(userID, { jobs, index }); // Update embed and buttons - - await i.update({ embeds: [embed], components: [row] }); + const newEmbed = this.createJobEmbed( + APIResponse[index], + index, + APIResponse.length + ); + await i.update({ embeds: [newEmbed.embed], components: [newEmbed.row] }); }); collector?.on('end', () => { From 8da42ba84bc3ac3a26c4f0a1a2d43ffdf1fc1549 Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 15:21:54 -0400 Subject: [PATCH 297/317] actually fixed the config example file hopefully --- config.example.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config.example.ts b/config.example.ts index 5f517293..2f076722 100644 --- a/config.example.ts +++ b/config.example.ts @@ -217,6 +217,9 @@ export const PREFIX = config.PREFIX; export const BLACKLIST = [config.BLACKLIST]; export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; +export const APP_ID = config.APP_ID; +export const APP_KEY = config.APP_KEY; +export const MAP_KEY = config.MAP_KEY; // eslint-disable-next-line prefer-destructuring export const MONGO = config.MONGO; From 81448354347c444790437335e7a498cd3b0dd2f2 Mon Sep 17 00:00:00 2001 From: Selin Bacaz <144861936+selinAbacaz@users.noreply.github.com> Date: Tue, 29 Apr 2025 15:28:04 -0400 Subject: [PATCH 298/317] added job_forms into config example --- config.example.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config.example.ts b/config.example.ts index 2f076722..1cf95c5b 100644 --- a/config.example.ts +++ b/config.example.ts @@ -10,6 +10,7 @@ interface Config { DB_PVQ: string; DB_QTAGS: string; DB_ASSIGNABLE: string; + DB_JOB_FORMS: string; DB_COURSES: string; DB_REMINDERS: string; DB_CLIENT_DATA: string; @@ -69,6 +70,7 @@ export const config: Config = { DB_QTAGS: getEnvVar('DB_QTAGS'), DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), DB_COURSES: getEnvVar('DB_COURSES'), + DB_JOB_FORMS: getEnvVar('DB_JOB_FORMS'), DB_REMINDERS: getEnvVar('DB_REMINDERS'), DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), DB_POLLS: getEnvVar('DB_POLLS'), @@ -153,6 +155,7 @@ export const DB = { CONNECTION: config.DB_CONNECTION, USERS: config.DB_USERS, PVQ: config.DB_PVQ, + JOB_FORMS: config.DB_JOB_FORMS, QTAGS: config.DB_QTAGS, ASSIGNABLE: config.DB_ASSIGNABLE, COURSES: config.DB_COURSES, From 6e94604638aa3397d42ec4794cc96b714fd9d099 Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Wed, 30 Apr 2025 14:43:55 -0400 Subject: [PATCH 299/317] Updated package.json file --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index fa2c2c1f..ee224f03 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,9 @@ "parse-duration": "^2.1.3", "pdf-lib": "^1.17.1", "pretty-ms": "^7.0.1", - "puppeteer": "^24.6.0" + "puppeteer": "^24.6.0", + "chart.js": "^4.2.1", + "chartjs-node-canvas": "^5.0.0" }, "_moduleAliases": { "@root": "dist", From e74e2dc731e7e4f2271f305c641626cc4f481b10 Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Wed, 30 Apr 2025 14:49:02 -0400 Subject: [PATCH 300/317] Cleaned up some unused imports --- src/commands/jobs/histogram.ts | 3 +-- src/commands/jobs/jobform.ts | 14 +++----------- src/commands/jobs/jobs.ts | 14 +------------- src/lib/utils/jobUtils/jobDatabase.ts | 1 - src/pieces/tasks.ts | 8 +++----- 5 files changed, 8 insertions(+), 32 deletions(-) diff --git a/src/commands/jobs/histogram.ts b/src/commands/jobs/histogram.ts index 435ca6f4..12475050 100644 --- a/src/commands/jobs/histogram.ts +++ b/src/commands/jobs/histogram.ts @@ -1,9 +1,8 @@ import { APP_ID, APP_KEY } from '@root/config'; import { Command } from '@root/src/lib/types/Command'; import axios from 'axios'; -import { Application, ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, InteractionResponse } from 'discord.js'; +import { ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, InteractionResponse } from 'discord.js'; import { ChartJSNodeCanvas } from 'chartjs-node-canvas'; -import fs from 'fs'; import { ChartConfiguration } from 'chart.js'; export default class extends Command { diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index eef33f4a..99813b47 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,17 +1,9 @@ import { Command } from '@root/src/lib/types/Command'; -import { - ActionRowBuilder, - ApplicationCommandOptionData, - ApplicationCommandOptionType, +import { ApplicationCommandOptionData, ChatInputCommandInteraction, DMChannel, InteractionResponse, - MessageFlags, - ModalBuilder, - ModalSubmitFields, - TextInputBuilder, - TextInputStyle -} from 'discord.js'; + MessageFlags } from 'discord.js'; import { validatePreferences } from '../../lib/utils/jobUtils/validatePreferences'; import { JobPreferenceAPI } from '@root/src/lib/utils/jobUtils/jobDatabase'; @@ -130,7 +122,7 @@ export default class extends Command { // Persist into Mongo const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); - const result = await jobPreferenceAPI.storeFormResponses(userId, answers); + await jobPreferenceAPI.storeFormResponses(userId, answers); await channel.send( `${`✅ Preferences saved! `}\n` + diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index d57bcd32..9736f69a 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -2,26 +2,14 @@ import { ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, - EmbedBuilder, - ActionRowBuilder, - ButtonBuilder, - ButtonStyle, ComponentType, InteractionResponse, AttachmentBuilder } 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'; -import { DB, BOT, MAP_KEY } from '@root/config'; -import { MongoClient } from 'mongodb'; // import { sendToFile } from '@root/src/lib/utils/generalUtils'; -import axios from 'axios'; -import { JobPreferences } from '@root/src/lib/types/JobPreferences'; -import { jobMessage, stripMarkdown, headerMessage, generateJobPDF, createJobEmbed } from '@root/src/pieces/tasks'; -import { sendToFile } from '@root/src/lib/utils/generalUtils'; +import { jobMessage, createJobEmbed } from '@root/src/pieces/tasks'; export default class extends Command { diff --git a/src/lib/utils/jobUtils/jobDatabase.ts b/src/lib/utils/jobUtils/jobDatabase.ts index 126ad924..74226ac3 100644 --- a/src/lib/utils/jobUtils/jobDatabase.ts +++ b/src/lib/utils/jobUtils/jobDatabase.ts @@ -1,6 +1,5 @@ import { Collection, Db } from 'mongodb'; import { DB } from '@root/config'; -import { validatePreferences } from './validatePreferences'; import { titleCase } from '@root/src/pieces/tasks'; // Class to store the info of the preferences the user previously put in to match to jobs in the database. diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index d3e0b47d..88a9ead5 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -4,7 +4,6 @@ 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 fetchJobListings from '../lib/utils/jobUtils/Adzuna_job_search'; import { sendToFile } from '../lib/utils/generalUtils'; import { JobData } from '../lib/types/JobData'; @@ -14,7 +13,6 @@ import { JobPreferences } from '../lib/types/JobPreferences'; import axios from 'axios'; import { PDFDocument, PDFFont, rgb, StandardFonts } from 'pdf-lib'; import { generateHistogram } from '../commands/jobs/histogram'; -import jobform from '../commands/jobs/jobform'; async function register(bot: Client): Promise { schedule('0/30 * * * * *', () => { @@ -90,7 +88,7 @@ async function checkPolls(bot: Client): Promise { } // eslint-disable-next-line no-warning-comments -async function getJobFormData(userID:string, filterBy: 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.USERS); const jobformAnswers: JobPreferences | null = (await db.findOne({ discordId: userID }))?.jobPreferences; @@ -212,7 +210,8 @@ async function listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: str return jobList || '### Unfortunately, there were no jobs found based on your interests :(. Consider updating your interests or waiting until something is found.'; } -export async function jobMessage(reminder: Reminder | string, userID: string): Promise<{ message: string, pdfBuffer: Buffer, embed: EmbedBuilder, row: ActionRowBuilder, jobResults: JobResult[] }> { +export async function jobMessage(reminder: Reminder | string, userID: string): Promise<{ message: string, pdfBuffer: Buffer, + embed: EmbedBuilder, row: ActionRowBuilder, jobResults: JobResult[] }> { const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, typeof reminder === 'object' && 'filterBy' in reminder ? reminder.filterBy : 'default'); let filterBy: string; if (typeof reminder === 'object' && 'filterBy' in reminder && reminder.filterBy) { @@ -234,7 +233,6 @@ export async function jobMessage(reminder: Reminder | string, userID: string): P const { embed, row } = createJobEmbed(jobResults[0], 0, jobResults.length); const pdfBuffer = await generateJobPDF(jobFormData); - const embedList: EmbedBuilder[] = []; const message = `## Hey <@${userID}>! ## Here's your list of job/internship recommendations: From 2070ea7923a8b6b45eead6a720f9fe9d8b4b60b0 Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Wed, 30 Apr 2025 14:54:27 -0400 Subject: [PATCH 301/317] fixed package-lock.json --- package-lock.json | 977 +++++++++++++++++++++++++++++++++------------- 1 file changed, 696 insertions(+), 281 deletions(-) diff --git a/package-lock.json b/package-lock.json index 01334b14..b8646f00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,8 @@ "@octokit/rest": "^21.1.1", "axios": "^1.4.0", "canvas": "^3.1.0", + "chart.js": "^4.2.1", + "chartjs-node-canvas": "^5.0.0", "console-stamp": "^3.0.2", "discord.js": "^14.16.3", "html-pdf-node": "^1.0.7", @@ -50,23 +52,25 @@ "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "license": "MIT", "dependencies": { "@babel/highlight": "^7.10.4" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "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==", + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -81,6 +85,7 @@ "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==", + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -92,6 +97,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -105,6 +111,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -112,12 +119,14 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "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==", + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -126,6 +135,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", "engines": { "node": ">=4" } @@ -134,6 +144,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -142,15 +153,15 @@ } }, "node_modules/@discordjs/builders": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.10.1.tgz", - "integrity": "sha512-OWo1fY4ztL1/M/DUyRPShB4d/EzVfuUvPTRRHRIt/YxBrUYSz0a+JicD5F5zHFoNs2oTuWavxCOVFV1UljHTng==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.1.tgz", + "integrity": "sha512-2zDAVuoeAkdv0YQzYKO8vZfaDfB+1KZ60ymBKtD7QDpsh6lzAnQSUBLqeRkhlons6BT9+yRctOh9fPy94w6kDA==", "license": "Apache-2.0", "dependencies": { - "@discordjs/formatters": "^0.6.0", + "@discordjs/formatters": "^0.6.1", "@discordjs/util": "^1.1.1", "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "^0.37.119", + "discord-api-types": "^0.38.1", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.4", "tslib": "^2.6.3" @@ -172,12 +183,12 @@ } }, "node_modules/@discordjs/formatters": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.0.tgz", - "integrity": "sha512-YIruKw4UILt/ivO4uISmrGq2GdMY6EkoTtD0oS0GvkJFRZbTSdPhzYiUILbJ/QslsvC9H9nTgGgnarnIl4jMfw==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.1.tgz", + "integrity": "sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==", "license": "Apache-2.0", "dependencies": { - "discord-api-types": "^0.37.114" + "discord-api-types": "^0.38.1" }, "engines": { "node": ">=16.11.0" @@ -207,9 +218,9 @@ } }, "node_modules/@discordjs/rest": { - "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==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.5.0.tgz", + "integrity": "sha512-PWhchxTzpn9EV3vvPRpwS0EE2rNYB9pvzDU/eLLW3mByJl0ZHZjHI2/wA8EbH2gRMQV7nu+0FoDF84oiPl8VAQ==", "license": "Apache-2.0", "dependencies": { "@discordjs/collection": "^2.1.1", @@ -217,7 +228,7 @@ "@sapphire/async-queue": "^1.5.3", "@sapphire/snowflake": "^3.5.3", "@vladfrangu/async_event_emitter": "^2.4.6", - "discord-api-types": "^0.37.119", + "discord-api-types": "^0.38.1", "magic-bytes.js": "^1.10.0", "tslib": "^2.6.3", "undici": "6.21.1" @@ -254,18 +265,18 @@ } }, "node_modules/@discordjs/ws": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.1.tgz", - "integrity": "sha512-PBvenhZG56a6tMWF/f4P6f4GxZKJTBG95n7aiGSPTnodmz4N5g60t79rSIAq7ywMbv8A4jFtexMruH+oe51aQQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.2.tgz", + "integrity": "sha512-dyfq7yn0wO0IYeYOs3z79I6/HumhmKISzFL0Z+007zQJMtAFGtt3AEoq1nuLXtcunUE5YYYQqgKvybXukAK8/w==", "license": "Apache-2.0", "dependencies": { "@discordjs/collection": "^2.1.0", - "@discordjs/rest": "^2.4.3", + "@discordjs/rest": "^2.5.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.119", + "discord-api-types": "^0.38.1", "tslib": "^2.6.2", "ws": "^8.17.0" }, @@ -339,7 +350,21 @@ "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 + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jonkemp/package-utils": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", + "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==", + "license": "MIT" + }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -389,16 +414,16 @@ } }, "node_modules/@octokit/core": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.4.tgz", - "integrity": "sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", + "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", "license": "MIT", "dependencies": { "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.1.2", - "@octokit/request": "^9.2.1", - "@octokit/request-error": "^6.1.7", - "@octokit/types": "^13.6.2", + "@octokit/graphql": "^8.2.2", + "@octokit/request": "^9.2.3", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", "before-after-hook": "^3.0.2", "universal-user-agent": "^7.0.0" }, @@ -407,12 +432,12 @@ } }, "node_modules/@octokit/endpoint": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.3.tgz", - "integrity": "sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", + "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", "license": "MIT", "dependencies": { - "@octokit/types": "^13.6.2", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -420,13 +445,13 @@ } }, "node_modules/@octokit/graphql": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.1.tgz", - "integrity": "sha512-n57hXtOoHrhwTWdvhVkdJHdhTv0JstjDbDRhJfwIRNfFqmSo1DaK/mD2syoNUoLCyqSjBpGAKOG0BuwF392slw==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", + "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", "license": "MIT", "dependencies": { - "@octokit/request": "^9.2.2", - "@octokit/types": "^13.8.0", + "@octokit/request": "^9.2.3", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.0" }, "engines": { @@ -434,18 +459,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz", - "integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==", + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.4.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.3.tgz", - "integrity": "sha512-tBXaAbXkqVJlRoA/zQVe9mUdb8rScmivqtpv3ovsC5xhje/a+NOCivs7eUhWBwCApJVsR4G5HMeaLbq7PxqZGA==", + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", + "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", "license": "MIT", "dependencies": { - "@octokit/types": "^13.7.0" + "@octokit/types": "^13.10.0" }, "engines": { "node": ">= 18" @@ -454,6 +479,21 @@ "@octokit/core": ">=6" } }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, "node_modules/@octokit/plugin-request-log": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", @@ -467,12 +507,12 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.1.tgz", - "integrity": "sha512-o8uOBdsyR+WR8MK9Cco8dCgvG13H1RlM1nWnK/W7TEACQBFux/vPREgKucxUfuDQ5yi1T3hGf4C5ZmZXAERgwQ==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", + "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", "license": "MIT", "dependencies": { - "@octokit/types": "^13.8.0" + "@octokit/types": "^13.10.0" }, "engines": { "node": ">= 18" @@ -481,15 +521,30 @@ "@octokit/core": ">=6" } }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, "node_modules/@octokit/request": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.2.tgz", - "integrity": "sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", + "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", "license": "MIT", "dependencies": { - "@octokit/endpoint": "^10.1.3", - "@octokit/request-error": "^6.1.7", - "@octokit/types": "^13.6.2", + "@octokit/endpoint": "^10.1.4", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", "fast-content-type-parse": "^2.0.0", "universal-user-agent": "^7.0.2" }, @@ -498,12 +553,12 @@ } }, "node_modules/@octokit/request-error": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.7.tgz", - "integrity": "sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", "license": "MIT", "dependencies": { - "@octokit/types": "^13.6.2" + "@octokit/types": "^14.0.0" }, "engines": { "node": ">= 18" @@ -525,12 +580,12 @@ } }, "node_modules/@octokit/types": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz", - "integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^23.0.1" + "@octokit/openapi-types": "^25.0.0" } }, "node_modules/@pdf-lib/standard-fonts": { @@ -552,9 +607,9 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.9.0.tgz", - "integrity": "sha512-8+xM+cFydYET4X/5/3yZMHs7sjS6c9I6H5I3xJdb6cinzxWUT/I2QVw4avxCQ8QDndwdHkG/FiSZIrCjAbaKvQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.2.tgz", + "integrity": "sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ==", "license": "Apache-2.0", "dependencies": { "debug": "^4.4.0", @@ -572,29 +627,6 @@ "node": ">=18" } }, - "node_modules/@puppeteer/browsers/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@puppeteer/browsers/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, "node_modules/@puppeteer/browsers/node_modules/tar-fs": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", @@ -742,9 +774,9 @@ "license": "MIT" }, "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==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -1046,20 +1078,6 @@ "node": ">=10" } }, - "node_modules/are-we-there-yet/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/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1109,9 +1127,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", - "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -1139,9 +1157,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.2.tgz", - "integrity": "sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.3.tgz", + "integrity": "sha512-OeEZYIg+2qepaWLyphaOXHAHKo3xkM8y3BeGAvHdMN8GNWvEAU1Yw6rYpGzu/wDDbKxgEjVeVDpgGhDzaeMpjg==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1220,7 +1238,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/basic-ftp": { "version": "5.0.5", @@ -1231,6 +1250,12 @@ "node": ">=10.0.0" } }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, "node_modules/before-after-hook": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", @@ -1247,12 +1272,48 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/bl/node_modules/readable-stream": { + "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", + "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" + } + }, + "node_modules/bl/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" + }, + "node_modules/bl/node_modules/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "license": "MIT" }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1335,6 +1396,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -1369,6 +1431,58 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chart.js": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", + "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/chartjs-node-canvas": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-5.0.0.tgz", + "integrity": "sha512-+Lc5phRWjb+UxAIiQpKgvOaG6Mw276YQx2jl2BrxoUtI3A4RYTZuGM5Dq+s4ReYmCY42WEPSR6viF3lDSTxpvw==", + "license": "MIT", + "dependencies": { + "canvas": "^3.1.0", + "tslib": "^2.8.1" + }, + "peerDependencies": { + "chart.js": "^4.4.8" + } + }, + "node_modules/cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", + "license": "MIT", + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -1379,9 +1493,9 @@ } }, "node_modules/chromium-bidi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-3.0.0.tgz", - "integrity": "sha512-ZOGRDAhBMX1uxL2Cm2TDuhImbrsEz5A/tTcVU6RpXEWaTNUNwsHW6njUXizh51Ir6iqHbKAfhA2XK33uBcLo5A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-4.1.1.tgz", + "integrity": "sha512-biR7t4vF3YluE6RlMSk9IWk+b9U+WWyzHp+N2pL9vRTk+UXHYRTVp7jTK58ZNzMLBgoLMHY4QyJMbeuw3eKxqg==", "license": "Apache-2.0", "dependencies": { "mitt": "^3.0.1", @@ -1534,6 +1648,42 @@ "node": ">= 8" } }, + "node_modules/css-rules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", + "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", + "license": "MIT", + "dependencies": { + "cssom": "^0.5.0" + } + }, + "node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", + "license": "BSD-like", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "license": "BSD-2-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "license": "MIT" + }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", @@ -1639,9 +1789,9 @@ } }, "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==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -1667,27 +1817,28 @@ } }, "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==", + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.1.tgz", + "integrity": "sha512-vsjsqjAuxsPhiwbPjTBeGQaDPlizFmSkU0mTzFGMgRxqCDIRBR7iTY74HacpzrDV0QtERHRKQEk1tq7drZUtHg==", "license": "MIT" }, "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==", + "version": "14.19.2", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.19.2.tgz", + "integrity": "sha512-L/ivhVefzzRcChHJSaGYsgA4Uqx6or2sst5JZ/ft9OBwrj8OJIzrrcutlkHnm/hlI0Hrm3es62TRVksU8VUqrg==", "license": "Apache-2.0", "dependencies": { - "@discordjs/builders": "^1.10.1", + "@discordjs/builders": "^1.11.1", "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.6.0", - "@discordjs/rest": "^2.4.3", + "@discordjs/formatters": "^0.6.1", + "@discordjs/rest": "^2.5.0", "@discordjs/util": "^1.1.1", - "@discordjs/ws": "^1.2.1", + "@discordjs/ws": "^1.2.2", "@sapphire/snowflake": "3.5.3", - "discord-api-types": "^0.37.119", + "discord-api-types": "^0.38.1", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", + "magic-bytes.js": "^1.10.0", "tslib": "^2.6.3", "undici": "6.21.1" }, @@ -1711,6 +1862,40 @@ "node": ">=6.0.0" } }, + "node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "license": "MIT", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1761,6 +1946,12 @@ "node": ">=8.6" } }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "license": "BSD-2-Clause" + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -2043,6 +2234,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -2111,6 +2303,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -2140,6 +2333,18 @@ "node": ">=6" } }, + "node_modules/extract-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-2.0.1.tgz", + "integrity": "sha512-DX3+27l6NIVYNidJjBJ4VU3Z5tk/0aEO/JJ6XEJIRPFum9kyA1PifPjnEa8Ztnv4DHNQg5EF27aypGz6s/fMdw==", + "license": "MIT", + "dependencies": { + "batch": "^0.6.1", + "href-content": "^2.0.1", + "list-stylesheets": "^1.2.10", + "style-data": "^1.4.8" + } + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -2309,6 +2514,12 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flat-util": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.11.tgz", + "integrity": "sha512-h9ho3lHr5hDTQZKLqFDqIliDV/A8yCyP7UoSIBT4U3d7VfA/EeqsC8cxWJGIr5oCxZzMD/3BEx3SLYFX6hD8ng==", + "license": "MIT" + }, "node_modules/flatted": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", @@ -2670,74 +2881,146 @@ "node": ">= 0.4" } }, + "node_modules/href-content": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.3.tgz", + "integrity": "sha512-ikrAoI1l5ihN5Be2cR9nozFfivVJxPQDpa4+sb6PLt/uaNE/a7A05rHbnJEUduoHddbB3GyT5tdqzXMUmPgJYA==", + "license": "MIT", + "dependencies": { + "remote-content": "^4.0.0" + } + }, "node_modules/html-pdf-node": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/html-pdf-node/-/html-pdf-node-1.0.7.tgz", - "integrity": "sha512-fBvV3/+GxqEuyZuYGPou9aKEP84VbN/1wmL1ujF1UsLSy10srESfQelbOrSgJkOHs23yPfUG9uGMajat6+1UfQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/html-pdf-node/-/html-pdf-node-1.0.8.tgz", + "integrity": "sha512-1PXbShoVXy8/86ZBY3xQNd5r2c/CPx/Me2wGtV0Z0Rekko5Tgow2hLms2n+OwA+PV7NyR7OPcTqsnhXIMUJLFw==", "license": "ISC", "dependencies": { "bluebird": "^3.7.2", "handlebars": "^4.7.6", - "puppeteer": "^5.1.0" + "inline-css": "^3.0.0", + "puppeteer": "^10.4.0" } }, - "node_modules/html-pdf-node/node_modules/agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "node_modules/html-pdf-node/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/html-pdf-node/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">= 6.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/html-pdf-node/node_modules/devtools-protocol": { - "version": "0.0.818844", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", - "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==", + "version": "0.0.901419", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", + "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", "license": "BSD-3-Clause" }, "node_modules/html-pdf-node/node_modules/https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "license": "MIT", "dependencies": { - "agent-base": "5", + "agent-base": "6", "debug": "4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 6" + } + }, + "node_modules/html-pdf-node/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/html-pdf-node/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==", + "license": "MIT" + }, + "node_modules/html-pdf-node/node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "license": "MIT", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/html-pdf-node/node_modules/progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", + "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" } }, "node_modules/html-pdf-node/node_modules/puppeteer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz", - "integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.4.0.tgz", + "integrity": "sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w==", "deprecated": "< 22.8.2 is no longer supported", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "debug": "^4.1.0", - "devtools-protocol": "0.0.818844", - "extract-zip": "^2.0.0", - "https-proxy-agent": "^4.0.0", - "node-fetch": "^2.6.1", - "pkg-dir": "^4.2.0", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^3.0.2", - "tar-fs": "^2.0.0", - "unbzip2-stream": "^1.3.3", - "ws": "^7.2.3" + "debug": "4.3.1", + "devtools-protocol": "0.0.901419", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "node-fetch": "2.6.1", + "pkg-dir": "4.2.0", + "progress": "2.0.1", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.0.0", + "unbzip2-stream": "1.3.3", + "ws": "7.4.6" }, "engines": { "node": ">=10.18.1" } }, + "node_modules/html-pdf-node/node_modules/tar-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", + "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, "node_modules/html-pdf-node/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "license": "MIT", "engines": { "node": ">=8.3.0" @@ -2755,6 +3038,20 @@ } } }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "license": "MIT", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -2821,9 +3118,10 @@ } }, "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==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2868,6 +3166,24 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, + "node_modules/inline-css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-3.0.0.tgz", + "integrity": "sha512-a+IE7oLaQqeVr3hMviekDDk94LA0+oZX8JEfJuXOm20diZAkOFrq/f/QZCEXpMK6qIbYr0nQNpsuioXQN1ZgXA==", + "license": "MIT", + "dependencies": { + "cheerio": "^0.22.0", + "css-rules": "^1.0.9", + "extract-css": "^2.0.0", + "flat-util": "^1.1.6", + "pick-util": "^1.1.3", + "slick": "^1.12.2", + "specificity": "^0.4.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -2951,7 +3267,8 @@ "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==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", @@ -3030,6 +3347,16 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, + "node_modules/list-stylesheets": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-1.2.10.tgz", + "integrity": "sha512-F85Yx9GKLJwDr1T9U34FST5m6iIXhPzqD+MRDsljZsdmoEZwllZBDbkAVaa+EpLKrr6de+P4SRGNHwrWv6zMZA==", + "license": "MIT", + "dependencies": { + "cheerio": "^0.22.0", + "pick-util": "^1.1.4" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -3048,11 +3375,71 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", + "license": "MIT" + }, + "node_modules/lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" + }, + "node_modules/lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", + "license": "MIT" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "license": "MIT" + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", + "license": "MIT" + }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", + "license": "MIT" + }, "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" + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "deprecated": "This package is deprecated. Use destructuring assignment syntax instead.", + "license": "MIT" + }, + "node_modules/lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", + "license": "MIT" + }, + "node_modules/lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", "license": "MIT" }, "node_modules/lodash.snakecase": { @@ -3061,11 +3448,18 @@ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", "license": "MIT" }, + "node_modules/lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", + "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 + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { "version": "7.18.3", @@ -3077,9 +3471,9 @@ } }, "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==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz", + "integrity": "sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==", "license": "MIT" }, "node_modules/make-dir": { @@ -3121,6 +3515,15 @@ "node": ">= 0.4" } }, + "node_modules/mediaquery-text": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", + "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", + "license": "MIT", + "dependencies": { + "cssom": "^0.5.0" + } + }, "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", @@ -3206,6 +3609,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -3344,9 +3756,9 @@ } }, "node_modules/node": { - "version": "23.9.0", - "resolved": "https://registry.npmjs.org/node/-/node-23.9.0.tgz", - "integrity": "sha512-G1UAqOInNxL2HkLV0i3ZEgnNsSsWsf4tlpMpR44s7jYPEH8sCXObnxgyphibOiHdyheRkUzE9lRJXJ/4n0/KdA==", + "version": "23.11.0", + "resolved": "https://registry.npmjs.org/node/-/node-23.11.0.tgz", + "integrity": "sha512-IS7dwB4M8/iKCFuJVN4EQmMmpX1YLN/wLfkgcouPA99s9cQUpuUX7Ng0j0XIK+4Zhb4EhcDyea5P20hF26nVow==", "hasInstallScript": true, "license": "ISC", "dependencies": { @@ -3425,9 +3837,9 @@ } }, "node_modules/nodemailer": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.0.tgz", - "integrity": "sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", + "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", "license": "MIT-0", "engines": { "node": ">=6.0.0" @@ -3461,6 +3873,15 @@ "set-blocking": "^2.0.0" } }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3618,6 +4039,7 @@ "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==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -3626,9 +4048,9 @@ } }, "node_modules/parse-duration": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.3.tgz", - "integrity": "sha512-MtbharL7Bets65qDBXuDOHHWyY1BxTJZmJ/xGmS90iEbKE0gZ6yZpZtCda7O79GeOi/f0NwBaplIuReExIoVsw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz", + "integrity": "sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg==", "license": "MIT" }, "node_modules/parse-json": { @@ -3733,6 +4155,15 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" }, + "node_modules/pick-util": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", + "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", + "license": "MIT", + "dependencies": { + "@jonkemp/package-utils": "^1.0.8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3825,6 +4256,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -3913,17 +4345,17 @@ } }, "node_modules/puppeteer": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.6.0.tgz", - "integrity": "sha512-wYTB8WkzAr7acrlsp+0at1PZjOJPOxe6dDWKOG/kaX4Zjck9RXCFx3CtsxsAGzPn/Yv6AzgJC/CW1P5l+qxsqw==", + "version": "24.7.2", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.7.2.tgz", + "integrity": "sha512-ifYqoY6wGs0yZeFuFPn8BE9FhuveXkarF+eO18I2e/axdoCh4Qh1AE+qXdJBhdaeoPt6eRNTY4Dih29Jbq8wow==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.9.0", - "chromium-bidi": "3.0.0", + "@puppeteer/browsers": "2.10.2", + "chromium-bidi": "4.1.1", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1425554", - "puppeteer-core": "24.6.0", + "puppeteer-core": "24.7.2", "typed-query-selector": "^2.12.0" }, "bin": { @@ -3934,13 +4366,13 @@ } }, "node_modules/puppeteer-core": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.6.0.tgz", - "integrity": "sha512-Cukxysy12m0v350bhl/Gzof0XQYmtON9l2VvGp3D4BOQZVgyf+y5wIpcjDZQ/896Okoi95dKRGRV8E6a7SYAQQ==", + "version": "24.7.2", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.7.2.tgz", + "integrity": "sha512-P9pZyTmJqKODFCnkZgemCpoFA4LbAa8+NumHVQKyP5X9IgdNS1ZnAnIh1sMAwhF8/xEUGf7jt+qmNLlKieFw1Q==", "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.9.0", - "chromium-bidi": "3.0.0", + "@puppeteer/browsers": "2.10.2", + "chromium-bidi": "4.1.1", "debug": "^4.4.0", "devtools-protocol": "0.0.1425554", "typed-query-selector": "^2.12.0", @@ -3950,29 +4382,6 @@ "node": ">=18" } }, - "node_modules/puppeteer-core/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/puppeteer-core/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -4019,26 +4428,19 @@ } }, "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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": { - "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" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "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" - }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -4052,6 +4454,16 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/remote-content": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-4.0.1.tgz", + "integrity": "sha512-W2lDnjK4k1vAJg7UZArH/rkNYJqZuteHkX1jS7tO9TJUiLhDcu2Ejvj97gK/XbZNDhzld0sn11OW8vihin4cAg==", + "license": "MIT", + "dependencies": { + "axios": "^1.7.9", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/require-at": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", @@ -4084,6 +4496,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", "engines": { "node": ">=4" } @@ -4292,6 +4705,15 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/slick": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", + "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", + "license": "MIT (http://mootools.net/license.txt)", + "engines": { + "node": "*" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -4358,6 +4780,15 @@ "memory-pager": "^1.0.2" } }, + "node_modules/specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "license": "MIT", + "bin": { + "specificity": "bin/specificity" + } + }, "node_modules/split": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", @@ -4402,20 +4833,14 @@ } }, "node_modules/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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, - "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" - }, "node_modules/string-argv": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.1.2.tgz", @@ -4465,6 +4890,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-data": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/style-data/-/style-data-1.4.8.tgz", + "integrity": "sha512-RBJD+YQef4PzYKqC4PQEjDvyX709mwEClYg9u0A5EPXqdSkN2BtMnF/tW7EtS9Q0FnBF+lrWsK5+bEKqA+++Dg==", + "license": "MIT", + "dependencies": { + "cheerio": "^0.22.0", + "mediaquery-text": "^1.2.0", + "pick-util": "^1.1.4" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4580,29 +5016,6 @@ "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/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, "node_modules/text-decoder": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", @@ -4622,7 +5035,8 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -4746,9 +5160,9 @@ "license": "MIT" }, "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.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -4779,9 +5193,9 @@ } }, "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", + "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", "license": "MIT", "dependencies": { "buffer": "^5.2.1", @@ -4939,7 +5353,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" }, "node_modules/yargs": { "version": "17.7.2", @@ -4979,9 +5394,9 @@ } }, "node_modules/zod": { - "version": "3.24.2", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", - "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "version": "3.24.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", + "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" From 4fc49fcbfd1c78d341dbefa22ad305f1af251a97 Mon Sep 17 00:00:00 2001 From: KKramer03 Date: Wed, 30 Apr 2025 15:02:03 -0400 Subject: [PATCH 302/317] fixed more formatting issues --- src/pieces/tasks.ts | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index 88a9ead5..b1085a05 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -122,12 +122,13 @@ function formatCurrency(currency:number): string { function calculateDistance(lat1: number, lon1: number, lat2: number, lon2: number): number { const toRadians = (degrees: number) => degrees * (Math.PI / 180); + // eslint-disable-next-line id-length const R = 3958.8; // Radius of the Earth in miles const dLat = toRadians(lat2 - lat1); const dLon = toRadians(lon2 - lon1); - const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) - * Math.sin(dLon / 2) * Math.sin(dLon / 2); + const a = (Math.sin(dLat / 2) * Math.sin(dLat / 2)) + + (Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) + * Math.sin(dLon / 2) * Math.sin(dLon / 2)); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); const distance = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 : R * c; return distance; @@ -349,14 +350,16 @@ export async function generateJobPDF(jobForm: [JobData, Interest, JobResult[]]): // Embed a standard font. + // eslint-disable-next-line @typescript-eslint/no-unused-vars const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman); const HelveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold); + // eslint-disable-next-line @typescript-eslint/no-unused-vars const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica); // Draw the title. const lineHeight = 10; // Height of the line - const lineWidth = (width - margin * 2) / 3; + const lineWidth = (width - (margin * 2)) / 3; currentPage.drawRectangle({ x: margin, @@ -377,7 +380,7 @@ export async function generateJobPDF(jobForm: [JobData, Interest, JobResult[]]): // Draw the third color segment currentPage.drawRectangle({ - x: margin + lineWidth * 2, + x: margin + (lineWidth * 2), y: yPosition + 50, width: lineWidth, height: lineHeight, @@ -410,18 +413,18 @@ export async function generateJobPDF(jobForm: [JobData, Interest, JobResult[]]): for (let i = 0; i < jobs.length; i++) { const job = jobs[i]; - if (yPosition - fontSize * 2 < margin) { + if ((yPosition - (fontSize * 2)) < margin) { currentPage = pdfDoc.addPage(); yPosition = currentPage.getHeight() - margin - 20; } - const maxWidth = width - margin * 2; // Calculate available width + const maxWidth = width - (margin * 2); // Calculate available width const wrappedTitle = wrapText(`${i + 1}. ${job.title}`, HelveticaBold, fontSize + 10, maxWidth); for (const line of wrappedTitle) { // Check if there's enough space for the line - if (yPosition - fontSize * 2 < margin) { + if (yPosition - (fontSize * 2) < margin) { currentPage = pdfDoc.addPage(); yPosition = currentPage.getHeight() - margin - 20; } @@ -469,18 +472,18 @@ export async function generateJobPDF(jobForm: [JobData, Interest, JobResult[]]): for (const point of bulletPoints) { // Check if there's enough space on the page, and add a new page if needed. - if (yPosition - fontSize * 2 < margin) { + if (yPosition - (fontSize * 2) < margin) { currentPage = pdfDoc.addPage(); yPosition = currentPage.getHeight() - margin - 20; } - const maxLabelWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; + const maxLabelWidth = width - (margin * 2) - bulletPointIndent - subBulletPointIndent; const wrappedLabel = wrapText(`• ${point.label}`, HelveticaBold, fontSize + 5, maxLabelWidth); // Draw the wrapped label for (const line of wrappedLabel) { // Check if there's enough space for the line - if (yPosition - fontSize * 2 < margin) { + if (yPosition - (fontSize * 2) < margin) { currentPage = pdfDoc.addPage(); yPosition = currentPage.getHeight() - margin - 20; } @@ -495,7 +498,7 @@ export async function generateJobPDF(jobForm: [JobData, Interest, JobResult[]]): if (point.label === 'Salary' && !noValues) { currentPage.drawImage(imageBytes, { // Change space check so it doesn't go off the page - x: currentPage.getWidth() / 2 - imageDims.width / 2, + x: (currentPage.getWidth() / 2) - (imageDims.width / 2), y: yPosition - imageDims.height - 10, width: imageDims.width, height: imageDims.height @@ -510,13 +513,13 @@ export async function generateJobPDF(jobForm: [JobData, Interest, JobResult[]]): const combinedText = `•${point.value}`; - const maxValueWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; + const maxValueWidth = width - (margin * 2) - bulletPointIndent - subBulletPointIndent; const wrappedValue = wrapText(combinedText, HelveticaBold, fontSize + 4, maxValueWidth); for (const line of wrappedValue) { // Check if there's enough space for the line - if (yPosition - fontSize * 2 < margin) { + if (yPosition - (fontSize * 2) < margin) { currentPage = pdfDoc.addPage(); yPosition = currentPage.getHeight() - margin - 20; } @@ -645,8 +648,6 @@ function formatSalaryforPDF(job: JobResult): string { } async function sortJobResults(jobForm: [JobData, Interest, JobResult[]], filterBy: string): Promise { - const cityCoordinates = await queryCoordinates(jobForm[0].city); - if (filterBy === 'salary') { jobForm[2].sort((a, b) => { const avgA = (Number(a.salaryMax) + Number(a.salaryMin)) / 2; @@ -663,8 +664,6 @@ async function sortJobResults(jobForm: [JobData, Interest, JobResult[]], filterB } else if (filterBy === 'date') { jobForm[2].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); } else if (filterBy === 'distance') { - // cityCoordinates = await this.queryCoordinates(jobForm[0].city); - jobForm[2].sort((a, b) => { const distanceA = a.distance; const distanceB = b.distance; From 68274dee326a353c271fedaf37af428de2424aa4 Mon Sep 17 00:00:00 2001 From: jmartgmz Date: Wed, 30 Apr 2025 18:30:36 -0400 Subject: [PATCH 303/317] Merged main --- .github/workflows/node.js.yml | 1 + .gitignore | 4 +- assets/images/header.png | Bin 0 -> 252 bytes binding.gyp | 8 + build/binding.sln | 19 + build/config.gypi | 172 ++- build/sage.vcxproj | 146 ++ build/sage.vcxproj.filters | 58 + config.example.ts | 12 + install-deps-mac.sh | 4 +- install-deps-windows.ps1 | 2 +- npm | 0 package-lock.json | 2424 ++++++++++++++++++++++++++------- package.json | 9 +- src/commands/jobs/jobform.ts | 29 +- src/commands/jobs/jobs.ts | 659 +++++++-- src/pieces/tasks.ts | 2 +- 17 files changed, 2926 insertions(+), 623 deletions(-) create mode 100644 assets/images/header.png create mode 100644 binding.gyp create mode 100644 build/binding.sln create mode 100644 build/sage.vcxproj create mode 100644 build/sage.vcxproj.filters create mode 100644 npm diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 289e6543..739255bf 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -24,6 +24,7 @@ jobs: 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 diff --git a/.gitignore b/.gitignore index 23593b77..d072299c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,11 @@ resources/* !resources/.exists src/commands/admin/eval.ts - +build config.ts + + # macOS stuff .DS_Store diff --git a/assets/images/header.png b/assets/images/header.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e3b3dd8a90f07c56040719f75ba2a526d49e00 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0y~yU@Zr-g*cdiJ!V4+StVT-?T1&?xLuvWlsvWSyeO1_frph!+JX{a;jb`+EHtES~<{3#1gb_3#0WV))l`8bq1IumQ;h4~;+^-sy}$GGhl1kaRel3KEji lV+N8J3M7GKLmTN@j`5q + + + + Debug + x64 + + + Release + x64 + + + + {27A859CD-4D6B-679F-943D-8D47ADCCBA5E} + 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\selin\AppData\Local\node-gyp\Cache\23.9.0\include\node;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\src;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\config;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\openssl\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\uv\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\zlib;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.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\\selin\\AppData\\Local\\node-gyp\\Cache\\23.9.0\\x64\\node.lib" + /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) + node.exe;%(DelayLoadDLLs) + true + true + true + $(OutDir)$(ProjectName).node + true + .node + MachineX64 + + + C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\include\node;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\src;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\config;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\openssl\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\uv\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\zlib;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.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\selin\AppData\Local\node-gyp\Cache\23.9.0\include\node;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\src;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\config;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\openssl\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\uv\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\zlib;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.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\\selin\\AppData\\Local\\node-gyp\\Cache\\23.9.0\\x64\\node.lib" + /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) + node.exe;%(DelayLoadDLLs) + true + true + true + $(OutDir)$(ProjectName).node + true + .node + MachineX64 + + + C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\include\node;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\src;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\config;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\openssl\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\uv\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\zlib;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.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..25be227f --- /dev/null +++ b/build/sage.vcxproj.filters @@ -0,0 +1,58 @@ + + + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8CDEE807-BC53-E450-C8B8-4DEBB66742D4} + + + {7B735499-E5DD-1C2B-6C26-70023832A1CF} + + + {E9F714C1-DA89-54E2-60CF-39FEB20BF756} + + + {45B03FE7-4348-5CE5-27CA-49253FE45921} + + + {F852EB63-437C-846A-220F-8D9ED6DAEC1D} + + + {D51E5808-912B-5C70-4BB7-475D1DBFA067} + + + {741E0E76-39B2-B1AB-9FA1-F1A20B16F295} + + + {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\selin\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\src + + + .. + + + diff --git a/config.example.ts b/config.example.ts index 5eb2e8d7..1cf95c5b 100644 --- a/config.example.ts +++ b/config.example.ts @@ -1,4 +1,7 @@ interface Config { + APP_ID: string; + APP_KEY: string; + MAP_KEY: string; DB_CONNECTION: string; BOT_NAME: string; BOT_TOKEN: string; @@ -7,6 +10,7 @@ interface Config { DB_PVQ: string; DB_QTAGS: string; DB_ASSIGNABLE: string; + DB_JOB_FORMS: string; DB_COURSES: string; DB_REMINDERS: string; DB_CLIENT_DATA: string; @@ -54,6 +58,9 @@ function getEnvVar(name: keyof Config): string { } export const config: Config = { + APP_ID: getEnvVar('APP_ID'), + APP_KEY: getEnvVar('APP_KEY'), + MAP_KEY: getEnvVar('MAP_KEY'), DB_CONNECTION: getEnvVar('DB_CONNECTION'), BOT_NAME: getEnvVar('BOT_NAME'), BOT_TOKEN: getEnvVar('BOT_TOKEN'), @@ -63,6 +70,7 @@ export const config: Config = { DB_QTAGS: getEnvVar('DB_QTAGS'), DB_ASSIGNABLE: getEnvVar('DB_ASSIGNABLE'), DB_COURSES: getEnvVar('DB_COURSES'), + DB_JOB_FORMS: getEnvVar('DB_JOB_FORMS'), DB_REMINDERS: getEnvVar('DB_REMINDERS'), DB_CLIENT_DATA: getEnvVar('DB_CLIENT_DATA'), DB_POLLS: getEnvVar('DB_POLLS'), @@ -147,6 +155,7 @@ export const DB = { CONNECTION: config.DB_CONNECTION, USERS: config.DB_USERS, PVQ: config.DB_PVQ, + JOB_FORMS: config.DB_JOB_FORMS, QTAGS: config.DB_QTAGS, ASSIGNABLE: config.DB_ASSIGNABLE, COURSES: config.DB_COURSES, @@ -211,6 +220,9 @@ export const PREFIX = config.PREFIX; export const BLACKLIST = [config.BLACKLIST]; export const GITHUB_TOKEN = config.ENV_GITHUB_TOKEN; +export const APP_ID = config.APP_ID; +export const APP_KEY = config.APP_KEY; +export const MAP_KEY = config.MAP_KEY; // eslint-disable-next-line prefer-destructuring export const MONGO = config.MONGO; diff --git a/install-deps-mac.sh b/install-deps-mac.sh index d7331c83..80b2beeb 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 +fi diff --git a/install-deps-windows.ps1 b/install-deps-windows.ps1 index 7890943f..5ad08195 100644 --- a/install-deps-windows.ps1 +++ b/install-deps-windows.ps1 @@ -72,4 +72,4 @@ if (!(Test-Path $bindingGypPath)) { 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!" \ No newline at end of file +Write-Host "All dependencies installed successfully!" diff --git a/npm b/npm new file mode 100644 index 00000000..e69de29b diff --git a/package-lock.json b/package-lock.json index f129d321..395f9f37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,18 +13,19 @@ "@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.6.3", - "node": "^20.19.0", "node-cron": "^2.0.3", "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", - "parse-duration": "^0.4.4", - "pretty-ms": "^7.0.1" + "parse-duration": "^2.1.3", + "pdf-lib": "^1.17.1", + "pretty-ms": "^7.0.1", + "puppeteer": "^24.6.0" }, "devDependencies": { "@types/console-stamp": "^0.2.33", @@ -47,16 +48,15 @@ "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, "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==", - "dev": true, + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -65,11 +65,11 @@ "version": "7.17.12", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", - "dev": true, "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" @@ -79,7 +79,6 @@ "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, "dependencies": { "color-convert": "^1.9.0" }, @@ -91,7 +90,6 @@ "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, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -105,7 +103,6 @@ "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, "dependencies": { "color-name": "1.1.3" } @@ -113,14 +110,12 @@ "node_modules/@babel/highlight/node_modules/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 + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "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, "engines": { "node": ">=0.8.0" } @@ -129,7 +124,6 @@ "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, "engines": { "node": ">=4" } @@ -138,7 +132,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -147,32 +140,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", @@ -183,26 +170,20 @@ } }, "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", @@ -224,9 +205,9 @@ } }, "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", @@ -234,10 +215,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" @@ -258,12 +239,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", @@ -277,20 +252,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" @@ -311,17 +286,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", @@ -342,6 +312,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" } @@ -350,7 +321,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", @@ -366,30 +339,12 @@ "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" - } - }, "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" @@ -403,6 +358,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" } @@ -412,6 +368,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" @@ -424,6 +381,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" } @@ -432,6 +390,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", @@ -446,6 +405,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", @@ -456,6 +416,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", @@ -463,16 +424,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" @@ -482,16 +445,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": { @@ -502,6 +467,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", @@ -515,6 +481,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", @@ -525,6 +492,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", @@ -533,17 +501,105 @@ } }, "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": "^12.11.0" + } + }, + "node_modules/@pdf-lib/standard-fonts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "license": "MIT", + "dependencies": { + "pako": "^1.0.6" + } + }, + "node_modules/@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "license": "MIT", + "dependencies": { + "pako": "^1.0.10" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.9.0.tgz", + "integrity": "sha512-8+xM+cFydYET4X/5/3yZMHs7sjS6c9I6H5I3xJdb6cinzxWUT/I2QVw4avxCQ8QDndwdHkG/FiSZIrCjAbaKvQ==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.0", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.1", + "tar-fs": "^3.0.8", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@puppeteer/browsers/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@puppeteer/browsers/node_modules/tar-fs": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/@puppeteer/browsers/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^11.2.0" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.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", @@ -573,14 +629,20 @@ "npm": ">=7.0.0" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, "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": { @@ -588,21 +650,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": "*" @@ -615,67 +680,68 @@ "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": "*" } }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@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, + "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "4.33.0", "@typescript-eslint/scope-manager": "4.33.0", @@ -708,6 +774,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", @@ -727,29 +794,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", @@ -777,6 +827,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" @@ -794,6 +845,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" }, @@ -807,6 +859,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", @@ -834,6 +887,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" @@ -859,13 +913,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" }, @@ -878,6 +934,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" } @@ -886,6 +943,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" }, @@ -898,6 +956,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", @@ -914,6 +973,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" } @@ -922,6 +982,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" } @@ -930,6 +991,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" }, @@ -943,12 +1005,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" @@ -958,9 +1023,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", @@ -975,6 +1041,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" } @@ -984,15 +1051,29 @@ "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" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/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, + "license": "MIT", "engines": { "node": ">=8" } @@ -1000,28 +1081,108 @@ "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" } }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" + }, "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/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.2.tgz", + "integrity": "sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } }, "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", @@ -1037,15 +1198,26 @@ } ] }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "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" @@ -1055,40 +1227,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", @@ -1103,39 +1273,61 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, - "node_modules/callsites": { - "version": "3.1.0", + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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, "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" @@ -1151,14 +1343,43 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", "engines": { "node": ">=10" } }, + "node_modules/chromium-bidi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-3.0.0.tgz", + "integrity": "sha512-ZOGRDAhBMX1uxL2Cm2TDuhImbrsEz5A/tTcVU6RpXEWaTNUNwsHW6njUXizh51Ir6iqHbKAfhA2XK33uBcLo5A==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/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==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1169,12 +1390,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" } @@ -1183,6 +1406,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" }, @@ -1193,35 +1417,84 @@ "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/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, "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", @@ -1231,20 +1504,31 @@ "node": ">= 8" } }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/dateformat": { "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" @@ -1256,26 +1540,55 @@ } }, "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/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } }, "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" } @@ -1283,12 +1596,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" } @@ -1296,21 +1611,30 @@ "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" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1425554", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", + "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==", + "license": "BSD-3-Clause" + }, "node_modules/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, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -1319,29 +1643,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" @@ -1355,6 +1679,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" }, @@ -1362,34 +1687,134 @@ "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/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "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/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "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" }, @@ -1397,11 +1822,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/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==", + "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", @@ -1459,6 +1916,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" @@ -1468,10 +1926,40 @@ } }, "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, + "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" }, @@ -1482,29 +1970,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" } @@ -1514,6 +1995,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", @@ -1528,6 +2010,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" } @@ -1536,7 +2019,6 @@ "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, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -1546,10 +2028,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" }, @@ -1562,6 +2045,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" } @@ -1571,6 +2055,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" }, @@ -1583,6 +2068,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" } @@ -1592,6 +2078,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" } @@ -1600,7 +2087,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1610,6 +2096,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", @@ -1620,22 +2107,59 @@ "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/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, "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-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "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" @@ -1645,28 +2169,58 @@ "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" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/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, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -1675,10 +2229,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" }, @@ -1687,12 +2242,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": { @@ -1700,21 +2257,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" }, @@ -1725,12 +2284,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": { @@ -1741,12 +2302,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" }, @@ -1754,21 +2323,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", @@ -1784,10 +2378,93 @@ "node": ">=10" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 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/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", + "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "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", @@ -1808,6 +2485,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" }, @@ -1816,10 +2494,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" }, @@ -1835,6 +2514,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", @@ -1850,23 +2530,99 @@ "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/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } }, "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" @@ -1879,7 +2635,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", @@ -1893,13 +2648,15 @@ "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" } @@ -1908,7 +2665,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1925,6 +2681,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -1933,21 +2690,56 @@ "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" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "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/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "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" } @@ -1956,6 +2748,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" } @@ -1965,6 +2758,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" }, @@ -1977,6 +2771,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" } @@ -1985,6 +2780,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" } @@ -1992,25 +2788,27 @@ "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 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "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" @@ -2019,23 +2817,55 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" + }, + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "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" @@ -2044,6 +2874,12 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2054,12 +2890,14 @@ "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", @@ -2068,14 +2906,12 @@ "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" - }, + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/magic-bytes.js": { @@ -2088,6 +2924,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" }, @@ -2099,9 +2936,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" } @@ -2112,10 +2950,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": { @@ -2123,17 +2971,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": { @@ -2144,6 +2994,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" } @@ -2152,6 +3003,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" }, @@ -2160,11 +3012,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" @@ -2174,6 +3027,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" }, @@ -2181,21 +3035,20 @@ "node": "*" } }, - "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" - }, - "engines": { - "node": ">=8" + "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/minizlib": { "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" @@ -2204,10 +3057,29 @@ "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/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, "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" }, @@ -2215,15 +3087,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": "*" } @@ -2267,64 +3147,65 @@ } } }, - "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": { - "version": "20.19.0", - "resolved": "https://registry.npmjs.org/node/-/node-20.19.0.tgz", - "integrity": "sha512-upEH46DT6+wF3J8Q7tnmB8Kh0m+xYcBdaIluOxjR9ZnM5lpabfZIBfXNYWUxOhxTQLu23J4MiNXkUOeFHPrqdA==", - "hasInstallScript": true, - "license": "ISC", + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "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": { - "node-bin-setup": "^1.0.0" - }, - "bin": { - "node": "bin/node" + "semver": "^7.3.5" }, "engines": { - "npm": ">=5.0.0" + "node": ">=10" } }, - "node_modules/node-bin-setup": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", - "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", - "license": "ISC" + "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" @@ -2334,9 +3215,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" }, @@ -2353,9 +3235,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" } @@ -2364,6 +3247,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" }, @@ -2378,6 +3262,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", @@ -2389,6 +3275,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" } @@ -2397,6 +3284,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" } @@ -2405,6 +3293,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" } @@ -2413,6 +3302,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" }, @@ -2421,27 +3311,87 @@ } }, "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" } }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, "node_modules/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, "dependencies": { "callsites": "^3.0.0" }, @@ -2450,14 +3400,34 @@ } }, "node_modules/parse-duration": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.4.4.tgz", - "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.3.tgz", + "integrity": "sha512-MtbharL7Bets65qDBXuDOHHWyY1BxTJZmJ/xGmS90iEbKE0gZ6yZpZtCda7O79GeOi/f0NwBaplIuReExIoVsw==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "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" } @@ -2466,6 +3436,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" } @@ -2475,6 +3446,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" } @@ -2484,6 +3456,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" } @@ -2493,15 +3466,50 @@ "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/pdf-lib": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "license": "MIT", + "dependencies": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + } + }, + "node_modules/pdf-lib/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/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" }, @@ -2509,11 +3517,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" } @@ -2522,6 +3557,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" }, @@ -2535,27 +3571,70 @@ "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, "engines": { "node": ">=0.4.0" } }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "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" }, @@ -2563,18 +3642,90 @@ "ps-tree": "bin/ps-tree.js" }, "engines": { - "node": ">= 0.10" + "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.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" + } + }, + "node_modules/puppeteer": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.6.0.tgz", + "integrity": "sha512-wYTB8WkzAr7acrlsp+0at1PZjOJPOxe6dDWKOG/kaX4Zjck9RXCFx3CtsxsAGzPn/Yv6AzgJC/CW1P5l+qxsqw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.9.0", + "chromium-bidi": "3.0.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1425554", + "puppeteer-core": "24.6.0", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.6.0.tgz", + "integrity": "sha512-Cukxysy12m0v350bhl/Gzof0XQYmtON9l2VvGp3D4BOQZVgyf+y5wIpcjDZQ/896Okoi95dKRGRV8E6a7SYAQQ==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.9.0", + "chromium-bidi": "3.0.0", + "debug": "^4.4.0", + "devtools-protocol": "0.0.1425554", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.1" + }, + "engines": { + "node": ">=18" } }, - "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==", - "dev": true, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -2593,12 +3744,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", @@ -2612,13 +3789,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" }, @@ -2630,15 +3809,26 @@ "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" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/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, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2647,16 +3837,16 @@ "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, "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" @@ -2666,6 +3856,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" }, @@ -2695,6 +3887,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -2716,12 +3909,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" @@ -2731,12 +3926,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" }, @@ -2747,13 +3940,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" }, @@ -2766,6 +3961,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" } @@ -2773,7 +3969,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", @@ -2792,14 +3989,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" } @@ -2809,6 +4022,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2818,6 +4032,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", @@ -2830,10 +4045,68 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", "optional": true, "dependencies": { "memory-pager": "^1.0.2" @@ -2844,6 +4117,7 @@ "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", "dev": true, + "license": "MIT", "dependencies": { "through": "2" }, @@ -2855,21 +4129,37 @@ "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" } }, + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/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==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -2877,13 +4167,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" } @@ -2892,6 +4184,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", @@ -2905,6 +4198,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" }, @@ -2917,6 +4211,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" }, @@ -2928,6 +4223,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" }, @@ -2936,10 +4232,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", @@ -2952,15 +4249,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", @@ -2971,29 +4269,109 @@ "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/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" } }, "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", @@ -3006,6 +4384,7 @@ "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" }, @@ -3016,7 +4395,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", @@ -3029,6 +4409,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", @@ -3047,9 +4428,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": { @@ -3057,6 +4438,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" }, @@ -3071,13 +4453,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" }, @@ -3090,6 +4486,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" }, @@ -3097,44 +4494,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "license": "MIT" + }, "node_modules/typescript": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "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" } @@ -3142,23 +4548,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" @@ -3169,6 +4579,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" }, @@ -3183,28 +4594,48 @@ "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" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "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" @@ -3222,10 +4653,65 @@ } } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zod": { + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index c4ad313c..fad84fe0 100644 --- a/package.json +++ b/package.json @@ -39,18 +39,19 @@ "@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.6.3", - "node": "^20.19.0", "node-cron": "^2.0.3", "node-fetch": "^2.6.1", "nodemailer": "^6.4.17", - "parse-duration": "^0.4.4", - "pretty-ms": "^7.0.1" + "parse-duration": "^2.1.3", + "pdf-lib": "^1.17.1", + "pretty-ms": "^7.0.1", + "puppeteer": "^24.6.0" }, "_moduleAliases": { "@root": "dist", 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/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index a74677b2..3c115911 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -1,4 +1,15 @@ -import { ApplicationCommandOptionData, ApplicationCommandOptionType, AttachmentBuilder, ChatInputCommandInteraction, InteractionResponse } from 'discord.js'; +import { + ApplicationCommandOptionData, + ApplicationCommandOptionType, + ChatInputCommandInteraction, + EmbedBuilder, + ActionRowBuilder, + ButtonBuilder, + ButtonStyle, + ComponentType, + InteractionResponse, + AttachmentBuilder +} 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'; @@ -6,9 +17,13 @@ import { JobData } from '@root/src/lib/types/JobData'; import { Command } from '@lib/types/Command'; import { DB, BOT, MAP_KEY } from '@root/config'; import { MongoClient } from 'mongodb'; -import { sendToFile } from '@root/src/lib/utils/generalUtils'; +// import { sendToFile } from '@root/src/lib/utils/generalUtils'; import axios from 'axios'; import { JobPreferences } from '@root/src/lib/types/JobPreferences'; +import { PDFDocument, PDFFont, StandardFonts, rgb } from 'pdf-lib'; + +// Temporary storage for user job data +const userJobData = new Map(); export default class extends Command { @@ -23,30 +38,215 @@ export default class extends Command { type: ApplicationCommandOptionType.String, required: false, choices: [ - { name: 'Date Posted', value: 'date' }, - { name: 'Salary', value: 'salary' }, - { name: 'Alphabetical', value: 'alphabetical' }, - {name: 'Distance', value: 'distance' } + { name: 'Date Posted: recent', value: 'date' }, + { name: 'Salary: high-low average', value: 'salary' }, + { name: 'Alphabetical: A-Z', value: 'alphabetical' }, + { name: 'Distance: shortest-longest', value: 'distance' } ] } - ] + ]; + + // -------------------ADDED PDF GENERATATOR METHOD---------------------- + private async generateJobPDF(jobs: JobResult[]): Promise { + // Create a new PDF document. + const pdfDoc = await PDFDocument.create(); + let currentPage = pdfDoc.addPage(); + const { width, height } = currentPage.getSize(); + const margin = 40; + let yPosition = height - margin - 50; + const fontSize = 10; + const titleFontSize = 30; + const bulletPointIndent = 20; + const subBulletPointIndent = 30; // Indentation for sub-bullet points + + + // Embed a standard font. + // const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman); + const HelveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold); + // const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica); + + + // Draw the title. + const lineHeight = 10; // Height of the line + const lineWidth = (width - (margin * 2)) / 3; + + currentPage.drawRectangle({ + x: margin, + y: yPosition + 50, + width: lineWidth, + height: lineHeight, + color: rgb(135 / 255, 59 / 255, 29 / 255) // red color + }); + + // Draw the second color segment + currentPage.drawRectangle({ + x: margin + lineWidth, + y: yPosition + 50, + width: lineWidth, + height: lineHeight, + color: rgb(237 / 255, 118 / 255, 71 / 255) // orangey color + }); + + // Draw the third color segment + currentPage.drawRectangle({ + x: margin + (lineWidth * 2), + y: yPosition + 50, + width: lineWidth, + height: lineHeight, + color: rgb(13 / 255, 158 / 255, 198 / 255) // Blue color + }); + + yPosition -= 40; // Adjust spacing below the line + + + currentPage.drawText('List of Jobs PDF', { + x: margin, + y: yPosition + 50, + size: titleFontSize, + font: HelveticaBold, + + color: rgb(114 / 255, 53 / 255, 9 / 255) + }); + yPosition -= 40; + + currentPage.drawRectangle({ + x: margin, + y: yPosition + 50, + width: lineWidth / 2, + height: lineHeight - 8, + color: rgb(135 / 255, 59 / 255, 29 / 255) // red color + }); + yPosition -= 10; + + // Loop through each job and add its details. + for (let i = 0; i < jobs.length; i++) { + const job = jobs[i]; + + if (yPosition - (fontSize * 2) < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin - 20; + } + + const maxWidth = width - (margin * 2); // Calculate available width + const wrappedTitle = this.wrapText(`${i + 1}. ${job.title}`, HelveticaBold, fontSize + 10, maxWidth); + + + for (const line of wrappedTitle) { + // Check if there's enough space for the line + if (yPosition - (fontSize * 2) < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin - 20; + } - async run(interaction: ChatInputCommandInteraction): Promise> { - const userID = interaction.user.id; + currentPage.drawText(line, { + x: margin, + y: yPosition + 30, + size: fontSize + 10, + font: HelveticaBold, + color: rgb(241 / 255, 113 / 255, 34 / 255) + }); + + yPosition -= 30; // Adjust spacing between lines + } + + // Draw the bullet points for location, salary, and apply link. + const bulletPoints = [ + { label: 'Location', value: job.location }, + { label: 'Salary', value: this.formatSalaryforPDF(job) }, + { label: 'Apply Here', value: job.link } + ]; + + for (const point of bulletPoints) { + // Check if there's enough space on the page, and add a new page if needed. + if (yPosition - (fontSize * 2) < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin - 20; + } - const client = await MongoClient.connect(DB.CONNECTION, { useUnifiedTopology: true }); - const db = client.db(BOT.NAME).collection(DB.USERS); - const filterBy = interaction.options.getString('filter') ?? 'default'; + const maxLabelWidth = width - (margin * 2) - bulletPointIndent - subBulletPointIndent; + const wrappedLabel = this.wrapText(`• ${point.label}`, HelveticaBold, fontSize + 5, maxLabelWidth); + + // Draw the wrapped label + for (const line of wrappedLabel) { + // Check if there's enough space for the line + if (yPosition - (fontSize * 2) < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin - 20; + } + + currentPage.drawText(line, { + x: margin + bulletPointIndent, + y: yPosition + 25, + size: fontSize + 5, + font: HelveticaBold, + color: rgb(94 / 255, 74 / 255, 74 / 255) + }); + + yPosition -= fontSize + 10; // Adjust spacing between lines + } + + + const combinedText = `•${point.value}`; + const maxValueWidth = width - (margin * 2) - bulletPointIndent - subBulletPointIndent; + const wrappedValue = this.wrapText(combinedText, HelveticaBold, fontSize + 4, maxValueWidth); + + + for (const line of wrappedValue) { + // Check if there's enough space for the line + if (yPosition - (fontSize * 2) < margin) { + currentPage = pdfDoc.addPage(); + yPosition = currentPage.getHeight() - margin - 20; + } + + currentPage.drawText(line, { + x: margin + bulletPointIndent + subBulletPointIndent, + y: yPosition + 20, + size: fontSize + 3, + font: HelveticaBold, + color: rgb(13 / 255, 158 / 255, 198 / 255) + }); + + yPosition -= fontSize + 5; // Adjust spacing between lines + } + + yPosition -= 20; // Add extra spacing between items + } + + yPosition -= 40; // Add extra spacing between jobs. + } + + + const pdfBytes = await pdfDoc.save(); + return Buffer.from(pdfBytes); + } + async run( + interaction: ChatInputCommandInteraction + ): Promise> { + const userID = interaction.user.id; + const filterBy = interaction.options.getString('filter') ?? 'salary'; - const jobformAnswers: JobPreferences | null = (await db.findOne({ discordId: userID }))?.jobPreferences; + const client = await MongoClient.connect(DB.CONNECTION, { + useUnifiedTopology: true + }); + const db = client.db(BOT.NAME).collection(DB.USERS); + const jobformAnswers: JobPreferences | null = ( + await db.findOne({ discordId: userID }) + )?.jobPreferences; + + if (!jobformAnswers) { + await interaction.reply( + "You haven't set up your job preferences yet. Please use `/jobform` first." + ); + return; + } const jobData: JobData = { city: jobformAnswers.answers.city, - preference: jobformAnswers.answers.workType, - jobType: jobformAnswers.answers.employmentType, + preference: jobformAnswers.answers.employmentType, + jobType: jobformAnswers.answers.workType, distance: jobformAnswers.answers.travelDistance, - filterBy: 'default' + filterBy: filterBy }; const interests: Interest = { @@ -57,41 +257,232 @@ export default class extends Command { interest5: jobformAnswers.answers.interest5 }; - const APIResponse:JobResult[] = await fetchJobListings(jobData, interests); - const jobFormData: [JobData, Interest, JobResult[]] = [jobData, interests, APIResponse]; - - const 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: - - ${await this.listJobs(jobFormData, 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. - `; - - const attachments: AttachmentBuilder[] = []; - const pubChan = interaction.channel; - if (message.length > 2000) { - attachments.push(await sendToFile(this.stripMarkdown(message.split('---')[0], userID), 'txt', 'list-of-jobs-internships', false)); - pubChan.send({ content: this.headerMessage(userID, filterBy), files: attachments as AttachmentBuilder[] }); - // interaction.user.send({ content: this.headerMessage(userID, 'default'), files: attachments as AttachmentBuilder[] }); - } else { - pubChan.send(message); + const APIResponse: JobResult[] = await fetchJobListings( + jobData, + interests + ); + + if (APIResponse.length === 0) { + await interaction.reply('No jobs found based on your interests.'); + return; } + + // Store job data for the user + userJobData.set(userID, { jobs: APIResponse, index: 0 }); + + // Create embed and buttons for the first job + const { embed, row } = this.createJobEmbed( + APIResponse[0], + 0, + APIResponse.length + ); + await interaction.reply({ embeds: [embed], components: [row] }); + + // Listen for button interactions + const collector = interaction.channel?.createMessageComponentCollector({ + componentType: ComponentType.Button, + time: 60000 // 1 minute timeout + }); + + collector?.on('collect', async (i) => { + if (i.user.id !== userID) { + await i.reply({ + content: 'This is not your interaction!', + ephemeral: true + }); + return; + } + + const userData = userJobData.get(userID); + if (!userData) return; + + const { jobs } = userData; + let { index } = userData; + + switch (i.customId) { + case 'previous': + index = index > 0 ? index - 1 : jobs.length - 1; + break; + case 'next': + index = index < jobs.length - 1 ? index + 1 : 0; + break; + case 'remove': + jobs.splice(index, 1); + if (jobs.length === 0) { + await i.update({ + content: 'No more jobs to display.', + embeds: [], + components: [] + }); + userJobData.delete(userID); + return; + } + index = index >= jobs.length ? 0 : index; + break; + // ----------------ADDED DOWNLOAD BUTTON-------------------- + case 'download': + await i.deferReply({ ephemeral: true }); + try { + // Generate the PDF from all stored jobs. + const pdfBuffer = await this.generateJobPDF(jobs); + const attachment = new AttachmentBuilder( + pdfBuffer + ).setName('jobs.pdf'); + await i.editReply({ + content: + 'Here is your PDF file with all job listings:', + files: [attachment] + }); + } catch (error) { + console.error('Error generating PDF:', error); + await i.editReply({ + content: + 'An error occurred while generating the PDF. Please try again later.' + }); + } + return; // Exit early so we don't update the embed. + } + + // Update user data + userJobData.set(userID, { jobs, index }); + + // Update embed and buttons + const newEmbed = this.createJobEmbed( + APIResponse[index], + index, + APIResponse.length + ); + await i.update({ embeds: [newEmbed.embed], components: [newEmbed.row] }); + }); + + collector?.on('end', () => { + userJobData.delete(userID); + }); } - async listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: string): Promise { - // Conditionally sort jobs by salary if sortBy is 'salary' + wrapText(text: string, font: PDFFont, fontSize: number, maxWidth: number): string[] { + const words = text.split(' '); + const lines: string[] = []; + let currentLine = ''; + + for (const word of words) { + const testLine = currentLine ? `${currentLine} ${word}` : word; + const textWidth = font.widthOfTextAtSize(testLine, fontSize); + + if (textWidth <= maxWidth) { + currentLine = testLine; + } else { + if (currentLine) { + lines.push(currentLine); + } + currentLine = ''; + + // Handle long words that exceed maxWidth + let remainingWord = word; + while (font.widthOfTextAtSize(remainingWord, fontSize) > maxWidth) { + const splitIndex = Math.floor((maxWidth / font.widthOfTextAtSize(remainingWord, fontSize)) * remainingWord.length); + const chunk = remainingWord.slice(0, splitIndex); + lines.push(chunk); + remainingWord = remainingWord.slice(splitIndex); + } + currentLine = remainingWord; + } + } + + if (currentLine) { + lines.push(currentLine); + } + + return lines; + } + + createJobEmbed( + job: JobResult, + index: number, + totalJobs: number + ): { embed: EmbedBuilder; row: ActionRowBuilder } { + const embed = new EmbedBuilder() + .setTitle(job.title) + .setDescription( + `**Location:** ${job.location}\n**Date Posted:** ${new Date( + job.created + ).toDateString()}` + ) + .addFields( + { name: 'Salary', value: this.formatSalary(job), inline: true }, + { + name: 'Apply Here', + value: `[Click here](${job.link})`, + inline: true + } + ) + .setFooter({ text: `Job ${index + 1} of ${totalJobs}` }) + .setColor('#0099ff'); + + const row = new ActionRowBuilder().addComponents( + new ButtonBuilder() + .setCustomId('previous') + .setLabel('Previous') + .setStyle(ButtonStyle.Primary) + .setDisabled(totalJobs === 1), + new ButtonBuilder() + .setCustomId('remove') + .setLabel('Remove') + .setStyle(ButtonStyle.Danger) + .setDisabled(totalJobs === 1), + new ButtonBuilder() + .setCustomId('next') + .setLabel('Next') + .setStyle(ButtonStyle.Primary) + .setDisabled(totalJobs === 1), + // ----------------ADDED DOWNLOAD BUTTON------------------- + new ButtonBuilder() + .setCustomId('download') + .setLabel('Download') + .setStyle(ButtonStyle.Success) + ); + + return { embed, row }; + } + + formatSalary(job: JobResult): string { + const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; + const formattedAvgSalary = this.formatCurrency(avgSalary); + const formattedSalaryMax + = this.formatCurrency(Number(job.salaryMax)) !== 'N/A' + ? this.formatCurrency(Number(job.salaryMax)) + : ''; + const formattedSalaryMin + = this.formatCurrency(Number(job.salaryMin)) !== 'N/A' + ? this.formatCurrency(Number(job.salaryMin)) + : ''; + + return formattedSalaryMin && formattedSalaryMax + ? `Avg: ${formattedAvgSalary}\nMin: ${formattedSalaryMin}\nMax: ${formattedSalaryMax}` + : formattedAvgSalary; + } + + formatSalaryforPDF(job: JobResult): string { + const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; + const formattedAvgSalary = this.formatCurrency(avgSalary); + const formattedSalaryMax + = this.formatCurrency(Number(job.salaryMax)) !== 'N/A' + ? this.formatCurrency(Number(job.salaryMax)) + : ''; + const formattedSalaryMin + = this.formatCurrency(Number(job.salaryMin)) !== 'N/A' + ? this.formatCurrency(Number(job.salaryMin)) + : ''; + + return formattedSalaryMin && formattedSalaryMax + ? `Avg: ${formattedAvgSalary}, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` + : formattedAvgSalary; + } + + async listJobs( + jobForm: [JobData, Interest, JobResult[]], + filterBy: string + ): Promise { const cityCoordinates = await this.queryCoordinates(jobForm[0].city); if (filterBy === 'salary') { @@ -99,110 +490,170 @@ Here's your personalized list: 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(avgA)) return 1; if (isNaN(avgB)) return -1; - return avgB - avgA; // Descending order + return avgB - avgA; }); } else if (filterBy === 'alphabetical') { - jobForm[2].sort((a, b) => (a.title > b.title ? 1 : -1)); + jobForm[2].sort((a, b) => a.title > b.title ? 1 : -1); } else if (filterBy === 'date') { - jobForm[2].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); + jobForm[2].sort( + (a, b) => + new Date(b.created).getTime() - + new Date(a.created).getTime() + ); } else if (filterBy === 'distance') { - // cityCoordinates = await this.queryCoordinates(jobForm[0].city); - jobForm[2].sort((a, b) => { - const distanceA = this.calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(a.latitude), Number(a.longitude)); - const distanceB = this.calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(b.latitude), Number(b.longitude)); + const distanceA = this.calculateDistance( + cityCoordinates.lat, + cityCoordinates.lng, + Number(a.latitude), + Number(a.longitude) + ); + const distanceB = this.calculateDistance( + cityCoordinates.lat, + cityCoordinates.lng, + Number(b.latitude), + Number(b.longitude) + ); if (distanceA === -1) { - return 1; // Treat jobs with no location as lowest + return 1; } - return distanceA - distanceB; // Might have to account for negative distances + return distanceA - distanceB; }); } - - let jobList = ''; for (let i = 0; i < jobForm[2].length; i++) { - const avgSalary = (Number(jobForm[2][i].salaryMax) + Number(jobForm[2][i].salaryMin)) / 2; + const avgSalary + = (Number(jobForm[2][i].salaryMax) + + Number(jobForm[2][i].salaryMin)) + / 2; const formattedAvgSalary = this.formatCurrency(avgSalary); - const formattedSalaryMax = this.formatCurrency(Number(jobForm[2][i].salaryMax)) !== 'N/A' ? this.formatCurrency(Number(jobForm[2][i].salaryMax)) : ''; - const formattedSalaryMin = this.formatCurrency(Number(jobForm[2][i].salaryMin)) !== 'N/A' ? this.formatCurrency(Number(jobForm[2][i].salaryMin)) : ''; - const jobDistance = this.calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(jobForm[2][i].latitude), Number(jobForm[2][i].longitude)); - const formattedDistance = (jobDistance !== -1) ? `${jobDistance.toFixed(2)} miles` : 'N/A'; - - const salaryDetails = (formattedSalaryMin && formattedSalaryMax) - ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` - : formattedAvgSalary; + const formattedSalaryMax + = this.formatCurrency(Number(jobForm[2][i].salaryMax)) !== 'N/A' + ? this.formatCurrency(Number(jobForm[2][i].salaryMax)) + : ''; + const formattedSalaryMin + = this.formatCurrency(Number(jobForm[2][i].salaryMin)) !== 'N/A' + ? this.formatCurrency(Number(jobForm[2][i].salaryMin)) + : ''; + const jobDistance = this.calculateDistance( + cityCoordinates.lat, + cityCoordinates.lng, + Number(jobForm[2][i].latitude), + Number(jobForm[2][i].longitude) + ); + const formattedDistance + = jobDistance !== -1 ? `${jobDistance.toFixed(2)} miles` : 'N/A'; + + const salaryDetails + = formattedSalaryMin && formattedSalaryMax + ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` + : formattedAvgSalary; jobList += `${i + 1}. **${jobForm[2][i].title}** - \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} - \t\t* **Location:** ${jobForm[2][i].location} - \t\t* **Date Posted:** ${new Date(jobForm[2][i].created).toDateString()} at ${new Date(jobForm[2][i].created).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })} - \t\t* **Apply here:** [read more about the job and apply here](${jobForm[2][i].link}) - \t\t* **Distance:** ${formattedDistance} - ${i !== jobForm[2].length - 1 ? '\n' : ''}`; + \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} + \t\t* **Location:** ${jobForm[2][i].location} + \t\t* **Date Posted:** ${new Date( + jobForm[2][i].created + ).toDateString()} at ${new Date( + jobForm[2][i].created +).toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit' +})} + \t\t* **Apply here:** [read more about the job and apply here](${ + jobForm[2][i].link +}) + \t\t* **Distance:** ${formattedDistance} + ${i !== jobForm[2].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.'; + 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))}`; + return isNaN(currency) + ? 'N/A' + : `${new Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD' + }).format(Number(currency))}`; } - 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( + new RegExp( + `## Hey <@${owner}>!\\s*## Here's your list of job/internship recommendations:?`, + 'g' + ), + '' + ) .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(/###|-\#\s*/g, '') + .replace(/##+ \s*/g, '') + .replace(/###|- \s*/g, '') .trim(); } - headerMessage(owner:string, filterBy:string):string { + 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. \ - 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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; + ### **__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${ + filterBy && filterBy !== 'default' + ? ` (filtered based on ${ + filterBy === 'date' ? 'date posted' : filterBy + }):` + : ':' +} + `; } - calculateDistance(lat1: number, lon1: number, lat2: number, lon2: number): number { + calculateDistance( + lat1: number, + lon1: number, + lat2: number, + lon2: number + ): number { const toRadians = (degrees: number) => degrees * (Math.PI / 180); - const R = 3958.8; // Radius of the Earth in miles + const Radius = 3958.8; // Radius of the Earth in miles const dLat = toRadians(lat2 - lat1); const dLon = toRadians(lon2 - lon1); - const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * - Math.sin(dLon / 2) * Math.sin(dLon / 2); - const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - const distance = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 : R * c; + const equation + = (Math.sin(dLat / 2) * Math.sin(dLat / 2)) + + (Math.cos(toRadians(lat1)) + * Math.cos(toRadians(lat2)) + * Math.sin(dLon / 2) + * Math.sin(dLon / 2)); + const cLetter = 2 * Math.atan2(Math.sqrt(equation), Math.sqrt(1 - equation)); + const distance + = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) + ? -1 + : Radius * cLetter; return distance; } - async queryCoordinates(location: string): Promise { // Change to appropriate type later + async queryCoordinates(location: string): Promise<{ lat: number; lng: number }> { const preferredCity = encodeURIComponent(location); const baseURL = `https://maps.google.com/maps/api/geocode/json?address=${preferredCity}&components=country:US&key=${MAP_KEY}`; const response = await axios.get(baseURL); - const coordinates : {lat: number, lng: number } = { + const coordinates: { lat: number; lng: number } = { lat: response.data.results[0].geometry.location.lat, lng: response.data.results[0].geometry.location.lng }; diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index ab065dd5..28ee570c 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -143,7 +143,7 @@ function listJobs(jobData: JobResult[], filterBy: string): string { 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 = (formattedSalaryMin && formattedSalaryMax) + const salaryDetails = formattedSalaryMin && formattedSalaryMax ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` : formattedAvgSalary; From a92de74335060bff3264c1d6bc0ca29c7a60e79e Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Wed, 30 Apr 2025 22:36:31 -0400 Subject: [PATCH 304/317] Refactored 1000 lines of a single file into multiple files for better documentation and readability --- src/commands/reminders/command.ts | 17 + src/commands/reminders/constants.ts | 23 + src/commands/reminders/email-handlers.ts | 110 ++ src/commands/reminders/index.ts | 15 + src/commands/reminders/job-handlers.ts | 299 +++++ src/commands/reminders/menu-handlers.ts | 331 ++++++ src/commands/reminders/reminder-handlers.ts | 243 ++++ src/commands/reminders/reminders.ts | 1103 ------------------- src/commands/reminders/types.ts | 26 + src/commands/reminders/ui.ts | 208 ++++ src/commands/reminders/utils.ts | 115 ++ 11 files changed, 1387 insertions(+), 1103 deletions(-) create mode 100644 src/commands/reminders/command.ts create mode 100644 src/commands/reminders/constants.ts create mode 100644 src/commands/reminders/email-handlers.ts create mode 100644 src/commands/reminders/index.ts create mode 100644 src/commands/reminders/job-handlers.ts create mode 100644 src/commands/reminders/menu-handlers.ts create mode 100644 src/commands/reminders/reminder-handlers.ts delete mode 100644 src/commands/reminders/reminders.ts create mode 100644 src/commands/reminders/types.ts create mode 100644 src/commands/reminders/ui.ts create mode 100644 src/commands/reminders/utils.ts diff --git a/src/commands/reminders/command.ts b/src/commands/reminders/command.ts new file mode 100644 index 00000000..6f4391f2 --- /dev/null +++ b/src/commands/reminders/command.ts @@ -0,0 +1,17 @@ +// Main Command class for the reminder system +import { BOT } from '@root/config'; +import { ChatInputCommandInteraction } from 'discord.js'; +import { Command } from '@lib/types/Command'; +import { showMainMenu } from './menu-handlers'; + +export default class extends Command { + description = `Have ${BOT.NAME} give you a reminder.`; + extendedHelp = 'Create reminders for anything - one-time or recurring job alerts with optional email notifications.'; + options = []; // No options needed as we're using buttons + + async run( + interaction: ChatInputCommandInteraction + ): Promise { + await showMainMenu(interaction); + } +} \ No newline at end of file diff --git a/src/commands/reminders/constants.ts b/src/commands/reminders/constants.ts new file mode 100644 index 00000000..75875e30 --- /dev/null +++ b/src/commands/reminders/constants.ts @@ -0,0 +1,23 @@ +// Constants for the reminder system + +// Emoji constants for button icons +export const EMOJI = { + REMINDER: '⏰', + JOB: '💼', + VIEW: '📋', + CANCEL: '✖️', + TIME: '🕒', + REPEAT: '🔄', + BACK: '↩️', + EMAIL: '📧' +}; + +// Color constants for embeds (using Discord.js ColorResolvable) +export const COLORS = { + PRIMARY: 0x5865F2, // Discord Blurple + SUCCESS: 0x57F287, // Green + DANGER: 0xED4245, // Red + WARNING: 0xFEE75C, // Yellow + SECONDARY: 0x9BA4EC, // Light Blurple + INFO: 0x5CBEFE // Light Blue +}; \ No newline at end of file diff --git a/src/commands/reminders/email-handlers.ts b/src/commands/reminders/email-handlers.ts new file mode 100644 index 00000000..2de0c9bc --- /dev/null +++ b/src/commands/reminders/email-handlers.ts @@ -0,0 +1,110 @@ +// Email handling functionality for reminders +import { ModalSubmitInteraction, ButtonInteraction } from "discord.js"; +import { ReminderData, JobReminderData } from "./types"; +import { COLORS, EMOJI } from "./constants"; +import { createEmailInputModal } from "./ui"; +import { createErrorEmbed, isValidEmail } from "./utils"; +import { completeReminderCreation } from "./reminder-handlers"; +import { completeJobReminderCreation } from "./job-handlers"; + +/** + * Show modal to collect email address for standard reminders + */ +export async function showEmailModal(buttonInteraction: ButtonInteraction): Promise { + // Create modal for email address + const modal = createEmailInputModal(); + + // Show the modal + await buttonInteraction.showModal(modal); + + try { + // Wait for modal submission + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 180000, // 3 minutes (extended) + filter: (i) => + i.customId === 'email_modal' && + i.user.id === buttonInteraction.user.id + }); + + // Process modal submission + const email = modalInteraction.fields.getTextInputValue('email'); + + // Simple email validation + if (!isValidEmail(email)) { + const errorEmbed = createErrorEmbed( + "Invalid Email Address", + `**"${email}"** does not appear to be a valid email address.` + ).setFooter({ text: 'Please try again with a valid email address' }); + + // Reply with error + await modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + return; + } + + // Finalize the reminder creation with email + await completeReminderCreation( + buttonInteraction, + true, + email, + modalInteraction + ); + } catch (error) { + console.error('Error in email modal submission:', error); + + // Only try to update if we haven't already replied + try { + // Fallback to creating the reminder without email + await completeReminderCreation(buttonInteraction, false, null); + } catch (updateError) { + console.error('Error updating after email modal error:', updateError); + } + } +} + +/** + * Show modal to collect email address for job reminders + */ +export async function showJobEmailModal(buttonInteraction: ButtonInteraction): Promise { + // Create modal for email address + const modal = createEmailInputModal(true); + + // Show the modal + await buttonInteraction.showModal(modal); + + try { + // Wait for modal submission + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 180000, // 3 minutes + filter: (mi) => + mi.customId === 'job_email_modal' && + mi.user.id === buttonInteraction.user.id + }); + + // Process the email and finalize + const email = modalInteraction.fields.getTextInputValue('email'); + + // Email validation + if (!isValidEmail(email)) { + await modalInteraction.reply({ + content: `Invalid email address format. Please try again.`, + ephemeral: true + }); + return; + } + + // Finalize job reminder creation with email + await completeJobReminderCreation( + buttonInteraction, + true, + email, + modalInteraction + ); + } catch (error) { + console.error('Error in job email modal submission:', error); + // Fallback to no email + await completeJobReminderCreation(buttonInteraction, false, null); + } +} \ No newline at end of file diff --git a/src/commands/reminders/index.ts b/src/commands/reminders/index.ts new file mode 100644 index 00000000..1783a076 --- /dev/null +++ b/src/commands/reminders/index.ts @@ -0,0 +1,15 @@ +// Main export file for the reminders system +import ReminderCommand from './command'; + +// Export the main command class +export default ReminderCommand; + +// Export other modules for use elsewhere if needed +export * from './constants'; +export * from './types'; +export * from './ui'; +export * from './utils'; +export * from './email-handlers'; +export * from './reminder-handlers'; +export * from './job-handlers'; +export * from './menu-handlers'; \ No newline at end of file diff --git a/src/commands/reminders/job-handlers.ts b/src/commands/reminders/job-handlers.ts new file mode 100644 index 00000000..39c1850f --- /dev/null +++ b/src/commands/reminders/job-handlers.ts @@ -0,0 +1,299 @@ +// Job reminder handling functionality +import { + ButtonInteraction, + ModalSubmitInteraction, + ComponentType, + EmbedBuilder +} from "discord.js"; +import { JobReminderData } from "./types"; +import { COLORS, EMOJI } from "./constants"; +import { + createBackButton, + createEmailOptionsEmbed, + createEmailOptionsButtons, + createJobReminderModal +} from "./ui"; +import { createErrorEmbed, createJobReminderSuccessEmbed, checkJobReminderForButton } from "./utils"; +import { DB } from "@root/config"; +import { Reminder } from "@lib/types/Reminder"; +import { reminderTime } from "@root/src/lib/utils/generalUtils"; +import { showJobEmailModal } from "./email-handlers"; + +/** + * Handle creating a job reminder + */ +export async function handleCreateJobReminder(buttonInteraction: ButtonInteraction): Promise { + // Check for existing job reminder using our utility that works with ButtonInteraction + if (await checkJobReminderForButton(buttonInteraction)) { + const errorEmbed = createErrorEmbed( + "Job Reminder Already Exists", + "You currently already have a job reminder set. To clear your existing job reminder, use the CANCEL button and provide the reminder number." + ); + + await buttonInteraction.update({ + embeds: [errorEmbed], + components: [createBackButton()], // Add back button + }); + return; + } + + // Create modal for job reminder settings + const modal = createJobReminderModal(); + + // Show the modal + await buttonInteraction.showModal(modal); + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 180000, // 3 minutes (extended) + filter: (i: ModalSubmitInteraction) => + i.customId === 'job_reminder_modal' && + i.user.id === buttonInteraction.user.id + }); + + // Process modal submission + let repeatValue = modalInteraction.fields.getTextInputValue('repeat').toLowerCase(); + let filterValue = modalInteraction.fields.getTextInputValue('filter').toLowerCase(); + + // Validate repeat input + if (repeatValue !== 'daily' && repeatValue !== 'weekly' && repeatValue !== 'monthly') { + const errorEmbed = createErrorEmbed( + "Invalid Repeat Option", + `**"${repeatValue}"** is not a valid repeat option. Please use "daily", "weekly", or "monthly".` + ); + + // Defer the modal reply to acknowledge it without sending a visible message + await modalInteraction.deferUpdate(); + + // Update the original message with the error + await buttonInteraction.editReply({ + embeds: [errorEmbed], + components: [createBackButton()], // Add back button + }); + + return; + } + + // Validate filter input + const validFilters = ['default', 'relevance', 'salary', 'date']; + if (!validFilters.includes(filterValue)) { + filterValue = 'default'; // Fallback to default if invalid + } + + // Store job reminder data + const jobReminderData: JobReminderData = { + repeatValue, + filterValue, + buttonInteraction, + modalInteraction + }; + + // Ask about email notifications + await askForJobEmailNotification(jobReminderData); + + } catch (error) { + console.error('Error in modal submission:', error); + const errorEmbed = createErrorEmbed( + "Job Alert Creation Failed", + "The job alert creation process timed out or an error occurred." + ); + + // Update the original button interaction instead of creating a new message + await buttonInteraction.editReply({ + embeds: [errorEmbed], + components: [createBackButton()], // Add back button + }); + } +} + +/** + * Ask if the user wants email notifications for job reminders + */ +export async function askForJobEmailNotification(jobReminderData: JobReminderData): Promise { + const { buttonInteraction, modalInteraction } = jobReminderData; + + // Create embed asking about email notifications + const emailEmbed = createEmailOptionsEmbed(true); + + // Create Yes/No buttons + const emailRow = createEmailOptionsButtons(true); + + // Store the job reminder data in the client's temporary collection + modalInteraction.client.jobReminderTemp = jobReminderData; + + // Defer the modal reply to acknowledge it + await modalInteraction.deferUpdate(); + + // Update original message to ask about email + const message = await buttonInteraction.editReply({ + embeds: [emailEmbed], + components: [emailRow] + }); + + // Create a dedicated collector for this specific message + const collector = message.createMessageComponentCollector({ + componentType: ComponentType.Button, + time: 60000 // 1 minute timeout + }); + + collector.on('collect', async (i) => { + // Make sure it's the right user + if (i.user.id !== buttonInteraction.user.id) { + await i.reply({ + content: 'This button is not for you.', + ephemeral: true + }); + return; + } + + // Stop the collector since we've handled the interaction + collector.stop(); + + if (i.customId === 'job_email_yes') { + await showJobEmailModal(i); + } else if (i.customId === 'job_email_no') { + // Handle "No, Discord only" option + await completeJobReminderCreation(buttonInteraction, false, null); + } + }); + + // Handle collector end (timeout) + collector.on('end', collected => { + if (collected.size === 0) { + // If no buttons were pressed, create without email + completeJobReminderCreation(buttonInteraction, false, null); + } + }); +} + +/** + * Create and store the job reminder with or without email + */ +export async function completeJobReminderCreation( + buttonInteraction: ButtonInteraction, + withEmail: boolean, + email: string | null, + modalInteraction?: ModalSubmitInteraction +): Promise { + try { + // Get the job reminder data + const jobReminderData = buttonInteraction.client.jobReminderTemp; + + // Check if we have valid job reminder data + if (!jobReminderData || !jobReminderData.repeatValue || !jobReminderData.filterValue) { + const errorEmbed = createErrorEmbed( + "Error Creating Job Alert", + "Missing job alert information. Please try creating your job alert again." + ); + + // If we have a modal interaction, respond to that + if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { + await modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } else { + // Otherwise try to update the button interaction + try { + await buttonInteraction.update({ + embeds: [errorEmbed], + components: [createBackButton()] + }); + } catch (updateError) { + // If updating fails, try editing + await buttonInteraction.editReply({ + embeds: [errorEmbed], + components: [createBackButton()] + }); + } + } + return; + } + + const { repeatValue, filterValue } = jobReminderData; + + // Create the job reminder object + const jobReminder: Reminder = { + owner: buttonInteraction.user.id, + content: 'Job Reminder', + mode: 'private', + expires: new Date(), // Set to now, will be handled by the job scheduler + repeat: repeatValue as 'daily' | 'weekly', + filterBy: filterValue as 'default' | 'relevance' | 'salary' | 'date', + emailNotification: withEmail, + emailAddress: withEmail ? email : null + }; + + // Store the job reminder in the database + await buttonInteraction.client.mongo + .collection(DB.REMINDERS) + .insertOne(jobReminder); + + // Create success embed + const successEmbed = createJobReminderSuccessEmbed( + repeatValue, + filterValue, + reminderTime(jobReminder), + withEmail, + email + ); + + // Handle the response based on which interaction is available + if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { + // If we have a modal interaction that hasn't been replied to yet + await modalInteraction.reply({ + content: "Your job alert has been created successfully!", + ephemeral: true + }); + + // Update the original message + await buttonInteraction.editReply({ + embeds: [successEmbed], + components: [createBackButton()] + }); + } else { + // Otherwise try to update the button interaction + try { + await buttonInteraction.update({ + embeds: [successEmbed], + components: [createBackButton()] + }); + } catch (updateError) { + // If updating fails, try editing + await buttonInteraction.editReply({ + embeds: [successEmbed], + components: [createBackButton()] + }); + } + } + + // Clean up temporary data + delete buttonInteraction.client.jobReminderTemp; + } catch (error) { + console.error('Error in completeJobReminderCreation:', error); + + // Try to give feedback through any available channel + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.WARNING) + .setTitle(`${EMOJI.JOB} Job Alert Process Completed`) + .setDescription("Your job alert has been created, but there was an issue updating the display.") + .setTimestamp(); + + try { + if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { + await modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } else { + await buttonInteraction.editReply({ + embeds: [errorEmbed], + components: [createBackButton()] + }); + } + } catch (secondError) { + console.error('Even the error handler failed:', secondError); + } + } +} \ No newline at end of file diff --git a/src/commands/reminders/menu-handlers.ts b/src/commands/reminders/menu-handlers.ts new file mode 100644 index 00000000..abd9785d --- /dev/null +++ b/src/commands/reminders/menu-handlers.ts @@ -0,0 +1,331 @@ +// Menu handling functionality for the reminder system +import { + ChatInputCommandInteraction, + ButtonInteraction, + ComponentType, + EmbedBuilder +} from "discord.js"; +import { COLORS, EMOJI } from "./constants"; +import { + createMainMenuEmbed, + createMainMenuButtons, + createBackButton, + createCancelReminderModal +} from "./ui"; +import { handleCreateReminder, completeReminderCreation } from "./reminder-handlers"; +import { handleCreateJobReminder } from "./job-handlers"; +import { DB } from "@root/config"; +import { Reminder } from "@lib/types/Reminder"; +import { createErrorEmbed, getReminderIcon } from "./utils"; +import { reminderTime } from "@root/src/lib/utils/generalUtils"; + +/** + * Display the main menu for the reminder system + */ +export async function showMainMenu(interaction: ChatInputCommandInteraction | ButtonInteraction): Promise { + // Create a stylish initial embed + const embed = createMainMenuEmbed( + interaction.user.username, + interaction.user.displayAvatarURL() + ); + + // Create buttons with emojis and clear labels + const row = createMainMenuButtons(); + + // Check if this is the initial interaction or a follow-up + if (interaction instanceof ChatInputCommandInteraction) { + // Initial command interaction + const response = await interaction.reply({ + embeds: [embed], + components: [row], + ephemeral: true + }); + + // Create collector for button interactions + createButtonCollector(response); + } else { + // A button interaction (going back to main menu) + await interaction.update({ + embeds: [embed], + components: [row] + }); + } +} + +/** + * Create a button collector for the main menu + */ +export function createButtonCollector(response: any): void { + const collector = response.createMessageComponentCollector({ + componentType: ComponentType.Button, + time: 120000 // 2 minute timeout (extended) + }); + + collector.on('collect', async (buttonInteraction: ButtonInteraction) => { + // Handle button clicks + switch (buttonInteraction.customId) { + case 'create_reminder': + await handleCreateReminder(buttonInteraction); + break; + case 'create_job_reminder': + await handleCreateJobReminder(buttonInteraction); + break; + case 'view_reminders': + await handleViewReminders(buttonInteraction); + break; + case 'cancel_reminder': + await handleCancelReminder(buttonInteraction); + break; + case 'back_to_menu': + // Handle going back to the main menu + await showMainMenu(buttonInteraction); + break; + case 'email_yes': + // Email yes handlers are implemented in email-handlers.ts + break; + case 'email_no': + // Handle no for email notification - retrieve the reminder data + const reminderData = buttonInteraction.client.reminderTemp; + if (reminderData) { + await handleEmailNoForReminder(buttonInteraction); + } else { + const errorEmbed = createErrorEmbed( + "Error Processing Reminder", + "Something went wrong while processing your reminder. Please try creating it again." + ); + + await buttonInteraction.update({ + embeds: [errorEmbed], + components: [createBackButton()] + }); + } + break; + } + }); + + collector.on('end', async (collected) => { + if (collected.size === 0) { + const timeoutEmbed = createErrorEmbed( + "Reminder Action Timed Out", + "You can run the command again to set up a reminder." + ); + + await response.interaction.editReply({ + embeds: [timeoutEmbed], + components: [] + }); + } + }); +} + +/** + * Handle the view reminders button + */ +export async function handleViewReminders(buttonInteraction: ButtonInteraction): Promise { + const reminders: Array = await buttonInteraction.client.mongo + .collection(DB.REMINDERS) + .find({ owner: buttonInteraction.user.id }) + .toArray(); + + reminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); + + if (reminders.length < 1) { + const noRemindersEmbed = new EmbedBuilder() + .setColor(COLORS.INFO) + .setTitle(`${EMOJI.VIEW} No Reminders Found`) + .setDescription('You don\'t have any pending reminders!') + .setFooter({ text: 'Use the CREATE REMINDER button to set one up' }) + .setTimestamp(); + + // Update instead of reply to replace the message + buttonInteraction.update({ + embeds: [noRemindersEmbed], + components: [createBackButton()], // Add back button + }); + return; + } + + const embeds: Array = []; + reminders.forEach((reminder, i) => { + if (i % 10 === 0) { // Reduced to 10 reminders per embed for better readability + embeds.push( + new EmbedBuilder() + .setTitle(`${EMOJI.VIEW} Your Reminders (${reminders.length})`) + .setColor(COLORS.INFO) + .setDescription('Here are all your pending reminders:') + .setFooter({ + text: `Page ${Math.floor(i / 10) + 1}/${Math.ceil(reminders.length / 10)}` + }) + .setTimestamp() + ); + } + + const hidden = reminder.mode === 'private'; + const isJobReminder = reminder.content === 'Job Reminder'; + const icon = getReminderIcon(reminder); + + embeds[Math.floor(i / 10)].addFields({ + name: `${i + 1}. ${icon} ${ + hidden + ? isJobReminder + ? 'Job Alert' + : 'Private Reminder' + : reminder.content + }`, + value: hidden + ? `${EMOJI.REPEAT} **${reminder.repeat}** job reminder filtered by **${reminder.filterBy}**${ + reminder.emailNotification ? `\n${EMOJI.EMAIL} Email notifications to: ${reminder.emailAddress}` : '' + }` + : `${EMOJI.TIME} Due: **${reminderTime(reminder)}**${ + reminder.emailNotification ? `\n${EMOJI.EMAIL} Email notifications to: ${reminder.emailAddress}` : '' + }` + }); + }); + + // Add back button to the response + const backButton = createBackButton(); + + // Update instead of reply to replace the message + await buttonInteraction.update({ + embeds, + components: [backButton], // Add back button + }); +} + +/** + * Handle the cancel reminder button + */ +export async function handleCancelReminder(buttonInteraction: ButtonInteraction): Promise { + // Create modal for reminder cancellation + const modal = createCancelReminderModal(); + + // Show the modal + await buttonInteraction.showModal(modal); + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 60000, // 1 minute + filter: (i) => + i.customId === 'cancel_reminder_modal' && + i.user.id === buttonInteraction.user.id + }); + + // Process modal submission + const reminderNumStr = modalInteraction.fields.getTextInputValue('reminder_number'); + const reminderNum = parseInt(reminderNumStr) - 1; // Convert to 0-based index + + if (isNaN(reminderNum) || reminderNum < 0) { + const errorEmbed = createErrorEmbed( + "Invalid Reminder Number", + `**"${reminderNumStr}"** is not a valid reminder number. Please enter a positive integer.` + ).setFooter({ text: 'Use the VIEW REMINDERS button to see your reminders and their numbers' }); + + // Defer the modal reply to acknowledge it without sending a visible message + await modalInteraction.deferUpdate(); + + // Update the original message with the error + await buttonInteraction.editReply({ + embeds: [errorEmbed], + components: [createBackButton()], // Add back button + }); + + return; + } + + // Get user's reminders and sort them + const reminders: Array = await modalInteraction.client.mongo + .collection(DB.REMINDERS) + .find({ owner: modalInteraction.user.id }) + .toArray(); + + reminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); + + // Check if the reminder exists + const reminder = reminders[reminderNum]; + if (!reminder) { + const notFoundEmbed = createErrorEmbed( + "Reminder Not Found", + `I couldn't find reminder **#${reminderNum + 1}**.` + ).setFooter({ text: 'Use the VIEW REMINDERS button to see your current reminders' }); + + // Defer the modal reply to acknowledge it without sending a visible message + await modalInteraction.deferUpdate(); + + // Update the original message with the error + await buttonInteraction.editReply({ + embeds: [notFoundEmbed], + components: [createBackButton()], // Add back button + }); + + return; + } + + // Delete the reminder + await modalInteraction.client.mongo + .collection(DB.REMINDERS) + .findOneAndDelete(reminder); + + const hidden = reminder.mode === 'private'; + const isJobReminder = reminder.content === 'Job Reminder'; + const emailInfo = reminder.emailNotification ? `\nEmail notifications to ${reminder.emailAddress} have been canceled.` : ''; + + const successEmbed = new EmbedBuilder() + .setColor(COLORS.SUCCESS) + .setTitle(`${EMOJI.CANCEL} Reminder Cancelled`) + .setDescription( + `Successfully cancelled reminder **#${reminderNum + 1}**: ${ + hidden + ? (isJobReminder ? 'Job Alert' : 'Private Reminder') + : `"${reminder.content}"` + }${emailInfo}` + ) + .setTimestamp(); + + // Defer the modal reply to acknowledge it without sending a visible message + await modalInteraction.deferUpdate(); + + // Update the original message with the success info + await buttonInteraction.editReply({ + embeds: [successEmbed], + components: [createBackButton()], // Add back button + }); + + } catch (error) { + console.error('Error in modal submission:', error); + + const errorEmbed = createErrorEmbed( + "Cancellation Failed", + "The reminder cancellation process timed out or an error occurred." + ); + + // Update the original button interaction + await buttonInteraction.editReply({ + embeds: [errorEmbed], + components: [createBackButton()], // Add back button + }); + } +} + +/** + * Handle the email no button for standard reminders + */ +export async function handleEmailNoForReminder(buttonInteraction: ButtonInteraction): Promise { + // Get the reminder data from client storage + const reminderData = buttonInteraction.client.reminderTemp; + + if (reminderData) { + // Finalize without email + await completeReminderCreation(buttonInteraction, false, null); + } else { + const errorEmbed = createErrorEmbed( + "Error Processing Reminder", + "Something went wrong while processing your reminder. Please try creating it again." + ); + + await buttonInteraction.update({ + embeds: [errorEmbed], + components: [createBackButton()] + }); + } +} \ No newline at end of file diff --git a/src/commands/reminders/reminder-handlers.ts b/src/commands/reminders/reminder-handlers.ts new file mode 100644 index 00000000..853edf4b --- /dev/null +++ b/src/commands/reminders/reminder-handlers.ts @@ -0,0 +1,243 @@ +// Standard reminder handling functionality +import { + ButtonInteraction, + ModalBuilder, + ModalSubmitInteraction, + EmbedBuilder +} from "discord.js"; +import { ReminderData } from "./types"; +import { COLORS, EMOJI } from "./constants"; +import { + createBackButton, + createEmailOptionsEmbed, + createEmailOptionsButtons, + createReminderModal +} from "./ui"; +import { createErrorEmbed, createReminderSuccessEmbed } from "./utils"; +import { DB } from "@root/config"; +import { Reminder } from "@lib/types/Reminder"; +import parse from "parse-duration"; +import { reminderTime } from "@root/src/lib/utils/generalUtils"; + +/** + * Handle the create reminder button interaction + */ +export async function handleCreateReminder(buttonInteraction: ButtonInteraction): Promise { + // Store reference to original message + const originalMessage = buttonInteraction.message; + + // Create modal for reminder details + const modal = createReminderModal(); + + // Show the modal + await buttonInteraction.showModal(modal); + + // Wait for modal submission + try { + const modalInteraction = await buttonInteraction.awaitModalSubmit({ + time: 180000, // 3 minutes (extended) + filter: (i: ModalSubmitInteraction) => + i.customId === 'reminder_modal' && + i.user.id === buttonInteraction.user.id + }); + + // Process modal submission + const content = modalInteraction.fields.getTextInputValue('content'); + const rawDuration = modalInteraction.fields.getTextInputValue('duration'); + const duration = parse(rawDuration); + + if (!duration) { + const errorEmbed = createErrorEmbed( + "Invalid Time Format", + `**"${rawDuration}"** is not a valid duration.\nYou can use words like hours, minutes, seconds, days, weeks, months, or years.` + ).setFooter({ text: 'Try something like "3 hours" or "2 days"' }); + + // Defer the modal reply to acknowledge it without sending a visible message + await modalInteraction.deferUpdate(); + + // Update the original message with the error + await buttonInteraction.editReply({ + embeds: [errorEmbed], + components: [createBackButton()] + }); + + return; + } + + // Calculate the expiry date + const expiryDate = new Date(duration + Date.now()); + + // Store the reminder data temporarily + const reminderData: ReminderData = { + content, + expiryDate, + buttonInteraction, + modalInteraction + }; + + // Ask the user if they want email notifications + await askForEmailNotification(reminderData); + + } catch (error) { + console.error('Error in modal submission:', error); + + const errorEmbed = createErrorEmbed( + "Reminder Creation Failed", + "The reminder creation process timed out or an error occurred." + ); + + // Update the original button interaction + await buttonInteraction.editReply({ + embeds: [errorEmbed], + components: [createBackButton()], // Add back button + }); + } +} + +/** + * Ask if the user wants email notifications for standard reminders + */ +export async function askForEmailNotification(reminderData: ReminderData): Promise { + const { buttonInteraction, modalInteraction } = reminderData; + + // Create embed asking about email notifications + const emailEmbed = createEmailOptionsEmbed(); + + // Create Yes/No buttons + const emailRow = createEmailOptionsButtons(); + + // Store the reminder data in the client's temporary collection + // This way we can access it when the user makes a choice + modalInteraction.client.reminderTemp = reminderData; + + // Defer the modal reply to acknowledge it + await modalInteraction.deferUpdate(); + + // Update original message to ask about email + await buttonInteraction.editReply({ + embeds: [emailEmbed], + components: [emailRow] + }); +} + +/** + * Create and store the reminder with or without email + */ +export async function completeReminderCreation( + buttonInteraction: ButtonInteraction, + withEmail: boolean, + email: string | null, + modalInteraction?: ModalSubmitInteraction +): Promise { + try { + // Get the reminder data + const reminderData = buttonInteraction.client.reminderTemp; + + // Check if we have valid reminder data + if (!reminderData || !reminderData.content || !reminderData.expiryDate) { + const errorEmbed = createErrorEmbed( + "Error Creating Reminder", + "Missing reminder information. Please try creating your reminder again." + ); + + // If we have a modal interaction, respond to that + if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { + await modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } else { + // Otherwise try to update the button interaction + await buttonInteraction.update({ + embeds: [errorEmbed], + components: [createBackButton()] + }); + } + return; + } + + const { content, expiryDate } = reminderData; + + // Create the reminder object + const reminder: Reminder = { + owner: buttonInteraction.user.id, + content, + mode: 'public', // could be changed to private if needed + expires: expiryDate, + repeat: null, // No repeat by default + emailNotification: withEmail, + emailAddress: withEmail ? email : null + }; + + // Store the reminder in the database + await buttonInteraction.client.mongo + .collection(DB.REMINDERS) + .insertOne(reminder); + + // Create success embed + const successEmbed = createReminderSuccessEmbed( + content, + reminderTime(reminder), + withEmail, + email + ); + + // Handle the response based on which interaction is available + if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { + // If we have a modal interaction that hasn't been replied to yet + await modalInteraction.reply({ + content: "Your reminder has been created successfully!", + ephemeral: true + }); + + // Update the original message + await buttonInteraction.editReply({ + embeds: [successEmbed], + components: [createBackButton()] + }); + } else { + // Otherwise try to update the button interaction + // First check if we can update + if (!buttonInteraction.replied) { + await buttonInteraction.update({ + embeds: [successEmbed], + components: [createBackButton()] + }); + } else { + // If we can't update, try to edit the reply + await buttonInteraction.editReply({ + embeds: [successEmbed], + components: [createBackButton()] + }); + } + } + + // Clean up temporary data + delete buttonInteraction.client.reminderTemp; + } catch (error) { + console.error('Error in completeReminderCreation:', error); + + // Try to give feedback through any available channel + const errorEmbed = new EmbedBuilder() + .setColor(COLORS.WARNING) + .setTitle(`${EMOJI.REMINDER} Reminder Process Completed`) + .setDescription("Your reminder has been created, but there was an issue updating the display.") + .setTimestamp(); + + try { + if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { + await modalInteraction.reply({ + embeds: [errorEmbed], + ephemeral: true + }); + } else if (!buttonInteraction.replied) { + await buttonInteraction.update({ + embeds: [errorEmbed], + components: [createBackButton()] + }); + } + } catch (secondError) { + console.error('Even the error handler failed:', secondError); + } + } +} \ No newline at end of file diff --git a/src/commands/reminders/reminders.ts b/src/commands/reminders/reminders.ts deleted file mode 100644 index 30f5c419..00000000 --- a/src/commands/reminders/reminders.ts +++ /dev/null @@ -1,1103 +0,0 @@ -import { BOT, DB, GMAIL } from '@root/config'; -import { - ApplicationCommandOptionData, - ChatInputCommandInteraction, - InteractionResponse, - ActionRowBuilder, - ButtonBuilder, - ButtonStyle, - ComponentType, - ModalBuilder, - TextInputBuilder, - TextInputStyle, - ModalSubmitInteraction, - EmbedBuilder -} from 'discord.js'; -import { Reminder } from '@lib/types/Reminder'; -import parse from 'parse-duration'; -import { checkJobReminder, reminderTime } from '@root/src/lib/utils/generalUtils'; -import { Command } from '@lib/types/Command'; -import nodemailer from 'nodemailer'; - -// Emoji constants for button icons -const EMOJI = { - REMINDER: '⏰', - JOB: '💼', - VIEW: '📋', - CANCEL: '✖️', - TIME: '🕒', - REPEAT: '🔄', - BACK: '↩️', - EMAIL: '📧' // Added email emoji -}; - -// Color constants for embeds (using Discord.js ColorResolvable) -const COLORS = { - PRIMARY: 0x5865F2, // Discord Blurple - SUCCESS: 0x57F287, // Green - DANGER: 0xED4245, // Red - WARNING: 0xFEE75C, // Yellow - SECONDARY: 0x9BA4EC, // Light Blurple - INFO: 0x5CBEFE // Light Blue -}; - -export default class extends Command { - description = `Have ${BOT.NAME} give you a reminder.`; - extendedHelp = 'Create reminders for anything - one-time or recurring job alerts with optional email notifications.'; - options: ApplicationCommandOptionData[] = []; // No options needed as we're using buttons - - async run( - interaction: ChatInputCommandInteraction - ): Promise | void> { - await this.showMainMenu(interaction); - } - - // Create and display the main menu - private async showMainMenu(interaction: ChatInputCommandInteraction | any) { - // Create a stylish initial embed - const embed = new EmbedBuilder() - .setColor(COLORS.PRIMARY) - .setTitle(`${EMOJI.REMINDER} Reminder System`) - .setDescription('What would you like to do?') - .setFooter({ - text: `Requested by ${interaction.user.username}`, - iconURL: interaction.user.displayAvatarURL() - }) - .setTimestamp(); - - // Create buttons with emojis and clear labels - const row = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId('create_reminder') - .setLabel('Create Reminder') - .setEmoji(EMOJI.REMINDER) - .setStyle(ButtonStyle.Primary), - new ButtonBuilder() - .setCustomId('create_job_reminder') - .setLabel('Job Alert') - .setEmoji(EMOJI.JOB) - .setStyle(ButtonStyle.Secondary), - new ButtonBuilder() - .setCustomId('view_reminders') - .setLabel('View All') - .setEmoji(EMOJI.VIEW) - .setStyle(ButtonStyle.Success), - new ButtonBuilder() - .setCustomId('cancel_reminder') - .setLabel('Cancel') - .setEmoji(EMOJI.CANCEL) - .setStyle(ButtonStyle.Danger) - ); - - // Check if this is the initial interaction or a follow-up - if (interaction instanceof ChatInputCommandInteraction) { - // Initial command interaction - const response = await interaction.reply({ - embeds: [embed], - components: [row], - ephemeral: true - }); - - // Create collector for button interactions - this.createButtonCollector(response); - } else { - // A button interaction (going back to main menu) - await interaction.update({ - embeds: [embed], - components: [row] - }); - } - } - - // Create button collector for the main menu - private createButtonCollector(response: any) { - const collector = response.createMessageComponentCollector({ - componentType: ComponentType.Button, - time: 120000 // 2 minute timeout (extended) - }); - - collector.on('collect', async (buttonInteraction) => { - // Handle button clicks - if (buttonInteraction.customId === 'create_reminder') { - await this.handleCreateReminder(buttonInteraction); - } else if (buttonInteraction.customId === 'create_job_reminder') { - await this.handleCreateJobReminder(buttonInteraction); - } else if (buttonInteraction.customId === 'view_reminders') { - await this.handleViewReminders(buttonInteraction); - } else if (buttonInteraction.customId === 'cancel_reminder') { - await this.handleCancelReminder(buttonInteraction); - } else if (buttonInteraction.customId === 'back_to_menu') { - // Handle going back to the main menu - await this.showMainMenu(buttonInteraction); - } else if (buttonInteraction.customId === 'email_yes') { - // Handle yes for email notification - await this.showEmailModal(buttonInteraction); - } else if (buttonInteraction.customId === 'email_no') { - // Handle no for email notification - retrieve the reminder data - const reminderData = buttonInteraction.client.reminderTemp; - if (reminderData) { - await this.finalizeReminderCreation(buttonInteraction, false, null); - } else { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Error Processing Reminder`) - .setDescription('Something went wrong while processing your reminder. Please try creating it again.') - .setTimestamp(); - - await buttonInteraction.update({ - embeds: [errorEmbed], - components: [this.createBackButton()] - }); - } - } - // We'll handle job email buttons through a different collector - }); - - collector.on('end', async (collected) => { - if (collected.size === 0) { - const timeoutEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.TIME} Reminder Action Timed Out`) - .setDescription('You can run the command again to set up a reminder.') - .setTimestamp(); - - await response.interaction.editReply({ - embeds: [timeoutEmbed], - components: [] - }); - } - }); - } - - // Helper function to create a back button - private createBackButton() { - return new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId('back_to_menu') - .setLabel('Back to Menu') - .setEmoji(EMOJI.BACK) - .setStyle(ButtonStyle.Secondary) - ); - } - - // Handle creating a standard reminder via a modal - private async handleCreateReminder(buttonInteraction: any) { - // Store reference to original message - const originalMessage = buttonInteraction.message; - - // Create modal for reminder details - const modal = new ModalBuilder() - .setCustomId('reminder_modal') - .setTitle(`${EMOJI.REMINDER} Create New Reminder`); - - // Add inputs for content and duration - const contentInput = new TextInputBuilder() - .setCustomId('content') - .setLabel("What would you like to be reminded of?") - .setStyle(TextInputStyle.Paragraph) - .setPlaceholder("Enter your reminder message here...") - .setRequired(true); - - const durationInput = new TextInputBuilder() - .setCustomId('duration') - .setLabel("When would you like to be reminded?") - .setPlaceholder('e.g. 1 hour, 30 minutes, 2 days, tomorrow at 3pm') - .setStyle(TextInputStyle.Short) - .setRequired(true); - - // Create action rows with inputs - const contentRow = new ActionRowBuilder().addComponents(contentInput); - const durationRow = new ActionRowBuilder().addComponents(durationInput); - - // Add action rows to the modal - modal.addComponents(contentRow, durationRow); - - // Show the modal - await buttonInteraction.showModal(modal); - - // Wait for modal submission - try { - const modalInteraction = await buttonInteraction.awaitModalSubmit({ - time: 180000, // 3 minutes (extended) - filter: (i: ModalSubmitInteraction) => - i.customId === 'reminder_modal' && - i.user.id === buttonInteraction.user.id - }); - - // Process modal submission - const content = modalInteraction.fields.getTextInputValue('content'); - const rawDuration = modalInteraction.fields.getTextInputValue('duration'); - const duration = parse(rawDuration); - - if (!duration) { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.TIME} Invalid Time Format`) - .setDescription(`**"${rawDuration}"** is not a valid duration.\nYou can use words like hours, minutes, seconds, days, weeks, months, or years.`) - .setFooter({ text: 'Try something like "3 hours" or "2 days"' }); - - // Defer the modal reply to acknowledge it without sending a visible message - await modalInteraction.deferUpdate(); - - // Update the original message with the error - await buttonInteraction.editReply({ - embeds: [errorEmbed], - components: [this.createBackButton()], // Add back button - }); - - return; - } - - // Calculate the expiry date - const expiryDate = new Date(duration + Date.now()); - - // Store the reminder data temporarily - const reminderData = { - content, - expiryDate, - buttonInteraction, - modalInteraction - }; - - // Ask the user if they want email notifications - await this.askForEmailNotification(reminderData); - - } catch (error) { - console.error('Error in modal submission:', error); - - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Reminder Creation Failed`) - .setDescription('The reminder creation process timed out or an error occurred.') - .setTimestamp(); - - // Update the original button interaction - await buttonInteraction.editReply({ - embeds: [errorEmbed], - components: [this.createBackButton()], // Add back button - }); - } - } - - // Ask if the user wants email notifications - private async askForEmailNotification(reminderData: any) { - const { buttonInteraction, modalInteraction } = reminderData; - - // Create embed asking about email notifications - const emailEmbed = new EmbedBuilder() - .setColor(COLORS.INFO) - .setTitle(`${EMOJI.EMAIL} Would you like to receive this reminder by email too?`) - .setDescription('Choose whether you want to also receive this reminder via email when it triggers.') - .setFooter({ text: 'Email notifications are optional' }) - .setTimestamp(); - - // Create Yes/No buttons - const emailRow = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId('email_yes') - .setLabel('Yes, send email') - .setEmoji(EMOJI.EMAIL) - .setStyle(ButtonStyle.Success), - new ButtonBuilder() - .setCustomId('email_no') - .setLabel('No, Discord only') - .setStyle(ButtonStyle.Secondary) - ); - - // Store the reminder data in the client's temporary collection - // This way we can access it when the user makes a choice - modalInteraction.client.reminderTemp = reminderData; - - // Defer the modal reply to acknowledge it - await modalInteraction.deferUpdate(); - - // Update original message to ask about email - await buttonInteraction.editReply({ - embeds: [emailEmbed], - components: [emailRow] - }); - } - - // Show modal to collect email address - private async showEmailModal(buttonInteraction: any) { - // Create modal for email address - const modal = new ModalBuilder() - .setCustomId('email_modal') - .setTitle(`${EMOJI.EMAIL} Email Notification`); - - // Add input for email address - const emailInput = new TextInputBuilder() - .setCustomId('email') - .setLabel("Email address for notifications:") - .setStyle(TextInputStyle.Short) - .setPlaceholder("Enter your email address here...") - .setRequired(true); - - // Create action row with input - const emailRow = new ActionRowBuilder().addComponents(emailInput); - - // Add action row to the modal - modal.addComponents(emailRow); - - // Show the modal - await buttonInteraction.showModal(modal); - - try { - // Wait for modal submission - const modalInteraction = await buttonInteraction.awaitModalSubmit({ - time: 180000, // 3 minutes (extended) - filter: (i: ModalSubmitInteraction) => - i.customId === 'email_modal' && - i.user.id === buttonInteraction.user.id - }); - - // Process modal submission - const email = modalInteraction.fields.getTextInputValue('email'); - - // Simple email validation - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - if (!emailRegex.test(email)) { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Invalid Email Address`) - .setDescription(`**"${email}"** does not appear to be a valid email address.`) - .setFooter({ text: 'Please try again with a valid email address' }); - - // Defer the modal reply to acknowledge it - await modalInteraction.reply({ - embeds: [errorEmbed], - ephemeral: true - }); - return; - } - - // Finalize the reminder creation with email - await this.finalizeReminderCreation(buttonInteraction, true, email, modalInteraction); - } catch (error) { - console.error('Error in email modal submission:', error); - - // Only try to update if we haven't already replied - try { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Email Collection Issue`) - .setDescription('There was a problem processing your email. Your reminder has been created without email notifications.') - .setTimestamp(); - - // Update the original button interaction in a way that's safer - await this.finalizeReminderCreation(buttonInteraction, false, null); - } catch (updateError) { - console.error('Error updating after email modal error:', updateError); - } - } - } - - // Create and store the reminder with or without email - private async finalizeReminderCreation(buttonInteraction: any, withEmail: boolean, email: string | null, modalInteraction?: ModalSubmitInteraction) { - try { - // Get the reminder data - const reminderData = buttonInteraction.client.reminderTemp; - - // Check if we have valid reminder data - if (!reminderData || !reminderData.content || !reminderData.expiryDate) { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Error Creating Reminder`) - .setDescription('Missing reminder information. Please try creating your reminder again.') - .setTimestamp(); - - // If we have a modal interaction, respond to that - if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { - await modalInteraction.reply({ - embeds: [errorEmbed], - ephemeral: true - }); - } else { - // Otherwise try to update the button interaction - await buttonInteraction.update({ - embeds: [errorEmbed], - components: [this.createBackButton()] - }); - } - return; - } - - const { content, expiryDate } = reminderData; - - // Create the reminder object - const reminder: Reminder = { - owner: buttonInteraction.user.id, - content, - mode: 'public', // could be changed to private if needed - expires: expiryDate, - repeat: null, // No repeat by default - emailNotification: withEmail, - emailAddress: withEmail ? email : null - }; - - // Store the reminder in the database - await buttonInteraction.client.mongo - .collection(DB.REMINDERS) - .insertOne(reminder); - - // Create success embed - const successEmbed = new EmbedBuilder() - .setColor(COLORS.SUCCESS) - .setTitle(`${EMOJI.REMINDER} Reminder Set!`) - .setDescription(`I'll remind you about that at **${reminderTime(reminder)}**.`) - .addFields({ - name: 'Reminder Content', - value: `> ${content}` - }); - - // Add email info if applicable - if (withEmail) { - successEmbed.addFields({ - name: 'Email Notification', - value: `You'll also receive an email at **${email}** when this reminder triggers.` - }); - } - - successEmbed.setTimestamp(); - - // Handle the response based on which interaction is available - if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { - // If we have a modal interaction that hasn't been replied to yet - await modalInteraction.reply({ - content: "Your reminder has been created successfully!", - ephemeral: true - }); - - // Update the original message - await buttonInteraction.editReply({ - embeds: [successEmbed], - components: [this.createBackButton()] - }); - } else { - // Otherwise try to update the button interaction - // First check if we can update - if (!buttonInteraction.replied) { - await buttonInteraction.update({ - embeds: [successEmbed], - components: [this.createBackButton()] - }); - } else { - // If we can't update, try to edit the reply - await buttonInteraction.editReply({ - embeds: [successEmbed], - components: [this.createBackButton()] - }); - } - } - - // Clean up temporary data - delete buttonInteraction.client.reminderTemp; - } catch (error) { - console.error('Error in finalizeReminderCreation:', error); - - // Try to give feedback through any available channel - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.WARNING) - .setTitle(`${EMOJI.REMINDER} Reminder Process Completed`) - .setDescription("Your reminder has been created, but there was an issue updating the display.") - .setTimestamp(); - - try { - if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { - await modalInteraction.reply({ - embeds: [errorEmbed], - ephemeral: true - }); - } else if (!buttonInteraction.replied) { - await buttonInteraction.update({ - embeds: [errorEmbed], - components: [this.createBackButton()] - }); - } - } catch (secondError) { - console.error('Even the error handler failed:', secondError); - } - } - } - - // Handle creating a job reminder using a modal - private async handleCreateJobReminder(buttonInteraction: any) { - // Check for existing job reminder - if (await checkJobReminder(buttonInteraction)) { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.WARNING) - .setTitle(`${EMOJI.JOB} Job Reminder Already Exists`) - .setDescription( - 'You currently already have a job reminder set. To clear your existing job reminder, use the CANCEL button and provide the reminder number.' - ); - - return buttonInteraction.update({ - embeds: [errorEmbed], - components: [this.createBackButton()], // Add back button - }); - } - - // Create modal for job reminder settings - const modal = new ModalBuilder() - .setCustomId('job_reminder_modal') - .setTitle(`${EMOJI.JOB} Create Job Alert`); - - // Add inputs for repeat frequency and filter type - const repeatInput = new TextInputBuilder() - .setCustomId('repeat') - .setLabel('How often would you like to receive alerts?') - .setPlaceholder('Type "daily", "weekly", or "monthly"') - .setStyle(TextInputStyle.Short) - .setRequired(true); - - const filterInput = new TextInputBuilder() - .setCustomId('filter') - .setLabel('Sort jobs by?') - .setPlaceholder('default, relevance, salary, or date') - .setStyle(TextInputStyle.Short) - .setRequired(true) - .setValue('default'); // Default value - - // Create action rows with inputs - const repeatRow = new ActionRowBuilder().addComponents(repeatInput); - const filterRow = new ActionRowBuilder().addComponents(filterInput); - - // Add action rows to the modal - modal.addComponents(repeatRow, filterRow); - - // Show the modal - await buttonInteraction.showModal(modal); - - // Wait for modal submission - try { - const modalInteraction = await buttonInteraction.awaitModalSubmit({ - time: 180000, // 3 minutes (extended) - filter: (i: ModalSubmitInteraction) => - i.customId === 'job_reminder_modal' && - i.user.id === buttonInteraction.user.id - }); - - // Process modal submission - let repeatValue = modalInteraction.fields.getTextInputValue('repeat').toLowerCase(); - let filterValue = modalInteraction.fields.getTextInputValue('filter').toLowerCase(); - - // Validate repeat input - if (repeatValue !== 'daily' && repeatValue !== 'weekly' && repeatValue !== 'monthly') { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.REPEAT} Invalid Repeat Option`) - .setDescription(`**"${repeatValue}"** is not a valid repeat option. Please use "daily", "weekly", or "monthly".`); - - // Defer the modal reply to acknowledge it without sending a visible message - await modalInteraction.deferUpdate(); - - // Update the original message with the error - await buttonInteraction.editReply({ - embeds: [errorEmbed], - components: [this.createBackButton()], // Add back button - }); - - return; - } - - // Validate filter input - const validFilters = ['default', 'relevance', 'salary', 'date']; - if (!validFilters.includes(filterValue)) { - filterValue = 'default'; // Fallback to default if invalid - } - - // Store job reminder data - const jobReminderData = { - repeatValue, - filterValue, - buttonInteraction, - modalInteraction - }; - - // Ask about email notifications - await this.askForJobEmailNotification(jobReminderData); - - } catch (error) { - console.error('Error in modal submission:', error); - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Job Alert Creation Failed`) - .setDescription('The job alert creation process timed out or an error occurred.') - .setTimestamp(); - - // Update the original button interaction instead of creating a new message - await buttonInteraction.editReply({ - embeds: [errorEmbed], - components: [this.createBackButton()], // Add back button - }); - } - } - - // Ask if the user wants email notifications for job reminders - private async askForJobEmailNotification(jobReminderData: any) { - const { buttonInteraction, modalInteraction } = jobReminderData; - - // Create embed asking about email notifications - const emailEmbed = new EmbedBuilder() - .setColor(COLORS.INFO) - .setTitle(`${EMOJI.EMAIL} Would you like to receive job alerts by email too?`) - .setDescription('Choose whether you want to also receive job alerts via email when they trigger.') - .setFooter({ text: 'Email notifications are optional' }) - .setTimestamp(); - - // Create Yes/No buttons - const emailRow = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId('job_email_yes') - .setLabel('Yes, send email') - .setEmoji(EMOJI.EMAIL) - .setStyle(ButtonStyle.Success), - new ButtonBuilder() - .setCustomId('job_email_no') - .setLabel('No, Discord only') - .setStyle(ButtonStyle.Secondary) - ); - - // Store the job reminder data in the client's temporary collection - modalInteraction.client.jobReminderTemp = jobReminderData; - - // Defer the modal reply to acknowledge it - await modalInteraction.deferUpdate(); - - // Update original message to ask about email - const message = await buttonInteraction.editReply({ - embeds: [emailEmbed], - components: [emailRow] - }); - - // Create a dedicated collector for this specific message - const collector = message.createMessageComponentCollector({ - componentType: ComponentType.Button, - time: 60000 // 1 minute timeout - }); - - collector.on('collect', async (i) => { - // Make sure it's the right user - if (i.user.id !== buttonInteraction.user.id) { - await i.reply({ - content: 'This button is not for you.', - ephemeral: true - }); - return; - } - - // Stop the collector since we've handled the interaction - collector.stop(); - - if (i.customId === 'job_email_yes') { - // Create modal for email address - const modal = new ModalBuilder() - .setCustomId('job_email_modal') - .setTitle(`${EMOJI.EMAIL} Email Notification for Job Alerts`); - - // Add input for email address - const emailInput = new TextInputBuilder() - .setCustomId('email') - .setLabel("Email address for job alerts:") - .setStyle(TextInputStyle.Short) - .setPlaceholder("Enter your email address here...") - .setRequired(true); - - // Create action row with input - const emailRow = new ActionRowBuilder().addComponents(emailInput); - - // Add action row to the modal - modal.addComponents(emailRow); - - // Show the modal using the NEW interaction from collector - await i.showModal(modal); - - try { - // Wait for modal submission - const modalSubmit = await i.awaitModalSubmit({ - time: 180000, // 3 minutes - filter: (mi) => mi.customId === 'job_email_modal' && mi.user.id === i.user.id - }); - - // Process the email and finalize - const email = modalSubmit.fields.getTextInputValue('email'); - - // Email validation - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - if (!emailRegex.test(email)) { - await modalSubmit.reply({ - content: `Invalid email address format. Please try again.`, - ephemeral: true - }); - return; - } - - // Finalize job reminder creation with email - await this.finalizeJobReminderCreation(buttonInteraction, true, email, modalSubmit); - } catch (error) { - console.error('Error in modal submission:', error); - // Fallback to no email - await this.finalizeJobReminderCreation(buttonInteraction, false, null); - } - } else if (i.customId === 'job_email_no') { - // Handle "No, Discord only" option - await this.finalizeJobReminderCreation(buttonInteraction, false, null); - } - }); - - // Handle collector end (timeout) - collector.on('end', collected => { - if (collected.size === 0) { - // If no buttons were pressed, create without email - this.finalizeJobReminderCreation(buttonInteraction, false, null); - } - }); - } - - // Create and store the job reminder with or without email - private async finalizeJobReminderCreation(buttonInteraction: any, withEmail: boolean, email: string | null, modalInteraction?: ModalSubmitInteraction) { - try { - // Get the job reminder data - const jobReminderData = buttonInteraction.client.jobReminderTemp; - - // Check if we have valid job reminder data - if (!jobReminderData || !jobReminderData.repeatValue || !jobReminderData.filterValue) { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Error Creating Job Alert`) - .setDescription('Missing job alert information. Please try creating your job alert again.') - .setTimestamp(); - - // If we have a modal interaction, respond to that - if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { - await modalInteraction.reply({ - embeds: [errorEmbed], - ephemeral: true - }); - } else { - // Otherwise try to update the button interaction - try { - await buttonInteraction.update({ - embeds: [errorEmbed], - components: [this.createBackButton()] - }); - } catch (updateError) { - // If updating fails, try editing - await buttonInteraction.editReply({ - embeds: [errorEmbed], - components: [this.createBackButton()] - }); - } - } - return; - } - - const { repeatValue, filterValue } = jobReminderData; - - // Create the job reminder object - const jobReminder: Reminder = { - owner: buttonInteraction.user.id, - content: 'Job Reminder', - mode: 'private', - expires: new Date(), // Set to now, will be handled by the job scheduler - repeat: repeatValue as 'daily' | 'weekly', - filterBy: filterValue as 'default' | 'relevance' | 'salary' | 'date', - emailNotification: withEmail, - emailAddress: withEmail ? email : null - }; - - // Store the job reminder in the database - await buttonInteraction.client.mongo - .collection(DB.REMINDERS) - .insertOne(jobReminder); - - // Create success embed - const successEmbed = new EmbedBuilder() - .setColor(COLORS.SECONDARY) - .setTitle(`${EMOJI.JOB} Job Alert Created`) - .setDescription( - `I'll send you job opportunities **${repeatValue}** starting at **${reminderTime(jobReminder)}**.` - ) - .addFields( - { name: 'Frequency', value: `${repeatValue.charAt(0).toUpperCase() + repeatValue.slice(1)}`, inline: true }, - { name: 'Sorted By', value: `${filterValue.charAt(0).toUpperCase() + filterValue.slice(1)}`, inline: true } - ); - - // Add email info if applicable - if (withEmail) { - successEmbed.addFields({ - name: 'Email Notification', - value: `You'll also receive job alerts at **${email}** when they trigger.` - }); - } - - successEmbed.setFooter({ text: 'You can update your preferences anytime' }) - .setTimestamp(); - - // Handle the response based on which interaction is available - if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { - // If we have a modal interaction that hasn't been replied to yet - await modalInteraction.reply({ - content: "Your job alert has been created successfully!", - ephemeral: true - }); - - // Update the original message - await buttonInteraction.editReply({ - embeds: [successEmbed], - components: [this.createBackButton()] - }); - } else { - // Otherwise try to update the button interaction - try { - await buttonInteraction.update({ - embeds: [successEmbed], - components: [this.createBackButton()] - }); - } catch (updateError) { - // If updating fails, try editing - await buttonInteraction.editReply({ - embeds: [successEmbed], - components: [this.createBackButton()] - }); - } - } - - // Clean up temporary data - delete buttonInteraction.client.jobReminderTemp; - } catch (error) { - console.error('Error in finalizeJobReminderCreation:', error); - - // Try to give feedback through any available channel - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.WARNING) - .setTitle(`${EMOJI.JOB} Job Alert Process Completed`) - .setDescription("Your job alert has been created, but there was an issue updating the display.") - .setTimestamp(); - - try { - if (modalInteraction && !modalInteraction.replied && !modalInteraction.deferred) { - await modalInteraction.reply({ - embeds: [errorEmbed], - ephemeral: true - }); - } else { - await buttonInteraction.editReply({ - embeds: [errorEmbed], - components: [this.createBackButton()] - }); - } - } catch (secondError) { - console.error('Even the error handler failed:', secondError); - } - } - } - - // Handle viewing reminders - private async handleViewReminders(buttonInteraction: any) { - const reminders: Array = await buttonInteraction.client.mongo - .collection(DB.REMINDERS) - .find({ owner: buttonInteraction.user.id }) - .toArray(); - - reminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); - - if (reminders.length < 1) { - const noRemindersEmbed = new EmbedBuilder() - .setColor(COLORS.INFO) - .setTitle(`${EMOJI.VIEW} No Reminders Found`) - .setDescription('You don\'t have any pending reminders!') - .setFooter({ text: 'Use the CREATE REMINDER button to set one up' }) - .setTimestamp(); - - // Update instead of reply to replace the message - return buttonInteraction.update({ - embeds: [noRemindersEmbed], - components: [this.createBackButton()], // Add back button - }); - } - - const embeds: Array = []; - reminders.forEach((reminder, i) => { - if (i % 10 === 0) { // Reduced to 10 reminders per embed for better readability - embeds.push( - new EmbedBuilder() - .setTitle(`${EMOJI.VIEW} Your Reminders (${reminders.length})`) - .setColor(COLORS.INFO) - .setDescription('Here are all your pending reminders:') - .setFooter({ - text: `Page ${Math.floor(i / 10) + 1}/${Math.ceil(reminders.length / 10)}` - }) - .setTimestamp() - ); - } - - const hidden = reminder.mode === 'private'; - const isJobReminder = reminder.content === 'Job Reminder'; - const icon = isJobReminder ? EMOJI.JOB : EMOJI.REMINDER; - const emailIcon = reminder.emailNotification ? ` ${EMOJI.EMAIL}` : ''; - - embeds[Math.floor(i / 10)].addFields({ - name: `${i + 1}. ${icon}${emailIcon} ${ - hidden - ? isJobReminder - ? 'Job Alert' - : 'Private Reminder' - : reminder.content - }`, - value: hidden - ? `${EMOJI.REPEAT} **${reminder.repeat}** job reminder filtered by **${reminder.filterBy}**${ - reminder.emailNotification ? `\n${EMOJI.EMAIL} Email notifications to: ${reminder.emailAddress}` : '' - }` - : `${EMOJI.TIME} Due: **${reminderTime(reminder)}**${ - reminder.emailNotification ? `\n${EMOJI.EMAIL} Email notifications to: ${reminder.emailAddress}` : '' - }` - }); - }); - - // Add back button to the response - const backButton = this.createBackButton(); - - // Update instead of reply to replace the message - await buttonInteraction.update({ - embeds, - components: [backButton], // Add back button - }); - } - - // Handle canceling a reminder - private async handleCancelReminder(buttonInteraction: any) { - // Create modal for reminder cancellation - const modal = new ModalBuilder() - .setCustomId('cancel_reminder_modal') - .setTitle(`${EMOJI.CANCEL} Cancel Reminder`); - - // Add input for reminder number - const reminderNumInput = new TextInputBuilder() - .setCustomId('reminder_number') - .setLabel("Which reminder would you like to cancel?") - .setPlaceholder('Enter the number (e.g. 1, 2, 3)') - .setStyle(TextInputStyle.Short) - .setRequired(true); - - // Create action row with input - const reminderNumRow = new ActionRowBuilder().addComponents(reminderNumInput); - - // Add action row to the modal - modal.addComponents(reminderNumRow); - - // Show the modal - await buttonInteraction.showModal(modal); - - // Wait for modal submission - try { - const modalInteraction = await buttonInteraction.awaitModalSubmit({ - time: 60000, // 1 minute - filter: (i: ModalSubmitInteraction) => - i.customId === 'cancel_reminder_modal' && - i.user.id === buttonInteraction.user.id - }); - - // Process modal submission - const reminderNumStr = modalInteraction.fields.getTextInputValue('reminder_number'); - const reminderNum = parseInt(reminderNumStr) - 1; // Convert to 0-based index - - if (isNaN(reminderNum) || reminderNum < 0) { - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Invalid Reminder Number`) - .setDescription(`**"${reminderNumStr}"** is not a valid reminder number. Please enter a positive integer.`) - .setFooter({ text: 'Use the VIEW REMINDERS button to see your reminders and their numbers' }); - - // Defer the modal reply to acknowledge it without sending a visible message - await modalInteraction.deferUpdate(); - - // Update the original message with the error - await buttonInteraction.editReply({ - embeds: [errorEmbed], - components: [this.createBackButton()], // Add back button - }); - - return; - } - - // Get user's reminders and sort them - const reminders: Array = await modalInteraction.client.mongo - .collection(DB.REMINDERS) - .find({ owner: modalInteraction.user.id }) - .toArray(); - - reminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); - - // Check if the reminder exists - const reminder = reminders[reminderNum]; - if (!reminder) { - const notFoundEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Reminder Not Found`) - .setDescription(`I couldn't find reminder **#${reminderNum + 1}**.`) - .setFooter({ text: 'Use the VIEW REMINDERS button to see your current reminders' }); - - // Defer the modal reply to acknowledge it without sending a visible message - await modalInteraction.deferUpdate(); - - // Update the original message with the error - await buttonInteraction.editReply({ - embeds: [notFoundEmbed], - components: [this.createBackButton()], // Add back button - }); - - return; - } - - // Delete the reminder - await modalInteraction.client.mongo - .collection(DB.REMINDERS) - .findOneAndDelete(reminder); - - const hidden = reminder.mode === 'private'; - const isJobReminder = reminder.content === 'Job Reminder'; - const emailInfo = reminder.emailNotification ? `\nEmail notifications to ${reminder.emailAddress} have been canceled.` : ''; - - const successEmbed = new EmbedBuilder() - .setColor(COLORS.SUCCESS) - .setTitle(`${EMOJI.CANCEL} Reminder Cancelled`) - .setDescription( - `Successfully cancelled reminder **#${reminderNum + 1}**: ${ - hidden - ? (isJobReminder ? 'Job Alert' : 'Private Reminder') - : `"${reminder.content}"` - }${emailInfo}` - ) - .setTimestamp(); - - // Defer the modal reply to acknowledge it without sending a visible message - await modalInteraction.deferUpdate(); - - // Update the original message with the success info - await buttonInteraction.editReply({ - embeds: [successEmbed], - components: [this.createBackButton()], // Add back button - }); - - } catch (error) { - console.error('Error in modal submission:', error); - - const errorEmbed = new EmbedBuilder() - .setColor(COLORS.DANGER) - .setTitle(`${EMOJI.CANCEL} Cancellation Failed`) - .setDescription('The reminder cancellation process timed out or an error occurred.') - .setTimestamp(); - - // Update the original button interaction - await buttonInteraction.editReply({ - embeds: [errorEmbed], - components: [this.createBackButton()], // Add back button - }); - } - } -} \ No newline at end of file diff --git a/src/commands/reminders/types.ts b/src/commands/reminders/types.ts new file mode 100644 index 00000000..b6012451 --- /dev/null +++ b/src/commands/reminders/types.ts @@ -0,0 +1,26 @@ +// Type definitions for the reminder system +import { ButtonInteraction, ChatInputCommandInteraction, ModalSubmitInteraction, Client } from "discord.js"; + +// Store reminder data temporarily during creation flow +export interface ReminderData { + content: string; + expiryDate: Date; + buttonInteraction: ButtonInteraction; + modalInteraction: ModalSubmitInteraction; +} + +// Store job reminder data temporarily during creation flow +export interface JobReminderData { + repeatValue: string; + filterValue: string; + buttonInteraction: ButtonInteraction; + modalInteraction: ModalSubmitInteraction; +} + +// Extend the Discord.js Client to include our temporary storage properties +declare module 'discord.js' { + interface Client { + reminderTemp?: ReminderData; + jobReminderTemp?: JobReminderData; + } +} \ No newline at end of file diff --git a/src/commands/reminders/ui.ts b/src/commands/reminders/ui.ts new file mode 100644 index 00000000..00e900a1 --- /dev/null +++ b/src/commands/reminders/ui.ts @@ -0,0 +1,208 @@ +// UI component creation functions +import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, ModalBuilder, TextInputBuilder, TextInputStyle } from "discord.js"; +import { COLORS, EMOJI } from "./constants"; + +/** + * Creates a back button to return to the main menu + */ +export function createBackButton(): ActionRowBuilder { + return new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId('back_to_menu') + .setLabel('Back to Menu') + .setEmoji(EMOJI.BACK) + .setStyle(ButtonStyle.Secondary) + ); +} + +/** + * Creates the main menu embed + */ +export function createMainMenuEmbed(username: string, avatarURL: string): EmbedBuilder { + return new EmbedBuilder() + .setColor(COLORS.PRIMARY) + .setTitle(`${EMOJI.REMINDER} Reminder System`) + .setDescription('What would you like to do?') + .setFooter({ + text: `Requested by ${username}`, + iconURL: avatarURL + }) + .setTimestamp(); +} + +/** + * Creates the main menu buttons + */ +export function createMainMenuButtons(): ActionRowBuilder { + return new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId('create_reminder') + .setLabel('Create Reminder') + .setEmoji(EMOJI.REMINDER) + .setStyle(ButtonStyle.Primary), + new ButtonBuilder() + .setCustomId('create_job_reminder') + .setLabel('Job Alert') + .setEmoji(EMOJI.JOB) + .setStyle(ButtonStyle.Secondary), + new ButtonBuilder() + .setCustomId('view_reminders') + .setLabel('View All') + .setEmoji(EMOJI.VIEW) + .setStyle(ButtonStyle.Success), + new ButtonBuilder() + .setCustomId('cancel_reminder') + .setLabel('Cancel') + .setEmoji(EMOJI.CANCEL) + .setStyle(ButtonStyle.Danger) + ); +} + +/** + * Creates a reminder modal + */ +export function createReminderModal(): ModalBuilder { + const modal = new ModalBuilder() + .setCustomId('reminder_modal') + .setTitle(`${EMOJI.REMINDER} Create New Reminder`); + + // Add inputs for content and duration + const contentInput = new TextInputBuilder() + .setCustomId('content') + .setLabel("What would you like to be reminded of?") + .setStyle(TextInputStyle.Paragraph) + .setPlaceholder("Enter your reminder message here...") + .setRequired(true); + + const durationInput = new TextInputBuilder() + .setCustomId('duration') + .setLabel("When would you like to be reminded?") + .setPlaceholder('e.g. 1 hour, 30 minutes, 2 days, tomorrow at 3pm') + .setStyle(TextInputStyle.Short) + .setRequired(true); + + // Create action rows with inputs + const contentRow = new ActionRowBuilder().addComponents(contentInput); + const durationRow = new ActionRowBuilder().addComponents(durationInput); + + // Add action rows to the modal + modal.addComponents(contentRow, durationRow); + + return modal; +} + +/** + * Creates a job reminder modal + */ +export function createJobReminderModal(): ModalBuilder { + const modal = new ModalBuilder() + .setCustomId('job_reminder_modal') + .setTitle(`${EMOJI.JOB} Create Job Alert`); + + // Add inputs for repeat frequency and filter type + const repeatInput = new TextInputBuilder() + .setCustomId('repeat') + .setLabel('How often would you like to receive alerts?') + .setPlaceholder('Type "daily", "weekly", or "monthly"') + .setStyle(TextInputStyle.Short) + .setRequired(true); + + const filterInput = new TextInputBuilder() + .setCustomId('filter') + .setLabel('Sort jobs by?') + .setPlaceholder('default, relevance, salary, or date') + .setStyle(TextInputStyle.Short) + .setRequired(true) + .setValue('default'); // Default value + + // Create action rows with inputs + const repeatRow = new ActionRowBuilder().addComponents(repeatInput); + const filterRow = new ActionRowBuilder().addComponents(filterInput); + + // Add action rows to the modal + modal.addComponents(repeatRow, filterRow); + + return modal; +} + +/** + * Creates an email notification options embed + */ +export function createEmailOptionsEmbed(isJobReminder: boolean = false): EmbedBuilder { + return new EmbedBuilder() + .setColor(COLORS.INFO) + .setTitle(`${EMOJI.EMAIL} Would you like to receive this ${isJobReminder ? 'job alert' : 'reminder'} by email too?`) + .setDescription(`Choose whether you want to also receive this ${isJobReminder ? 'job alert' : 'reminder'} via email when it triggers.`) + .setFooter({ text: 'Email notifications are optional' }) + .setTimestamp(); +} + +/** + * Creates email notification option buttons + */ +export function createEmailOptionsButtons(isJobReminder: boolean = false): ActionRowBuilder { + return new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId(isJobReminder ? 'job_email_yes' : 'email_yes') + .setLabel('Yes, send email') + .setEmoji(EMOJI.EMAIL) + .setStyle(ButtonStyle.Success), + new ButtonBuilder() + .setCustomId(isJobReminder ? 'job_email_no' : 'email_no') + .setLabel('No, Discord only') + .setStyle(ButtonStyle.Secondary) + ); +} + +/** + * Creates an email input modal + */ +export function createEmailInputModal(isJobReminder: boolean = false): ModalBuilder { + const modal = new ModalBuilder() + .setCustomId(isJobReminder ? 'job_email_modal' : 'email_modal') + .setTitle(`${EMOJI.EMAIL} Email Notification${isJobReminder ? ' for Job Alerts' : ''}`); + + // Add input for email address + const emailInput = new TextInputBuilder() + .setCustomId('email') + .setLabel(`Email address for ${isJobReminder ? 'job alerts' : 'notifications'}:`) + .setStyle(TextInputStyle.Short) + .setPlaceholder("Enter your email address here...") + .setRequired(true); + + // Create action row with input + const emailRow = new ActionRowBuilder().addComponents(emailInput); + + // Add action row to the modal + modal.addComponents(emailRow); + + return modal; +} + +/** + * Creates a cancel reminder modal + */ +export function createCancelReminderModal(): ModalBuilder { + const modal = new ModalBuilder() + .setCustomId('cancel_reminder_modal') + .setTitle(`${EMOJI.CANCEL} Cancel Reminder`); + + // Add input for reminder number + const reminderNumInput = new TextInputBuilder() + .setCustomId('reminder_number') + .setLabel("Which reminder would you like to cancel?") + .setPlaceholder('Enter the number (e.g. 1, 2, 3)') + .setStyle(TextInputStyle.Short) + .setRequired(true); + + // Create action row with input + const reminderNumRow = new ActionRowBuilder().addComponents(reminderNumInput); + + // Add action row to the modal + modal.addComponents(reminderNumRow); + + return modal; +} \ No newline at end of file diff --git a/src/commands/reminders/utils.ts b/src/commands/reminders/utils.ts new file mode 100644 index 00000000..0324e506 --- /dev/null +++ b/src/commands/reminders/utils.ts @@ -0,0 +1,115 @@ +// Utility functions for the reminders system +import { COLORS, EMOJI } from "./constants"; +import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, ButtonInteraction } from "discord.js"; +import { Reminder } from "@lib/types/Reminder"; + +/** + * Validates an email address format + */ +export function isValidEmail(email: string): boolean { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegex.test(email); +} + +/** + * Creates an error embed with the specified message + */ +export function createErrorEmbed(title: string, description: string): EmbedBuilder { + return new EmbedBuilder() + .setColor(COLORS.DANGER) + .setTitle(`${EMOJI.CANCEL} ${title}`) + .setDescription(description) + .setTimestamp(); +} + +/** + * Creates a success embed for a standard reminder + */ +export function createReminderSuccessEmbed( + content: string, + expiryTime: string, + withEmail: boolean = false, + email: string = null +): EmbedBuilder { + const embed = new EmbedBuilder() + .setColor(COLORS.SUCCESS) + .setTitle(`${EMOJI.REMINDER} Reminder Set!`) + .setDescription(`I'll remind you about that at **${expiryTime}**.`) + .addFields({ + name: 'Reminder Content', + value: `> ${content}` + }); + + // Add email info if applicable + if (withEmail && email) { + embed.addFields({ + name: 'Email Notification', + value: `You'll also receive an email at **${email}** when this reminder triggers.` + }); + } + + embed.setTimestamp(); + + return embed; +} + +/** + * Creates a success embed for a job reminder + */ +export function createJobReminderSuccessEmbed( + repeatValue: string, + filterValue: string, + expiryTime: string, + withEmail: boolean = false, + email: string = null +): EmbedBuilder { + const embed = new EmbedBuilder() + .setColor(COLORS.SECONDARY) + .setTitle(`${EMOJI.JOB} Job Alert Created`) + .setDescription( + `I'll send you job opportunities **${repeatValue}** starting at **${expiryTime}**.` + ) + .addFields( + { name: 'Frequency', value: `${repeatValue.charAt(0).toUpperCase() + repeatValue.slice(1)}`, inline: true }, + { name: 'Sorted By', value: `${filterValue.charAt(0).toUpperCase() + filterValue.slice(1)}`, inline: true } + ); + + // Add email info if applicable + if (withEmail && email) { + embed.addFields({ + name: 'Email Notification', + value: `You'll also receive job alerts at **${email}** when they trigger.` + }); + } + + embed.setFooter({ text: 'You can update your preferences anytime' }) + .setTimestamp(); + + return embed; +} + +/** + * Format reminder icon based on type + */ +export function getReminderIcon(reminder: Reminder): string { + const isJobReminder = reminder.content === 'Job Reminder'; + const emailIcon = reminder.emailNotification ? ` ${EMOJI.EMAIL}` : ''; + + return `${isJobReminder ? EMOJI.JOB : EMOJI.REMINDER}${emailIcon}`; +} + +/** + * Helper for checking job reminder that accepts ButtonInteraction + * This wraps the original checkJobReminder function to handle ButtonInteraction + */ +export async function checkJobReminderForButton(buttonInteraction: ButtonInteraction): Promise { + const DB = (await import('@root/config')).DB; + const reminders = await buttonInteraction.client.mongo + .collection(DB.REMINDERS) + .find({ owner: buttonInteraction.user.id }) + .toArray(); + + return reminders.some( + (reminder) => reminder.content === 'Job Reminder' + ); +} \ No newline at end of file From baede7ce10cfd04cbf38cd20791650e92f210293 Mon Sep 17 00:00:00 2001 From: Karanvir Date: Sat, 3 May 2025 23:12:00 -0400 Subject: [PATCH 305/317] fixed the sorting for reminders --- .../workflows/node.js_20250502203204.yml | 62 - .../workflows/node.js_20250502203333.yml | 59 - .../workflows/node.js_20250502203345.yml | 58 - .history/binding_20250502203204.gyp | 12 - .history/binding_20250502203734.gyp | 0 .history/binding_20250502203739.gyp | 8 - .history/install-deps-mac_20250502203204.sh | 35 - .history/install-deps-mac_20250502203411.sh | 31 - .history/install-deps-mac_20250502203414.sh | 27 - .history/install-deps-mac_20250502203418.sh | 24 - .../install-deps-windows_20250502203204.ps1 | 81 - .../install-deps-windows_20250502203428.ps1 | 79 - .../install-deps-windows_20250502203429.ps1 | 75 - .history/package-lock_20250502203204.json | 5433 ----------------- .history/package-lock_20250502203557.json | 5422 ---------------- .history/package-lock_20250502203601.json | 5423 ---------------- .history/package-lock_20250502203603.json | 5424 ---------------- .history/package-lock_20250502203724.json | 5406 ---------------- .history/package-lock_20250502203726.json | 5405 ---------------- .history/package_20250502203204.json | 84 - .history/package_20250502203547.json | 82 - .history/package_20250502203550.json | 78 - .../reminders/remind_20250428131631.ts | 149 - .../reminders/remind_20250502211217.ts | 150 - .../reminders/remind_20250502211309.ts | 149 - .../Adzuna_job_search_20250430125913.ts | 68 - .../Adzuna_job_search_20250502202604.ts | 74 - .../Adzuna_job_search_20250502202609.ts | 74 - .../Adzuna_job_search_20250502202613.ts | 74 - .../Adzuna_job_search_20250502202614.ts | 74 - .../Adzuna_job_search_20250502202618.ts | 74 - .../Adzuna_job_search_20250502202634.ts | 74 - .../Adzuna_job_search_20250502202638.ts | 68 - .../Adzuna_job_search_20250502202648.ts | 74 - .../Adzuna_job_search_20250502202653.ts | 68 - .../Adzuna_job_search_20250502202739.ts | 78 - .../Adzuna_job_search_20250502202830.ts | 79 - .../Adzuna_job_search_20250502205348.ts | 73 - .../Adzuna_job_search_20250502205439.ts | 68 - .../Adzuna_job_search_20250502205724.ts | 74 - .history/src/pieces/tasks_20250430125913.ts | 254 - .history/src/pieces/tasks_20250502202034.ts | 279 - .history/src/pieces/tasks_20250502202042.ts | 279 - .history/src/pieces/tasks_20250502202046.ts | 279 - .history/src/pieces/tasks_20250502202137.ts | 254 - .history/src/pieces/tasks_20250502202201.ts | 279 - .history/src/pieces/tasks_20250502202259.ts | 279 - .history/src/pieces/tasks_20250502202302.ts | 279 - .history/src/pieces/tasks_20250502202306.ts | 279 - .history/src/pieces/tasks_20250502202310.ts | 279 - .history/src/pieces/tasks_20250502204843.ts | 698 --- .history/src/pieces/tasks_20250502205558.ts | 705 --- src/commands/jobs/update_filtering.ts | 22 +- src/commands/reminders/remind.ts | 65 +- src/commands/reminders/viewreminders.ts | 69 +- src/lib/utils/generalUtils.ts | 13 +- 56 files changed, 111 insertions(+), 39051 deletions(-) delete mode 100644 .history/.github/workflows/node.js_20250502203204.yml delete mode 100644 .history/.github/workflows/node.js_20250502203333.yml delete mode 100644 .history/.github/workflows/node.js_20250502203345.yml delete mode 100644 .history/binding_20250502203204.gyp delete mode 100644 .history/binding_20250502203734.gyp delete mode 100644 .history/binding_20250502203739.gyp delete mode 100644 .history/install-deps-mac_20250502203204.sh delete mode 100644 .history/install-deps-mac_20250502203411.sh delete mode 100644 .history/install-deps-mac_20250502203414.sh delete mode 100644 .history/install-deps-mac_20250502203418.sh delete mode 100644 .history/install-deps-windows_20250502203204.ps1 delete mode 100644 .history/install-deps-windows_20250502203428.ps1 delete mode 100644 .history/install-deps-windows_20250502203429.ps1 delete mode 100644 .history/package-lock_20250502203204.json delete mode 100644 .history/package-lock_20250502203557.json delete mode 100644 .history/package-lock_20250502203601.json delete mode 100644 .history/package-lock_20250502203603.json delete mode 100644 .history/package-lock_20250502203724.json delete mode 100644 .history/package-lock_20250502203726.json delete mode 100644 .history/package_20250502203204.json delete mode 100644 .history/package_20250502203547.json delete mode 100644 .history/package_20250502203550.json delete mode 100644 .history/src/commands/reminders/remind_20250428131631.ts delete mode 100644 .history/src/commands/reminders/remind_20250502211217.ts delete mode 100644 .history/src/commands/reminders/remind_20250502211309.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250430125913.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202604.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202609.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202613.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202614.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202618.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202634.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202638.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202648.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202653.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202739.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202830.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502205348.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502205439.ts delete mode 100644 .history/src/lib/utils/jobUtils/Adzuna_job_search_20250502205724.ts delete mode 100644 .history/src/pieces/tasks_20250430125913.ts delete mode 100644 .history/src/pieces/tasks_20250502202034.ts delete mode 100644 .history/src/pieces/tasks_20250502202042.ts delete mode 100644 .history/src/pieces/tasks_20250502202046.ts delete mode 100644 .history/src/pieces/tasks_20250502202137.ts delete mode 100644 .history/src/pieces/tasks_20250502202201.ts delete mode 100644 .history/src/pieces/tasks_20250502202259.ts delete mode 100644 .history/src/pieces/tasks_20250502202302.ts delete mode 100644 .history/src/pieces/tasks_20250502202306.ts delete mode 100644 .history/src/pieces/tasks_20250502202310.ts delete mode 100644 .history/src/pieces/tasks_20250502204843.ts delete mode 100644 .history/src/pieces/tasks_20250502205558.ts diff --git a/.history/.github/workflows/node.js_20250502203204.yml b/.history/.github/workflows/node.js_20250502203204.yml deleted file mode 100644 index 4ba5b2b4..00000000 --- a/.history/.github/workflows/node.js_20250502203204.yml +++ /dev/null @@ -1,62 +0,0 @@ -# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs - -name: node - -on: - workflow_call: - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Use Node.js - uses: actions/setup-node@v4 - 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++ - - - - name: Install node-gyp - run: npm install -g node-gyp -<<<<<<< HEAD - -======= ->>>>>>> 1c0d10eab4981bb2ff421a64acc77f0afac0a43f - - - 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 - - if grep -q "node_modules/discord.js/typings/index.d.ts" build-output.log; then - echo "Ignoring build errors from node_modules/discord.js/typings/index.d.ts" - - sed -i '/node_modules\/discord\.js\/typings\/index\.d\.ts/d' build-output.log - fi - - if grep -q "Error" build-output.log; then - echo "Other build errors found. Failing the workflow." - exit 1 - fi - - echo "No unignored build errors found. Workflow continues." - - - run: npm test - - # - name: Start Development - # run: npm run dev diff --git a/.history/.github/workflows/node.js_20250502203333.yml b/.history/.github/workflows/node.js_20250502203333.yml deleted file mode 100644 index 7baef215..00000000 --- a/.history/.github/workflows/node.js_20250502203333.yml +++ /dev/null @@ -1,59 +0,0 @@ -# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs - -name: node - -on: - workflow_call: - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Use Node.js - uses: actions/setup-node@v4 - 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++ - - - - name: Install node-gyp - run: npm install -g node-gyp ->>>>>>>>> Temporary merge branch 2 - - - 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 - - if grep -q "node_modules/discord.js/typings/index.d.ts" build-output.log; then - echo "Ignoring build errors from node_modules/discord.js/typings/index.d.ts" - - sed -i '/node_modules\/discord\.js\/typings\/index\.d\.ts/d' build-output.log - fi - - if grep -q "Error" build-output.log; then - echo "Other build errors found. Failing the workflow." - exit 1 - fi - - echo "No unignored build errors found. Workflow continues." - - - run: npm test - - # - name: Start Development - # run: npm run dev diff --git a/.history/.github/workflows/node.js_20250502203345.yml b/.history/.github/workflows/node.js_20250502203345.yml deleted file mode 100644 index 739255bf..00000000 --- a/.history/.github/workflows/node.js_20250502203345.yml +++ /dev/null @@ -1,58 +0,0 @@ -# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs - -name: node - -on: - workflow_call: - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Use Node.js - uses: actions/setup-node@v4 - 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++ - - - - name: Install node-gyp - run: npm install -g node-gyp - - - 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 - - if grep -q "node_modules/discord.js/typings/index.d.ts" build-output.log; then - echo "Ignoring build errors from node_modules/discord.js/typings/index.d.ts" - - sed -i '/node_modules\/discord\.js\/typings\/index\.d\.ts/d' build-output.log - fi - - if grep -q "Error" build-output.log; then - echo "Other build errors found. Failing the workflow." - exit 1 - fi - - echo "No unignored build errors found. Workflow continues." - - - run: npm test - - # - name: Start Development - # run: npm run dev diff --git a/.history/binding_20250502203204.gyp b/.history/binding_20250502203204.gyp deleted file mode 100644 index 46794b98..00000000 --- a/.history/binding_20250502203204.gyp +++ /dev/null @@ -1,12 +0,0 @@ -{ - "targets": [ - { - "target_name": "sage", - "sources": ["src/sage.ts"] - } - ] -<<<<<<< HEAD -} -======= -} ->>>>>>> 1c0d10eab4981bb2ff421a64acc77f0afac0a43f diff --git a/.history/binding_20250502203734.gyp b/.history/binding_20250502203734.gyp deleted file mode 100644 index e69de29b..00000000 diff --git a/.history/binding_20250502203739.gyp b/.history/binding_20250502203739.gyp deleted file mode 100644 index b2402bae..00000000 --- a/.history/binding_20250502203739.gyp +++ /dev/null @@ -1,8 +0,0 @@ -{ - "targets": [ - { - "target_name": "sage", - "sources": ["src/sage.ts"] - } - ] -} \ No newline at end of file diff --git a/.history/install-deps-mac_20250502203204.sh b/.history/install-deps-mac_20250502203204.sh deleted file mode 100644 index bf608126..00000000 --- a/.history/install-deps-mac_20250502203204.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -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", -<<<<<<< HEAD - - "sources": ["$SRC_FILE"] -======= - "sources": ["$SRC_FILE"], ->>>>>>> 1c0d10eab4981bb2ff421a64acc77f0afac0a43f - } - ] -} -EOF - echo "binding.gyp created successfully." -<<<<<<< HEAD - -fi - -======= -fi ->>>>>>> 1c0d10eab4981bb2ff421a64acc77f0afac0a43f diff --git a/.history/install-deps-mac_20250502203411.sh b/.history/install-deps-mac_20250502203411.sh deleted file mode 100644 index a32af6bd..00000000 --- a/.history/install-deps-mac_20250502203411.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -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", -<<<<<<<<< Temporary merge branch 1 - "sources": ["$SRC_FILE"], -========= - "sources": ["$SRC_FILE"] ->>>>>>>>> Temporary merge branch 2 - } - ] -} -EOF - echo "binding.gyp created successfully." -<<<<<<<<< Temporary merge branch 1 -========= -fi ->>>>>>>>> Temporary merge branch 2 diff --git a/.history/install-deps-mac_20250502203414.sh b/.history/install-deps-mac_20250502203414.sh deleted file mode 100644 index 33fdabdd..00000000 --- a/.history/install-deps-mac_20250502203414.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -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." -<<<<<<<<< Temporary merge branch 1 -========= -fi ->>>>>>>>> Temporary merge branch 2 diff --git a/.history/install-deps-mac_20250502203418.sh b/.history/install-deps-mac_20250502203418.sh deleted file mode 100644 index 80b2beeb..00000000 --- a/.history/install-deps-mac_20250502203418.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -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." -fi diff --git a/.history/install-deps-windows_20250502203204.ps1 b/.history/install-deps-windows_20250502203204.ps1 deleted file mode 100644 index 27b673f0..00000000 --- a/.history/install-deps-windows_20250502203204.ps1 +++ /dev/null @@ -1,81 +0,0 @@ -#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..." - -#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." -} - -#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 MSYS2 -Write-Host "Installing MSYS2..." -choco install -y msys2 - -#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"] - } - ] -} -"@ - - # Write file in UTF-8 without BOM - [System.Text.Encoding]::UTF8.GetBytes($bindingContent) | Set-Content -Path $bindingGypPath -Encoding Byte -} - -#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" - -<<<<<<< HEAD - -Write-Host "All dependencies installed successfully!" - -======= -Write-Host "All dependencies installed successfully!" ->>>>>>> 1c0d10eab4981bb2ff421a64acc77f0afac0a43f diff --git a/.history/install-deps-windows_20250502203428.ps1 b/.history/install-deps-windows_20250502203428.ps1 deleted file mode 100644 index 5426abc4..00000000 --- a/.history/install-deps-windows_20250502203428.ps1 +++ /dev/null @@ -1,79 +0,0 @@ -#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..." - -#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." -} - -#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 MSYS2 -Write-Host "Installing MSYS2..." -choco install -y msys2 - -#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"] - } - ] -} -"@ - - # Write file in UTF-8 without BOM - [System.Text.Encoding]::UTF8.GetBytes($bindingContent) | Set-Content -Path $bindingGypPath -Encoding Byte -} - -#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" - -<<<<<<<<< Temporary merge branch 1 -Write-Host "All dependencies installed successfully!" -========= -Write-Host "All dependencies installed successfully!" ->>>>>>>>> Temporary merge branch 2 diff --git a/.history/install-deps-windows_20250502203429.ps1 b/.history/install-deps-windows_20250502203429.ps1 deleted file mode 100644 index 5ad08195..00000000 --- a/.history/install-deps-windows_20250502203429.ps1 +++ /dev/null @@ -1,75 +0,0 @@ -#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..." - -#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." -} - -#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 MSYS2 -Write-Host "Installing MSYS2..." -choco install -y msys2 - -#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"] - } - ] -} -"@ - - # Write file in UTF-8 without BOM - [System.Text.Encoding]::UTF8.GetBytes($bindingContent) | Set-Content -Path $bindingGypPath -Encoding Byte -} - -#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!" diff --git a/.history/package-lock_20250502203204.json b/.history/package-lock_20250502203204.json deleted file mode 100644 index 26460c63..00000000 --- a/.history/package-lock_20250502203204.json +++ /dev/null @@ -1,5433 +0,0 @@ -{ - "name": "sage", - "version": "3.3.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "sage", - "version": "3.3.0", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@discordjs/node-pre-gyp": "0.4.5", -<<<<<<< HEAD - "@octokit/rest": "^18.3.5", -======= - "@octokit/rest": "^21.1.1", ->>>>>>> 1c0d10eab4981bb2ff421a64acc77f0afac0a43f - "axios": "^1.4.0", - "canvas": "^3.1.0", - "chart.js": "^4.2.1", - "chartjs-node-canvas": "^5.0.0", - "console-stamp": "^3.0.2", - "discord.js": "^14.16.3", - "html-pdf-node": "^1.0.7", - "module-alias": "^2.2.2", - "moment": "^2.29.1", -<<<<<<< HEAD - "mongodb": "^3.6.3", -======= - "mongodb": "^3.7.4", - "node": "^23.9.0", ->>>>>>> 1c0d10eab4981bb2ff421a64acc77f0afac0a43f - "node-cron": "^2.0.3", - "node-fetch": "^2.6.1", - "nodemailer": "^6.4.17", - "parse-duration": "^2.1.3", - "pdf-lib": "^1.17.1", - "pretty-ms": "^7.0.1", - "puppeteer": "^24.6.0" - }, - "devDependencies": { - "@types/console-stamp": "^0.2.33", - "@types/mongodb": "^3.6.3", - "@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.6.2", - "typescript": "^5.0.2" - }, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "license": "MIT", - "dependencies": { - "@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" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "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==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/builders": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.1.tgz", - "integrity": "sha512-2zDAVuoeAkdv0YQzYKO8vZfaDfB+1KZ60ymBKtD7QDpsh6lzAnQSUBLqeRkhlons6BT9+yRctOh9fPy94w6kDA==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/formatters": "^0.6.1", - "@discordjs/util": "^1.1.1", - "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.4", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@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==", - "license": "Apache-2.0", - "engines": { - "node": ">=16.11.0" - } - }, - "node_modules/@discordjs/formatters": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.1.tgz", - "integrity": "sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==", - "license": "Apache-2.0", - "dependencies": { - "discord-api-types": "^0.38.1" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "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", - "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.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.5.0.tgz", - "integrity": "sha512-PWhchxTzpn9EV3vvPRpwS0EE2rNYB9pvzDU/eLLW3mByJl0ZHZjHI2/wA8EbH2gRMQV7nu+0FoDF84oiPl8VAQ==", - "license": "Apache-2.0", - "dependencies": { - "@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.38.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "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/util": { - "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" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/ws": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.2.tgz", - "integrity": "sha512-dyfq7yn0wO0IYeYOs3z79I6/HumhmKISzFL0Z+007zQJMtAFGtt3AEoq1nuLXtcunUE5YYYQqgKvybXukAK8/w==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/collection": "^2.1.0", - "@discordjs/rest": "^2.5.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.38.1", - "tslib": "^2.6.2", - "ws": "^8.17.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/@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", - "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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/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" - } - }, - "node_modules/@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==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@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==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@jonkemp/package-utils": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", - "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==", - "license": "MIT" - }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", - "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", - "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.2.2", - "@octokit/request": "^9.2.3", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "before-after-hook": "^3.0.2", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^9.2.3", - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", - "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", - "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.10.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", - "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", - "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.10.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/request": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", - "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^10.1.4", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^2.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", - "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", - "license": "MIT", - "dependencies": { - "@octokit/core": "^6.1.4", - "@octokit/plugin-paginate-rest": "^11.4.2", - "@octokit/plugin-request-log": "^5.3.1", - "@octokit/plugin-rest-endpoint-methods": "^13.3.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", - "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^25.0.0" - } - }, - "node_modules/@pdf-lib/standard-fonts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", - "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.6" - } - }, - "node_modules/@pdf-lib/upng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", - "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.10" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.2.tgz", - "integrity": "sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.4.0", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.1", - "tar-fs": "^3.0.8", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", - "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/@sapphire/async-queue": { - "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" - } - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v16" - } - }, - "node_modules/@sapphire/snowflake": { - "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/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "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": "*" - } - }, - "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" - }, - "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": "*" - } - }, - "node_modules/@types/node-fetch": { - "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": "^4.0.0" - } - }, - "node_modules/@types/nodemailer": { - "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.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.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "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", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@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, - "license": "MIT", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@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, - "license": "BSD-2-Clause", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "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", - "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" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.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", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "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" - } - }, - "node_modules/ansi-styles": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "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" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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" - }, - "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, - "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" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.3.tgz", - "integrity": "sha512-OeEZYIg+2qepaWLyphaOXHAHKo3xkM8y3BeGAvHdMN8GNWvEAU1Yw6rYpGzu/wDDbKxgEjVeVDpgGhDzaeMpjg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", - "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" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "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", - "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" - } - }, - "node_modules/bl/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" - }, - "node_modules/bl/node_modules/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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "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.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.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "engines": { - "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==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/canvas": { - "version": "3.1.0", - "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" - }, - "engines": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chart.js": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", - "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", - "license": "MIT", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chartjs-node-canvas": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-5.0.0.tgz", - "integrity": "sha512-+Lc5phRWjb+UxAIiQpKgvOaG6Mw276YQx2jl2BrxoUtI3A4RYTZuGM5Dq+s4ReYmCY42WEPSR6viF3lDSTxpvw==", - "license": "MIT", - "dependencies": { - "canvas": "^3.1.0", - "tslib": "^2.8.1" - }, - "peerDependencies": { - "chart.js": "^4.4.8" - } - }, - "node_modules/cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", - "license": "MIT", - "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-bidi": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-4.1.1.tgz", - "integrity": "sha512-biR7t4vF3YluE6RlMSk9IWk+b9U+WWyzHp+N2pL9vRTk+UXHYRTVp7jTK58ZNzMLBgoLMHY4QyJMbeuw3eKxqg==", - "license": "Apache-2.0", - "dependencies": { - "mitt": "^3.0.1", - "zod": "^3.24.1" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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" - }, - "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" - } - }, - "node_modules/combined-stream": { - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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" - }, - "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" - }, - "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" - }, - "engines": { - "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==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "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", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-rules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", - "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", - "license": "MIT", - "dependencies": { - "cssom": "^0.5.0" - } - }, - "node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", - "license": "BSD-like", - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "node_modules/css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "license": "BSD-2-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "license": "MIT" - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/dateformat": { - "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.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "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" - }, - "engines": { - "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, - "license": "MIT" - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "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" - } - }, - "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" - }, - "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" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.1425554", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", - "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==", - "license": "BSD-3-Clause" - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/discord-api-types": { - "version": "0.38.1", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.1.tgz", - "integrity": "sha512-vsjsqjAuxsPhiwbPjTBeGQaDPlizFmSkU0mTzFGMgRxqCDIRBR7iTY74HacpzrDV0QtERHRKQEk1tq7drZUtHg==", - "license": "MIT" - }, - "node_modules/discord.js": { - "version": "14.19.2", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.19.2.tgz", - "integrity": "sha512-L/ivhVefzzRcChHJSaGYsgA4Uqx6or2sst5JZ/ft9OBwrj8OJIzrrcutlkHnm/hlI0Hrm3es62TRVksU8VUqrg==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/builders": "^1.11.1", - "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.6.1", - "@discordjs/rest": "^2.5.0", - "@discordjs/util": "^1.1.1", - "@discordjs/ws": "^1.2.2", - "@sapphire/snowflake": "3.5.3", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "3.1.3", - "lodash.snakecase": "4.1.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "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, - "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==", - "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.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", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "license": "BSD-2-Clause" - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "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/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/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==", - "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", - "@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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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, - "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" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "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/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" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/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/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "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" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "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" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "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" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "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" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "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" - } - }, - "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/extract-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-2.0.1.tgz", - "integrity": "sha512-DX3+27l6NIVYNidJjBJ4VU3Z5tk/0aEO/JJ6XEJIRPFum9kyA1PifPjnEa8Ztnv4DHNQg5EF27aypGz6s/fMdw==", - "license": "MIT", - "dependencies": { - "batch": "^0.6.1", - "href-content": "^2.0.1", - "list-stylesheets": "^1.2.10", - "style-data": "^1.4.8" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "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" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "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", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/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, - "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, - "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.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" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "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.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-util": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.11.tgz", - "integrity": "sha512-h9ho3lHr5hDTQZKLqFDqIliDV/A8yCyP7UoSIBT4U3d7VfA/EeqsC8cxWJGIr5oCxZzMD/3BEx3SLYFX6hD8ng==", - "license": "MIT" - }, - "node_modules/flatted": { - "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.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" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "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": { - "node": ">= 6" - } - }, - "node_modules/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, - "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" - }, - "engines": { - "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==", - "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, - "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", - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 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/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "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", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "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", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "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/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "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==", - "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/href-content": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.3.tgz", - "integrity": "sha512-ikrAoI1l5ihN5Be2cR9nozFfivVJxPQDpa4+sb6PLt/uaNE/a7A05rHbnJEUduoHddbB3GyT5tdqzXMUmPgJYA==", - "license": "MIT", - "dependencies": { - "remote-content": "^4.0.0" - } - }, - "node_modules/html-pdf-node": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/html-pdf-node/-/html-pdf-node-1.0.8.tgz", - "integrity": "sha512-1PXbShoVXy8/86ZBY3xQNd5r2c/CPx/Me2wGtV0Z0Rekko5Tgow2hLms2n+OwA+PV7NyR7OPcTqsnhXIMUJLFw==", - "license": "ISC", - "dependencies": { - "bluebird": "^3.7.2", - "handlebars": "^4.7.6", - "inline-css": "^3.0.0", - "puppeteer": "^10.4.0" - } - }, - "node_modules/html-pdf-node/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/html-pdf-node/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/html-pdf-node/node_modules/devtools-protocol": { - "version": "0.0.901419", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", - "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", - "license": "BSD-3-Clause" - }, - "node_modules/html-pdf-node/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/html-pdf-node/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/html-pdf-node/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==", - "license": "MIT" - }, - "node_modules/html-pdf-node/node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "license": "MIT", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/html-pdf-node/node_modules/progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/html-pdf-node/node_modules/puppeteer": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.4.0.tgz", - "integrity": "sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w==", - "deprecated": "< 22.8.2 is no longer supported", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "4.3.1", - "devtools-protocol": "0.0.901419", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "node-fetch": "2.6.1", - "pkg-dir": "4.2.0", - "progress": "2.0.1", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.0.0", - "unbzip2-stream": "1.3.3", - "ws": "7.4.6" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/html-pdf-node/node_modules/tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "node_modules/html-pdf-node/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "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" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "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" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "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" - } - }, - "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" - }, - "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/inline-css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-3.0.0.tgz", - "integrity": "sha512-a+IE7oLaQqeVr3hMviekDDk94LA0+oZX8JEfJuXOm20diZAkOFrq/f/QZCEXpMK6qIbYr0nQNpsuioXQN1ZgXA==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "css-rules": "^1.0.9", - "extract-css": "^2.0.0", - "flat-util": "^1.1.6", - "pick-util": "^1.1.3", - "slick": "^1.12.2", - "specificity": "^0.4.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "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" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "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" - }, - "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" - }, - "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==", - "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" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" - }, - "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-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "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, - "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, - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/list-stylesheets": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-1.2.10.tgz", - "integrity": "sha512-F85Yx9GKLJwDr1T9U34FST5m6iIXhPzqD+MRDsljZsdmoEZwllZBDbkAVaa+EpLKrr6de+P4SRGNHwrWv6zMZA==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "pick-util": "^1.1.4" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", - "license": "MIT" - }, - "node_modules/lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" - }, - "node_modules/lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "license": "MIT" - }, - "node_modules/lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", - "license": "MIT" - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "deprecated": "This package is deprecated. Use destructuring assignment syntax instead.", - "license": "MIT" - }, - "node_modules/lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", - "license": "MIT" - }, - "node_modules/lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", - "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==", - "license": "MIT" - }, - "node_modules/lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", - "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, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/magic-bytes.js": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz", - "integrity": "sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==", - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/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 - }, - "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/mediaquery-text": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", - "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", - "license": "MIT", - "dependencies": { - "cssom": "^0.5.0" - } - }, - "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": { - "version": "1.4.1", - "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.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.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "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" - }, - "engines": { - "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": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "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" - }, - "engines": { - "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/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "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" - }, - "engines": { - "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.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.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/mongodb": { - "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", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/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, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/node": { - "version": "23.11.0", - "resolved": "https://registry.npmjs.org/node/-/node-23.11.0.tgz", - "integrity": "sha512-IS7dwB4M8/iKCFuJVN4EQmMmpX1YLN/wLfkgcouPA99s9cQUpuUX7Ng0j0XIK+4Zhb4EhcDyea5P20hF26nVow==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "node-bin-setup": "^1.0.0" - }, - "bin": { - "node": "bin/node" - }, - "engines": { - "npm": ">=5.0.0" - } - }, - "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-bin-setup": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", - "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", - "license": "ISC" - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/node-fetch": { - "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" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/nodemailer": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", - "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", - "license": "MIT-0", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npmlog": { - "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", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "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" - } - }, - "node_modules/opencollective-postinstall": { - "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" - } - }, - "node_modules/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==", - "license": "Apache-2.0", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "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.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-duration": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz", - "integrity": "sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg==", - "license": "MIT" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": [ - "MIT", - "Apache2" - ], - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pdf-lib": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", - "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", - "license": "MIT", - "dependencies": { - "@pdf-lib/standard-fonts": "^1.0.0", - "@pdf-lib/upng": "^1.0.1", - "pako": "^1.0.11", - "tslib": "^1.11.1" - } - }, - "node_modules/pdf-lib/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/pick-util": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", - "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", - "license": "MIT", - "dependencies": { - "@jonkemp/package-utils": "^1.0.8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/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" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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" - } - }, - "node_modules/pretty-ms": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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" - }, - "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" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, - "engines": { - "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.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" - } - }, - "node_modules/puppeteer": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.7.2.tgz", - "integrity": "sha512-ifYqoY6wGs0yZeFuFPn8BE9FhuveXkarF+eO18I2e/axdoCh4Qh1AE+qXdJBhdaeoPt6eRNTY4Dih29Jbq8wow==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", - "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1425554", - "puppeteer-core": "24.7.2", - "typed-query-selector": "^2.12.0" - }, - "bin": { - "puppeteer": "lib/cjs/puppeteer/node/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-core": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.7.2.tgz", - "integrity": "sha512-P9pZyTmJqKODFCnkZgemCpoFA4LbAa8+NumHVQKyP5X9IgdNS1ZnAnIh1sMAwhF8/xEUGf7jt+qmNLlKieFw1Q==", - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", - "debug": "^4.4.0", - "devtools-protocol": "0.0.1425554", - "typed-query-selector": "^2.12.0", - "ws": "^8.18.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/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, - "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" - }, - "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": "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/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" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/remote-content": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-4.0.1.tgz", - "integrity": "sha512-W2lDnjK4k1vAJg7UZArH/rkNYJqZuteHkX1jS7tO9TJUiLhDcu2Ejvj97gK/XbZNDhzld0sn11OW8vihin4cAg==", - "license": "MIT", - "dependencies": { - "axios": "^1.7.9", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/require-at": { - "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" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "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" - } - }, - "node_modules/rimraf": { - "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" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "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": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/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==", - "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" - }, - "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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "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" - }, - "engines": { - "node": ">=10" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=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==", - "license": "ISC" - }, - "node_modules/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==", - "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" - }, - "node_modules/simple-get": { - "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": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slick": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", - "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", - "license": "MIT (http://mootools.net/license.txt)", - "engines": { - "node": "*" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "license": "MIT", - "bin": { - "specificity": "bin/specificity" - } - }, - "node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sprintf-js": { - "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" - }, - "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" - } - }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-data": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/style-data/-/style-data-1.4.8.tgz", - "integrity": "sha512-RBJD+YQef4PzYKqC4PQEjDvyX709mwEClYg9u0A5EPXqdSkN2BtMnF/tW7EtS9Q0FnBF+lrWsK5+bEKqA+++Dg==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "mediaquery-text": "^1.2.0", - "pick-util": "^1.1.4" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table": { - "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", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "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.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/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, - "license": "MIT" - }, - "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", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "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/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "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, - "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==", - "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" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "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" - }, - "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", - "ps-tree": "^1.2.0", - "string-argv": "^0.1.1", - "strip-ansi": "^6.0.0" - }, - "bin": { - "tsc-watch": "index.js" - }, - "engines": { - "node": ">=8.17.0" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-query-selector": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", - "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "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==", - "license": "ISC" - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "license": "MIT", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "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" - } - }, - "node_modules/universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", - "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" - } - }, - "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" - }, - "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" - }, - "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" - }, - "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" - } - }, - "node_modules/which": { - "version": "2.0.2", - "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" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/word-wrap": { - "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" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "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" - }, - "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" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zod": { - "version": "3.24.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", - "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/.history/package-lock_20250502203557.json b/.history/package-lock_20250502203557.json deleted file mode 100644 index 72185497..00000000 --- a/.history/package-lock_20250502203557.json +++ /dev/null @@ -1,5422 +0,0 @@ -{ - "name": "sage", - "version": "3.3.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "sage", - "version": "3.3.0", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@octokit/rest": "^18.3.5", - "axios": "^1.4.0", - "canvas": "^3.1.0", - "chart.js": "^4.2.1", - "chartjs-node-canvas": "^5.0.0", - "console-stamp": "^3.0.2", - "discord.js": "^14.16.3", - "html-pdf-node": "^1.0.7", - "module-alias": "^2.2.2", - "moment": "^2.29.1", - "mongodb": "^3.7.4", - "node-cron": "^2.0.3", - "node-fetch": "^2.6.1", - "nodemailer": "^6.4.17", - "parse-duration": "^2.1.3", - "pdf-lib": "^1.17.1", - "pretty-ms": "^7.0.1", - "puppeteer": "^24.6.0" - }, - "devDependencies": { - "@types/console-stamp": "^0.2.33", - "@types/mongodb": "^3.6.3", - "@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.6.2", - "typescript": "^5.0.2" - }, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "license": "MIT", - "dependencies": { - "@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" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "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==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/builders": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.1.tgz", - "integrity": "sha512-2zDAVuoeAkdv0YQzYKO8vZfaDfB+1KZ60ymBKtD7QDpsh6lzAnQSUBLqeRkhlons6BT9+yRctOh9fPy94w6kDA==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/formatters": "^0.6.1", - "@discordjs/util": "^1.1.1", - "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.4", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@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==", - "license": "Apache-2.0", - "engines": { - "node": ">=16.11.0" - } - }, - "node_modules/@discordjs/formatters": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.1.tgz", - "integrity": "sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==", - "license": "Apache-2.0", - "dependencies": { - "discord-api-types": "^0.38.1" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "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", - "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.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.5.0.tgz", - "integrity": "sha512-PWhchxTzpn9EV3vvPRpwS0EE2rNYB9pvzDU/eLLW3mByJl0ZHZjHI2/wA8EbH2gRMQV7nu+0FoDF84oiPl8VAQ==", - "license": "Apache-2.0", - "dependencies": { - "@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.38.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "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/util": { - "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" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/ws": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.2.tgz", - "integrity": "sha512-dyfq7yn0wO0IYeYOs3z79I6/HumhmKISzFL0Z+007zQJMtAFGtt3AEoq1nuLXtcunUE5YYYQqgKvybXukAK8/w==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/collection": "^2.1.0", - "@discordjs/rest": "^2.5.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.38.1", - "tslib": "^2.6.2", - "ws": "^8.17.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/@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", - "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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/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" - } - }, - "node_modules/@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==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@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==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@jonkemp/package-utils": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", - "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==", - "license": "MIT" - }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", - "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", - "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.2.2", - "@octokit/request": "^9.2.3", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "before-after-hook": "^3.0.2", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^9.2.3", - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", - "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", - "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.10.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", - "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", - "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.10.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/request": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", - "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^10.1.4", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^2.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", - "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", - "license": "MIT", - "dependencies": { - "@octokit/core": "^6.1.4", - "@octokit/plugin-paginate-rest": "^11.4.2", - "@octokit/plugin-request-log": "^5.3.1", - "@octokit/plugin-rest-endpoint-methods": "^13.3.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", - "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^25.0.0" - } - }, - "node_modules/@pdf-lib/standard-fonts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", - "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.6" - } - }, - "node_modules/@pdf-lib/upng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", - "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.10" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.2.tgz", - "integrity": "sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.4.0", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.1", - "tar-fs": "^3.0.8", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", - "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/@sapphire/async-queue": { - "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" - } - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v16" - } - }, - "node_modules/@sapphire/snowflake": { - "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/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "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": "*" - } - }, - "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" - }, - "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": "*" - } - }, - "node_modules/@types/node-fetch": { - "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": "^4.0.0" - } - }, - "node_modules/@types/nodemailer": { - "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.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.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "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", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@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, - "license": "MIT", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@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, - "license": "BSD-2-Clause", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "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", - "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" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.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", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "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" - } - }, - "node_modules/ansi-styles": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "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" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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" - }, - "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, - "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" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.3.tgz", - "integrity": "sha512-OeEZYIg+2qepaWLyphaOXHAHKo3xkM8y3BeGAvHdMN8GNWvEAU1Yw6rYpGzu/wDDbKxgEjVeVDpgGhDzaeMpjg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", - "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" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "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", - "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" - } - }, - "node_modules/bl/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" - }, - "node_modules/bl/node_modules/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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "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.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.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "engines": { - "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==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/canvas": { - "version": "3.1.0", - "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" - }, - "engines": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chart.js": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", - "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", - "license": "MIT", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chartjs-node-canvas": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-5.0.0.tgz", - "integrity": "sha512-+Lc5phRWjb+UxAIiQpKgvOaG6Mw276YQx2jl2BrxoUtI3A4RYTZuGM5Dq+s4ReYmCY42WEPSR6viF3lDSTxpvw==", - "license": "MIT", - "dependencies": { - "canvas": "^3.1.0", - "tslib": "^2.8.1" - }, - "peerDependencies": { - "chart.js": "^4.4.8" - } - }, - "node_modules/cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", - "license": "MIT", - "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-bidi": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-4.1.1.tgz", - "integrity": "sha512-biR7t4vF3YluE6RlMSk9IWk+b9U+WWyzHp+N2pL9vRTk+UXHYRTVp7jTK58ZNzMLBgoLMHY4QyJMbeuw3eKxqg==", - "license": "Apache-2.0", - "dependencies": { - "mitt": "^3.0.1", - "zod": "^3.24.1" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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" - }, - "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" - } - }, - "node_modules/combined-stream": { - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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" - }, - "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" - }, - "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" - }, - "engines": { - "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==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "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", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-rules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", - "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", - "license": "MIT", - "dependencies": { - "cssom": "^0.5.0" - } - }, - "node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", - "license": "BSD-like", - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "node_modules/css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "license": "BSD-2-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "license": "MIT" - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/dateformat": { - "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.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "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" - }, - "engines": { - "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, - "license": "MIT" - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "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" - } - }, - "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" - }, - "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" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.1425554", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", - "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==", - "license": "BSD-3-Clause" - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/discord-api-types": { - "version": "0.38.1", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.1.tgz", - "integrity": "sha512-vsjsqjAuxsPhiwbPjTBeGQaDPlizFmSkU0mTzFGMgRxqCDIRBR7iTY74HacpzrDV0QtERHRKQEk1tq7drZUtHg==", - "license": "MIT" - }, - "node_modules/discord.js": { - "version": "14.19.2", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.19.2.tgz", - "integrity": "sha512-L/ivhVefzzRcChHJSaGYsgA4Uqx6or2sst5JZ/ft9OBwrj8OJIzrrcutlkHnm/hlI0Hrm3es62TRVksU8VUqrg==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/builders": "^1.11.1", - "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.6.1", - "@discordjs/rest": "^2.5.0", - "@discordjs/util": "^1.1.1", - "@discordjs/ws": "^1.2.2", - "@sapphire/snowflake": "3.5.3", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "3.1.3", - "lodash.snakecase": "4.1.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "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, - "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==", - "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.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", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "license": "BSD-2-Clause" - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "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/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/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==", - "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", - "@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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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, - "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" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "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/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" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/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/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "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" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "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" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "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" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "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" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "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" - } - }, - "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/extract-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-2.0.1.tgz", - "integrity": "sha512-DX3+27l6NIVYNidJjBJ4VU3Z5tk/0aEO/JJ6XEJIRPFum9kyA1PifPjnEa8Ztnv4DHNQg5EF27aypGz6s/fMdw==", - "license": "MIT", - "dependencies": { - "batch": "^0.6.1", - "href-content": "^2.0.1", - "list-stylesheets": "^1.2.10", - "style-data": "^1.4.8" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "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" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "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", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/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, - "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, - "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.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" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "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.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-util": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.11.tgz", - "integrity": "sha512-h9ho3lHr5hDTQZKLqFDqIliDV/A8yCyP7UoSIBT4U3d7VfA/EeqsC8cxWJGIr5oCxZzMD/3BEx3SLYFX6hD8ng==", - "license": "MIT" - }, - "node_modules/flatted": { - "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.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" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "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": { - "node": ">= 6" - } - }, - "node_modules/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, - "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" - }, - "engines": { - "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==", - "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, - "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", - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 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/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "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", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "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", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "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/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "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==", - "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/href-content": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.3.tgz", - "integrity": "sha512-ikrAoI1l5ihN5Be2cR9nozFfivVJxPQDpa4+sb6PLt/uaNE/a7A05rHbnJEUduoHddbB3GyT5tdqzXMUmPgJYA==", - "license": "MIT", - "dependencies": { - "remote-content": "^4.0.0" - } - }, - "node_modules/html-pdf-node": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/html-pdf-node/-/html-pdf-node-1.0.8.tgz", - "integrity": "sha512-1PXbShoVXy8/86ZBY3xQNd5r2c/CPx/Me2wGtV0Z0Rekko5Tgow2hLms2n+OwA+PV7NyR7OPcTqsnhXIMUJLFw==", - "license": "ISC", - "dependencies": { - "bluebird": "^3.7.2", - "handlebars": "^4.7.6", - "inline-css": "^3.0.0", - "puppeteer": "^10.4.0" - } - }, - "node_modules/html-pdf-node/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/html-pdf-node/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/html-pdf-node/node_modules/devtools-protocol": { - "version": "0.0.901419", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", - "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", - "license": "BSD-3-Clause" - }, - "node_modules/html-pdf-node/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/html-pdf-node/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/html-pdf-node/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==", - "license": "MIT" - }, - "node_modules/html-pdf-node/node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "license": "MIT", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/html-pdf-node/node_modules/progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/html-pdf-node/node_modules/puppeteer": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.4.0.tgz", - "integrity": "sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w==", - "deprecated": "< 22.8.2 is no longer supported", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "4.3.1", - "devtools-protocol": "0.0.901419", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "node-fetch": "2.6.1", - "pkg-dir": "4.2.0", - "progress": "2.0.1", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.0.0", - "unbzip2-stream": "1.3.3", - "ws": "7.4.6" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/html-pdf-node/node_modules/tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "node_modules/html-pdf-node/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "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" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "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" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "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" - } - }, - "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" - }, - "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/inline-css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-3.0.0.tgz", - "integrity": "sha512-a+IE7oLaQqeVr3hMviekDDk94LA0+oZX8JEfJuXOm20diZAkOFrq/f/QZCEXpMK6qIbYr0nQNpsuioXQN1ZgXA==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "css-rules": "^1.0.9", - "extract-css": "^2.0.0", - "flat-util": "^1.1.6", - "pick-util": "^1.1.3", - "slick": "^1.12.2", - "specificity": "^0.4.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "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" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "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" - }, - "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" - }, - "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==", - "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" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" - }, - "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-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "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, - "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 - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/list-stylesheets": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-1.2.10.tgz", - "integrity": "sha512-F85Yx9GKLJwDr1T9U34FST5m6iIXhPzqD+MRDsljZsdmoEZwllZBDbkAVaa+EpLKrr6de+P4SRGNHwrWv6zMZA==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "pick-util": "^1.1.4" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", - "license": "MIT" - }, - "node_modules/lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" - }, - "node_modules/lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "license": "MIT" - }, - "node_modules/lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", - "license": "MIT" - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "deprecated": "This package is deprecated. Use destructuring assignment syntax instead.", - "license": "MIT" - }, - "node_modules/lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", - "license": "MIT" - }, - "node_modules/lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", - "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==", - "license": "MIT" - }, - "node_modules/lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", - "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, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/magic-bytes.js": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz", - "integrity": "sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==", - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/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 - }, - "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/mediaquery-text": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", - "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", - "license": "MIT", - "dependencies": { - "cssom": "^0.5.0" - } - }, - "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": { - "version": "1.4.1", - "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.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.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "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" - }, - "engines": { - "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": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "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" - }, - "engines": { - "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/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "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" - }, - "engines": { - "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.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.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/mongodb": { - "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", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/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, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/node": { - "version": "23.11.0", - "resolved": "https://registry.npmjs.org/node/-/node-23.11.0.tgz", - "integrity": "sha512-IS7dwB4M8/iKCFuJVN4EQmMmpX1YLN/wLfkgcouPA99s9cQUpuUX7Ng0j0XIK+4Zhb4EhcDyea5P20hF26nVow==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "node-bin-setup": "^1.0.0" - }, - "bin": { - "node": "bin/node" - }, - "engines": { - "npm": ">=5.0.0" - } - }, - "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-bin-setup": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", - "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", - "license": "ISC" - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/node-fetch": { - "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" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/nodemailer": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", - "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", - "license": "MIT-0", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npmlog": { - "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", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "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" - } - }, - "node_modules/opencollective-postinstall": { - "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" - } - }, - "node_modules/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==", - "license": "Apache-2.0", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "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.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-duration": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz", - "integrity": "sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg==", - "license": "MIT" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": [ - "MIT", - "Apache2" - ], - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pdf-lib": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", - "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", - "license": "MIT", - "dependencies": { - "@pdf-lib/standard-fonts": "^1.0.0", - "@pdf-lib/upng": "^1.0.1", - "pako": "^1.0.11", - "tslib": "^1.11.1" - } - }, - "node_modules/pdf-lib/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/pick-util": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", - "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", - "license": "MIT", - "dependencies": { - "@jonkemp/package-utils": "^1.0.8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/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" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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" - } - }, - "node_modules/pretty-ms": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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" - }, - "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" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, - "engines": { - "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.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" - } - }, - "node_modules/puppeteer": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.7.2.tgz", - "integrity": "sha512-ifYqoY6wGs0yZeFuFPn8BE9FhuveXkarF+eO18I2e/axdoCh4Qh1AE+qXdJBhdaeoPt6eRNTY4Dih29Jbq8wow==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", - "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1425554", - "puppeteer-core": "24.7.2", - "typed-query-selector": "^2.12.0" - }, - "bin": { - "puppeteer": "lib/cjs/puppeteer/node/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-core": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.7.2.tgz", - "integrity": "sha512-P9pZyTmJqKODFCnkZgemCpoFA4LbAa8+NumHVQKyP5X9IgdNS1ZnAnIh1sMAwhF8/xEUGf7jt+qmNLlKieFw1Q==", - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", - "debug": "^4.4.0", - "devtools-protocol": "0.0.1425554", - "typed-query-selector": "^2.12.0", - "ws": "^8.18.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/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, - "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" - }, - "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": "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/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" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/remote-content": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-4.0.1.tgz", - "integrity": "sha512-W2lDnjK4k1vAJg7UZArH/rkNYJqZuteHkX1jS7tO9TJUiLhDcu2Ejvj97gK/XbZNDhzld0sn11OW8vihin4cAg==", - "license": "MIT", - "dependencies": { - "axios": "^1.7.9", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/require-at": { - "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" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "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" - } - }, - "node_modules/rimraf": { - "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" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "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": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/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==", - "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" - }, - "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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "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" - }, - "engines": { - "node": ">=10" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=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==", - "license": "ISC" - }, - "node_modules/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==", - "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" - }, - "node_modules/simple-get": { - "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": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slick": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", - "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", - "license": "MIT (http://mootools.net/license.txt)", - "engines": { - "node": "*" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "license": "MIT", - "bin": { - "specificity": "bin/specificity" - } - }, - "node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sprintf-js": { - "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" - }, - "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" - } - }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-data": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/style-data/-/style-data-1.4.8.tgz", - "integrity": "sha512-RBJD+YQef4PzYKqC4PQEjDvyX709mwEClYg9u0A5EPXqdSkN2BtMnF/tW7EtS9Q0FnBF+lrWsK5+bEKqA+++Dg==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "mediaquery-text": "^1.2.0", - "pick-util": "^1.1.4" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table": { - "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", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "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.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/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, - "license": "MIT" - }, - "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", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "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/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "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, - "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==", - "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" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "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" - }, - "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", - "ps-tree": "^1.2.0", - "string-argv": "^0.1.1", - "strip-ansi": "^6.0.0" - }, - "bin": { - "tsc-watch": "index.js" - }, - "engines": { - "node": ">=8.17.0" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-query-selector": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", - "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "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==", - "license": "ISC" - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "license": "MIT", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "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" - } - }, - "node_modules/universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", - "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" - } - }, - "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" - }, - "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" - }, - "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" - }, - "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" - } - }, - "node_modules/which": { - "version": "2.0.2", - "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" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/word-wrap": { - "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" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "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" - }, - "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" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zod": { - "version": "3.24.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", - "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/.history/package-lock_20250502203601.json b/.history/package-lock_20250502203601.json deleted file mode 100644 index 04a93bf7..00000000 --- a/.history/package-lock_20250502203601.json +++ /dev/null @@ -1,5423 +0,0 @@ -{ - "name": "sage", - "version": "3.3.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "sage", - "version": "3.3.0", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@discordjs/node-pre-gyp": "0.4.5", - "@octokit/rest": "^21.1.1", - "axios": "^1.4.0", - "canvas": "^3.1.0", - "chart.js": "^4.2.1", - "chartjs-node-canvas": "^5.0.0", - "console-stamp": "^3.0.2", - "discord.js": "^14.16.3", - "html-pdf-node": "^1.0.7", - "module-alias": "^2.2.2", - "moment": "^2.29.1", - "mongodb": "^3.7.4", - "node-cron": "^2.0.3", - "node-fetch": "^2.6.1", - "nodemailer": "^6.4.17", - "parse-duration": "^2.1.3", - "pdf-lib": "^1.17.1", - "pretty-ms": "^7.0.1", - "puppeteer": "^24.6.0" - }, - "devDependencies": { - "@types/console-stamp": "^0.2.33", - "@types/mongodb": "^3.6.3", - "@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.6.2", - "typescript": "^5.0.2" - }, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "license": "MIT", - "dependencies": { - "@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" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "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==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/builders": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.1.tgz", - "integrity": "sha512-2zDAVuoeAkdv0YQzYKO8vZfaDfB+1KZ60ymBKtD7QDpsh6lzAnQSUBLqeRkhlons6BT9+yRctOh9fPy94w6kDA==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/formatters": "^0.6.1", - "@discordjs/util": "^1.1.1", - "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.4", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@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==", - "license": "Apache-2.0", - "engines": { - "node": ">=16.11.0" - } - }, - "node_modules/@discordjs/formatters": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.1.tgz", - "integrity": "sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==", - "license": "Apache-2.0", - "dependencies": { - "discord-api-types": "^0.38.1" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "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", - "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.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.5.0.tgz", - "integrity": "sha512-PWhchxTzpn9EV3vvPRpwS0EE2rNYB9pvzDU/eLLW3mByJl0ZHZjHI2/wA8EbH2gRMQV7nu+0FoDF84oiPl8VAQ==", - "license": "Apache-2.0", - "dependencies": { - "@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.38.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "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/util": { - "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" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/ws": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.2.tgz", - "integrity": "sha512-dyfq7yn0wO0IYeYOs3z79I6/HumhmKISzFL0Z+007zQJMtAFGtt3AEoq1nuLXtcunUE5YYYQqgKvybXukAK8/w==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/collection": "^2.1.0", - "@discordjs/rest": "^2.5.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.38.1", - "tslib": "^2.6.2", - "ws": "^8.17.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/@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", - "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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/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" - } - }, - "node_modules/@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==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@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==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@jonkemp/package-utils": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", - "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==", - "license": "MIT" - }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", - "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", - "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.2.2", - "@octokit/request": "^9.2.3", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "before-after-hook": "^3.0.2", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^9.2.3", - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", - "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", - "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.10.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", - "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", - "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.10.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/request": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", - "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^10.1.4", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^2.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", - "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", - "license": "MIT", - "dependencies": { - "@octokit/core": "^6.1.4", - "@octokit/plugin-paginate-rest": "^11.4.2", - "@octokit/plugin-request-log": "^5.3.1", - "@octokit/plugin-rest-endpoint-methods": "^13.3.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", - "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^25.0.0" - } - }, - "node_modules/@pdf-lib/standard-fonts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", - "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.6" - } - }, - "node_modules/@pdf-lib/upng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", - "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.10" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.2.tgz", - "integrity": "sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.4.0", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.1", - "tar-fs": "^3.0.8", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", - "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/@sapphire/async-queue": { - "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" - } - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v16" - } - }, - "node_modules/@sapphire/snowflake": { - "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/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "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": "*" - } - }, - "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" - }, - "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": "*" - } - }, - "node_modules/@types/node-fetch": { - "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": "^4.0.0" - } - }, - "node_modules/@types/nodemailer": { - "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.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.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "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", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@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, - "license": "MIT", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@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, - "license": "BSD-2-Clause", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "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", - "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" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.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", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "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" - } - }, - "node_modules/ansi-styles": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "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" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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" - }, - "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, - "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" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.3.tgz", - "integrity": "sha512-OeEZYIg+2qepaWLyphaOXHAHKo3xkM8y3BeGAvHdMN8GNWvEAU1Yw6rYpGzu/wDDbKxgEjVeVDpgGhDzaeMpjg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", - "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" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "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", - "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" - } - }, - "node_modules/bl/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" - }, - "node_modules/bl/node_modules/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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "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.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.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "engines": { - "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==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/canvas": { - "version": "3.1.0", - "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" - }, - "engines": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chart.js": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", - "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", - "license": "MIT", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chartjs-node-canvas": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-5.0.0.tgz", - "integrity": "sha512-+Lc5phRWjb+UxAIiQpKgvOaG6Mw276YQx2jl2BrxoUtI3A4RYTZuGM5Dq+s4ReYmCY42WEPSR6viF3lDSTxpvw==", - "license": "MIT", - "dependencies": { - "canvas": "^3.1.0", - "tslib": "^2.8.1" - }, - "peerDependencies": { - "chart.js": "^4.4.8" - } - }, - "node_modules/cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", - "license": "MIT", - "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-bidi": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-4.1.1.tgz", - "integrity": "sha512-biR7t4vF3YluE6RlMSk9IWk+b9U+WWyzHp+N2pL9vRTk+UXHYRTVp7jTK58ZNzMLBgoLMHY4QyJMbeuw3eKxqg==", - "license": "Apache-2.0", - "dependencies": { - "mitt": "^3.0.1", - "zod": "^3.24.1" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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" - }, - "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" - } - }, - "node_modules/combined-stream": { - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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" - }, - "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" - }, - "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" - }, - "engines": { - "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==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "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", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-rules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", - "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", - "license": "MIT", - "dependencies": { - "cssom": "^0.5.0" - } - }, - "node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", - "license": "BSD-like", - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "node_modules/css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "license": "BSD-2-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "license": "MIT" - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/dateformat": { - "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.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "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" - }, - "engines": { - "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, - "license": "MIT" - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "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" - } - }, - "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" - }, - "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" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.1425554", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", - "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==", - "license": "BSD-3-Clause" - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/discord-api-types": { - "version": "0.38.1", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.1.tgz", - "integrity": "sha512-vsjsqjAuxsPhiwbPjTBeGQaDPlizFmSkU0mTzFGMgRxqCDIRBR7iTY74HacpzrDV0QtERHRKQEk1tq7drZUtHg==", - "license": "MIT" - }, - "node_modules/discord.js": { - "version": "14.19.2", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.19.2.tgz", - "integrity": "sha512-L/ivhVefzzRcChHJSaGYsgA4Uqx6or2sst5JZ/ft9OBwrj8OJIzrrcutlkHnm/hlI0Hrm3es62TRVksU8VUqrg==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/builders": "^1.11.1", - "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.6.1", - "@discordjs/rest": "^2.5.0", - "@discordjs/util": "^1.1.1", - "@discordjs/ws": "^1.2.2", - "@sapphire/snowflake": "3.5.3", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "3.1.3", - "lodash.snakecase": "4.1.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "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, - "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==", - "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.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", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "license": "BSD-2-Clause" - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "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/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/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==", - "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", - "@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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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, - "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" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "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/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" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/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/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "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" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "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" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "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" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "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" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "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" - } - }, - "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/extract-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-2.0.1.tgz", - "integrity": "sha512-DX3+27l6NIVYNidJjBJ4VU3Z5tk/0aEO/JJ6XEJIRPFum9kyA1PifPjnEa8Ztnv4DHNQg5EF27aypGz6s/fMdw==", - "license": "MIT", - "dependencies": { - "batch": "^0.6.1", - "href-content": "^2.0.1", - "list-stylesheets": "^1.2.10", - "style-data": "^1.4.8" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "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" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "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", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/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, - "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, - "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.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" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "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.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-util": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.11.tgz", - "integrity": "sha512-h9ho3lHr5hDTQZKLqFDqIliDV/A8yCyP7UoSIBT4U3d7VfA/EeqsC8cxWJGIr5oCxZzMD/3BEx3SLYFX6hD8ng==", - "license": "MIT" - }, - "node_modules/flatted": { - "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.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" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "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": { - "node": ">= 6" - } - }, - "node_modules/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, - "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" - }, - "engines": { - "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==", - "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, - "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", - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 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/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "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", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "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", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "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/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "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==", - "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/href-content": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.3.tgz", - "integrity": "sha512-ikrAoI1l5ihN5Be2cR9nozFfivVJxPQDpa4+sb6PLt/uaNE/a7A05rHbnJEUduoHddbB3GyT5tdqzXMUmPgJYA==", - "license": "MIT", - "dependencies": { - "remote-content": "^4.0.0" - } - }, - "node_modules/html-pdf-node": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/html-pdf-node/-/html-pdf-node-1.0.8.tgz", - "integrity": "sha512-1PXbShoVXy8/86ZBY3xQNd5r2c/CPx/Me2wGtV0Z0Rekko5Tgow2hLms2n+OwA+PV7NyR7OPcTqsnhXIMUJLFw==", - "license": "ISC", - "dependencies": { - "bluebird": "^3.7.2", - "handlebars": "^4.7.6", - "inline-css": "^3.0.0", - "puppeteer": "^10.4.0" - } - }, - "node_modules/html-pdf-node/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/html-pdf-node/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/html-pdf-node/node_modules/devtools-protocol": { - "version": "0.0.901419", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", - "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", - "license": "BSD-3-Clause" - }, - "node_modules/html-pdf-node/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/html-pdf-node/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/html-pdf-node/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==", - "license": "MIT" - }, - "node_modules/html-pdf-node/node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "license": "MIT", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/html-pdf-node/node_modules/progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/html-pdf-node/node_modules/puppeteer": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.4.0.tgz", - "integrity": "sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w==", - "deprecated": "< 22.8.2 is no longer supported", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "4.3.1", - "devtools-protocol": "0.0.901419", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "node-fetch": "2.6.1", - "pkg-dir": "4.2.0", - "progress": "2.0.1", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.0.0", - "unbzip2-stream": "1.3.3", - "ws": "7.4.6" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/html-pdf-node/node_modules/tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "node_modules/html-pdf-node/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "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" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "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" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "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" - } - }, - "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" - }, - "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/inline-css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-3.0.0.tgz", - "integrity": "sha512-a+IE7oLaQqeVr3hMviekDDk94LA0+oZX8JEfJuXOm20diZAkOFrq/f/QZCEXpMK6qIbYr0nQNpsuioXQN1ZgXA==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "css-rules": "^1.0.9", - "extract-css": "^2.0.0", - "flat-util": "^1.1.6", - "pick-util": "^1.1.3", - "slick": "^1.12.2", - "specificity": "^0.4.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "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" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "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" - }, - "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" - }, - "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==", - "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" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" - }, - "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-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "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, - "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 - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/list-stylesheets": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-1.2.10.tgz", - "integrity": "sha512-F85Yx9GKLJwDr1T9U34FST5m6iIXhPzqD+MRDsljZsdmoEZwllZBDbkAVaa+EpLKrr6de+P4SRGNHwrWv6zMZA==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "pick-util": "^1.1.4" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", - "license": "MIT" - }, - "node_modules/lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" - }, - "node_modules/lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "license": "MIT" - }, - "node_modules/lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", - "license": "MIT" - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "deprecated": "This package is deprecated. Use destructuring assignment syntax instead.", - "license": "MIT" - }, - "node_modules/lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", - "license": "MIT" - }, - "node_modules/lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", - "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==", - "license": "MIT" - }, - "node_modules/lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", - "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, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/magic-bytes.js": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz", - "integrity": "sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==", - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/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 - }, - "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/mediaquery-text": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", - "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", - "license": "MIT", - "dependencies": { - "cssom": "^0.5.0" - } - }, - "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": { - "version": "1.4.1", - "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.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.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "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" - }, - "engines": { - "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": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "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" - }, - "engines": { - "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/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "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" - }, - "engines": { - "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.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.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/mongodb": { - "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", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/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, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/node": { - "version": "23.11.0", - "resolved": "https://registry.npmjs.org/node/-/node-23.11.0.tgz", - "integrity": "sha512-IS7dwB4M8/iKCFuJVN4EQmMmpX1YLN/wLfkgcouPA99s9cQUpuUX7Ng0j0XIK+4Zhb4EhcDyea5P20hF26nVow==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "node-bin-setup": "^1.0.0" - }, - "bin": { - "node": "bin/node" - }, - "engines": { - "npm": ">=5.0.0" - } - }, - "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-bin-setup": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", - "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", - "license": "ISC" - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/node-fetch": { - "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" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/nodemailer": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", - "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", - "license": "MIT-0", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npmlog": { - "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", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "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" - } - }, - "node_modules/opencollective-postinstall": { - "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" - } - }, - "node_modules/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==", - "license": "Apache-2.0", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "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.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-duration": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz", - "integrity": "sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg==", - "license": "MIT" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": [ - "MIT", - "Apache2" - ], - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pdf-lib": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", - "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", - "license": "MIT", - "dependencies": { - "@pdf-lib/standard-fonts": "^1.0.0", - "@pdf-lib/upng": "^1.0.1", - "pako": "^1.0.11", - "tslib": "^1.11.1" - } - }, - "node_modules/pdf-lib/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/pick-util": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", - "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", - "license": "MIT", - "dependencies": { - "@jonkemp/package-utils": "^1.0.8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/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" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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" - } - }, - "node_modules/pretty-ms": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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" - }, - "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" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, - "engines": { - "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.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" - } - }, - "node_modules/puppeteer": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.7.2.tgz", - "integrity": "sha512-ifYqoY6wGs0yZeFuFPn8BE9FhuveXkarF+eO18I2e/axdoCh4Qh1AE+qXdJBhdaeoPt6eRNTY4Dih29Jbq8wow==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", - "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1425554", - "puppeteer-core": "24.7.2", - "typed-query-selector": "^2.12.0" - }, - "bin": { - "puppeteer": "lib/cjs/puppeteer/node/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-core": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.7.2.tgz", - "integrity": "sha512-P9pZyTmJqKODFCnkZgemCpoFA4LbAa8+NumHVQKyP5X9IgdNS1ZnAnIh1sMAwhF8/xEUGf7jt+qmNLlKieFw1Q==", - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", - "debug": "^4.4.0", - "devtools-protocol": "0.0.1425554", - "typed-query-selector": "^2.12.0", - "ws": "^8.18.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/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, - "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" - }, - "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": "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/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" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/remote-content": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-4.0.1.tgz", - "integrity": "sha512-W2lDnjK4k1vAJg7UZArH/rkNYJqZuteHkX1jS7tO9TJUiLhDcu2Ejvj97gK/XbZNDhzld0sn11OW8vihin4cAg==", - "license": "MIT", - "dependencies": { - "axios": "^1.7.9", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/require-at": { - "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" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "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" - } - }, - "node_modules/rimraf": { - "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" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "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": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/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==", - "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" - }, - "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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "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" - }, - "engines": { - "node": ">=10" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=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==", - "license": "ISC" - }, - "node_modules/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==", - "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" - }, - "node_modules/simple-get": { - "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": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slick": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", - "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", - "license": "MIT (http://mootools.net/license.txt)", - "engines": { - "node": "*" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "license": "MIT", - "bin": { - "specificity": "bin/specificity" - } - }, - "node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sprintf-js": { - "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" - }, - "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" - } - }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-data": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/style-data/-/style-data-1.4.8.tgz", - "integrity": "sha512-RBJD+YQef4PzYKqC4PQEjDvyX709mwEClYg9u0A5EPXqdSkN2BtMnF/tW7EtS9Q0FnBF+lrWsK5+bEKqA+++Dg==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "mediaquery-text": "^1.2.0", - "pick-util": "^1.1.4" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table": { - "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", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "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.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/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, - "license": "MIT" - }, - "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", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "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/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "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, - "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==", - "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" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "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" - }, - "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", - "ps-tree": "^1.2.0", - "string-argv": "^0.1.1", - "strip-ansi": "^6.0.0" - }, - "bin": { - "tsc-watch": "index.js" - }, - "engines": { - "node": ">=8.17.0" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-query-selector": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", - "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "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==", - "license": "ISC" - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "license": "MIT", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "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" - } - }, - "node_modules/universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", - "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" - } - }, - "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" - }, - "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" - }, - "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" - }, - "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" - } - }, - "node_modules/which": { - "version": "2.0.2", - "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" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/word-wrap": { - "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" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "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" - }, - "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" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zod": { - "version": "3.24.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", - "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/.history/package-lock_20250502203603.json b/.history/package-lock_20250502203603.json deleted file mode 100644 index f45733d5..00000000 --- a/.history/package-lock_20250502203603.json +++ /dev/null @@ -1,5424 +0,0 @@ -{ - "name": "sage", - "version": "3.3.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "sage", - "version": "3.3.0", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@discordjs/node-pre-gyp": "0.4.5", - "@octokit/rest": "^21.1.1", - "axios": "^1.4.0", - "canvas": "^3.1.0", - "chart.js": "^4.2.1", - "chartjs-node-canvas": "^5.0.0", - "console-stamp": "^3.0.2", - "discord.js": "^14.16.3", - "html-pdf-node": "^1.0.7", - "module-alias": "^2.2.2", - "moment": "^2.29.1", - "mongodb": "^3.7.4", - "node": "^23.9.0", - "node-cron": "^2.0.3", - "node-fetch": "^2.6.1", - "nodemailer": "^6.4.17", - "parse-duration": "^2.1.3", - "pdf-lib": "^1.17.1", - "pretty-ms": "^7.0.1", - "puppeteer": "^24.6.0" - }, - "devDependencies": { - "@types/console-stamp": "^0.2.33", - "@types/mongodb": "^3.6.3", - "@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.6.2", - "typescript": "^5.0.2" - }, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "license": "MIT", - "dependencies": { - "@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" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "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==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/builders": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.1.tgz", - "integrity": "sha512-2zDAVuoeAkdv0YQzYKO8vZfaDfB+1KZ60ymBKtD7QDpsh6lzAnQSUBLqeRkhlons6BT9+yRctOh9fPy94w6kDA==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/formatters": "^0.6.1", - "@discordjs/util": "^1.1.1", - "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.4", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@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==", - "license": "Apache-2.0", - "engines": { - "node": ">=16.11.0" - } - }, - "node_modules/@discordjs/formatters": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.1.tgz", - "integrity": "sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==", - "license": "Apache-2.0", - "dependencies": { - "discord-api-types": "^0.38.1" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "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", - "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.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.5.0.tgz", - "integrity": "sha512-PWhchxTzpn9EV3vvPRpwS0EE2rNYB9pvzDU/eLLW3mByJl0ZHZjHI2/wA8EbH2gRMQV7nu+0FoDF84oiPl8VAQ==", - "license": "Apache-2.0", - "dependencies": { - "@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.38.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "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/util": { - "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" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/ws": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.2.tgz", - "integrity": "sha512-dyfq7yn0wO0IYeYOs3z79I6/HumhmKISzFL0Z+007zQJMtAFGtt3AEoq1nuLXtcunUE5YYYQqgKvybXukAK8/w==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/collection": "^2.1.0", - "@discordjs/rest": "^2.5.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.38.1", - "tslib": "^2.6.2", - "ws": "^8.17.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/@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", - "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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/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" - } - }, - "node_modules/@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==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@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==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@jonkemp/package-utils": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", - "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==", - "license": "MIT" - }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", - "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", - "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.2.2", - "@octokit/request": "^9.2.3", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "before-after-hook": "^3.0.2", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^9.2.3", - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", - "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", - "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.10.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", - "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", - "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.10.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/request": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", - "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^10.1.4", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^2.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", - "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", - "license": "MIT", - "dependencies": { - "@octokit/core": "^6.1.4", - "@octokit/plugin-paginate-rest": "^11.4.2", - "@octokit/plugin-request-log": "^5.3.1", - "@octokit/plugin-rest-endpoint-methods": "^13.3.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", - "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^25.0.0" - } - }, - "node_modules/@pdf-lib/standard-fonts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", - "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.6" - } - }, - "node_modules/@pdf-lib/upng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", - "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.10" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.2.tgz", - "integrity": "sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.4.0", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.1", - "tar-fs": "^3.0.8", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", - "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/@sapphire/async-queue": { - "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" - } - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v16" - } - }, - "node_modules/@sapphire/snowflake": { - "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/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "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": "*" - } - }, - "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" - }, - "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": "*" - } - }, - "node_modules/@types/node-fetch": { - "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": "^4.0.0" - } - }, - "node_modules/@types/nodemailer": { - "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.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.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "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", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@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, - "license": "MIT", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@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, - "license": "BSD-2-Clause", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "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", - "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" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.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", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "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" - } - }, - "node_modules/ansi-styles": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "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" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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" - }, - "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, - "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" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.3.tgz", - "integrity": "sha512-OeEZYIg+2qepaWLyphaOXHAHKo3xkM8y3BeGAvHdMN8GNWvEAU1Yw6rYpGzu/wDDbKxgEjVeVDpgGhDzaeMpjg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", - "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" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "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", - "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" - } - }, - "node_modules/bl/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" - }, - "node_modules/bl/node_modules/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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "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.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.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "engines": { - "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==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/canvas": { - "version": "3.1.0", - "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" - }, - "engines": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chart.js": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", - "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", - "license": "MIT", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chartjs-node-canvas": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-5.0.0.tgz", - "integrity": "sha512-+Lc5phRWjb+UxAIiQpKgvOaG6Mw276YQx2jl2BrxoUtI3A4RYTZuGM5Dq+s4ReYmCY42WEPSR6viF3lDSTxpvw==", - "license": "MIT", - "dependencies": { - "canvas": "^3.1.0", - "tslib": "^2.8.1" - }, - "peerDependencies": { - "chart.js": "^4.4.8" - } - }, - "node_modules/cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", - "license": "MIT", - "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-bidi": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-4.1.1.tgz", - "integrity": "sha512-biR7t4vF3YluE6RlMSk9IWk+b9U+WWyzHp+N2pL9vRTk+UXHYRTVp7jTK58ZNzMLBgoLMHY4QyJMbeuw3eKxqg==", - "license": "Apache-2.0", - "dependencies": { - "mitt": "^3.0.1", - "zod": "^3.24.1" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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" - }, - "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" - } - }, - "node_modules/combined-stream": { - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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" - }, - "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" - }, - "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" - }, - "engines": { - "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==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "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", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-rules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", - "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", - "license": "MIT", - "dependencies": { - "cssom": "^0.5.0" - } - }, - "node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", - "license": "BSD-like", - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "node_modules/css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "license": "BSD-2-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "license": "MIT" - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/dateformat": { - "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.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "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" - }, - "engines": { - "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, - "license": "MIT" - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "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" - } - }, - "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" - }, - "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" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.1425554", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", - "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==", - "license": "BSD-3-Clause" - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/discord-api-types": { - "version": "0.38.1", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.1.tgz", - "integrity": "sha512-vsjsqjAuxsPhiwbPjTBeGQaDPlizFmSkU0mTzFGMgRxqCDIRBR7iTY74HacpzrDV0QtERHRKQEk1tq7drZUtHg==", - "license": "MIT" - }, - "node_modules/discord.js": { - "version": "14.19.2", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.19.2.tgz", - "integrity": "sha512-L/ivhVefzzRcChHJSaGYsgA4Uqx6or2sst5JZ/ft9OBwrj8OJIzrrcutlkHnm/hlI0Hrm3es62TRVksU8VUqrg==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/builders": "^1.11.1", - "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.6.1", - "@discordjs/rest": "^2.5.0", - "@discordjs/util": "^1.1.1", - "@discordjs/ws": "^1.2.2", - "@sapphire/snowflake": "3.5.3", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "3.1.3", - "lodash.snakecase": "4.1.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "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, - "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==", - "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.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", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "license": "BSD-2-Clause" - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "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/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/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==", - "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", - "@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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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, - "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" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "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/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" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/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/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "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" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "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" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "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" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "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" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "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" - } - }, - "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/extract-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-2.0.1.tgz", - "integrity": "sha512-DX3+27l6NIVYNidJjBJ4VU3Z5tk/0aEO/JJ6XEJIRPFum9kyA1PifPjnEa8Ztnv4DHNQg5EF27aypGz6s/fMdw==", - "license": "MIT", - "dependencies": { - "batch": "^0.6.1", - "href-content": "^2.0.1", - "list-stylesheets": "^1.2.10", - "style-data": "^1.4.8" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "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" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "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", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/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, - "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, - "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.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" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "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.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-util": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.11.tgz", - "integrity": "sha512-h9ho3lHr5hDTQZKLqFDqIliDV/A8yCyP7UoSIBT4U3d7VfA/EeqsC8cxWJGIr5oCxZzMD/3BEx3SLYFX6hD8ng==", - "license": "MIT" - }, - "node_modules/flatted": { - "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.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" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "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": { - "node": ">= 6" - } - }, - "node_modules/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, - "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" - }, - "engines": { - "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==", - "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, - "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", - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 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/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "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", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "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", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "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/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "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==", - "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/href-content": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.3.tgz", - "integrity": "sha512-ikrAoI1l5ihN5Be2cR9nozFfivVJxPQDpa4+sb6PLt/uaNE/a7A05rHbnJEUduoHddbB3GyT5tdqzXMUmPgJYA==", - "license": "MIT", - "dependencies": { - "remote-content": "^4.0.0" - } - }, - "node_modules/html-pdf-node": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/html-pdf-node/-/html-pdf-node-1.0.8.tgz", - "integrity": "sha512-1PXbShoVXy8/86ZBY3xQNd5r2c/CPx/Me2wGtV0Z0Rekko5Tgow2hLms2n+OwA+PV7NyR7OPcTqsnhXIMUJLFw==", - "license": "ISC", - "dependencies": { - "bluebird": "^3.7.2", - "handlebars": "^4.7.6", - "inline-css": "^3.0.0", - "puppeteer": "^10.4.0" - } - }, - "node_modules/html-pdf-node/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/html-pdf-node/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/html-pdf-node/node_modules/devtools-protocol": { - "version": "0.0.901419", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", - "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", - "license": "BSD-3-Clause" - }, - "node_modules/html-pdf-node/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/html-pdf-node/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/html-pdf-node/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==", - "license": "MIT" - }, - "node_modules/html-pdf-node/node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "license": "MIT", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/html-pdf-node/node_modules/progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/html-pdf-node/node_modules/puppeteer": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.4.0.tgz", - "integrity": "sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w==", - "deprecated": "< 22.8.2 is no longer supported", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "4.3.1", - "devtools-protocol": "0.0.901419", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "node-fetch": "2.6.1", - "pkg-dir": "4.2.0", - "progress": "2.0.1", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.0.0", - "unbzip2-stream": "1.3.3", - "ws": "7.4.6" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/html-pdf-node/node_modules/tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "node_modules/html-pdf-node/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "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" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "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" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "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" - } - }, - "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" - }, - "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/inline-css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-3.0.0.tgz", - "integrity": "sha512-a+IE7oLaQqeVr3hMviekDDk94LA0+oZX8JEfJuXOm20diZAkOFrq/f/QZCEXpMK6qIbYr0nQNpsuioXQN1ZgXA==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "css-rules": "^1.0.9", - "extract-css": "^2.0.0", - "flat-util": "^1.1.6", - "pick-util": "^1.1.3", - "slick": "^1.12.2", - "specificity": "^0.4.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "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" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "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" - }, - "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" - }, - "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==", - "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" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" - }, - "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-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "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, - "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 - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/list-stylesheets": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-1.2.10.tgz", - "integrity": "sha512-F85Yx9GKLJwDr1T9U34FST5m6iIXhPzqD+MRDsljZsdmoEZwllZBDbkAVaa+EpLKrr6de+P4SRGNHwrWv6zMZA==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "pick-util": "^1.1.4" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", - "license": "MIT" - }, - "node_modules/lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" - }, - "node_modules/lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "license": "MIT" - }, - "node_modules/lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", - "license": "MIT" - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "deprecated": "This package is deprecated. Use destructuring assignment syntax instead.", - "license": "MIT" - }, - "node_modules/lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", - "license": "MIT" - }, - "node_modules/lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", - "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==", - "license": "MIT" - }, - "node_modules/lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", - "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, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/magic-bytes.js": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz", - "integrity": "sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==", - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/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 - }, - "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/mediaquery-text": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", - "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", - "license": "MIT", - "dependencies": { - "cssom": "^0.5.0" - } - }, - "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": { - "version": "1.4.1", - "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.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.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "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" - }, - "engines": { - "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": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "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" - }, - "engines": { - "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/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "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" - }, - "engines": { - "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.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.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/mongodb": { - "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", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/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, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/node": { - "version": "23.11.0", - "resolved": "https://registry.npmjs.org/node/-/node-23.11.0.tgz", - "integrity": "sha512-IS7dwB4M8/iKCFuJVN4EQmMmpX1YLN/wLfkgcouPA99s9cQUpuUX7Ng0j0XIK+4Zhb4EhcDyea5P20hF26nVow==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "node-bin-setup": "^1.0.0" - }, - "bin": { - "node": "bin/node" - }, - "engines": { - "npm": ">=5.0.0" - } - }, - "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-bin-setup": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", - "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", - "license": "ISC" - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/node-fetch": { - "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" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/nodemailer": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", - "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", - "license": "MIT-0", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npmlog": { - "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", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "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" - } - }, - "node_modules/opencollective-postinstall": { - "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" - } - }, - "node_modules/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==", - "license": "Apache-2.0", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "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.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-duration": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz", - "integrity": "sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg==", - "license": "MIT" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": [ - "MIT", - "Apache2" - ], - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pdf-lib": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", - "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", - "license": "MIT", - "dependencies": { - "@pdf-lib/standard-fonts": "^1.0.0", - "@pdf-lib/upng": "^1.0.1", - "pako": "^1.0.11", - "tslib": "^1.11.1" - } - }, - "node_modules/pdf-lib/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/pick-util": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", - "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", - "license": "MIT", - "dependencies": { - "@jonkemp/package-utils": "^1.0.8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/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" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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" - } - }, - "node_modules/pretty-ms": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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" - }, - "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" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, - "engines": { - "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.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" - } - }, - "node_modules/puppeteer": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.7.2.tgz", - "integrity": "sha512-ifYqoY6wGs0yZeFuFPn8BE9FhuveXkarF+eO18I2e/axdoCh4Qh1AE+qXdJBhdaeoPt6eRNTY4Dih29Jbq8wow==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", - "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1425554", - "puppeteer-core": "24.7.2", - "typed-query-selector": "^2.12.0" - }, - "bin": { - "puppeteer": "lib/cjs/puppeteer/node/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-core": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.7.2.tgz", - "integrity": "sha512-P9pZyTmJqKODFCnkZgemCpoFA4LbAa8+NumHVQKyP5X9IgdNS1ZnAnIh1sMAwhF8/xEUGf7jt+qmNLlKieFw1Q==", - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", - "debug": "^4.4.0", - "devtools-protocol": "0.0.1425554", - "typed-query-selector": "^2.12.0", - "ws": "^8.18.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/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, - "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" - }, - "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": "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/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" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/remote-content": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-4.0.1.tgz", - "integrity": "sha512-W2lDnjK4k1vAJg7UZArH/rkNYJqZuteHkX1jS7tO9TJUiLhDcu2Ejvj97gK/XbZNDhzld0sn11OW8vihin4cAg==", - "license": "MIT", - "dependencies": { - "axios": "^1.7.9", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/require-at": { - "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" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "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" - } - }, - "node_modules/rimraf": { - "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" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "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": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/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==", - "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" - }, - "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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "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" - }, - "engines": { - "node": ">=10" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=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==", - "license": "ISC" - }, - "node_modules/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==", - "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" - }, - "node_modules/simple-get": { - "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": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slick": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", - "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", - "license": "MIT (http://mootools.net/license.txt)", - "engines": { - "node": "*" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "license": "MIT", - "bin": { - "specificity": "bin/specificity" - } - }, - "node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sprintf-js": { - "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" - }, - "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" - } - }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-data": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/style-data/-/style-data-1.4.8.tgz", - "integrity": "sha512-RBJD+YQef4PzYKqC4PQEjDvyX709mwEClYg9u0A5EPXqdSkN2BtMnF/tW7EtS9Q0FnBF+lrWsK5+bEKqA+++Dg==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "mediaquery-text": "^1.2.0", - "pick-util": "^1.1.4" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table": { - "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", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "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.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/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, - "license": "MIT" - }, - "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", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "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/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "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, - "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==", - "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" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "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" - }, - "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", - "ps-tree": "^1.2.0", - "string-argv": "^0.1.1", - "strip-ansi": "^6.0.0" - }, - "bin": { - "tsc-watch": "index.js" - }, - "engines": { - "node": ">=8.17.0" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-query-selector": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", - "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "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==", - "license": "ISC" - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "license": "MIT", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "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" - } - }, - "node_modules/universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", - "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" - } - }, - "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" - }, - "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" - }, - "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" - }, - "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" - } - }, - "node_modules/which": { - "version": "2.0.2", - "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" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/word-wrap": { - "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" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "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" - }, - "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" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zod": { - "version": "3.24.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", - "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/.history/package-lock_20250502203724.json b/.history/package-lock_20250502203724.json deleted file mode 100644 index 644c00a9..00000000 --- a/.history/package-lock_20250502203724.json +++ /dev/null @@ -1,5406 +0,0 @@ -{ - "name": "sage", - "version": "3.3.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "sage", - "version": "3.3.0", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@discordjs/node-pre-gyp": "0.4.5", - "@octokit/rest": "^21.1.1", - "axios": "^1.4.0", - "canvas": "^3.1.0", - "chart.js": "^4.2.1", - "chartjs-node-canvas": "^5.0.0", - "console-stamp": "^3.0.2", - "discord.js": "^14.16.3", - "html-pdf-node": "^1.0.7", - "module-alias": "^2.2.2", - "moment": "^2.29.1", - "mongodb": "^3.7.4", - "node": "^23.9.0", - "node-cron": "^2.0.3", - "node-fetch": "^2.6.1", - "nodemailer": "^6.4.17", - "parse-duration": "^2.1.3", - "pdf-lib": "^1.17.1", - "pretty-ms": "^7.0.1", - "puppeteer": "^24.6.0" - }, - "devDependencies": { - "@types/console-stamp": "^0.2.33", - "@types/mongodb": "^3.6.3", - "@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.6.2", - "typescript": "^5.0.2" - }, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "license": "MIT", - "dependencies": { - "@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" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "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==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/builders": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.1.tgz", - "integrity": "sha512-2zDAVuoeAkdv0YQzYKO8vZfaDfB+1KZ60ymBKtD7QDpsh6lzAnQSUBLqeRkhlons6BT9+yRctOh9fPy94w6kDA==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/formatters": "^0.6.1", - "@discordjs/util": "^1.1.1", - "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.4", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@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==", - "license": "Apache-2.0", - "engines": { - "node": ">=16.11.0" - } - }, - "node_modules/@discordjs/formatters": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.1.tgz", - "integrity": "sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==", - "license": "Apache-2.0", - "dependencies": { - "discord-api-types": "^0.38.1" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "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==", - "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.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.5.0.tgz", - "integrity": "sha512-PWhchxTzpn9EV3vvPRpwS0EE2rNYB9pvzDU/eLLW3mByJl0ZHZjHI2/wA8EbH2gRMQV7nu+0FoDF84oiPl8VAQ==", - "license": "Apache-2.0", - "dependencies": { - "@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.38.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "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/util": { - "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" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/ws": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.2.tgz", - "integrity": "sha512-dyfq7yn0wO0IYeYOs3z79I6/HumhmKISzFL0Z+007zQJMtAFGtt3AEoq1nuLXtcunUE5YYYQqgKvybXukAK8/w==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/collection": "^2.1.0", - "@discordjs/rest": "^2.5.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.38.1", - "tslib": "^2.6.2", - "ws": "^8.17.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/@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", - "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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/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" - } - }, - "node_modules/@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==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@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==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@jonkemp/package-utils": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", - "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==", - "license": "MIT" - }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", - "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", - "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.2.2", - "@octokit/request": "^9.2.3", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "before-after-hook": "^3.0.2", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^9.2.3", - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", - "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", - "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.10.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", - "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", - "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.10.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/request": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", - "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^10.1.4", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^2.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", - "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", - "license": "MIT", - "dependencies": { - "@octokit/core": "^6.1.4", - "@octokit/plugin-paginate-rest": "^11.4.2", - "@octokit/plugin-request-log": "^5.3.1", - "@octokit/plugin-rest-endpoint-methods": "^13.3.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", - "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^25.0.0" - } - }, - "node_modules/@pdf-lib/standard-fonts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", - "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.6" - } - }, - "node_modules/@pdf-lib/upng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", - "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.10" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.2.tgz", - "integrity": "sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.4.0", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.1", - "tar-fs": "^3.0.8", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", - "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/@sapphire/async-queue": { - "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" - } - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v16" - } - }, - "node_modules/@sapphire/snowflake": { - "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/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "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": "*" - } - }, - "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" - }, - "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": "*" - } - }, - "node_modules/@types/node-fetch": { - "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": "^4.0.0" - } - }, - "node_modules/@types/nodemailer": { - "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.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.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "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", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@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, - "license": "MIT", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@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, - "license": "BSD-2-Clause", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "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", - "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" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.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", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "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" - } - }, - "node_modules/ansi-styles": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "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" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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" - }, - "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, - "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" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.3.tgz", - "integrity": "sha512-OeEZYIg+2qepaWLyphaOXHAHKo3xkM8y3BeGAvHdMN8GNWvEAU1Yw6rYpGzu/wDDbKxgEjVeVDpgGhDzaeMpjg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", - "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" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "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", - "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" - } - }, - "node_modules/bl/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" - }, - "node_modules/bl/node_modules/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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "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.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.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "engines": { - "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==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/canvas": { - "version": "3.1.0", - "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" - }, - "engines": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chart.js": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", - "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", - "license": "MIT", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chartjs-node-canvas": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-5.0.0.tgz", - "integrity": "sha512-+Lc5phRWjb+UxAIiQpKgvOaG6Mw276YQx2jl2BrxoUtI3A4RYTZuGM5Dq+s4ReYmCY42WEPSR6viF3lDSTxpvw==", - "license": "MIT", - "dependencies": { - "canvas": "^3.1.0", - "tslib": "^2.8.1" - }, - "peerDependencies": { - "chart.js": "^4.4.8" - } - }, - "node_modules/cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", - "license": "MIT", - "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-bidi": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-4.1.1.tgz", - "integrity": "sha512-biR7t4vF3YluE6RlMSk9IWk+b9U+WWyzHp+N2pL9vRTk+UXHYRTVp7jTK58ZNzMLBgoLMHY4QyJMbeuw3eKxqg==", - "license": "Apache-2.0", - "dependencies": { - "mitt": "^3.0.1", - "zod": "^3.24.1" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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" - }, - "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" - } - }, - "node_modules/combined-stream": { - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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" - }, - "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" - }, - "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" - }, - "engines": { - "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==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "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", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-rules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", - "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", - "license": "MIT", - "dependencies": { - "cssom": "^0.5.0" - } - }, - "node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", - "license": "BSD-like", - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "node_modules/css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "license": "BSD-2-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "license": "MIT" - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/dateformat": { - "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.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "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" - }, - "engines": { - "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, - "license": "MIT" - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "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" - } - }, - "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" - }, - "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" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.1425554", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", - "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==", - "license": "BSD-3-Clause" - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/discord-api-types": { - "version": "0.38.1", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.1.tgz", - "integrity": "sha512-vsjsqjAuxsPhiwbPjTBeGQaDPlizFmSkU0mTzFGMgRxqCDIRBR7iTY74HacpzrDV0QtERHRKQEk1tq7drZUtHg==", - "license": "MIT" - }, - "node_modules/discord.js": { - "version": "14.19.2", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.19.2.tgz", - "integrity": "sha512-L/ivhVefzzRcChHJSaGYsgA4Uqx6or2sst5JZ/ft9OBwrj8OJIzrrcutlkHnm/hlI0Hrm3es62TRVksU8VUqrg==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/builders": "^1.11.1", - "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.6.1", - "@discordjs/rest": "^2.5.0", - "@discordjs/util": "^1.1.1", - "@discordjs/ws": "^1.2.2", - "@sapphire/snowflake": "3.5.3", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "3.1.3", - "lodash.snakecase": "4.1.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "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, - "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==", - "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.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", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "license": "BSD-2-Clause" - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "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/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/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==", - "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", - "@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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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, - "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" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "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/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" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/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/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "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" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "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" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "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" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "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" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "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" - } - }, - "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/extract-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-2.0.1.tgz", - "integrity": "sha512-DX3+27l6NIVYNidJjBJ4VU3Z5tk/0aEO/JJ6XEJIRPFum9kyA1PifPjnEa8Ztnv4DHNQg5EF27aypGz6s/fMdw==", - "license": "MIT", - "dependencies": { - "batch": "^0.6.1", - "href-content": "^2.0.1", - "list-stylesheets": "^1.2.10", - "style-data": "^1.4.8" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "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" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "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", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/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, - "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, - "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.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" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "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.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-util": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.11.tgz", - "integrity": "sha512-h9ho3lHr5hDTQZKLqFDqIliDV/A8yCyP7UoSIBT4U3d7VfA/EeqsC8cxWJGIr5oCxZzMD/3BEx3SLYFX6hD8ng==", - "license": "MIT" - }, - "node_modules/flatted": { - "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.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" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "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": { - "node": ">= 6" - } - }, - "node_modules/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, - "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" - }, - "engines": { - "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==", - "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, - "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", - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 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/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "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", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "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", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "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/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "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==", - "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/href-content": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.3.tgz", - "integrity": "sha512-ikrAoI1l5ihN5Be2cR9nozFfivVJxPQDpa4+sb6PLt/uaNE/a7A05rHbnJEUduoHddbB3GyT5tdqzXMUmPgJYA==", - "license": "MIT", - "dependencies": { - "remote-content": "^4.0.0" - } - }, - "node_modules/html-pdf-node": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/html-pdf-node/-/html-pdf-node-1.0.8.tgz", - "integrity": "sha512-1PXbShoVXy8/86ZBY3xQNd5r2c/CPx/Me2wGtV0Z0Rekko5Tgow2hLms2n+OwA+PV7NyR7OPcTqsnhXIMUJLFw==", - "license": "ISC", - "dependencies": { - "bluebird": "^3.7.2", - "handlebars": "^4.7.6", - "inline-css": "^3.0.0", - "puppeteer": "^10.4.0" - } - }, - "node_modules/html-pdf-node/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/html-pdf-node/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/html-pdf-node/node_modules/devtools-protocol": { - "version": "0.0.901419", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", - "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", - "license": "BSD-3-Clause" - }, - "node_modules/html-pdf-node/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/html-pdf-node/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/html-pdf-node/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==", - "license": "MIT" - }, - "node_modules/html-pdf-node/node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "license": "MIT", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/html-pdf-node/node_modules/progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/html-pdf-node/node_modules/puppeteer": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.4.0.tgz", - "integrity": "sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w==", - "deprecated": "< 22.8.2 is no longer supported", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "4.3.1", - "devtools-protocol": "0.0.901419", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "node-fetch": "2.6.1", - "pkg-dir": "4.2.0", - "progress": "2.0.1", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.0.0", - "unbzip2-stream": "1.3.3", - "ws": "7.4.6" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/html-pdf-node/node_modules/tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "node_modules/html-pdf-node/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "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" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "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" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "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" - } - }, - "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" - }, - "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/inline-css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-3.0.0.tgz", - "integrity": "sha512-a+IE7oLaQqeVr3hMviekDDk94LA0+oZX8JEfJuXOm20diZAkOFrq/f/QZCEXpMK6qIbYr0nQNpsuioXQN1ZgXA==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "css-rules": "^1.0.9", - "extract-css": "^2.0.0", - "flat-util": "^1.1.6", - "pick-util": "^1.1.3", - "slick": "^1.12.2", - "specificity": "^0.4.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "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" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "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" - }, - "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" - }, - "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==", - "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" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" - }, - "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-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "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, - "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 - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/list-stylesheets": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-1.2.10.tgz", - "integrity": "sha512-F85Yx9GKLJwDr1T9U34FST5m6iIXhPzqD+MRDsljZsdmoEZwllZBDbkAVaa+EpLKrr6de+P4SRGNHwrWv6zMZA==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "pick-util": "^1.1.4" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", - "license": "MIT" - }, - "node_modules/lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" - }, - "node_modules/lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "license": "MIT" - }, - "node_modules/lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", - "license": "MIT" - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "deprecated": "This package is deprecated. Use destructuring assignment syntax instead.", - "license": "MIT" - }, - "node_modules/lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", - "license": "MIT" - }, - "node_modules/lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", - "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==", - "license": "MIT" - }, - "node_modules/lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", - "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, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/magic-bytes.js": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz", - "integrity": "sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==", - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/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 - }, - "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/mediaquery-text": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", - "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", - "license": "MIT", - "dependencies": { - "cssom": "^0.5.0" - } - }, - "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": { - "version": "1.4.1", - "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.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.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "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" - }, - "engines": { - "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": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "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" - }, - "engines": { - "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/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "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" - }, - "engines": { - "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.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.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/mongodb": { - "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", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/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, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/node": { - "version": "23.11.0", - "resolved": "https://registry.npmjs.org/node/-/node-23.11.0.tgz", - "integrity": "sha512-IS7dwB4M8/iKCFuJVN4EQmMmpX1YLN/wLfkgcouPA99s9cQUpuUX7Ng0j0XIK+4Zhb4EhcDyea5P20hF26nVow==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "node-bin-setup": "^1.0.0" - }, - "bin": { - "node": "bin/node" - }, - "engines": { - "npm": ">=5.0.0" - } - }, - "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-bin-setup": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", - "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", - "license": "ISC" - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/node-fetch": { - "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" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/nodemailer": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", - "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", - "license": "MIT-0", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npmlog": { - "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", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "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" - } - }, - "node_modules/opencollective-postinstall": { - "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" - } - }, - "node_modules/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==", - "license": "Apache-2.0", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "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.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-duration": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz", - "integrity": "sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg==", - "license": "MIT" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": [ - "MIT", - "Apache2" - ], - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pdf-lib": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", - "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", - "license": "MIT", - "dependencies": { - "@pdf-lib/standard-fonts": "^1.0.0", - "@pdf-lib/upng": "^1.0.1", - "pako": "^1.0.11", - "tslib": "^1.11.1" - } - }, - "node_modules/pdf-lib/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/pick-util": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", - "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", - "license": "MIT", - "dependencies": { - "@jonkemp/package-utils": "^1.0.8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/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" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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" - } - }, - "node_modules/pretty-ms": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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" - }, - "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" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, - "engines": { - "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.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" - } - }, - "node_modules/puppeteer": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.7.2.tgz", - "integrity": "sha512-ifYqoY6wGs0yZeFuFPn8BE9FhuveXkarF+eO18I2e/axdoCh4Qh1AE+qXdJBhdaeoPt6eRNTY4Dih29Jbq8wow==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", - "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1425554", - "puppeteer-core": "24.7.2", - "typed-query-selector": "^2.12.0" - }, - "bin": { - "puppeteer": "lib/cjs/puppeteer/node/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-core": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.7.2.tgz", - "integrity": "sha512-P9pZyTmJqKODFCnkZgemCpoFA4LbAa8+NumHVQKyP5X9IgdNS1ZnAnIh1sMAwhF8/xEUGf7jt+qmNLlKieFw1Q==", - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", - "debug": "^4.4.0", - "devtools-protocol": "0.0.1425554", - "typed-query-selector": "^2.12.0", - "ws": "^8.18.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/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, - "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" - }, - "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": "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/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" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/remote-content": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-4.0.1.tgz", - "integrity": "sha512-W2lDnjK4k1vAJg7UZArH/rkNYJqZuteHkX1jS7tO9TJUiLhDcu2Ejvj97gK/XbZNDhzld0sn11OW8vihin4cAg==", - "license": "MIT", - "dependencies": { - "axios": "^1.7.9", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/require-at": { - "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" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "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" - } - }, - "node_modules/rimraf": { - "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" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "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": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/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==", - "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" - }, - "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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "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" - }, - "engines": { - "node": ">=10" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=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==", - "license": "ISC" - }, - "node_modules/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==", - "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" - }, - "node_modules/simple-get": { - "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": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slick": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", - "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", - "license": "MIT (http://mootools.net/license.txt)", - "engines": { - "node": "*" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "license": "MIT", - "bin": { - "specificity": "bin/specificity" - } - }, - "node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sprintf-js": { - "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" - }, - "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" - } - }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-data": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/style-data/-/style-data-1.4.8.tgz", - "integrity": "sha512-RBJD+YQef4PzYKqC4PQEjDvyX709mwEClYg9u0A5EPXqdSkN2BtMnF/tW7EtS9Q0FnBF+lrWsK5+bEKqA+++Dg==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "mediaquery-text": "^1.2.0", - "pick-util": "^1.1.4" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table": { - "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", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "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.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/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, - "license": "MIT" - }, - "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", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "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/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "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, - "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==", - "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" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "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" - }, - "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", - "ps-tree": "^1.2.0", - "string-argv": "^0.1.1", - "strip-ansi": "^6.0.0" - }, - "bin": { - "tsc-watch": "index.js" - }, - "engines": { - "node": ">=8.17.0" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-query-selector": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", - "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "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==", - "license": "ISC" - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "license": "MIT", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "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" - } - }, - "node_modules/universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", - "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" - } - }, - "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" - }, - "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" - }, - "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" - }, - "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" - } - }, - "node_modules/which": { - "version": "2.0.2", - "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" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/word-wrap": { - "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" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "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" - }, - "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" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zod": { - "version": "3.24.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", - "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/.history/package-lock_20250502203726.json b/.history/package-lock_20250502203726.json deleted file mode 100644 index b34ee7da..00000000 --- a/.history/package-lock_20250502203726.json +++ /dev/null @@ -1,5405 +0,0 @@ -{ - "name": "sage", - "version": "3.3.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "sage", - "version": "3.3.0", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@discordjs/node-pre-gyp": "0.4.5", - "@octokit/rest": "^21.1.1", - "axios": "^1.4.0", - "canvas": "^3.1.0", - "chart.js": "^4.2.1", - "chartjs-node-canvas": "^5.0.0", - "console-stamp": "^3.0.2", - "discord.js": "^14.16.3", - "html-pdf-node": "^1.0.7", - "module-alias": "^2.2.2", - "moment": "^2.29.1", - "mongodb": "^3.7.4", - "node": "^23.9.0", - "node-cron": "^2.0.3", - "node-fetch": "^2.6.1", - "nodemailer": "^6.4.17", - "parse-duration": "^2.1.3", - "pdf-lib": "^1.17.1", - "pretty-ms": "^7.0.1", - "puppeteer": "^24.6.0" - }, - "devDependencies": { - "@types/console-stamp": "^0.2.33", - "@types/mongodb": "^3.6.3", - "@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.6.2", - "typescript": "^5.0.2" - }, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "license": "MIT", - "dependencies": { - "@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" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "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==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@discordjs/builders": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.1.tgz", - "integrity": "sha512-2zDAVuoeAkdv0YQzYKO8vZfaDfB+1KZ60ymBKtD7QDpsh6lzAnQSUBLqeRkhlons6BT9+yRctOh9fPy94w6kDA==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/formatters": "^0.6.1", - "@discordjs/util": "^1.1.1", - "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.4", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@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==", - "license": "Apache-2.0", - "engines": { - "node": ">=16.11.0" - } - }, - "node_modules/@discordjs/formatters": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.1.tgz", - "integrity": "sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==", - "license": "Apache-2.0", - "dependencies": { - "discord-api-types": "^0.38.1" - }, - "engines": { - "node": ">=16.11.0" - }, - "funding": { - "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==", - "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.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.5.0.tgz", - "integrity": "sha512-PWhchxTzpn9EV3vvPRpwS0EE2rNYB9pvzDU/eLLW3mByJl0ZHZjHI2/wA8EbH2gRMQV7nu+0FoDF84oiPl8VAQ==", - "license": "Apache-2.0", - "dependencies": { - "@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.38.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "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/util": { - "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" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/@discordjs/ws": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.2.tgz", - "integrity": "sha512-dyfq7yn0wO0IYeYOs3z79I6/HumhmKISzFL0Z+007zQJMtAFGtt3AEoq1nuLXtcunUE5YYYQqgKvybXukAK8/w==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/collection": "^2.1.0", - "@discordjs/rest": "^2.5.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.38.1", - "tslib": "^2.6.2", - "ws": "^8.17.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/@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", - "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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/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" - } - }, - "node_modules/@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==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@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==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@jonkemp/package-utils": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", - "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==", - "license": "MIT" - }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", - "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", - "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.2.2", - "@octokit/request": "^9.2.3", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "before-after-hook": "^3.0.2", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^9.2.3", - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", - "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", - "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.10.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", - "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", - "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.10.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/request": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", - "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^10.1.4", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^2.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", - "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", - "license": "MIT", - "dependencies": { - "@octokit/core": "^6.1.4", - "@octokit/plugin-paginate-rest": "^11.4.2", - "@octokit/plugin-request-log": "^5.3.1", - "@octokit/plugin-rest-endpoint-methods": "^13.3.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", - "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^25.0.0" - } - }, - "node_modules/@pdf-lib/standard-fonts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", - "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.6" - } - }, - "node_modules/@pdf-lib/upng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", - "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.10" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.2.tgz", - "integrity": "sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.4.0", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.1", - "tar-fs": "^3.0.8", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", - "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/@sapphire/async-queue": { - "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" - } - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v16" - } - }, - "node_modules/@sapphire/snowflake": { - "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/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "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": "*" - } - }, - "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" - }, - "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": "*" - } - }, - "node_modules/@types/node-fetch": { - "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": "^4.0.0" - } - }, - "node_modules/@types/nodemailer": { - "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.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.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "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", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@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, - "license": "MIT", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@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, - "license": "BSD-2-Clause", - "dependencies": { - "@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" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@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, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "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", - "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" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.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", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "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" - } - }, - "node_modules/ansi-styles": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "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" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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" - }, - "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, - "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" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.3.tgz", - "integrity": "sha512-OeEZYIg+2qepaWLyphaOXHAHKo3xkM8y3BeGAvHdMN8GNWvEAU1Yw6rYpGzu/wDDbKxgEjVeVDpgGhDzaeMpjg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", - "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" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "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", - "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" - } - }, - "node_modules/bl/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" - }, - "node_modules/bl/node_modules/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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "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.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.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "engines": { - "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==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/canvas": { - "version": "3.1.0", - "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" - }, - "engines": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chart.js": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", - "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", - "license": "MIT", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chartjs-node-canvas": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-5.0.0.tgz", - "integrity": "sha512-+Lc5phRWjb+UxAIiQpKgvOaG6Mw276YQx2jl2BrxoUtI3A4RYTZuGM5Dq+s4ReYmCY42WEPSR6viF3lDSTxpvw==", - "license": "MIT", - "dependencies": { - "canvas": "^3.1.0", - "tslib": "^2.8.1" - }, - "peerDependencies": { - "chart.js": "^4.4.8" - } - }, - "node_modules/cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", - "license": "MIT", - "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-bidi": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-4.1.1.tgz", - "integrity": "sha512-biR7t4vF3YluE6RlMSk9IWk+b9U+WWyzHp+N2pL9vRTk+UXHYRTVp7jTK58ZNzMLBgoLMHY4QyJMbeuw3eKxqg==", - "license": "Apache-2.0", - "dependencies": { - "mitt": "^3.0.1", - "zod": "^3.24.1" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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" - }, - "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" - } - }, - "node_modules/combined-stream": { - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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" - }, - "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" - }, - "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" - }, - "engines": { - "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==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "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", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-rules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", - "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", - "license": "MIT", - "dependencies": { - "cssom": "^0.5.0" - } - }, - "node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", - "license": "BSD-like", - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "node_modules/css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "license": "BSD-2-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "license": "MIT" - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/dateformat": { - "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.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "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" - }, - "engines": { - "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, - "license": "MIT" - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "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" - } - }, - "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" - }, - "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" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.1425554", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", - "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==", - "license": "BSD-3-Clause" - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/discord-api-types": { - "version": "0.38.1", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.1.tgz", - "integrity": "sha512-vsjsqjAuxsPhiwbPjTBeGQaDPlizFmSkU0mTzFGMgRxqCDIRBR7iTY74HacpzrDV0QtERHRKQEk1tq7drZUtHg==", - "license": "MIT" - }, - "node_modules/discord.js": { - "version": "14.19.2", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.19.2.tgz", - "integrity": "sha512-L/ivhVefzzRcChHJSaGYsgA4Uqx6or2sst5JZ/ft9OBwrj8OJIzrrcutlkHnm/hlI0Hrm3es62TRVksU8VUqrg==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/builders": "^1.11.1", - "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.6.1", - "@discordjs/rest": "^2.5.0", - "@discordjs/util": "^1.1.1", - "@discordjs/ws": "^1.2.2", - "@sapphire/snowflake": "3.5.3", - "discord-api-types": "^0.38.1", - "fast-deep-equal": "3.1.3", - "lodash.snakecase": "4.1.1", - "magic-bytes.js": "^1.10.0", - "tslib": "^2.6.3", - "undici": "6.21.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/discordjs/discord.js?sponsor" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "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, - "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==", - "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.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", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "license": "BSD-2-Clause" - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "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/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/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==", - "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", - "@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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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, - "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" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "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/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" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/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/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "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" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "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" - } - }, - "node_modules/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, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "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" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "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" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "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" - } - }, - "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/extract-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-2.0.1.tgz", - "integrity": "sha512-DX3+27l6NIVYNidJjBJ4VU3Z5tk/0aEO/JJ6XEJIRPFum9kyA1PifPjnEa8Ztnv4DHNQg5EF27aypGz6s/fMdw==", - "license": "MIT", - "dependencies": { - "batch": "^0.6.1", - "href-content": "^2.0.1", - "list-stylesheets": "^1.2.10", - "style-data": "^1.4.8" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "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" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "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", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/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, - "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, - "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.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" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "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.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-util": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.11.tgz", - "integrity": "sha512-h9ho3lHr5hDTQZKLqFDqIliDV/A8yCyP7UoSIBT4U3d7VfA/EeqsC8cxWJGIr5oCxZzMD/3BEx3SLYFX6hD8ng==", - "license": "MIT" - }, - "node_modules/flatted": { - "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.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" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "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": { - "node": ">= 6" - } - }, - "node_modules/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, - "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" - }, - "engines": { - "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==", - "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, - "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", - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 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/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "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", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "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", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "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/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "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==", - "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/href-content": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.3.tgz", - "integrity": "sha512-ikrAoI1l5ihN5Be2cR9nozFfivVJxPQDpa4+sb6PLt/uaNE/a7A05rHbnJEUduoHddbB3GyT5tdqzXMUmPgJYA==", - "license": "MIT", - "dependencies": { - "remote-content": "^4.0.0" - } - }, - "node_modules/html-pdf-node": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/html-pdf-node/-/html-pdf-node-1.0.8.tgz", - "integrity": "sha512-1PXbShoVXy8/86ZBY3xQNd5r2c/CPx/Me2wGtV0Z0Rekko5Tgow2hLms2n+OwA+PV7NyR7OPcTqsnhXIMUJLFw==", - "license": "ISC", - "dependencies": { - "bluebird": "^3.7.2", - "handlebars": "^4.7.6", - "inline-css": "^3.0.0", - "puppeteer": "^10.4.0" - } - }, - "node_modules/html-pdf-node/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/html-pdf-node/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/html-pdf-node/node_modules/devtools-protocol": { - "version": "0.0.901419", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", - "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", - "license": "BSD-3-Clause" - }, - "node_modules/html-pdf-node/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/html-pdf-node/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/html-pdf-node/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==", - "license": "MIT" - }, - "node_modules/html-pdf-node/node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "license": "MIT", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/html-pdf-node/node_modules/progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/html-pdf-node/node_modules/puppeteer": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.4.0.tgz", - "integrity": "sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w==", - "deprecated": "< 22.8.2 is no longer supported", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "4.3.1", - "devtools-protocol": "0.0.901419", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "node-fetch": "2.6.1", - "pkg-dir": "4.2.0", - "progress": "2.0.1", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.0.0", - "unbzip2-stream": "1.3.3", - "ws": "7.4.6" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/html-pdf-node/node_modules/tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "node_modules/html-pdf-node/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "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" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "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" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "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" - } - }, - "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" - }, - "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/inline-css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-3.0.0.tgz", - "integrity": "sha512-a+IE7oLaQqeVr3hMviekDDk94LA0+oZX8JEfJuXOm20diZAkOFrq/f/QZCEXpMK6qIbYr0nQNpsuioXQN1ZgXA==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "css-rules": "^1.0.9", - "extract-css": "^2.0.0", - "flat-util": "^1.1.6", - "pick-util": "^1.1.3", - "slick": "^1.12.2", - "specificity": "^0.4.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "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" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "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" - }, - "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" - }, - "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==", - "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" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" - }, - "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-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "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, - "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 - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/list-stylesheets": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-1.2.10.tgz", - "integrity": "sha512-F85Yx9GKLJwDr1T9U34FST5m6iIXhPzqD+MRDsljZsdmoEZwllZBDbkAVaa+EpLKrr6de+P4SRGNHwrWv6zMZA==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "pick-util": "^1.1.4" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", - "license": "MIT" - }, - "node_modules/lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" - }, - "node_modules/lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "license": "MIT" - }, - "node_modules/lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", - "license": "MIT" - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "deprecated": "This package is deprecated. Use destructuring assignment syntax instead.", - "license": "MIT" - }, - "node_modules/lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", - "license": "MIT" - }, - "node_modules/lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", - "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==", - "license": "MIT" - }, - "node_modules/lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", - "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, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/magic-bytes.js": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz", - "integrity": "sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==", - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/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 - }, - "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/mediaquery-text": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", - "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", - "license": "MIT", - "dependencies": { - "cssom": "^0.5.0" - } - }, - "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": { - "version": "1.4.1", - "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.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.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "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" - }, - "engines": { - "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": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "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" - }, - "engines": { - "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/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "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" - }, - "engines": { - "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.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.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/mongodb": { - "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", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/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, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/node": { - "version": "23.11.0", - "resolved": "https://registry.npmjs.org/node/-/node-23.11.0.tgz", - "integrity": "sha512-IS7dwB4M8/iKCFuJVN4EQmMmpX1YLN/wLfkgcouPA99s9cQUpuUX7Ng0j0XIK+4Zhb4EhcDyea5P20hF26nVow==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "node-bin-setup": "^1.0.0" - }, - "bin": { - "node": "bin/node" - }, - "engines": { - "npm": ">=5.0.0" - } - }, - "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-bin-setup": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", - "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", - "license": "ISC" - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/node-fetch": { - "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" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/nodemailer": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", - "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", - "license": "MIT-0", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npmlog": { - "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", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "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" - } - }, - "node_modules/opencollective-postinstall": { - "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" - } - }, - "node_modules/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==", - "license": "Apache-2.0", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "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.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-duration": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz", - "integrity": "sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg==", - "license": "MIT" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": [ - "MIT", - "Apache2" - ], - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pdf-lib": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", - "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", - "license": "MIT", - "dependencies": { - "@pdf-lib/standard-fonts": "^1.0.0", - "@pdf-lib/upng": "^1.0.1", - "pako": "^1.0.11", - "tslib": "^1.11.1" - } - }, - "node_modules/pdf-lib/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/pick-util": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", - "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", - "license": "MIT", - "dependencies": { - "@jonkemp/package-utils": "^1.0.8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/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" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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" - } - }, - "node_modules/pretty-ms": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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" - }, - "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" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, - "engines": { - "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.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" - } - }, - "node_modules/puppeteer": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.7.2.tgz", - "integrity": "sha512-ifYqoY6wGs0yZeFuFPn8BE9FhuveXkarF+eO18I2e/axdoCh4Qh1AE+qXdJBhdaeoPt6eRNTY4Dih29Jbq8wow==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", - "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1425554", - "puppeteer-core": "24.7.2", - "typed-query-selector": "^2.12.0" - }, - "bin": { - "puppeteer": "lib/cjs/puppeteer/node/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-core": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.7.2.tgz", - "integrity": "sha512-P9pZyTmJqKODFCnkZgemCpoFA4LbAa8+NumHVQKyP5X9IgdNS1ZnAnIh1sMAwhF8/xEUGf7jt+qmNLlKieFw1Q==", - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", - "debug": "^4.4.0", - "devtools-protocol": "0.0.1425554", - "typed-query-selector": "^2.12.0", - "ws": "^8.18.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/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, - "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" - }, - "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": "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/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" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/remote-content": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-4.0.1.tgz", - "integrity": "sha512-W2lDnjK4k1vAJg7UZArH/rkNYJqZuteHkX1jS7tO9TJUiLhDcu2Ejvj97gK/XbZNDhzld0sn11OW8vihin4cAg==", - "license": "MIT", - "dependencies": { - "axios": "^1.7.9", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/require-at": { - "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" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "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" - } - }, - "node_modules/rimraf": { - "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" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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, - "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": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/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==", - "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" - }, - "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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "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" - }, - "engines": { - "node": ">=10" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=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==", - "license": "ISC" - }, - "node_modules/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==", - "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" - }, - "node_modules/simple-get": { - "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": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slick": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", - "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", - "license": "MIT (http://mootools.net/license.txt)", - "engines": { - "node": "*" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "license": "MIT", - "bin": { - "specificity": "bin/specificity" - } - }, - "node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sprintf-js": { - "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" - }, - "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" - } - }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-data": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/style-data/-/style-data-1.4.8.tgz", - "integrity": "sha512-RBJD+YQef4PzYKqC4PQEjDvyX709mwEClYg9u0A5EPXqdSkN2BtMnF/tW7EtS9Q0FnBF+lrWsK5+bEKqA+++Dg==", - "license": "MIT", - "dependencies": { - "cheerio": "^0.22.0", - "mediaquery-text": "^1.2.0", - "pick-util": "^1.1.4" - } - }, - "node_modules/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table": { - "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", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "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.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/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, - "license": "MIT" - }, - "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", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "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/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "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, - "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==", - "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" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "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" - }, - "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", - "ps-tree": "^1.2.0", - "string-argv": "^0.1.1", - "strip-ansi": "^6.0.0" - }, - "bin": { - "tsc-watch": "index.js" - }, - "engines": { - "node": ">=8.17.0" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "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" - }, - "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" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-query-selector": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", - "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "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==", - "license": "ISC" - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "license": "MIT", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "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" - } - }, - "node_modules/universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", - "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" - } - }, - "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" - }, - "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" - }, - "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" - }, - "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" - } - }, - "node_modules/which": { - "version": "2.0.2", - "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" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/word-wrap": { - "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" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "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" - }, - "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" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zod": { - "version": "3.24.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", - "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/.history/package_20250502203204.json b/.history/package_20250502203204.json deleted file mode 100644 index 79059ff9..00000000 --- a/.history/package_20250502203204.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "sage", - "version": "3.3.0", - "engines": { - "node": ">=16.9.0" - }, - "engineStrict": true, - "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", -<<<<<<< HEAD - - "install": "node-pre-gyp install --fallback-to-build --build-from-source", - -======= - "install": "node-pre-gyp install --fallback-to-build --build-from-source", ->>>>>>> 1c0d10eab4981bb2ff421a64acc77f0afac0a43f - "build": "tsc -p .", - "clean": "rm -rf dist", - "test": "eslint src --ext .ts", - "lint": "eslint src --ext .ts --fix", - "dev": "tsc-watch --onSuccess \"node dist/src/sage.js\"", - "onboard": "node dist/onboard/onboard.js", - "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" - }, - "author": "Matt Nadar, Leo Chen, Simon Brugel, Blade Tyrrell, Josh Lyon, Ren Ross & Ben Segal", - "license": "MIT", - "bugs": { - "url": "https://github.com/ud-cis-discord/SageV2/issues" - }, - "homepage": "https://github.com/ud-cis-discord/SageV2", - "dependencies": { - "@discordjs/node-pre-gyp": "0.4.5", - "@octokit/rest": "^21.1.1", - "axios": "^1.4.0", - "canvas": "^3.1.0", - "console-stamp": "^3.0.2", - "discord.js": "^14.16.3", - "html-pdf-node": "^1.0.7", - "module-alias": "^2.2.2", - "moment": "^2.29.1", - "mongodb": "^3.7.4", - "node": "^23.9.0", - "node-cron": "^2.0.3", - "node-fetch": "^2.6.1", - "nodemailer": "^6.4.17", - "parse-duration": "^2.1.3", - "pdf-lib": "^1.17.1", - "pretty-ms": "^7.0.1", - "puppeteer": "^24.6.0", - "chart.js": "^4.2.1", - "chartjs-node-canvas": "^5.0.0" - }, - "_moduleAliases": { - "@root": "dist", - "@lib": "dist/src/lib", - "@pieces": "dist/src/pieces" - }, - "devDependencies": { - "@types/console-stamp": "^0.2.33", - "@types/mongodb": "^3.6.3", - "@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.6.2", - "typescript": "^5.0.2" - } -} diff --git a/.history/package_20250502203547.json b/.history/package_20250502203547.json deleted file mode 100644 index 8997273a..00000000 --- a/.history/package_20250502203547.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "sage", - "version": "3.3.0", - "engines": { - "node": ">=16.9.0" - }, - "engineStrict": true, - "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", -<<<<<<<<< Temporary merge branch 1 - "install": "node-pre-gyp install --fallback-to-build", -========= - "install": "node-pre-gyp install --fallback-to-build --build-from-source", ->>>>>>>>> Temporary merge branch 2 - "build": "tsc -p .", - "clean": "rm -rf dist", - "test": "eslint src --ext .ts", - "lint": "eslint src --ext .ts --fix", - "dev": "tsc-watch --onSuccess \"node dist/src/sage.js\"", - "onboard": "node dist/onboard/onboard.js", - "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" - }, - "author": "Matt Nadar, Leo Chen, Simon Brugel, Blade Tyrrell, Josh Lyon, Ren Ross & Ben Segal", - "license": "MIT", - "bugs": { - "url": "https://github.com/ud-cis-discord/SageV2/issues" - }, - "homepage": "https://github.com/ud-cis-discord/SageV2", - "dependencies": { - "@discordjs/node-pre-gyp": "0.4.5", - "@octokit/rest": "^21.1.1", - "axios": "^1.4.0", - "canvas": "^3.1.0", - "console-stamp": "^3.0.2", - "discord.js": "^14.16.3", - "html-pdf-node": "^1.0.7", - "module-alias": "^2.2.2", - "moment": "^2.29.1", - "mongodb": "^3.7.4", - "node": "^23.9.0", - "node-cron": "^2.0.3", - "node-fetch": "^2.6.1", - "nodemailer": "^6.4.17", - "parse-duration": "^2.1.3", - "pdf-lib": "^1.17.1", - "pretty-ms": "^7.0.1", - "puppeteer": "^24.6.0", - "chart.js": "^4.2.1", - "chartjs-node-canvas": "^5.0.0" - }, - "_moduleAliases": { - "@root": "dist", - "@lib": "dist/src/lib", - "@pieces": "dist/src/pieces" - }, - "devDependencies": { - "@types/console-stamp": "^0.2.33", - "@types/mongodb": "^3.6.3", - "@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.6.2", - "typescript": "^5.0.2" - } -} diff --git a/.history/package_20250502203550.json b/.history/package_20250502203550.json deleted file mode 100644 index ee224f03..00000000 --- a/.history/package_20250502203550.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "sage", - "version": "3.3.0", - "engines": { - "node": ">=16.9.0" - }, - "engineStrict": true, - "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-from-source", - "build": "tsc -p .", - "clean": "rm -rf dist", - "test": "eslint src --ext .ts", - "lint": "eslint src --ext .ts --fix", - "dev": "tsc-watch --onSuccess \"node dist/src/sage.js\"", - "onboard": "node dist/onboard/onboard.js", - "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" - }, - "author": "Matt Nadar, Leo Chen, Simon Brugel, Blade Tyrrell, Josh Lyon, Ren Ross & Ben Segal", - "license": "MIT", - "bugs": { - "url": "https://github.com/ud-cis-discord/SageV2/issues" - }, - "homepage": "https://github.com/ud-cis-discord/SageV2", - "dependencies": { - "@discordjs/node-pre-gyp": "0.4.5", - "@octokit/rest": "^21.1.1", - "axios": "^1.4.0", - "canvas": "^3.1.0", - "console-stamp": "^3.0.2", - "discord.js": "^14.16.3", - "html-pdf-node": "^1.0.7", - "module-alias": "^2.2.2", - "moment": "^2.29.1", - "mongodb": "^3.7.4", - "node": "^23.9.0", - "node-cron": "^2.0.3", - "node-fetch": "^2.6.1", - "nodemailer": "^6.4.17", - "parse-duration": "^2.1.3", - "pdf-lib": "^1.17.1", - "pretty-ms": "^7.0.1", - "puppeteer": "^24.6.0", - "chart.js": "^4.2.1", - "chartjs-node-canvas": "^5.0.0" - }, - "_moduleAliases": { - "@root": "dist", - "@lib": "dist/src/lib", - "@pieces": "dist/src/pieces" - }, - "devDependencies": { - "@types/console-stamp": "^0.2.33", - "@types/mongodb": "^3.6.3", - "@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.6.2", - "typescript": "^5.0.2" - } -} diff --git a/.history/src/commands/reminders/remind_20250428131631.ts b/.history/src/commands/reminders/remind_20250428131631.ts deleted file mode 100644 index 3ec3c308..00000000 --- a/.history/src/commands/reminders/remind_20250428131631.ts +++ /dev/null @@ -1,149 +0,0 @@ -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 { checkJobReminder, 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.'; - options: ApplicationCommandOptionData[] = [ - { - 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 - } - ] - }, - // added by Fried Sage Leaves - handles what happens when /remind jobs is run - { - name: 'jobs', - description: 'Create a job reminder', - type: ApplicationCommandOptionType.Subcommand, - options: [ - { - name: 'job-repeat', - description: 'How often you want the reminder to repeat', - choices: [ - { name: 'Daily', value: 'daily' }, - { name: 'Weekly', value: 'weekly' } - ], - 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' }, - { name: 'Default', value: 'default' } - ], - type: ApplicationCommandOptionType.String - } - ] - } - ]; - - async run( - interaction: ChatInputCommandInteraction - ): Promise | void> { - const subcommand: string = interaction.options.getSubcommand(); - - if (subcommand === 'jobs') { - const jobReminderRepeat = interaction.options.getString('job-repeat') as - | 'daily' - | 'weekly' || null; - - const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date' | 'default' | null; - - const jobReminder: Reminder = { - owner: interaction.user.id, - content: 'Job Reminder', - mode: 'private', - expires: new Date(), - repeat: jobReminderRepeat, - filterBy - }; - // handling duplicate job reminders - 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.', - ephemeral: true - }); - } else { - interaction.client.mongo - .collection(DB.REMINDERS) - .insertOne(jobReminder); - return interaction.reply({ - content: `I'll remind you about job offers ${jobReminderRepeat} at ${reminderTime( - jobReminder - )}.`, - ephemeral: true - }); - } - } else { - 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: `I'll remind you about that at ${reminderTime( - reminder - )}.`, - ephemeral: true - }); - } - } - -} diff --git a/.history/src/commands/reminders/remind_20250502211217.ts b/.history/src/commands/reminders/remind_20250502211217.ts deleted file mode 100644 index f318875d..00000000 --- a/.history/src/commands/reminders/remind_20250502211217.ts +++ /dev/null @@ -1,150 +0,0 @@ -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 { checkJobReminder, 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.'; - options: ApplicationCommandOptionData[] = [ - { - 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 - } - ] - }, - // added by Fried Sage Leaves - handles what happens when /remind jobs is run - { - name: 'jobs', - description: 'Create a job reminder', - type: ApplicationCommandOptionType.Subcommand, - options: [ - { - name: 'job-repeat', - description: 'How often you want the reminder to repeat', - choices: [ - { name: 'Daily', value: 'daily' }, - { name: 'Weekly', value: 'weekly' } - ], - 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' }, - { name: 'Default', value: 'default' } - ], - type: ApplicationCommandOptionType.String - } - ] - } - ]; - - async run( - interaction: ChatInputCommandInteraction - ): Promise | void> { - await interaction.deferReply({ ephemeral: true }); // NEW LINE - const subcommand: string = interaction.options.getSubcommand(); - - if (subcommand === 'jobs') { - const jobReminderRepeat = interaction.options.getString('job-repeat') as - | 'daily' - | 'weekly' || null; - - const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date' | 'default' | null; - - const jobReminder: Reminder = { - owner: interaction.user.id, - content: 'Job Reminder', - mode: 'private', - expires: new Date(), - repeat: jobReminderRepeat, - filterBy - }; - // handling duplicate job reminders - 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.', - ephemeral: true - }); - } else { - interaction.client.mongo - .collection(DB.REMINDERS) - .insertOne(jobReminder); - return interaction.reply({ - content: `I'll remind you about job offers ${jobReminderRepeat} at ${reminderTime( - jobReminder - )}.`, - ephemeral: true - }); - } - } else { - 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: `I'll remind you about that at ${reminderTime( - reminder - )}.`, - ephemeral: true - }); - } - } - -} diff --git a/.history/src/commands/reminders/remind_20250502211309.ts b/.history/src/commands/reminders/remind_20250502211309.ts deleted file mode 100644 index 3ec3c308..00000000 --- a/.history/src/commands/reminders/remind_20250502211309.ts +++ /dev/null @@ -1,149 +0,0 @@ -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 { checkJobReminder, 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.'; - options: ApplicationCommandOptionData[] = [ - { - 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 - } - ] - }, - // added by Fried Sage Leaves - handles what happens when /remind jobs is run - { - name: 'jobs', - description: 'Create a job reminder', - type: ApplicationCommandOptionType.Subcommand, - options: [ - { - name: 'job-repeat', - description: 'How often you want the reminder to repeat', - choices: [ - { name: 'Daily', value: 'daily' }, - { name: 'Weekly', value: 'weekly' } - ], - 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' }, - { name: 'Default', value: 'default' } - ], - type: ApplicationCommandOptionType.String - } - ] - } - ]; - - async run( - interaction: ChatInputCommandInteraction - ): Promise | void> { - const subcommand: string = interaction.options.getSubcommand(); - - if (subcommand === 'jobs') { - const jobReminderRepeat = interaction.options.getString('job-repeat') as - | 'daily' - | 'weekly' || null; - - const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date' | 'default' | null; - - const jobReminder: Reminder = { - owner: interaction.user.id, - content: 'Job Reminder', - mode: 'private', - expires: new Date(), - repeat: jobReminderRepeat, - filterBy - }; - // handling duplicate job reminders - 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.', - ephemeral: true - }); - } else { - interaction.client.mongo - .collection(DB.REMINDERS) - .insertOne(jobReminder); - return interaction.reply({ - content: `I'll remind you about job offers ${jobReminderRepeat} at ${reminderTime( - jobReminder - )}.`, - ephemeral: true - }); - } - } else { - 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: `I'll remind you about that at ${reminderTime( - reminder - )}.`, - ephemeral: true - }); - } - } - -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250430125913.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250430125913.ts deleted file mode 100644 index 67cf981c..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250430125913.ts +++ /dev/null @@ -1,68 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -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 - - 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); - - const cacheKey = `${jobData.jobType.toLowerCase()}-${jobData.city.toLowerCase()}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - 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_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(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, - 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', - // Added latitude and longitude - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202604.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202604.ts deleted file mode 100644 index 0f4a7940..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202604.ts +++ /dev/null @@ -1,74 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -export default async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { - // ✅ Fix: make sure city and jobType don't crash if they're missing - // If either one is undefined or empty, just fall back to a default - const safeCity = jobData.city?.toLowerCase?.() || 'newark'; - const safeJobType = jobData.jobType?.toLowerCase?.() || 'full-time'; - const safeDistanceKm = Number(jobData.distance || 10) * 1.609; // default to 10 miles if distance is missing - - const LOCATION = encodeURIComponent(safeCity); - const JOB_TYPE = encodeURIComponent(safeJobType); - - // ✅ Fix: make sure interests aren't undefined when building the query string - let whatInterests = ''; - if (interests) { - const keys = Object.keys(interests); - const lastKey = keys[keys.length - 1]; - const lastValue = interests[lastKey]; - - for (const interest in interests) { - // If the interest is missing, just skip it - whatInterests += interests[interest]?.replace(/\s+/g, '-') || ''; - if (interests[interest] !== lastValue) whatInterests += ' '; - } - } - whatInterests = encodeURIComponent(whatInterests); - - // ✅ Fix: build the cache key safely using the cleaned-up values - const cacheKey = `${safeJobType}-${safeCity}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - 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_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(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, - 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', - // Added latitude and longitude - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202609.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202609.ts deleted file mode 100644 index dcedcd85..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202609.ts +++ /dev/null @@ -1,74 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -export default async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { - // ✅ Fix: make sure city and jobType don't crash if they're missing - // If either one is undefined or empty, just fall back to a default - const safeCity = jobData.city?.toLowerCase?.() || 'newark'; - const safeJobType = jobData.jobType?.toLowerCase?.() || 'full-time'; - const safeDistanceKm = Number(jobData.distance || 10) * 1.609; // default to 10 miles if distance is missing - - const LOCATION = encodeURIComponent(safeCity); - const JOB_TYPE = encodeURIComponent(safeJobType); - - // ✅ Fix: make sure interests aren't undefined when building the query string - let whatInterests = ''; - if (interests) { - const keys = Object.keys(interests); - const lastKey = keys[keys.length - 1]; - const lastValue = interests[lastKey]; - - for (const interest in interests) { - // If the interest is missing, just skip it - whatInterests += interests[interest]?.replace(/\s+/g, '-') || ''; - if (interests[interest] !== lastValue) whatInterests += ' '; - } - } - whatInterests = encodeURIComponent(whatInterests); - - // build the cache key safely using the cleaned-up values - const cacheKey = `${safeJobType}-${safeCity}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - 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_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(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, - 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', - // Added latitude and longitude - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202613.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202613.ts deleted file mode 100644 index de80467f..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202613.ts +++ /dev/null @@ -1,74 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -export default async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { - // ✅ Fix: make sure city and jobType don't crash if they're missing - // If either one is undefined or empty, just fall back to a default - const safeCity = jobData.city?.toLowerCase?.() || 'newark'; - const safeJobType = jobData.jobType?.toLowerCase?.() || 'full-time'; - const safeDistanceKm = Number(jobData.distance || 10) * 1.609; // default to 10 miles if distance is missing - - const LOCATION = encodeURIComponent(safeCity); - const JOB_TYPE = encodeURIComponent(safeJobType); - - // make sure interests aren't undefined when building the query string - let whatInterests = ''; - if (interests) { - const keys = Object.keys(interests); - const lastKey = keys[keys.length - 1]; - const lastValue = interests[lastKey]; - - for (const interest in interests) { - // If the interest is missing, just skip it - whatInterests += interests[interest]?.replace(/\s+/g, '-') || ''; - if (interests[interest] !== lastValue) whatInterests += ' '; - } - } - whatInterests = encodeURIComponent(whatInterests); - - // build the cache key safely using the cleaned-up values - const cacheKey = `${safeJobType}-${safeCity}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - 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_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(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, - 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', - // Added latitude and longitude - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202614.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202614.ts deleted file mode 100644 index 4530b80f..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202614.ts +++ /dev/null @@ -1,74 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -export default async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { - // ✅ Fix: make sure city and jobType don't crash if they're missing - // If either one is undefined or empty, just fall back to a default - const safeCity = jobData.city?.toLowerCase?.() || 'newark'; - const safeJobType = jobData.jobType?.toLowerCase?.() || 'full-time'; - const safeDistanceKm = Number(jobData.distance || 10) * 1.609; // default to 10 miles if distance is missing - - const LOCATION = encodeURIComponent(safeCity); - const JOB_TYPE = encodeURIComponent(safeJobType); - - // make sure interests aren't undefined when building the query string - let whatInterests = ''; - if (interests) { - const keys = Object.keys(interests); - const lastKey = keys[keys.length - 1]; - const lastValue = interests[lastKey]; - - for (const interest in interests) { - // If the interest is missing, just skip it - whatInterests += interests[interest]?.replace(/\s+/g, '-') || ''; - if (interests[interest] !== lastValue) whatInterests += ' '; - } - } - whatInterests = encodeURIComponent(whatInterests); - - // build the cache key safely using the cleaned-up values - const cacheKey = `${safeJobType}-${safeCity}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - 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_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(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, - 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', - // Added latitude and longitude - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202618.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202618.ts deleted file mode 100644 index 56ca9c4b..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202618.ts +++ /dev/null @@ -1,74 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -export default async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { - //make sure city and jobType don't crash if they're missing - // If either one is undefined or empty, just fall back to a default - const safeCity = jobData.city?.toLowerCase?.() || 'newark'; - const safeJobType = jobData.jobType?.toLowerCase?.() || 'full-time'; - const safeDistanceKm = Number(jobData.distance || 10) * 1.609; // default to 10 miles if distance is missing - - const LOCATION = encodeURIComponent(safeCity); - const JOB_TYPE = encodeURIComponent(safeJobType); - - // make sure interests aren't undefined when building the query string - let whatInterests = ''; - if (interests) { - const keys = Object.keys(interests); - const lastKey = keys[keys.length - 1]; - const lastValue = interests[lastKey]; - - for (const interest in interests) { - // If the interest is missing, just skip it - whatInterests += interests[interest]?.replace(/\s+/g, '-') || ''; - if (interests[interest] !== lastValue) whatInterests += ' '; - } - } - whatInterests = encodeURIComponent(whatInterests); - - // build the cache key safely using the cleaned-up values - const cacheKey = `${safeJobType}-${safeCity}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - 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_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(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, - 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', - // Added latitude and longitude - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202634.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202634.ts deleted file mode 100644 index 4530b80f..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202634.ts +++ /dev/null @@ -1,74 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -export default async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { - // ✅ Fix: make sure city and jobType don't crash if they're missing - // If either one is undefined or empty, just fall back to a default - const safeCity = jobData.city?.toLowerCase?.() || 'newark'; - const safeJobType = jobData.jobType?.toLowerCase?.() || 'full-time'; - const safeDistanceKm = Number(jobData.distance || 10) * 1.609; // default to 10 miles if distance is missing - - const LOCATION = encodeURIComponent(safeCity); - const JOB_TYPE = encodeURIComponent(safeJobType); - - // make sure interests aren't undefined when building the query string - let whatInterests = ''; - if (interests) { - const keys = Object.keys(interests); - const lastKey = keys[keys.length - 1]; - const lastValue = interests[lastKey]; - - for (const interest in interests) { - // If the interest is missing, just skip it - whatInterests += interests[interest]?.replace(/\s+/g, '-') || ''; - if (interests[interest] !== lastValue) whatInterests += ' '; - } - } - whatInterests = encodeURIComponent(whatInterests); - - // build the cache key safely using the cleaned-up values - const cacheKey = `${safeJobType}-${safeCity}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - 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_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(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, - 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', - // Added latitude and longitude - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202638.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202638.ts deleted file mode 100644 index 67cf981c..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202638.ts +++ /dev/null @@ -1,68 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -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 - - 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); - - const cacheKey = `${jobData.jobType.toLowerCase()}-${jobData.city.toLowerCase()}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - 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_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(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, - 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', - // Added latitude and longitude - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202648.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202648.ts deleted file mode 100644 index 0f4a7940..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202648.ts +++ /dev/null @@ -1,74 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -export default async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { - // ✅ Fix: make sure city and jobType don't crash if they're missing - // If either one is undefined or empty, just fall back to a default - const safeCity = jobData.city?.toLowerCase?.() || 'newark'; - const safeJobType = jobData.jobType?.toLowerCase?.() || 'full-time'; - const safeDistanceKm = Number(jobData.distance || 10) * 1.609; // default to 10 miles if distance is missing - - const LOCATION = encodeURIComponent(safeCity); - const JOB_TYPE = encodeURIComponent(safeJobType); - - // ✅ Fix: make sure interests aren't undefined when building the query string - let whatInterests = ''; - if (interests) { - const keys = Object.keys(interests); - const lastKey = keys[keys.length - 1]; - const lastValue = interests[lastKey]; - - for (const interest in interests) { - // If the interest is missing, just skip it - whatInterests += interests[interest]?.replace(/\s+/g, '-') || ''; - if (interests[interest] !== lastValue) whatInterests += ' '; - } - } - whatInterests = encodeURIComponent(whatInterests); - - // ✅ Fix: build the cache key safely using the cleaned-up values - const cacheKey = `${safeJobType}-${safeCity}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - 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_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(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, - 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', - // Added latitude and longitude - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202653.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202653.ts deleted file mode 100644 index 67cf981c..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202653.ts +++ /dev/null @@ -1,68 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -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 - - 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); - - const cacheKey = `${jobData.jobType.toLowerCase()}-${jobData.city.toLowerCase()}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - 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_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(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, - 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', - // Added latitude and longitude - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202739.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202739.ts deleted file mode 100644 index a89acfef..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202739.ts +++ /dev/null @@ -1,78 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -export default async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { - // Make sure city and jobType exist; use defaults if not - const safeCity = jobData.city?.toLowerCase?.() || 'newark'; - const safeJobType = jobData.jobType?.toLowerCase?.() || 'full-time'; - const safeDistanceKm = Number(jobData.distance || 10) * 1.609; // Default to 10 miles if distance is missing - - const LOCATION = encodeURIComponent(safeCity); - const JOB_TYPE = encodeURIComponent(safeJobType); - - // Format interests into a string for the query - let whatInterests = ''; - if (interests) { - const keys = Object.keys(interests); - const lastKey = keys[keys.length - 1]; - const lastValue = interests[lastKey]; - - for (const interest in interests) { - // If interest is undefined, skip it - whatInterests += interests[interest]?.replace(/\s+/g, '-') || ''; - if (interests[interest] !== lastValue) { - whatInterests += ' '; - } - } - } - whatInterests = encodeURIComponent(whatInterests); - - // Use safe values in the cache key - const cacheKey = `${safeJobType}-${safeCity}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - return jobCache[cacheKey] as JobResult[]; - } - - // Build base API URL - 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(safeDistanceKm)}`; - - try { - // If a sorting method is given and not "default", add it to the URL - const url = jobData.filterBy && jobData.filterBy !== 'default' - ? `${URL_BASE}&sort_by=${jobData.filterBy}` - : URL_BASE; - - const response = await axios.get(url); - - // Map Adzuna response to our JobResult format - 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', - 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', - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202830.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202830.ts deleted file mode 100644 index 56432ee0..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502202830.ts +++ /dev/null @@ -1,79 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -//fixes the /job command -export default async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { - // Make sure city and jobType exist; use defaults if not - const safeCity = jobData.city?.toLowerCase?.() || 'newark'; - const safeJobType = jobData.jobType?.toLowerCase?.() || 'full-time'; - const safeDistanceKm = Number(jobData.distance || 10) * 1.609; // Default to 10 miles if distance is missing - - const LOCATION = encodeURIComponent(safeCity); - const JOB_TYPE = encodeURIComponent(safeJobType); - - // Format interests into a string for the query - let whatInterests = ''; - if (interests) { - const keys = Object.keys(interests); - const lastKey = keys[keys.length - 1]; - const lastValue = interests[lastKey]; - - for (const interest in interests) { - // If interest is undefined, skip it - whatInterests += interests[interest]?.replace(/\s+/g, '-') || ''; - if (interests[interest] !== lastValue) { - whatInterests += ' '; - } - } - } - whatInterests = encodeURIComponent(whatInterests); - - // Use safe values in the cache key - const cacheKey = `${safeJobType}-${safeCity}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - return jobCache[cacheKey] as JobResult[]; - } - - // Build base API URL - 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(safeDistanceKm)}`; - - try { - // If a sorting method is given and not "default", add it to the URL - const url = jobData.filterBy && jobData.filterBy !== 'default' - ? `${URL_BASE}&sort_by=${jobData.filterBy}` - : URL_BASE; - - const response = await axios.get(url); - - // Map Adzuna response to our JobResult format - 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', - 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', - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502205348.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502205348.ts deleted file mode 100644 index ebbacc84..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502205348.ts +++ /dev/null @@ -1,73 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -export default async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { - // Safely encode jobData fields, falling back to defaults if they're missing - const city = jobData.city ?? 'new york'; - const jobType = jobData.jobType ?? 'software'; - const distance = jobData.distance ?? '10'; - const filterBy = jobData.filterBy ?? 'default'; - - const LOCATION = encodeURIComponent(city); - const JOB_TYPE = encodeURIComponent(jobType); - const DISTANCE_KM = Number(distance) * 1.609; // Convert miles to kilometers - - let whatInterests = ''; - if (interests) { - // Turn user interests into dash-separated keywords - const keys = Object.keys(interests); - const lastKey = keys[keys.length - 1]; - const lastValue = interests[lastKey]; - - for (const interest of keys) { - const value = interests[interest]; - whatInterests += value.replace(/\s+/g, '-'); // Replace spaces with dashes - if (value !== lastValue) whatInterests += ' '; - } - } - whatInterests = encodeURIComponent(whatInterests); - - // Prevent crashes by defaulting undefined fields before toLowerCase() - const cacheKey = `${jobType.toLowerCase()}-${city.toLowerCase()}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - return jobCache[cacheKey] as JobResult[]; - } - - 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 { - // Append sorting only if it's not 'default' - const url = filterBy !== 'default' ? `${URL_BASE}&sort_by=${filterBy}` : URL_BASE; - - const response = await axios.get(url); - 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', - 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', - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502205439.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502205439.ts deleted file mode 100644 index 67cf981c..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502205439.ts +++ /dev/null @@ -1,68 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -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 - - 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); - - const cacheKey = `${jobData.jobType.toLowerCase()}-${jobData.city.toLowerCase()}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - 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_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(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, - 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', - // Added latitude and longitude - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} diff --git a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502205724.ts b/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502205724.ts deleted file mode 100644 index ac650984..00000000 --- a/.history/src/lib/utils/jobUtils/Adzuna_job_search_20250502205724.ts +++ /dev/null @@ -1,74 +0,0 @@ -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'; -import { AdzunaJobResponse } from '../../types/AdzunaJobResponse'; - -type JobCache = { - [key: string]: JobListing[] | JobResult[]; -}; - -const jobCache: JobCache = {}; - -export default async function fetchJobListings(jobData: JobData, interests?: Interest): Promise { - // Safely encode jobData fields, falling back to defaults if they're missing - const city = jobData.city ?? 'new york'; - const jobType = jobData.jobType ?? 'software'; - const distance = jobData.distance ?? '10'; - const filterBy = jobData.filterBy ?? 'default'; - - const LOCATION = encodeURIComponent(city); - const JOB_TYPE = encodeURIComponent(jobType); - const DISTANCE_KM = Number(distance) * 1.609; // Convert miles to kilometers - - let whatInterests = ''; - if (interests) { - // Turn user interests into dash-separated keywords - const keys = Object.keys(interests); - const lastKey = keys[keys.length - 1]; - const lastValue = interests[lastKey]; - - for (const interest of keys) { - const value = interests[interest]; - whatInterests += value.replace(/\s+/g, '-'); // Replace spaces with dashes - if (value !== lastValue) whatInterests += ' '; - } - } - whatInterests = encodeURIComponent(whatInterests); - - // Prevent crashes by defaulting undefined fields before toLowerCase() - const cacheKey = `${jobType.toLowerCase()}-${city.toLowerCase()}-${whatInterests}`; - if (jobCache[cacheKey]) { - console.log('Fetching data from cache...'); - return jobCache[cacheKey] as JobResult[]; - } - - 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 { - // Append sorting only if it's not 'default' - const url = filterBy !== 'default' ? `${URL_BASE}&sort_by=${filterBy}` : URL_BASE; - - const response = await axios.get(url); - 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', - 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', - longitude: job.longitude || 0, - latitude: job.latitude || 0 - })); - - return jobResults.sort(); - } catch (error) { - console.error('API error:', error); - throw error; - } -} - diff --git a/.history/src/pieces/tasks_20250430125913.ts b/.history/src/pieces/tasks_20250430125913.ts deleted file mode 100644 index c85abec9..00000000 --- a/.history/src/pieces/tasks_20250430125913.ts +++ /dev/null @@ -1,254 +0,0 @@ -import { BOT, CHANNELS, DB } from '@root/config'; -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 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 * * * * *', () => { - handleCron(bot).catch(async (error) => bot.emit('error', error)); - }); -} - -async function handleCron(bot: Client): Promise { - checkPolls(bot); - checkReminders(bot); -} - -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 mdTimestamp = ``; - 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) { - winners = [res]; - } else if (res.users.length === winners[0].users.length) { - winners.push(res); - } - }); - - let winMessage: string; - const winCount = winners[0].users.length; - 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.slice(-1)[0].option - }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; - } - - let choiceText = ''; - let count = 0; - resultMap.forEach((value, key) => { - 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'; - } - - 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'); - - 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') - ] - }); - - await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); - }); -} - -// 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 }); - 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' - }; - - 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 APIResponse:JobResult[] = await fetchJobListings(jobData, interests); - return [jobData, interests, APIResponse]; -} - -function formatCurrency(currency:number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).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[], 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)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMax)) : ''; - const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMin)) : ''; - - 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' : ''}`; - } - - 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); - 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], 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. - `; - return message; -} - -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(/###|-\#\s*/g, '') - .trim(); -} - -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. \ -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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; -} - -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) => { - if (reminder.mode === 'public') { - pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); - } else { - bot.users.fetch(reminder.owner).then(async (user) => { - const message = await jobMessage(reminder, user.id); - 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(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - 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); - }); - } - - const newReminder: Reminder = { - content: reminder.content, - expires: new Date(reminder.expires), - mode: reminder.mode, - repeat: reminder.repeat, - owner: reminder.owner - }; - - if (reminder.repeat === 'daily') { - newReminder.expires.setDate(reminder.expires.getDate() + 1); - 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); - } else { - bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - } - }); -} - -export default register; diff --git a/.history/src/pieces/tasks_20250502202034.ts b/.history/src/pieces/tasks_20250502202034.ts deleted file mode 100644 index 73a137a8..00000000 --- a/.history/src/pieces/tasks_20250502202034.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { BOT, CHANNELS, DB } from '@root/config'; -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 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 * * * * *', () => { - handleCron(bot).catch(async (error) => bot.emit('error', error)); - }); -} - -async function handleCron(bot: Client): Promise { - checkPolls(bot); - checkReminders(bot); -} - -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 mdTimestamp = ``; - 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) { - winners = [res]; - } else if (res.users.length === winners[0].users.length) { - winners.push(res); - } - }); - - let winMessage: string; - const winCount = winners[0].users.length; - 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.slice(-1)[0].option - }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; - } - - let choiceText = ''; - let count = 0; - resultMap.forEach((value, key) => { - 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'; - } - - 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'); - - 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') - ] - }); - - await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); - }); -} - -// 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 }); - const db = client.db(BOT.NAME).collection(DB.JOB_FORMS); - - const jobformAnswers: Job[] = await db.find({ owner: userID }).toArray(); - - if (!jobformAnswers || jobformAnswers.length < 2) { - console.warn(`User ${userID} is missing job form answers in the DB.`); - // You can either throw an error, return dummy defaults, or send a bot message - return [ - { - city: "newark", - preference: "software", - jobType: "full-time", - distance: "10", - filterBy: filterBy ?? "default" - }, - { - interest1: "javascript", - interest2: "node", - interest3: "react", - interest4: "web", - interest5: "api" - }, - [] // Or skip fetchJobListings entirely - ]; - } - - const jobData: JobData = { - city: jobformAnswers[0].answers?.[0] ?? "newark", - preference: jobformAnswers[0].answers?.[1] ?? "software", - jobType: jobformAnswers[0].answers?.[2] ?? "full-time", - distance: jobformAnswers[0].answers?.[3] ?? "10", - filterBy: filterBy ?? "default" - }; - - const interests: Interest = { - interest1: jobformAnswers[1].answers?.[0] ?? "javascript", - interest2: jobformAnswers[1].answers?.[1] ?? "node", - interest3: jobformAnswers[1].answers?.[2] ?? "react", - interest4: jobformAnswers[1].answers?.[3] ?? "web", - interest5: jobformAnswers[1].answers?.[4] ?? "api" - }; - - const APIResponse: JobResult[] = await fetchJobListings(jobData, interests); - return [jobData, interests, APIResponse]; -} - - -function formatCurrency(currency:number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).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[], 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)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMax)) : ''; - const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMin)) : ''; - - 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' : ''}`; - } - - 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); - 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], 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. - `; - return message; -} - -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(/###|-\#\s*/g, '') - .trim(); -} - -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. \ -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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; -} - -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) => { - if (reminder.mode === 'public') { - pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); - } else { - bot.users.fetch(reminder.owner).then(async (user) => { - const message = await jobMessage(reminder, user.id); - 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(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - 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); - }); - } - - const newReminder: Reminder = { - content: reminder.content, - expires: new Date(reminder.expires), - mode: reminder.mode, - repeat: reminder.repeat, - owner: reminder.owner - }; - - if (reminder.repeat === 'daily') { - newReminder.expires.setDate(reminder.expires.getDate() + 1); - 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); - } else { - bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - } - }); -} - -export default register; diff --git a/.history/src/pieces/tasks_20250502202042.ts b/.history/src/pieces/tasks_20250502202042.ts deleted file mode 100644 index ed073c63..00000000 --- a/.history/src/pieces/tasks_20250502202042.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { BOT, CHANNELS, DB } from '@root/config'; -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 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 * * * * *', () => { - handleCron(bot).catch(async (error) => bot.emit('error', error)); - }); -} - -async function handleCron(bot: Client): Promise { - checkPolls(bot); - checkReminders(bot); -} - -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 mdTimestamp = ``; - 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) { - winners = [res]; - } else if (res.users.length === winners[0].users.length) { - winners.push(res); - } - }); - - let winMessage: string; - const winCount = winners[0].users.length; - 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.slice(-1)[0].option - }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; - } - - let choiceText = ''; - let count = 0; - resultMap.forEach((value, key) => { - 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'; - } - - 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'); - - 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') - ] - }); - - await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); - }); -} - -//Fixes -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(); - - if (!jobformAnswers || jobformAnswers.length < 2) { - console.warn(`User ${userID} is missing job form answers in the DB.`); - // You can either throw an error, return dummy defaults, or send a bot message - return [ - { - city: "newark", - preference: "software", - jobType: "full-time", - distance: "10", - filterBy: filterBy ?? "default" - }, - { - interest1: "javascript", - interest2: "node", - interest3: "react", - interest4: "web", - interest5: "api" - }, - [] // Or skip fetchJobListings entirely - ]; - } - - const jobData: JobData = { - city: jobformAnswers[0].answers?.[0] ?? "newark", - preference: jobformAnswers[0].answers?.[1] ?? "software", - jobType: jobformAnswers[0].answers?.[2] ?? "full-time", - distance: jobformAnswers[0].answers?.[3] ?? "10", - filterBy: filterBy ?? "default" - }; - - const interests: Interest = { - interest1: jobformAnswers[1].answers?.[0] ?? "javascript", - interest2: jobformAnswers[1].answers?.[1] ?? "node", - interest3: jobformAnswers[1].answers?.[2] ?? "react", - interest4: jobformAnswers[1].answers?.[3] ?? "web", - interest5: jobformAnswers[1].answers?.[4] ?? "api" - }; - - const APIResponse: JobResult[] = await fetchJobListings(jobData, interests); - return [jobData, interests, APIResponse]; -} - - -function formatCurrency(currency:number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).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[], 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)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMax)) : ''; - const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMin)) : ''; - - 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' : ''}`; - } - - 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); - 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], 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. - `; - return message; -} - -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(/###|-\#\s*/g, '') - .trim(); -} - -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. \ -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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; -} - -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) => { - if (reminder.mode === 'public') { - pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); - } else { - bot.users.fetch(reminder.owner).then(async (user) => { - const message = await jobMessage(reminder, user.id); - 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(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - 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); - }); - } - - const newReminder: Reminder = { - content: reminder.content, - expires: new Date(reminder.expires), - mode: reminder.mode, - repeat: reminder.repeat, - owner: reminder.owner - }; - - if (reminder.repeat === 'daily') { - newReminder.expires.setDate(reminder.expires.getDate() + 1); - 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); - } else { - bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - } - }); -} - -export default register; diff --git a/.history/src/pieces/tasks_20250502202046.ts b/.history/src/pieces/tasks_20250502202046.ts deleted file mode 100644 index 83d647ea..00000000 --- a/.history/src/pieces/tasks_20250502202046.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { BOT, CHANNELS, DB } from '@root/config'; -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 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 * * * * *', () => { - handleCron(bot).catch(async (error) => bot.emit('error', error)); - }); -} - -async function handleCron(bot: Client): Promise { - checkPolls(bot); - checkReminders(bot); -} - -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 mdTimestamp = ``; - 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) { - winners = [res]; - } else if (res.users.length === winners[0].users.length) { - winners.push(res); - } - }); - - let winMessage: string; - const winCount = winners[0].users.length; - 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.slice(-1)[0].option - }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; - } - - let choiceText = ''; - let count = 0; - resultMap.forEach((value, key) => { - 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'; - } - - 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'); - - 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') - ] - }); - - await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); - }); -} - -// -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(); - - if (!jobformAnswers || jobformAnswers.length < 2) { - console.warn(`User ${userID} is missing job form answers in the DB.`); - // You can either throw an error, return dummy defaults, or send a bot message - return [ - { - city: "newark", - preference: "software", - jobType: "full-time", - distance: "10", - filterBy: filterBy ?? "default" - }, - { - interest1: "javascript", - interest2: "node", - interest3: "react", - interest4: "web", - interest5: "api" - }, - [] // Or skip fetchJobListings entirely - ]; - } - - const jobData: JobData = { - city: jobformAnswers[0].answers?.[0] ?? "newark", - preference: jobformAnswers[0].answers?.[1] ?? "software", - jobType: jobformAnswers[0].answers?.[2] ?? "full-time", - distance: jobformAnswers[0].answers?.[3] ?? "10", - filterBy: filterBy ?? "default" - }; - - const interests: Interest = { - interest1: jobformAnswers[1].answers?.[0] ?? "javascript", - interest2: jobformAnswers[1].answers?.[1] ?? "node", - interest3: jobformAnswers[1].answers?.[2] ?? "react", - interest4: jobformAnswers[1].answers?.[3] ?? "web", - interest5: jobformAnswers[1].answers?.[4] ?? "api" - }; - - const APIResponse: JobResult[] = await fetchJobListings(jobData, interests); - return [jobData, interests, APIResponse]; -} - - -function formatCurrency(currency:number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).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[], 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)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMax)) : ''; - const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMin)) : ''; - - 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' : ''}`; - } - - 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); - 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], 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. - `; - return message; -} - -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(/###|-\#\s*/g, '') - .trim(); -} - -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. \ -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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; -} - -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) => { - if (reminder.mode === 'public') { - pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); - } else { - bot.users.fetch(reminder.owner).then(async (user) => { - const message = await jobMessage(reminder, user.id); - 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(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - 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); - }); - } - - const newReminder: Reminder = { - content: reminder.content, - expires: new Date(reminder.expires), - mode: reminder.mode, - repeat: reminder.repeat, - owner: reminder.owner - }; - - if (reminder.repeat === 'daily') { - newReminder.expires.setDate(reminder.expires.getDate() + 1); - 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); - } else { - bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - } - }); -} - -export default register; diff --git a/.history/src/pieces/tasks_20250502202137.ts b/.history/src/pieces/tasks_20250502202137.ts deleted file mode 100644 index c85abec9..00000000 --- a/.history/src/pieces/tasks_20250502202137.ts +++ /dev/null @@ -1,254 +0,0 @@ -import { BOT, CHANNELS, DB } from '@root/config'; -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 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 * * * * *', () => { - handleCron(bot).catch(async (error) => bot.emit('error', error)); - }); -} - -async function handleCron(bot: Client): Promise { - checkPolls(bot); - checkReminders(bot); -} - -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 mdTimestamp = ``; - 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) { - winners = [res]; - } else if (res.users.length === winners[0].users.length) { - winners.push(res); - } - }); - - let winMessage: string; - const winCount = winners[0].users.length; - 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.slice(-1)[0].option - }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; - } - - let choiceText = ''; - let count = 0; - resultMap.forEach((value, key) => { - 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'; - } - - 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'); - - 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') - ] - }); - - await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); - }); -} - -// 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 }); - 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' - }; - - 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 APIResponse:JobResult[] = await fetchJobListings(jobData, interests); - return [jobData, interests, APIResponse]; -} - -function formatCurrency(currency:number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).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[], 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)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMax)) : ''; - const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMin)) : ''; - - 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' : ''}`; - } - - 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); - 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], 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. - `; - return message; -} - -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(/###|-\#\s*/g, '') - .trim(); -} - -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. \ -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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; -} - -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) => { - if (reminder.mode === 'public') { - pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); - } else { - bot.users.fetch(reminder.owner).then(async (user) => { - const message = await jobMessage(reminder, user.id); - 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(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - 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); - }); - } - - const newReminder: Reminder = { - content: reminder.content, - expires: new Date(reminder.expires), - mode: reminder.mode, - repeat: reminder.repeat, - owner: reminder.owner - }; - - if (reminder.repeat === 'daily') { - newReminder.expires.setDate(reminder.expires.getDate() + 1); - 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); - } else { - bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - } - }); -} - -export default register; diff --git a/.history/src/pieces/tasks_20250502202201.ts b/.history/src/pieces/tasks_20250502202201.ts deleted file mode 100644 index 73a137a8..00000000 --- a/.history/src/pieces/tasks_20250502202201.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { BOT, CHANNELS, DB } from '@root/config'; -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 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 * * * * *', () => { - handleCron(bot).catch(async (error) => bot.emit('error', error)); - }); -} - -async function handleCron(bot: Client): Promise { - checkPolls(bot); - checkReminders(bot); -} - -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 mdTimestamp = ``; - 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) { - winners = [res]; - } else if (res.users.length === winners[0].users.length) { - winners.push(res); - } - }); - - let winMessage: string; - const winCount = winners[0].users.length; - 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.slice(-1)[0].option - }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; - } - - let choiceText = ''; - let count = 0; - resultMap.forEach((value, key) => { - 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'; - } - - 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'); - - 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') - ] - }); - - await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); - }); -} - -// 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 }); - const db = client.db(BOT.NAME).collection(DB.JOB_FORMS); - - const jobformAnswers: Job[] = await db.find({ owner: userID }).toArray(); - - if (!jobformAnswers || jobformAnswers.length < 2) { - console.warn(`User ${userID} is missing job form answers in the DB.`); - // You can either throw an error, return dummy defaults, or send a bot message - return [ - { - city: "newark", - preference: "software", - jobType: "full-time", - distance: "10", - filterBy: filterBy ?? "default" - }, - { - interest1: "javascript", - interest2: "node", - interest3: "react", - interest4: "web", - interest5: "api" - }, - [] // Or skip fetchJobListings entirely - ]; - } - - const jobData: JobData = { - city: jobformAnswers[0].answers?.[0] ?? "newark", - preference: jobformAnswers[0].answers?.[1] ?? "software", - jobType: jobformAnswers[0].answers?.[2] ?? "full-time", - distance: jobformAnswers[0].answers?.[3] ?? "10", - filterBy: filterBy ?? "default" - }; - - const interests: Interest = { - interest1: jobformAnswers[1].answers?.[0] ?? "javascript", - interest2: jobformAnswers[1].answers?.[1] ?? "node", - interest3: jobformAnswers[1].answers?.[2] ?? "react", - interest4: jobformAnswers[1].answers?.[3] ?? "web", - interest5: jobformAnswers[1].answers?.[4] ?? "api" - }; - - const APIResponse: JobResult[] = await fetchJobListings(jobData, interests); - return [jobData, interests, APIResponse]; -} - - -function formatCurrency(currency:number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).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[], 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)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMax)) : ''; - const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMin)) : ''; - - 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' : ''}`; - } - - 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); - 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], 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. - `; - return message; -} - -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(/###|-\#\s*/g, '') - .trim(); -} - -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. \ -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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; -} - -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) => { - if (reminder.mode === 'public') { - pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); - } else { - bot.users.fetch(reminder.owner).then(async (user) => { - const message = await jobMessage(reminder, user.id); - 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(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - 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); - }); - } - - const newReminder: Reminder = { - content: reminder.content, - expires: new Date(reminder.expires), - mode: reminder.mode, - repeat: reminder.repeat, - owner: reminder.owner - }; - - if (reminder.repeat === 'daily') { - newReminder.expires.setDate(reminder.expires.getDate() + 1); - 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); - } else { - bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - } - }); -} - -export default register; diff --git a/.history/src/pieces/tasks_20250502202259.ts b/.history/src/pieces/tasks_20250502202259.ts deleted file mode 100644 index c9656882..00000000 --- a/.history/src/pieces/tasks_20250502202259.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { BOT, CHANNELS, DB } from '@root/config'; -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 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 * * * * *', () => { - handleCron(bot).catch(async (error) => bot.emit('error', error)); - }); -} - -async function handleCron(bot: Client): Promise { - checkPolls(bot); - checkReminders(bot); -} - -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 mdTimestamp = ``; - 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) { - winners = [res]; - } else if (res.users.length === winners[0].users.length) { - winners.push(res); - } - }); - - let winMessage: string; - const winCount = winners[0].users.length; - 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.slice(-1)[0].option - }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; - } - - let choiceText = ''; - let count = 0; - resultMap.forEach((value, key) => { - 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'; - } - - 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'); - - 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') - ] - }); - - await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); - }); -} - -// Trying to fix -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(); - - if (!jobformAnswers || jobformAnswers.length < 2) { - console.warn(`User ${userID} is missing job form answers in the DB.`); - // You can either throw an error, return dummy defaults, or send a bot message - return [ - { - city: "newark", - preference: "software", - jobType: "full-time", - distance: "10", - filterBy: filterBy ?? "default" - }, - { - interest1: "javascript", - interest2: "node", - interest3: "react", - interest4: "web", - interest5: "api" - }, - [] // Or skip fetchJobListings entirely - ]; - } - - const jobData: JobData = { - city: jobformAnswers[0].answers?.[0] ?? "newark", - preference: jobformAnswers[0].answers?.[1] ?? "software", - jobType: jobformAnswers[0].answers?.[2] ?? "full-time", - distance: jobformAnswers[0].answers?.[3] ?? "10", - filterBy: filterBy ?? "default" - }; - - const interests: Interest = { - interest1: jobformAnswers[1].answers?.[0] ?? "javascript", - interest2: jobformAnswers[1].answers?.[1] ?? "node", - interest3: jobformAnswers[1].answers?.[2] ?? "react", - interest4: jobformAnswers[1].answers?.[3] ?? "web", - interest5: jobformAnswers[1].answers?.[4] ?? "api" - }; - - const APIResponse: JobResult[] = await fetchJobListings(jobData, interests); - return [jobData, interests, APIResponse]; -} - - -function formatCurrency(currency:number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).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[], 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)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMax)) : ''; - const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMin)) : ''; - - 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' : ''}`; - } - - 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); - 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], 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. - `; - return message; -} - -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(/###|-\#\s*/g, '') - .trim(); -} - -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. \ -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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; -} - -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) => { - if (reminder.mode === 'public') { - pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); - } else { - bot.users.fetch(reminder.owner).then(async (user) => { - const message = await jobMessage(reminder, user.id); - 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(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - 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); - }); - } - - const newReminder: Reminder = { - content: reminder.content, - expires: new Date(reminder.expires), - mode: reminder.mode, - repeat: reminder.repeat, - owner: reminder.owner - }; - - if (reminder.repeat === 'daily') { - newReminder.expires.setDate(reminder.expires.getDate() + 1); - 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); - } else { - bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - } - }); -} - -export default register; diff --git a/.history/src/pieces/tasks_20250502202302.ts b/.history/src/pieces/tasks_20250502202302.ts deleted file mode 100644 index 918e1833..00000000 --- a/.history/src/pieces/tasks_20250502202302.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { BOT, CHANNELS, DB } from '@root/config'; -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 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 * * * * *', () => { - handleCron(bot).catch(async (error) => bot.emit('error', error)); - }); -} - -async function handleCron(bot: Client): Promise { - checkPolls(bot); - checkReminders(bot); -} - -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 mdTimestamp = ``; - 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) { - winners = [res]; - } else if (res.users.length === winners[0].users.length) { - winners.push(res); - } - }); - - let winMessage: string; - const winCount = winners[0].users.length; - 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.slice(-1)[0].option - }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; - } - - let choiceText = ''; - let count = 0; - resultMap.forEach((value, key) => { - 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'; - } - - 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'); - - 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') - ] - }); - - await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); - }); -} - -// Trying to fix mongodb -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(); - - if (!jobformAnswers || jobformAnswers.length < 2) { - console.warn(`User ${userID} is missing job form answers in the DB.`); - // You can either throw an error, return dummy defaults, or send a bot message - return [ - { - city: "newark", - preference: "software", - jobType: "full-time", - distance: "10", - filterBy: filterBy ?? "default" - }, - { - interest1: "javascript", - interest2: "node", - interest3: "react", - interest4: "web", - interest5: "api" - }, - [] // Or skip fetchJobListings entirely - ]; - } - - const jobData: JobData = { - city: jobformAnswers[0].answers?.[0] ?? "newark", - preference: jobformAnswers[0].answers?.[1] ?? "software", - jobType: jobformAnswers[0].answers?.[2] ?? "full-time", - distance: jobformAnswers[0].answers?.[3] ?? "10", - filterBy: filterBy ?? "default" - }; - - const interests: Interest = { - interest1: jobformAnswers[1].answers?.[0] ?? "javascript", - interest2: jobformAnswers[1].answers?.[1] ?? "node", - interest3: jobformAnswers[1].answers?.[2] ?? "react", - interest4: jobformAnswers[1].answers?.[3] ?? "web", - interest5: jobformAnswers[1].answers?.[4] ?? "api" - }; - - const APIResponse: JobResult[] = await fetchJobListings(jobData, interests); - return [jobData, interests, APIResponse]; -} - - -function formatCurrency(currency:number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).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[], 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)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMax)) : ''; - const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMin)) : ''; - - 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' : ''}`; - } - - 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); - 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], 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. - `; - return message; -} - -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(/###|-\#\s*/g, '') - .trim(); -} - -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. \ -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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; -} - -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) => { - if (reminder.mode === 'public') { - pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); - } else { - bot.users.fetch(reminder.owner).then(async (user) => { - const message = await jobMessage(reminder, user.id); - 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(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - 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); - }); - } - - const newReminder: Reminder = { - content: reminder.content, - expires: new Date(reminder.expires), - mode: reminder.mode, - repeat: reminder.repeat, - owner: reminder.owner - }; - - if (reminder.repeat === 'daily') { - newReminder.expires.setDate(reminder.expires.getDate() + 1); - 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); - } else { - bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - } - }); -} - -export default register; diff --git a/.history/src/pieces/tasks_20250502202306.ts b/.history/src/pieces/tasks_20250502202306.ts deleted file mode 100644 index b65a60ab..00000000 --- a/.history/src/pieces/tasks_20250502202306.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { BOT, CHANNELS, DB } from '@root/config'; -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 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 * * * * *', () => { - handleCron(bot).catch(async (error) => bot.emit('error', error)); - }); -} - -async function handleCron(bot: Client): Promise { - checkPolls(bot); - checkReminders(bot); -} - -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 mdTimestamp = ``; - 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) { - winners = [res]; - } else if (res.users.length === winners[0].users.length) { - winners.push(res); - } - }); - - let winMessage: string; - const winCount = winners[0].users.length; - 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.slice(-1)[0].option - }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; - } - - let choiceText = ''; - let count = 0; - resultMap.forEach((value, key) => { - 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'; - } - - 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'); - - 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') - ] - }); - - await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); - }); -} - -// Trying to fix mongodb error when running -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(); - - if (!jobformAnswers || jobformAnswers.length < 2) { - console.warn(`User ${userID} is missing job form answers in the DB.`); - // You can either throw an error, return dummy defaults, or send a bot message - return [ - { - city: "newark", - preference: "software", - jobType: "full-time", - distance: "10", - filterBy: filterBy ?? "default" - }, - { - interest1: "javascript", - interest2: "node", - interest3: "react", - interest4: "web", - interest5: "api" - }, - [] // Or skip fetchJobListings entirely - ]; - } - - const jobData: JobData = { - city: jobformAnswers[0].answers?.[0] ?? "newark", - preference: jobformAnswers[0].answers?.[1] ?? "software", - jobType: jobformAnswers[0].answers?.[2] ?? "full-time", - distance: jobformAnswers[0].answers?.[3] ?? "10", - filterBy: filterBy ?? "default" - }; - - const interests: Interest = { - interest1: jobformAnswers[1].answers?.[0] ?? "javascript", - interest2: jobformAnswers[1].answers?.[1] ?? "node", - interest3: jobformAnswers[1].answers?.[2] ?? "react", - interest4: jobformAnswers[1].answers?.[3] ?? "web", - interest5: jobformAnswers[1].answers?.[4] ?? "api" - }; - - const APIResponse: JobResult[] = await fetchJobListings(jobData, interests); - return [jobData, interests, APIResponse]; -} - - -function formatCurrency(currency:number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).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[], 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)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMax)) : ''; - const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMin)) : ''; - - 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' : ''}`; - } - - 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); - 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], 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. - `; - return message; -} - -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(/###|-\#\s*/g, '') - .trim(); -} - -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. \ -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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; -} - -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) => { - if (reminder.mode === 'public') { - pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); - } else { - bot.users.fetch(reminder.owner).then(async (user) => { - const message = await jobMessage(reminder, user.id); - 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(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - 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); - }); - } - - const newReminder: Reminder = { - content: reminder.content, - expires: new Date(reminder.expires), - mode: reminder.mode, - repeat: reminder.repeat, - owner: reminder.owner - }; - - if (reminder.repeat === 'daily') { - newReminder.expires.setDate(reminder.expires.getDate() + 1); - 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); - } else { - bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - } - }); -} - -export default register; diff --git a/.history/src/pieces/tasks_20250502202310.ts b/.history/src/pieces/tasks_20250502202310.ts deleted file mode 100644 index f9654db6..00000000 --- a/.history/src/pieces/tasks_20250502202310.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { BOT, CHANNELS, DB } from '@root/config'; -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 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 * * * * *', () => { - handleCron(bot).catch(async (error) => bot.emit('error', error)); - }); -} - -async function handleCron(bot: Client): Promise { - checkPolls(bot); - checkReminders(bot); -} - -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 mdTimestamp = ``; - 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) { - winners = [res]; - } else if (res.users.length === winners[0].users.length) { - winners.push(res); - } - }); - - let winMessage: string; - const winCount = winners[0].users.length; - 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.slice(-1)[0].option - }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; - } - - let choiceText = ''; - let count = 0; - resultMap.forEach((value, key) => { - 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'; - } - - 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'); - - 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') - ] - }); - - await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); - }); -} - -// Trying to fix mongodb error when running jobs command -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(); - - if (!jobformAnswers || jobformAnswers.length < 2) { - console.warn(`User ${userID} is missing job form answers in the DB.`); - // You can either throw an error, return dummy defaults, or send a bot message - return [ - { - city: "newark", - preference: "software", - jobType: "full-time", - distance: "10", - filterBy: filterBy ?? "default" - }, - { - interest1: "javascript", - interest2: "node", - interest3: "react", - interest4: "web", - interest5: "api" - }, - [] // Or skip fetchJobListings entirely - ]; - } - - const jobData: JobData = { - city: jobformAnswers[0].answers?.[0] ?? "newark", - preference: jobformAnswers[0].answers?.[1] ?? "software", - jobType: jobformAnswers[0].answers?.[2] ?? "full-time", - distance: jobformAnswers[0].answers?.[3] ?? "10", - filterBy: filterBy ?? "default" - }; - - const interests: Interest = { - interest1: jobformAnswers[1].answers?.[0] ?? "javascript", - interest2: jobformAnswers[1].answers?.[1] ?? "node", - interest3: jobformAnswers[1].answers?.[2] ?? "react", - interest4: jobformAnswers[1].answers?.[3] ?? "web", - interest5: jobformAnswers[1].answers?.[4] ?? "api" - }; - - const APIResponse: JobResult[] = await fetchJobListings(jobData, interests); - return [jobData, interests, APIResponse]; -} - - -function formatCurrency(currency:number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).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[], 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)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMax)) : ''; - const formattedSalaryMin = formatCurrency(Number(jobData[i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobData[i].salaryMin)) : ''; - - 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' : ''}`; - } - - 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); - 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], 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. - `; - return message; -} - -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(/###|-\#\s*/g, '') - .trim(); -} - -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. \ -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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; -} - -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) => { - if (reminder.mode === 'public') { - pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); - } else { - bot.users.fetch(reminder.owner).then(async (user) => { - const message = await jobMessage(reminder, user.id); - 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(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - 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); - }); - } - - const newReminder: Reminder = { - content: reminder.content, - expires: new Date(reminder.expires), - mode: reminder.mode, - repeat: reminder.repeat, - owner: reminder.owner - }; - - if (reminder.repeat === 'daily') { - newReminder.expires.setDate(reminder.expires.getDate() + 1); - 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); - } else { - bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - } - }); -} - -export default register; diff --git a/.history/src/pieces/tasks_20250502204843.ts b/.history/src/pieces/tasks_20250502204843.ts deleted file mode 100644 index de4884c6..00000000 --- a/.history/src/pieces/tasks_20250502204843.ts +++ /dev/null @@ -1,698 +0,0 @@ -import { APP_ID, APP_KEY, BOT, CHANNELS, DB, MAP_KEY } from '@root/config'; -import { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonStyle, 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 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'; -import { JobPreferences } from '../lib/types/JobPreferences'; -import axios from 'axios'; -import { PDFDocument, PDFFont, rgb, StandardFonts } from 'pdf-lib'; -import { generateHistogram } from '../commands/jobs/histogram'; - -async function register(bot: Client): Promise { - schedule('0/30 * * * * *', () => { - handleCron(bot).catch(async (error) => bot.emit('error', error)); - }); -} - -async function handleCron(bot: Client): Promise { - checkPolls(bot); - checkReminders(bot); -} - -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 mdTimestamp = ``; - 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) { - winners = [res]; - } else if (res.users.length === winners[0].users.length) { - winners.push(res); - } - }); - - let winMessage: string; - const winCount = winners[0].users.length; - 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.slice(-1)[0].option - }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; - } - - let choiceText = ''; - let count = 0; - resultMap.forEach((value, key) => { - 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'; - } - - 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'); - - 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') - ] - }); - - await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); - }); -} - -// eslint-disable-next-line no-warning-comments -// Retrieves job form data from the DB for a given user and builds the necessary payload for job search -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.USERS); - - // Attempt to find the user's job preferences by their Discord ID - const jobformAnswers: JobPreferences | null = (await db.findOne({ discordId: userID }))?.jobPreferences; - - // If no job preferences exist, bail early with a meaningful error - if (!jobformAnswers || !jobformAnswers.answers) { - throw new Error(`No job preferences found for user ${userID}`); - } - - const answers = jobformAnswers.answers; - - // Build the main job search query payload from the user's saved answers - const jobData: JobData = { - city: answers.city, - preference: answers.workType, - jobType: answers.employmentType, - distance: answers.travelDistance, - filterBy: 'default' - }; - - // Build the interests section for filtering jobs further - const interests: Interest = { - interest1: answers.interest1, - interest2: answers.interest2, - interest3: answers.interest3, - interest4: answers.interest4, - interest5: answers.interest5 - }; - - // Fetch jobs using Adzuna with the above criteria - const APIResponse: JobResult[] = await fetchJobListings(jobData, interests); - return [jobData, interests, APIResponse]; -} - - -function formatCurrency(currency:number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).format(Number(currency))}`; -} - -function calculateDistance(lat1: number, lon1: number, lat2: number, lon2: number): number { - const toRadians = (degrees: number) => degrees * (Math.PI / 180); - - // eslint-disable-next-line id-length - const R = 3958.8; // Radius of the Earth in miles - const dLat = toRadians(lat2 - lat1); - const dLon = toRadians(lon2 - lon1); - const a = (Math.sin(dLat / 2) * Math.sin(dLat / 2)) + - (Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) - * Math.sin(dLon / 2) * Math.sin(dLon / 2)); - const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - const distance = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 : R * c; - return distance; -} - -async function queryCoordinates(location: string): Promise<{lat: number, lng: number}> { - const preferredCity = encodeURIComponent(location); - - const baseURL = `https://maps.google.com/maps/api/geocode/json?address=${preferredCity}&components=country:US&key=${MAP_KEY}`; - const response = await axios.get(baseURL); - const coordinates : {lat: number, lng: number } = { - lat: response.data.results[0].geometry.location.lat, - lng: response.data.results[0].geometry.location.lng - }; - - return coordinates; -} - -export function titleCase(jobTitle:string): string { - return jobTitle.toLowerCase().replace(/[()]/g, '').split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' '); -} - -async function listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: string): Promise { - // Conditionally sort jobs by salary if sortBy is 'salary' - const cityCoordinates = await queryCoordinates(jobForm[0].city); - - if (filterBy === 'salary') { - jobForm[2].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') { - jobForm[2].sort((a, b) => a.title > b.title ? 1 : -1); - } else if (filterBy === 'date') { - jobForm[2].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); - } else if (filterBy === 'distance') { - // cityCoordinates = await this.queryCoordinates(jobForm[0].city); - - jobForm[2].sort((a, b) => { - const distanceA = a.distance; - const distanceB = b.distance; - - if (distanceA === -1) { - return 1; // Treat jobs with no location as lowest - } - - return distanceA - distanceB; // Might have to account for negative distances - }); - } - - - let jobList = ''; - for (let i = 0; i < jobForm[2].length; i++) { - const avgSalary = (Number(jobForm[2][i].salaryMax) + Number(jobForm[2][i].salaryMin)) / 2; - const formattedAvgSalary = formatCurrency(avgSalary); - const formattedSalaryMax = formatCurrency(Number(jobForm[2][i].salaryMax)) !== 'N/A' ? formatCurrency(Number(jobForm[2][i].salaryMax)) : ''; - const formattedSalaryMin = formatCurrency(Number(jobForm[2][i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobForm[2][i].salaryMin)) : ''; - const jobDistance = calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(jobForm[2][i].latitude), Number(jobForm[2][i].longitude)); - const formattedDistance = jobDistance !== -1 ? `${jobDistance.toFixed(2)} miles` : 'N/A'; - - const salaryDetails = formattedSalaryMin && formattedSalaryMax - ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` - : formattedAvgSalary; - - jobList += `${i + 1}. **${jobForm[2][i].title}** - \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} - \t\t* **Location:** ${jobForm[2][i].location} - \t\t* **Date Posted:** ${new Date(jobForm[2][i].created).toDateString()} at ${new Date(jobForm[2][i].created).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })} - \t\t* **Apply here:** [read more about the job and apply here](${jobForm[2][i].link}) - \t\t* **Distance:** ${formattedDistance} - ${i !== jobForm[2].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.'; -} - -export async function jobMessage(reminder: Reminder | string, userID: string): Promise<{ message: string, pdfBuffer: Buffer, - embed: EmbedBuilder, row: ActionRowBuilder, jobResults: JobResult[] }> { - const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, typeof reminder === 'object' && 'filterBy' in reminder ? reminder.filterBy : 'default'); - let filterBy: string; - if (typeof reminder === 'object' && 'filterBy' in reminder && reminder.filterBy) { - filterBy = String(reminder.filterBy); - } else if (typeof reminder === 'object') { - filterBy = 'default'; - } else { - filterBy = typeof reminder === 'string' && reminder ? reminder : 'default'; - } - - const cityCoordinates = await queryCoordinates(jobFormData[0].city); - for (let i = 0; i < jobFormData[2].length; i++) { - const job = jobFormData[2][i]; - const distance = Math.round(calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(job.latitude), Number(job.longitude)) + Number.EPSILON) * 100 / 100; // Round to 2 decimal places - jobFormData[2][i].distance = distance; - } - - const jobResults : JobResult[] = await sortJobResults(jobFormData, filterBy); - const { embed, row } = createJobEmbed(jobResults[0], 0, jobResults.length); - - const pdfBuffer = await generateJobPDF(jobFormData); - - const 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: - - ${await listJobs(jobFormData, 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.`; - - return { message, pdfBuffer, embed, row, jobResults }; -} - -export 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(/###|-\#\s*/g, '') - .trim(); -} - -export 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. \ -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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; -} - -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) => { - if (reminder.mode === 'public') { - pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); - } else { - bot.users.fetch(reminder.owner).then(async (user) => { - const result = await jobMessage(reminder, user.id); - // const { message } = result; - const message = 'placeholder'; // Placeholder for the message variable - const { pdfBuffer } = result; - 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(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - 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); - }); - } - - const newReminder: Reminder = { - content: reminder.content, - expires: new Date(reminder.expires), - mode: reminder.mode, - repeat: reminder.repeat, - owner: reminder.owner - }; - - if (reminder.repeat === 'daily') { - newReminder.expires.setDate(reminder.expires.getDate() + 1); - 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); - } else { - bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - } - }); -} - -export async function generateJobPDF(jobForm: [JobData, Interest, JobResult[]]): Promise { - // Create a new PDF document. - - // Seperate sorting in listjobs into its own function, call function here so sorting maintained - - const jobs = jobForm[2]; - - const pdfDoc = await PDFDocument.create(); - let currentPage = pdfDoc.addPage(); - const { width, height } = currentPage.getSize(); - const margin = 40; - let yPosition = height - margin - 50; - const fontSize = 10; - const titleFontSize = 30; - const bulletPointIndent = 20; - const subBulletPointIndent = 30; // Indentation for sub-bullet points - - - // Embed a standard font. - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman); - const HelveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica); - - - // Draw the title. - const lineHeight = 10; // Height of the line - const lineWidth = (width - (margin * 2)) / 3; - - currentPage.drawRectangle({ - x: margin, - y: yPosition + 50, - width: lineWidth, - height: lineHeight, - color: rgb(135 / 255, 59 / 255, 29 / 255) // red color - }); - - // Draw the second color segment - currentPage.drawRectangle({ - x: margin + lineWidth, - y: yPosition + 50, - width: lineWidth, - height: lineHeight, - color: rgb(237 / 255, 118 / 255, 71 / 255) // orangey color - }); - - // Draw the third color segment - currentPage.drawRectangle({ - x: margin + (lineWidth * 2), - y: yPosition + 50, - width: lineWidth, - height: lineHeight, - color: rgb(13 / 255, 158 / 255, 198 / 255) // Blue color - }); - - yPosition -= 40; // Adjust spacing below the line - - - currentPage.drawText('List of Jobs PDF', { - x: margin, - y: yPosition + 50, - size: titleFontSize, - font: HelveticaBold, - - color: rgb(114 / 255, 53 / 255, 9 / 255) - }); - yPosition -= 40; - - currentPage.drawRectangle({ - x: margin, - y: yPosition + 50, - width: lineWidth / 2, - height: lineHeight - 8, - color: rgb(135 / 255, 59 / 255, 29 / 255) // red color - }); - yPosition -= 10; - - // Loop through each job and add its details. - for (let i = 0; i < jobs.length; i++) { - const job = jobs[i]; - - if ((yPosition - (fontSize * 2)) < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin - 20; - } - - const maxWidth = width - (margin * 2); // Calculate available width - const wrappedTitle = wrapText(`${i + 1}. ${job.title}`, HelveticaBold, fontSize + 10, maxWidth); - - - for (const line of wrappedTitle) { - // Check if there's enough space for the line - if (yPosition - (fontSize * 2) < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin - 20; - } - - currentPage.drawText(line, { - x: margin, - y: yPosition + 30, - size: fontSize + 10, - font: HelveticaBold, - color: rgb(241 / 255, 113 / 255, 34 / 255) - }); - - yPosition -= 30; // Adjust spacing between lines - } - - // Draw the bullet points for location, salary, and apply link. - const bulletPoints = [ - { label: 'Location', value: `${job.location}, ${job.distance >= 0 ? `${job.distance} miles from ${titleCase(jobForm[0].city)}` : ''} ` }, - { label: 'Salary', value: formatSalaryforPDF(job) }, - { label: 'Apply Here', value: job.link } - ]; - - const jobTitle = encodeURIComponent(job.title); - const URL_BASE = `https://api.adzuna.com/v1/api/jobs/us/histogram?app_id=${APP_ID}&app_key=${APP_KEY}&what=${jobTitle}`; - - const response = await axios.get(URL_BASE); - const data = Object.entries(response.data.histogram).map(([value, frequency]: [string, number]) => ({ - value, - frequency - })); - let noValues = true; - - for (const item of data) { - if (item.frequency > 0) { - noValues = false; - break; - } - } - - - const image = await generateHistogram(data, job.title); - const imageBytes = await pdfDoc.embedPng(image); - const imageDims = imageBytes.scale(0.2); - - - for (const point of bulletPoints) { - // Check if there's enough space on the page, and add a new page if needed. - if (yPosition - (fontSize * 2) < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin - 20; - } - - const maxLabelWidth = width - (margin * 2) - bulletPointIndent - subBulletPointIndent; - const wrappedLabel = wrapText(`• ${point.label}`, HelveticaBold, fontSize + 5, maxLabelWidth); - - // Draw the wrapped label - for (const line of wrappedLabel) { - // Check if there's enough space for the line - if (yPosition - (fontSize * 2) < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin - 20; - } - - currentPage.drawText(line, { - x: margin + bulletPointIndent, - y: yPosition + 25, - size: fontSize + 5, - font: HelveticaBold, - color: rgb(94 / 255, 74 / 255, 74 / 255) - }); - - if (point.label === 'Salary' && !noValues) { - currentPage.drawImage(imageBytes, { // Change space check so it doesn't go off the page - x: (currentPage.getWidth() / 2) - (imageDims.width / 2), - y: yPosition - imageDims.height - 10, - width: imageDims.width, - height: imageDims.height - }); - - yPosition -= imageDims.height + 30; // Adjust spacing for the image - } - - - yPosition -= fontSize + 10; // Adjust spacing between lines - } - - - const combinedText = `•${point.value}`; - const maxValueWidth = width - (margin * 2) - bulletPointIndent - subBulletPointIndent; - const wrappedValue = wrapText(combinedText, HelveticaBold, fontSize + 4, maxValueWidth); - - - for (const line of wrappedValue) { - // Check if there's enough space for the line - if (yPosition - (fontSize * 2) < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin - 20; - } - - currentPage.drawText(line, { - x: margin + bulletPointIndent + subBulletPointIndent, - y: yPosition + 20, - size: fontSize + 3, - font: HelveticaBold, - color: rgb(13 / 255, 158 / 255, 198 / 255) - }); - - yPosition -= fontSize + 5; // Adjust spacing between lines - } - - yPosition -= 20; // Add extra spacing between items - } - - yPosition -= 40; // Add extra spacing between jobs. - } - - - const pdfBytes = await pdfDoc.save(); - return Buffer.from(pdfBytes); -} - -export function createJobEmbed( - job: JobResult, - index: number, - totalJobs: number -): { embed: EmbedBuilder; row: ActionRowBuilder } { - const embed = new EmbedBuilder() - .setTitle(job.title) - .setDescription( - `**Location:** ${job.location}\n**Date Posted:** ${new Date( - job.created - ).toDateString()}` - ) - .addFields( - { name: 'Salary', value: formatSalaryforPDF(job), inline: true }, - { - name: 'Apply Here', - value: `[Click here](${job.link})`, - inline: true - } - ) - .setFooter({ text: `Job ${index + 1} of ${totalJobs}` }) - .setColor('#0099ff'); - - const row = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setCustomId('previous') - .setLabel('Previous') - .setStyle(ButtonStyle.Primary) - .setDisabled(totalJobs === 1), - new ButtonBuilder() - .setCustomId('remove') - .setLabel('Remove') - .setStyle(ButtonStyle.Danger) - .setDisabled(totalJobs === 1), - new ButtonBuilder() - .setCustomId('next') - .setLabel('Next') - .setStyle(ButtonStyle.Primary) - .setDisabled(totalJobs === 1), - // ----------------ADDED DOWNLOAD BUTTON------------------- - new ButtonBuilder() - .setCustomId('download') - .setLabel('Download') - .setStyle(ButtonStyle.Success) - ); - return { embed, row }; -} - -function wrapText(text: string, font: PDFFont, fontSize: number, maxWidth: number): string[] { - const words = text.split(' '); - const lines: string[] = []; - let currentLine = ''; - - for (const word of words) { - const testLine = currentLine ? `${currentLine} ${word}` : word; - const textWidth = font.widthOfTextAtSize(testLine, fontSize); - - if (textWidth <= maxWidth) { - currentLine = testLine; - } else { - if (currentLine) { - lines.push(currentLine); - } - currentLine = ''; - - // Handle long words that exceed maxWidth - let remainingWord = word; - while (font.widthOfTextAtSize(remainingWord, fontSize) > maxWidth) { - const splitIndex = Math.floor((maxWidth / font.widthOfTextAtSize(remainingWord, fontSize)) * remainingWord.length); - const chunk = remainingWord.slice(0, splitIndex); - lines.push(chunk); - remainingWord = remainingWord.slice(splitIndex); - } - currentLine = remainingWord; - } - } - - if (currentLine) { - lines.push(currentLine); - } - - return lines; -} - -function formatSalaryforPDF(job: JobResult): string { - const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; - const formattedAvgSalary = formatCurrency(avgSalary); - const formattedSalaryMax - = formatCurrency(Number(job.salaryMax)) !== 'N/A' - ? formatCurrency(Number(job.salaryMax)) - : ''; - const formattedSalaryMin - = formatCurrency(Number(job.salaryMin)) !== 'N/A' - ? formatCurrency(Number(job.salaryMin)) - : ''; - - return formattedSalaryMin && formattedSalaryMax - ? `Avg: ${formattedAvgSalary}, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` - : formattedAvgSalary; -} - -async function sortJobResults(jobForm: [JobData, Interest, JobResult[]], filterBy: string): Promise { - if (filterBy === 'salary') { - jobForm[2].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') { - jobForm[2].sort((a, b) => a.title > b.title ? 1 : -1); - } else if (filterBy === 'date') { - jobForm[2].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); - } else if (filterBy === 'distance') { - jobForm[2].sort((a, b) => { - const distanceA = a.distance; - const distanceB = b.distance; - - if (distanceA === -1) { - return 1; // Treat jobs with no location as lowest - } - - return distanceA - distanceB; // Might have to account for negative distances - }); - } - - return jobForm[2]; -} - - -export default register; diff --git a/.history/src/pieces/tasks_20250502205558.ts b/.history/src/pieces/tasks_20250502205558.ts deleted file mode 100644 index ea10f34d..00000000 --- a/.history/src/pieces/tasks_20250502205558.ts +++ /dev/null @@ -1,705 +0,0 @@ -import { APP_ID, APP_KEY, BOT, CHANNELS, DB, MAP_KEY } from '@root/config'; -import { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonStyle, 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 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'; -import { JobPreferences } from '../lib/types/JobPreferences'; -import axios from 'axios'; -import { PDFDocument, PDFFont, rgb, StandardFonts } from 'pdf-lib'; -import { generateHistogram } from '../commands/jobs/histogram'; - -async function register(bot: Client): Promise { - schedule('0/30 * * * * *', () => { - handleCron(bot).catch(async (error) => bot.emit('error', error)); - }); -} - -async function handleCron(bot: Client): Promise { - checkPolls(bot); - checkReminders(bot); -} - -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 mdTimestamp = ``; - 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) { - winners = [res]; - } else if (res.users.length === winners[0].users.length) { - winners.push(res); - } - }); - - let winMessage: string; - const winCount = winners[0].users.length; - 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.slice(-1)[0].option - }** have won the poll with ${winCount} vote${winCount === 1 ? '' : 's'} each!`; - } - - let choiceText = ''; - let count = 0; - resultMap.forEach((value, key) => { - 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'; - } - - 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'); - - 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') - ] - }); - - await bot.mongo.collection(DB.POLLS).findOneAndDelete(poll); - }); -} - -// eslint-disable-next-line no-warning-comments -// Retrieves job form data from the DB for a given user and builds the necessary payload for job search -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.USERS); - - // Attempt to find the user's job preferences by their Discord ID - const jobformAnswers: JobPreferences | null = (await db.findOne({ discordId: userID }))?.jobPreferences; - - // If no job preferences exist, bail early with a meaningful error - if (!jobformAnswers || !jobformAnswers.answers) { - throw new Error(`No job preferences found for user ${userID}`); - } - - const answers = jobformAnswers.answers; - - // Build the main job search query payload from the user's saved answers - const jobData: JobData = { - city: answers.city, - preference: answers.workType, - jobType: answers.employmentType, - distance: answers.travelDistance, - filterBy: 'default' - }; - - // Build the interests section for filtering jobs further - const interests: Interest = { - interest1: answers.interest1, - interest2: answers.interest2, - interest3: answers.interest3, - interest4: answers.interest4, - interest5: answers.interest5 - }; - - // Fetch jobs using Adzuna with the above criteria - const APIResponse: JobResult[] = await fetchJobListings(jobData, interests); - return [jobData, interests, APIResponse]; -} - - -function formatCurrency(currency:number): string { - return isNaN(currency) ? 'N/A' : `${new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD' - }).format(Number(currency))}`; -} - -function calculateDistance(lat1: number, lon1: number, lat2: number, lon2: number): number { - const toRadians = (degrees: number) => degrees * (Math.PI / 180); - - // eslint-disable-next-line id-length - const R = 3958.8; // Radius of the Earth in miles - const dLat = toRadians(lat2 - lat1); - const dLon = toRadians(lon2 - lon1); - const a = (Math.sin(dLat / 2) * Math.sin(dLat / 2)) + - (Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) - * Math.sin(dLon / 2) * Math.sin(dLon / 2)); - const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - const distance = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 : R * c; - return distance; -} - -async function queryCoordinates(location: string): Promise<{lat: number, lng: number}> { - const preferredCity = encodeURIComponent(location); - - const baseURL = `https://maps.google.com/maps/api/geocode/json?address=${preferredCity}&components=country:US&key=${MAP_KEY}`; - const response = await axios.get(baseURL); - const coordinates : {lat: number, lng: number } = { - lat: response.data.results[0].geometry.location.lat, - lng: response.data.results[0].geometry.location.lng - }; - - return coordinates; -} - -export function titleCase(jobTitle: string | undefined | null): string { - if (!jobTitle) return ''; // fallback for null or undefined - return jobTitle - .toLowerCase() - .replace(/[()]/g, '') - .split(' ') - .map(word => word.charAt(0).toUpperCase() + word.slice(1)) - .join(' '); -} - - -async function listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: string): Promise { - // Conditionally sort jobs by salary if sortBy is 'salary' - const cityCoordinates = await queryCoordinates(jobForm[0].city); - - if (filterBy === 'salary') { - jobForm[2].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') { - jobForm[2].sort((a, b) => a.title > b.title ? 1 : -1); - } else if (filterBy === 'date') { - jobForm[2].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); - } else if (filterBy === 'distance') { - // cityCoordinates = await this.queryCoordinates(jobForm[0].city); - - jobForm[2].sort((a, b) => { - const distanceA = a.distance; - const distanceB = b.distance; - - if (distanceA === -1) { - return 1; // Treat jobs with no location as lowest - } - - return distanceA - distanceB; // Might have to account for negative distances - }); - } - - - let jobList = ''; - for (let i = 0; i < jobForm[2].length; i++) { - const avgSalary = (Number(jobForm[2][i].salaryMax) + Number(jobForm[2][i].salaryMin)) / 2; - const formattedAvgSalary = formatCurrency(avgSalary); - const formattedSalaryMax = formatCurrency(Number(jobForm[2][i].salaryMax)) !== 'N/A' ? formatCurrency(Number(jobForm[2][i].salaryMax)) : ''; - const formattedSalaryMin = formatCurrency(Number(jobForm[2][i].salaryMin)) !== 'N/A' ? formatCurrency(Number(jobForm[2][i].salaryMin)) : ''; - const jobDistance = calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(jobForm[2][i].latitude), Number(jobForm[2][i].longitude)); - const formattedDistance = jobDistance !== -1 ? `${jobDistance.toFixed(2)} miles` : 'N/A'; - - const salaryDetails = formattedSalaryMin && formattedSalaryMax - ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` - : formattedAvgSalary; - - jobList += `${i + 1}. **${jobForm[2][i].title}** - \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} - \t\t* **Location:** ${jobForm[2][i].location} - \t\t* **Date Posted:** ${new Date(jobForm[2][i].created).toDateString()} at ${new Date(jobForm[2][i].created).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })} - \t\t* **Apply here:** [read more about the job and apply here](${jobForm[2][i].link}) - \t\t* **Distance:** ${formattedDistance} - ${i !== jobForm[2].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.'; -} - -export async function jobMessage(reminder: Reminder | string, userID: string): Promise<{ message: string, pdfBuffer: Buffer, - embed: EmbedBuilder, row: ActionRowBuilder, jobResults: JobResult[] }> { - const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, typeof reminder === 'object' && 'filterBy' in reminder ? reminder.filterBy : 'default'); - let filterBy: string; - if (typeof reminder === 'object' && 'filterBy' in reminder && reminder.filterBy) { - filterBy = String(reminder.filterBy); - } else if (typeof reminder === 'object') { - filterBy = 'default'; - } else { - filterBy = typeof reminder === 'string' && reminder ? reminder : 'default'; - } - - const cityCoordinates = await queryCoordinates(jobFormData[0].city); - for (let i = 0; i < jobFormData[2].length; i++) { - const job = jobFormData[2][i]; - const distance = Math.round(calculateDistance(cityCoordinates.lat, cityCoordinates.lng, Number(job.latitude), Number(job.longitude)) + Number.EPSILON) * 100 / 100; // Round to 2 decimal places - jobFormData[2][i].distance = distance; - } - - const jobResults : JobResult[] = await sortJobResults(jobFormData, filterBy); - const { embed, row } = createJobEmbed(jobResults[0], 0, jobResults.length); - - const pdfBuffer = await generateJobPDF(jobFormData); - - const 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: - - ${await listJobs(jobFormData, 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.`; - - return { message, pdfBuffer, embed, row, jobResults }; -} - -export 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(/###|-\#\s*/g, '') - .trim(); -} - -export 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. \ -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${filterBy && filterBy !== 'default' ? ` (filtered based on ${filterBy === 'date' ? 'date posted' : filterBy}):` : ':'} - `; -} - -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) => { - if (reminder.mode === 'public') { - pubChan.send(`<@${reminder.owner}>, here's the reminder you asked for: **${reminder.content}**`); - } else { - bot.users.fetch(reminder.owner).then(async (user) => { - const result = await jobMessage(reminder, user.id); - // const { message } = result; - const message = 'placeholder'; // Placeholder for the message variable - const { pdfBuffer } = result; - 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(stripMarkdown(message.split('---')[0], reminder.owner), 'txt', 'list-of-jobs-internships', false)); - 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); - }); - } - - const newReminder: Reminder = { - content: reminder.content, - expires: new Date(reminder.expires), - mode: reminder.mode, - repeat: reminder.repeat, - owner: reminder.owner - }; - - if (reminder.repeat === 'daily') { - newReminder.expires.setDate(reminder.expires.getDate() + 1); - 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); - } else { - bot.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); - } - }); -} - -export async function generateJobPDF(jobForm: [JobData, Interest, JobResult[]]): Promise { - // Create a new PDF document. - - // Seperate sorting in listjobs into its own function, call function here so sorting maintained - - const jobs = jobForm[2]; - - const pdfDoc = await PDFDocument.create(); - let currentPage = pdfDoc.addPage(); - const { width, height } = currentPage.getSize(); - const margin = 40; - let yPosition = height - margin - 50; - const fontSize = 10; - const titleFontSize = 30; - const bulletPointIndent = 20; - const subBulletPointIndent = 30; // Indentation for sub-bullet points - - - // Embed a standard font. - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman); - const HelveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica); - - - // Draw the title. - const lineHeight = 10; // Height of the line - const lineWidth = (width - (margin * 2)) / 3; - - currentPage.drawRectangle({ - x: margin, - y: yPosition + 50, - width: lineWidth, - height: lineHeight, - color: rgb(135 / 255, 59 / 255, 29 / 255) // red color - }); - - // Draw the second color segment - currentPage.drawRectangle({ - x: margin + lineWidth, - y: yPosition + 50, - width: lineWidth, - height: lineHeight, - color: rgb(237 / 255, 118 / 255, 71 / 255) // orangey color - }); - - // Draw the third color segment - currentPage.drawRectangle({ - x: margin + (lineWidth * 2), - y: yPosition + 50, - width: lineWidth, - height: lineHeight, - color: rgb(13 / 255, 158 / 255, 198 / 255) // Blue color - }); - - yPosition -= 40; // Adjust spacing below the line - - - currentPage.drawText('List of Jobs PDF', { - x: margin, - y: yPosition + 50, - size: titleFontSize, - font: HelveticaBold, - - color: rgb(114 / 255, 53 / 255, 9 / 255) - }); - yPosition -= 40; - - currentPage.drawRectangle({ - x: margin, - y: yPosition + 50, - width: lineWidth / 2, - height: lineHeight - 8, - color: rgb(135 / 255, 59 / 255, 29 / 255) // red color - }); - yPosition -= 10; - - // Loop through each job and add its details. - for (let i = 0; i < jobs.length; i++) { - const job = jobs[i]; - - if ((yPosition - (fontSize * 2)) < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin - 20; - } - - const maxWidth = width - (margin * 2); // Calculate available width - const wrappedTitle = wrapText(`${i + 1}. ${job.title}`, HelveticaBold, fontSize + 10, maxWidth); - - - for (const line of wrappedTitle) { - // Check if there's enough space for the line - if (yPosition - (fontSize * 2) < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin - 20; - } - - currentPage.drawText(line, { - x: margin, - y: yPosition + 30, - size: fontSize + 10, - font: HelveticaBold, - color: rgb(241 / 255, 113 / 255, 34 / 255) - }); - - yPosition -= 30; // Adjust spacing between lines - } - - // Draw the bullet points for location, salary, and apply link. - const bulletPoints = [ - { label: 'Location', value: `${job.location}, ${job.distance >= 0 ? `${job.distance} miles from ${titleCase(jobForm[0].city)}` : ''} ` }, - { label: 'Salary', value: formatSalaryforPDF(job) }, - { label: 'Apply Here', value: job.link } - ]; - - const jobTitle = encodeURIComponent(job.title); - const URL_BASE = `https://api.adzuna.com/v1/api/jobs/us/histogram?app_id=${APP_ID}&app_key=${APP_KEY}&what=${jobTitle}`; - - const response = await axios.get(URL_BASE); - const data = Object.entries(response.data.histogram).map(([value, frequency]: [string, number]) => ({ - value, - frequency - })); - let noValues = true; - - for (const item of data) { - if (item.frequency > 0) { - noValues = false; - break; - } - } - - - const image = await generateHistogram(data, job.title); - const imageBytes = await pdfDoc.embedPng(image); - const imageDims = imageBytes.scale(0.2); - - - for (const point of bulletPoints) { - // Check if there's enough space on the page, and add a new page if needed. - if (yPosition - (fontSize * 2) < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin - 20; - } - - const maxLabelWidth = width - (margin * 2) - bulletPointIndent - subBulletPointIndent; - const wrappedLabel = wrapText(`• ${point.label}`, HelveticaBold, fontSize + 5, maxLabelWidth); - - // Draw the wrapped label - for (const line of wrappedLabel) { - // Check if there's enough space for the line - if (yPosition - (fontSize * 2) < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin - 20; - } - - currentPage.drawText(line, { - x: margin + bulletPointIndent, - y: yPosition + 25, - size: fontSize + 5, - font: HelveticaBold, - color: rgb(94 / 255, 74 / 255, 74 / 255) - }); - - if (point.label === 'Salary' && !noValues) { - currentPage.drawImage(imageBytes, { // Change space check so it doesn't go off the page - x: (currentPage.getWidth() / 2) - (imageDims.width / 2), - y: yPosition - imageDims.height - 10, - width: imageDims.width, - height: imageDims.height - }); - - yPosition -= imageDims.height + 30; // Adjust spacing for the image - } - - - yPosition -= fontSize + 10; // Adjust spacing between lines - } - - - const combinedText = `•${point.value}`; - const maxValueWidth = width - (margin * 2) - bulletPointIndent - subBulletPointIndent; - const wrappedValue = wrapText(combinedText, HelveticaBold, fontSize + 4, maxValueWidth); - - - for (const line of wrappedValue) { - // Check if there's enough space for the line - if (yPosition - (fontSize * 2) < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin - 20; - } - - currentPage.drawText(line, { - x: margin + bulletPointIndent + subBulletPointIndent, - y: yPosition + 20, - size: fontSize + 3, - font: HelveticaBold, - color: rgb(13 / 255, 158 / 255, 198 / 255) - }); - - yPosition -= fontSize + 5; // Adjust spacing between lines - } - - yPosition -= 20; // Add extra spacing between items - } - - yPosition -= 40; // Add extra spacing between jobs. - } - - - const pdfBytes = await pdfDoc.save(); - return Buffer.from(pdfBytes); -} - -export function createJobEmbed( - job: JobResult, - index: number, - totalJobs: number -): { embed: EmbedBuilder; row: ActionRowBuilder } { - const embed = new EmbedBuilder() - .setTitle(job.title) - .setDescription( - `**Location:** ${job.location}\n**Date Posted:** ${new Date( - job.created - ).toDateString()}` - ) - .addFields( - { name: 'Salary', value: formatSalaryforPDF(job), inline: true }, - { - name: 'Apply Here', - value: `[Click here](${job.link})`, - inline: true - } - ) - .setFooter({ text: `Job ${index + 1} of ${totalJobs}` }) - .setColor('#0099ff'); - - const row = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setCustomId('previous') - .setLabel('Previous') - .setStyle(ButtonStyle.Primary) - .setDisabled(totalJobs === 1), - new ButtonBuilder() - .setCustomId('remove') - .setLabel('Remove') - .setStyle(ButtonStyle.Danger) - .setDisabled(totalJobs === 1), - new ButtonBuilder() - .setCustomId('next') - .setLabel('Next') - .setStyle(ButtonStyle.Primary) - .setDisabled(totalJobs === 1), - // ----------------ADDED DOWNLOAD BUTTON------------------- - new ButtonBuilder() - .setCustomId('download') - .setLabel('Download') - .setStyle(ButtonStyle.Success) - ); - return { embed, row }; -} - -function wrapText(text: string, font: PDFFont, fontSize: number, maxWidth: number): string[] { - const words = text.split(' '); - const lines: string[] = []; - let currentLine = ''; - - for (const word of words) { - const testLine = currentLine ? `${currentLine} ${word}` : word; - const textWidth = font.widthOfTextAtSize(testLine, fontSize); - - if (textWidth <= maxWidth) { - currentLine = testLine; - } else { - if (currentLine) { - lines.push(currentLine); - } - currentLine = ''; - - // Handle long words that exceed maxWidth - let remainingWord = word; - while (font.widthOfTextAtSize(remainingWord, fontSize) > maxWidth) { - const splitIndex = Math.floor((maxWidth / font.widthOfTextAtSize(remainingWord, fontSize)) * remainingWord.length); - const chunk = remainingWord.slice(0, splitIndex); - lines.push(chunk); - remainingWord = remainingWord.slice(splitIndex); - } - currentLine = remainingWord; - } - } - - if (currentLine) { - lines.push(currentLine); - } - - return lines; -} - -function formatSalaryforPDF(job: JobResult): string { - const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; - const formattedAvgSalary = formatCurrency(avgSalary); - const formattedSalaryMax - = formatCurrency(Number(job.salaryMax)) !== 'N/A' - ? formatCurrency(Number(job.salaryMax)) - : ''; - const formattedSalaryMin - = formatCurrency(Number(job.salaryMin)) !== 'N/A' - ? formatCurrency(Number(job.salaryMin)) - : ''; - - return formattedSalaryMin && formattedSalaryMax - ? `Avg: ${formattedAvgSalary}, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` - : formattedAvgSalary; -} - -async function sortJobResults(jobForm: [JobData, Interest, JobResult[]], filterBy: string): Promise { - if (filterBy === 'salary') { - jobForm[2].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') { - jobForm[2].sort((a, b) => a.title > b.title ? 1 : -1); - } else if (filterBy === 'date') { - jobForm[2].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()); - } else if (filterBy === 'distance') { - jobForm[2].sort((a, b) => { - const distanceA = a.distance; - const distanceB = b.distance; - - if (distanceA === -1) { - return 1; // Treat jobs with no location as lowest - } - - return distanceA - distanceB; // Might have to account for negative distances - }); - } - - return jobForm[2]; -} - - -export default register; diff --git a/src/commands/jobs/update_filtering.ts b/src/commands/jobs/update_filtering.ts index dde9ba7e..e3b2dfed 100644 --- a/src/commands/jobs/update_filtering.ts +++ b/src/commands/jobs/update_filtering.ts @@ -48,16 +48,20 @@ export default class extends Command { 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`'); + const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date' | 'default'; + + // Check if user already has a job reminder with that filter + if (!await checkJobReminder(interaction, filterBy)) { + await interaction.reply({ + content: 'Please make sure you have a job reminder with that filter already set. To do so, run `/remind jobs` first.', + ephemeral: true + }); } 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({ + content: `Your job/internship filter has been updated to **${filterBy}** successfully!`, + ephemeral: true + }); } - - await interaction.reply('Filter updated successfully!'); } - -} +} diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index 3ec3c308..babce6be 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 { checkJobReminder, reminderTime } from '@root/src/lib/utils/generalUtils'; +import { reminderTime } from '@root/src/lib/utils/generalUtils'; import { Command } from '@lib/types/Command'; export default class extends Command { @@ -44,7 +44,6 @@ 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', @@ -82,10 +81,15 @@ export default class extends Command { if (subcommand === 'jobs') { const jobReminderRepeat = interaction.options.getString('job-repeat') as - | 'daily' - | 'weekly' || null; + | 'daily' + | 'weekly' || null; - const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date' | 'default' | null; + const filterBy = interaction.options.getString('filter-type') as + | 'relevance' + | 'salary' + | 'date' + | 'default' + || 'default'; // fallback to default if null const jobReminder: Reminder = { owner: interaction.user.id, @@ -95,31 +99,42 @@ export default class extends Command { repeat: jobReminderRepeat, filterBy }; - // handling duplicate job reminders - 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.', - ephemeral: true + + const existing = await interaction.client.mongo + .collection(DB.REMINDERS) + .findOne({ + owner: interaction.user.id, + content: 'Job Reminder', + filterBy }); - } else { - interaction.client.mongo - .collection(DB.REMINDERS) - .insertOne(jobReminder); + + if (existing) { return interaction.reply({ - content: `I'll remind you about job offers ${jobReminderRepeat} at ${reminderTime( - jobReminder - )}.`, + content: `You already have a job reminder set with **${filterBy}** as the filter. Use /cancelreminder to remove it first.`, ephemeral: true }); } + + await interaction.client.mongo + .collection(DB.REMINDERS) + .insertOne(jobReminder); + + console.log('[DEBUG] Inserted job reminder:', jobReminder); + + return interaction.reply({ + content: `I'll remind you about job offers ${jobReminderRepeat} at ${reminderTime( + jobReminder + )}.`, + ephemeral: true + }); } else { 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; + | 'daily' + | 'weekly' + || null; if (!duration) { return interaction.reply({ @@ -127,6 +142,7 @@ export default class extends Command { ephemeral: true }); } + const reminder: Reminder = { owner: interaction.user.id, content, @@ -134,16 +150,15 @@ export default class extends Command { expires: new Date(duration + Date.now()), repeat }; - interaction.client.mongo + + await interaction.client.mongo .collection(DB.REMINDERS) .insertOne(reminder); + return interaction.reply({ - content: `I'll remind you about that at ${reminderTime( - reminder - )}.`, + content: `I'll remind you about that at ${reminderTime(reminder)}.`, ephemeral: true }); } } - } diff --git a/src/commands/reminders/viewreminders.ts b/src/commands/reminders/viewreminders.ts index 5152df69..abc85ee8 100644 --- a/src/commands/reminders/viewreminders.ts +++ b/src/commands/reminders/viewreminders.ts @@ -12,7 +12,7 @@ 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.'; + 'Don\'t worry, private reminders will be hidden if you use this command publicly.'; async run( interaction: ChatInputCommandInteraction @@ -21,41 +21,72 @@ export default class extends Command { .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({ + return interaction.reply({ content: 'You don\'t have any pending reminders!', ephemeral: true }); } + // Split reminders + const jobReminders = reminders.filter(r => r.content === 'Job Reminder'); + const normalReminders = reminders.filter(r => r.content !== 'Job Reminder'); + + // Sort job reminders by filter priority + const priorityOrder = { salary: 1, date: 2, relevance: 3, default: 4 }; + jobReminders.sort((a, b) => { + const aVal = priorityOrder[a.filterBy || 'default']; + const bVal = priorityOrder[b.filterBy || 'default']; + return aVal - bVal; + }); + + // Sort regular reminders by expiration + normalReminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); + + const sortedReminders = [...jobReminders, ...normalReminders]; const embeds: Array = []; - reminders.forEach((reminder, i) => { + sortedReminders.forEach((reminder, i) => { if (i % 25 === 0) { embeds.push( new EmbedBuilder() - .setTitle('Pending reminders') + .setTitle('📋 Pending Reminders') .setColor('DarkAqua') ); } + 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 - ? `This is a **${reminder.repeat}** job reminder` - : reminderTime(reminder) - }); + + let name = `${i + 1}. `; + if (hidden) { + name += reminder.content === 'Job Reminder' ? '[Job Reminder]' : 'Private reminder'; + } else { + name += reminder.content; + } + + let value = hidden + ? `This is a **${reminder.repeat}** job reminder` + : reminderTime(reminder); + + if (reminder.filterBy) { + value += `\n🔍 Sorting preference: **${reminder.filterBy}**`; + } + + embeds[Math.floor(i / 25)].addFields({ name, value }); }); - interaction.reply({ embeds }); - } + // Set sorting explanation at the top + if (embeds.length > 0) { + embeds[0].setDescription('Job reminders are sorted based on your selected filter type.'); + } + + // Add sorting logic at the bottom + embeds[embeds.length - 1].addFields({ + name: '\u200B', + value: '**Job Reminder Sorting:** salary > date > relevance > default' + }); + return interaction.reply({ embeds }); + } } diff --git a/src/lib/utils/generalUtils.ts b/src/lib/utils/generalUtils.ts index f1ffa715..2de0c32e 100644 --- a/src/lib/utils/generalUtils.ts +++ b/src/lib/utils/generalUtils.ts @@ -293,14 +293,17 @@ export function calcNeededExp(levelExp: number, direction: string): number { } export async function checkJobReminder( - interaction: ChatInputCommandInteraction + interaction: ChatInputCommandInteraction, + filterBy: string ): Promise { const reminders: Array = await interaction.client.mongo .collection(DB.REMINDERS) - .find({ owner: interaction.user.id }) + .find({ + owner: interaction.user.id, + content: 'Job Reminder', + filterBy // <-- Now checks per filter type! + }) .toArray(); - return reminders.some( - (reminder: Reminder) => reminder.content === 'Job Reminder' - ); + return reminders.length > 0; } From df8c6eb490a6ece2402c0cc70e8daf6afb0a52aa Mon Sep 17 00:00:00 2001 From: Karanvir Date: Mon, 5 May 2025 02:55:11 -0400 Subject: [PATCH 306/317] Fixed linting errors --- build/Makefile | 2 +- src/commands/jobs/update_filtering.ts | 5 +++-- src/commands/reminders/remind.ts | 1 + src/commands/reminders/viewreminders.ts | 3 ++- src/lib/utils/jobUtils/Adzuna_job_search.ts | 9 ++++++++- src/pieces/tasks.ts | 6 +++--- 6 files changed, 18 insertions(+), 8 deletions(-) diff --git a/build/Makefile b/build/Makefile index da4a6d13..01b31e7f 100644 --- a/build/Makefile +++ b/build/Makefile @@ -332,7 +332,7 @@ 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/23.11.0" "-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/Users/karansingh/Library/Caches/node-gyp/23.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/23.11.0/include/node/common.gypi "--toplevel-dir=." binding.gyp -Makefile: $(srcdir)/binding.gyp $(srcdir)/../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/../Library/Caches/node-gyp/23.11.0/include/node/common.gypi $(srcdir)/build/config.gypi +Makefile: $(srcdir)/binding.gyp $(srcdir)/../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/build/config.gypi $(srcdir)/../Library/Caches/node-gyp/23.11.0/include/node/common.gypi $(call do_cmd,regen_makefile) # "all" is a concatenation of the "all" targets from all the included diff --git a/src/commands/jobs/update_filtering.ts b/src/commands/jobs/update_filtering.ts index e3b2dfed..994e9ff7 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> { const filterBy = interaction.options.getString('filter-type') as 'relevance' | 'salary' | 'date' | 'default'; - + // Check if user already has a job reminder with that filter if (!await checkJobReminder(interaction, filterBy)) { await interaction.reply({ @@ -64,4 +64,5 @@ export default class extends Command { }); } } -} + +} diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts index babce6be..ac8f78dc 100644 --- a/src/commands/reminders/remind.ts +++ b/src/commands/reminders/remind.ts @@ -161,4 +161,5 @@ export default class extends Command { }); } } + } diff --git a/src/commands/reminders/viewreminders.ts b/src/commands/reminders/viewreminders.ts index abc85ee8..cb814ed3 100644 --- a/src/commands/reminders/viewreminders.ts +++ b/src/commands/reminders/viewreminders.ts @@ -12,7 +12,7 @@ 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.'; + 'Don\'t worry, private reminders will be hidden if you use this command publicly.'; async run( interaction: ChatInputCommandInteraction @@ -89,4 +89,5 @@ export default class extends Command { return interaction.reply({ embeds }); } + } diff --git a/src/lib/utils/jobUtils/Adzuna_job_search.ts b/src/lib/utils/jobUtils/Adzuna_job_search.ts index ac650984..ab4976f9 100644 --- a/src/lib/utils/jobUtils/Adzuna_job_search.ts +++ b/src/lib/utils/jobUtils/Adzuna_job_search.ts @@ -45,7 +45,14 @@ export default async function fetchJobListings(jobData: JobData, interests?: Int return jobCache[cacheKey] as JobResult[]; } - 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)}`; + 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 { // Append sorting only if it's not 'default' diff --git a/src/pieces/tasks.ts b/src/pieces/tasks.ts index ea10f34d..0d39efd6 100644 --- a/src/pieces/tasks.ts +++ b/src/pieces/tasks.ts @@ -89,7 +89,7 @@ async function checkPolls(bot: Client): Promise { // eslint-disable-next-line no-warning-comments // Retrieves job form data from the DB for a given user and builds the necessary payload for job search -async function getJobFormData(userID: string, _filterBy: string): Promise<[JobData, Interest, JobResult[]]> { +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.USERS); @@ -101,7 +101,7 @@ async function getJobFormData(userID: string, _filterBy: string): Promise<[JobDa throw new Error(`No job preferences found for user ${userID}`); } - const answers = jobformAnswers.answers; + const { answers } = jobformAnswers; // Build the main job search query payload from the user's saved answers const jobData: JobData = { @@ -235,7 +235,7 @@ async function listJobs(jobForm: [JobData, Interest, JobResult[]], filterBy: str export async function jobMessage(reminder: Reminder | string, userID: string): Promise<{ message: string, pdfBuffer: Buffer, embed: EmbedBuilder, row: ActionRowBuilder, jobResults: JobResult[] }> { - const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID, typeof reminder === 'object' && 'filterBy' in reminder ? reminder.filterBy : 'default'); + const jobFormData: [JobData, Interest, JobResult[]] = await getJobFormData(userID); let filterBy: string; if (typeof reminder === 'object' && 'filterBy' in reminder && reminder.filterBy) { filterBy = String(reminder.filterBy); From fc9c917d3fa101b7ff0ef8342b2cc312196f44cc Mon Sep 17 00:00:00 2001 From: Nazmul Date: Mon, 5 May 2025 12:40:52 -0400 Subject: [PATCH 307/317] half finished share button --- src/commands/jobs/jobs.ts | 507 +++++++++++++++++++------------------- 1 file changed, 256 insertions(+), 251 deletions(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index ffaf653b..b6f81c20 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -9,6 +9,11 @@ import { ComponentType, InteractionResponse, AttachmentBuilder, + ModalBuilder, + TextInputBuilder, + TextInputStyle, + ModalSubmitInteraction, + User, } from "discord.js"; import fetchJobListings from "@root/src/lib/utils/jobUtils/Adzuna_job_search"; import { JobResult } from "@root/src/lib/types/JobResult"; @@ -20,12 +25,11 @@ import { MongoClient } from "mongodb"; import { sendToFile } from "@root/src/lib/utils/generalUtils"; import axios from "axios"; import { JobPreferences } from "@root/src/lib/types/JobPreferences"; -import { PDFDocument, PDFFont, StandardFonts, rgb } from "pdf-lib"; +import { PDFDocument, StandardFonts, rgb } from "pdf-lib"; // Temporary storage for user job data const userJobData = new Map(); - 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.`; @@ -45,188 +49,224 @@ export default class extends Command { }, ]; - //-------------------ADDED PDF GENERATATOR METHOD---------------------- + private sanitizeText(text: string): string { + return text + .replace(/[^\x00-\x7F]/g, "") // Remove non-ASCII characters + .replace(/[•]/g, "*") // Replace bullet points + .replace(/[“”]/g, '"') // Replace smart quotes + .replace(/[‘’]/g, "'") // Replace smart single quotes + .replace(/\s+/g, " ") // Collapse multiple spaces + .trim(); + } + private async generateJobPDF(jobs: JobResult[]): Promise { - // Create a new PDF document. const pdfDoc = await PDFDocument.create(); - let currentPage = pdfDoc.addPage(); + let currentPage = pdfDoc.addPage([600, 800]); const { width, height } = currentPage.getSize(); const margin = 40; - let yPosition = height - margin- 50; + let yPosition = height - margin - 50; const fontSize = 10; const titleFontSize = 30; const bulletPointIndent = 20; - const subBulletPointIndent = 30; // Indentation for sub-bullet points - - - - // Embed a standard font. - const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman); - const HelveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold ); - const Helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica ); - - + const subBulletPointIndent = 30; + const helveticaBold = await pdfDoc.embedFont( + StandardFonts.HelveticaBold + ); + const helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica); - // Draw the title. - const lineHeight = 10; // Height of the line + // Draw title decoration + const lineHeight = 10; const lineWidth = (width - margin * 2) / 3; currentPage.drawRectangle({ x: margin, - y: yPosition+50, + y: yPosition + 50, width: lineWidth, height: lineHeight, - color: rgb(135 / 255, 59 / 255, 29 / 255), // red color + color: rgb(135 / 255, 59 / 255, 29 / 255), }); - - // Draw the second color segment + currentPage.drawRectangle({ x: margin + lineWidth, - y: yPosition+50, + y: yPosition + 50, width: lineWidth, height: lineHeight, - color: rgb(237 / 255, 118 / 255, 71 / 255), // orangey color + color: rgb(237 / 255, 118 / 255, 71 / 255), }); - - // Draw the third color segment + currentPage.drawRectangle({ x: margin + lineWidth * 2, - y: yPosition+50, + y: yPosition + 50, width: lineWidth, height: lineHeight, - color: rgb(13/255, 158/255, 198/255), // Blue color + color: rgb(13 / 255, 158 / 255, 198 / 255), }); - - yPosition -= 40; // Adjust spacing below the line - + yPosition -= 40; - currentPage.drawText("List of Jobs PDF", { + // Draw title + currentPage.drawText("Your Job Listings", { x: margin, - y: yPosition+50, + y: yPosition + 50, size: titleFontSize, - font: HelveticaBold, - - color: rgb(114/255, 53/255, 9/255), + font: helveticaBold, + color: rgb(114 / 255, 53 / 255, 9 / 255), }); yPosition -= 40; currentPage.drawRectangle({ x: margin, - y: yPosition+50, - width: lineWidth/2, - height: lineHeight-8, - color: rgb(135 / 255, 59 / 255, 29 / 255), // red color + y: yPosition + 50, + width: lineWidth / 2, + height: lineHeight - 8, + color: rgb(135 / 255, 59 / 255, 29 / 255), }); yPosition -= 10; - // Loop through each job and add its details. + // Add jobs for (let i = 0; i < jobs.length; i++) { const job = jobs[i]; - - if (yPosition - fontSize*2 < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin-20; + const sanitizedJob = { + title: this.sanitizeText(job.title), + location: this.sanitizeText(job.location), + salary: this.sanitizeText(this.formatSalaryforPDF(job)), + link: job.link, // URLs should be ASCII already + }; + + // Add new page if needed + if (yPosition - fontSize * 2 < margin) { + currentPage = pdfDoc.addPage([600, 800]); + yPosition = currentPage.getHeight() - margin - 20; } - - const maxWidth = width - margin * 2; // Calculate available width - const wrappedTitle = this.wrapText(`${i + 1}. ${job.title}`, HelveticaBold, fontSize + 10, maxWidth); - + // Add job title + const titleLines = this.wrapText( + `${i + 1}. ${sanitizedJob.title}`, + helveticaBold, + fontSize + 10, + width - margin * 2 + ); - for (const line of wrappedTitle) { - // Check if there's enough space for the line - if (yPosition - fontSize*2 < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin-20; + for (const line of titleLines) { + if (yPosition - fontSize * 2 < margin) { + currentPage = pdfDoc.addPage([600, 800]); + yPosition = currentPage.getHeight() - margin - 20; } currentPage.drawText(line, { x: margin, - y: yPosition+30, + y: yPosition + 30, size: fontSize + 10, - font: HelveticaBold, + font: helveticaBold, color: rgb(241 / 255, 113 / 255, 34 / 255), }); - - yPosition -= 30; // Adjust spacing between lines + yPosition -= 30; } - - // Draw the bullet points for location, salary, and apply link. - const bulletPoints = [ - { label: "Location", value: job.location }, - { label: "Salary", value: this.formatSalaryforPDF(job) }, - { label: "Apply Here", value: job.link }, + + // Add job details + const details = [ + { label: "Location", value: sanitizedJob.location }, + { label: "Salary", value: sanitizedJob.salary }, + { label: "Apply Here", value: sanitizedJob.link }, ]; - - for (const point of bulletPoints) { - // Check if there's enough space on the page, and add a new page if needed. - if (yPosition - fontSize *2 < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin-20; - } - const maxLabelWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; - const wrappedLabel = this.wrapText(`• ${point.label}`, HelveticaBold, fontSize + 5, maxLabelWidth); + for (const detail of details) { + // Label + const labelLines = this.wrapText( + `• ${detail.label}`, + helveticaBold, + fontSize + 5, + width - + margin * 2 - + bulletPointIndent - + subBulletPointIndent + ); - // Draw the wrapped label - for (const line of wrappedLabel) { - // Check if there's enough space for the line - if (yPosition - fontSize*2 < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin-20; + for (const line of labelLines) { + if (yPosition - fontSize * 2 < margin) { + currentPage = pdfDoc.addPage([600, 800]); + yPosition = currentPage.getHeight() - margin - 20; } currentPage.drawText(line, { x: margin + bulletPointIndent, - y: yPosition+25, + y: yPosition + 25, size: fontSize + 5, - font: HelveticaBold, + font: helveticaBold, color: rgb(94 / 255, 74 / 255, 74 / 255), }); - - yPosition -= fontSize + 10; // Adjust spacing between lines + yPosition -= fontSize + 10; } - - - const combinedText = `•${point.value}`; - const maxValueWidth = width - margin * 2 - bulletPointIndent - subBulletPointIndent; - const wrappedValue = this.wrapText(combinedText, HelveticaBold, fontSize+4, maxValueWidth); - - - for (const line of wrappedValue) { - // Check if there's enough space for the line - if (yPosition - fontSize*2 < margin) { - currentPage = pdfDoc.addPage(); - yPosition = currentPage.getHeight() - margin-20; + + // Value + const valueLines = this.wrapText( + `•${detail.value}`, + helvetica, + fontSize + 3, + width - + margin * 2 - + bulletPointIndent - + subBulletPointIndent + ); + + for (const line of valueLines) { + if (yPosition - fontSize * 2 < margin) { + currentPage = pdfDoc.addPage([600, 800]); + yPosition = currentPage.getHeight() - margin - 20; } currentPage.drawText(line, { x: margin + bulletPointIndent + subBulletPointIndent, - y: yPosition+20, - size: fontSize+3, - font: HelveticaBold, + y: yPosition + 20, + size: fontSize + 3, + font: helvetica, color: rgb(13 / 255, 158 / 255, 198 / 255), }); - - yPosition -= fontSize + 5; // Adjust spacing between lines + yPosition -= fontSize + 5; } - yPosition -= 20; // Add extra spacing between items + yPosition -= 20; } - yPosition -= 40; // Add extra spacing between jobs. - - - + yPosition -= 40; } - const pdfBytes = await pdfDoc.save(); return Buffer.from(pdfBytes); } + private wrapText( + text: string, + font: any, + fontSize: number, + maxWidth: number + ): string[] { + const words = text.split(" "); + const lines: string[] = []; + let currentLine = ""; + + for (const word of words) { + const testLine = currentLine ? `${currentLine} ${word}` : word; + const testWidth = font.widthOfTextAtSize(testLine, fontSize); + + if (testWidth <= maxWidth) { + currentLine = testLine; + } else { + if (currentLine) { + lines.push(currentLine); + } + currentLine = word; + } + } + + if (currentLine) { + lines.push(currentLine); + } + + return lines; + } + async run( interaction: ChatInputCommandInteraction ): Promise> { @@ -249,10 +289,10 @@ export default class extends Command { } const jobData: JobData = { - city: jobformAnswers.answers.city, - preference: jobformAnswers.answers.employmentType, - jobType: jobformAnswers.answers.workType, - distance: jobformAnswers.answers.travelDistance, + city: jobformAnswers.answers.city, + preference: jobformAnswers.answers.employmentType, + jobType: jobformAnswers.answers.workType, + distance: jobformAnswers.answers.travelDistance, filterBy: filterBy, }; @@ -288,7 +328,7 @@ export default class extends Command { // Listen for button interactions const collector = interaction.channel?.createMessageComponentCollector({ componentType: ComponentType.Button, - time: 60000, // 1 minute timeout + time: 60000, }); collector?.on("collect", async (i) => { @@ -325,29 +365,68 @@ export default class extends Command { } index = index >= jobs.length ? 0 : index; break; - //----------------ADDED DOWNLOAD BUTTON-------------------- case "download": await i.deferReply({ ephemeral: true }); try { - // Generate the PDF from all stored jobs. const pdfBuffer = await this.generateJobPDF(jobs); const attachment = new AttachmentBuilder( pdfBuffer - ).setName("jobs.pdf"); + ).setName("job_listings.pdf"); + await i.editReply({ content: - "Here is your PDF file with all job listings:", + "Here are your job listings in PDF format:", files: [attachment], }); } catch (error) { console.error("Error generating PDF:", error); await i.editReply({ content: - "An error occurred while generating the PDF. Please try again later.", + "Failed to generate PDF. The job listings may contain unsupported characters.", }); } - return; // Exit early so we don't update the embed. + break; + case "share": + await i.showModal( + new ModalBuilder() + .setCustomId("shareJobModal") + .setTitle("Share Job") + .addComponents( + new ActionRowBuilder().addComponents( + new TextInputBuilder() + .setCustomId("recipient") + .setLabel( + "Tag user or enter channel ID" + ) + .setStyle(TextInputStyle.Short) + .setRequired(true) + ), + new ActionRowBuilder().addComponents( + new TextInputBuilder() + .setCustomId("message") + .setLabel("Add a message (optional)") + .setStyle(TextInputStyle.Paragraph) + .setRequired(false) + ) + ) + ); + return; } + interaction.client.on( + "interactionCreate", + async (modalInteraction) => { + if (!modalInteraction.isModalSubmit()) return; + if (modalInteraction.customId !== "shareJobModal") return; + + const userData = userJobData.get(modalInteraction.user.id); + if (!userData) return; + + await this.handleShareModal( + modalInteraction, + userData.jobs[userData.index] + ); + } + ); // Update user data userJobData.set(userID, { jobs, index }); @@ -366,40 +445,60 @@ export default class extends Command { }); } - wrapText(text: string, font: PDFFont, fontSize: number, maxWidth: number): string[] { - const words = text.split(" "); - const lines: string[] = []; - let currentLine = ""; - - for (const word of words) { - const testLine = currentLine ? `${currentLine} ${word}` : word; - const textWidth = font.widthOfTextAtSize(testLine, fontSize); - - if (textWidth <= maxWidth) { - currentLine = testLine; - } else { - if (currentLine) { - lines.push(currentLine); - } - currentLine = ""; - - // Handle long words that exceed maxWidth - let remainingWord = word; - while (font.widthOfTextAtSize(remainingWord, fontSize) > maxWidth) { - let splitIndex = Math.floor((maxWidth / font.widthOfTextAtSize(remainingWord, fontSize)) * remainingWord.length); - const chunk = remainingWord.slice(0, splitIndex); - lines.push(chunk); - remainingWord = remainingWord.slice(splitIndex); - } - currentLine = remainingWord; + private async handleShareModal( + interaction: ModalSubmitInteraction, + job: JobResult + ) { + const recipient = interaction.fields.getTextInputValue("recipient"); + const message = + interaction.fields.getTextInputValue("message") || + "Check out this job opportunity!"; + + try { + // Try to parse as user/channel mention + const targetId = recipient.replace(/[<@#>]/g, ""); + const target = + (await interaction.client.users.fetch(targetId)) || + interaction.guild?.channels.cache.get(targetId); + + if (!target) throw new Error("Invalid target"); + + const shareEmbed = new EmbedBuilder() + .setTitle(`Job Shared: ${job.title}`) + .setDescription( + `${message}\n\n**Shared by:** ${interaction.user}` + ) + .addFields( + { name: "Location", value: job.location, inline: true }, + { + name: "Posted", + value: new Date(job.created).toDateString(), + inline: true, + }, + { name: "Apply Here", value: `[Click here](${job.link})` } + ) + .setColor("#4CAF50"); + + if (target instanceof User) { + await target.send({ embeds: [shareEmbed] }); + await interaction.reply({ + content: `✅ Job shared with ${target}!`, + ephemeral: true, + }); + } else if (target?.isTextBased()) { + await target.send({ embeds: [shareEmbed] }); + await interaction.reply({ + content: `✅ Job shared in ${target}!`, + ephemeral: true, + }); } + } catch (error) { + await interaction.reply({ + content: + "❌ Couldn't share. Make sure you entered a valid user/channel!", + ephemeral: true, + }); } - - if (currentLine) { - lines.push(currentLine); - } - - return lines; } createJobEmbed( @@ -441,16 +540,22 @@ export default class extends Command { .setLabel("Next") .setStyle(ButtonStyle.Primary) .setDisabled(totalJobs === 1), - //----------------ADDED DOWNLOAD BUTTON------------------- new ButtonBuilder() .setCustomId("download") - .setLabel("Download") + .setLabel("Download PDF") .setStyle(ButtonStyle.Success) + .setEmoji("📄"), + new ButtonBuilder() + .setCustomId("share") + .setLabel("Share") + .setStyle(ButtonStyle.Secondary) + .setEmoji("↗️") ); return { embed, row }; } + // ... (keep all your existing helper methods below) formatSalary(job: JobResult): string { const avgSalary = (Number(job.salaryMax) + Number(job.salaryMin)) / 2; const formattedAvgSalary = this.formatCurrency(avgSalary); @@ -485,106 +590,6 @@ export default class extends Command { : formattedAvgSalary; } - async listJobs( - jobForm: [JobData, Interest, JobResult[]], - filterBy: string - ): Promise { - const cityCoordinates = await this.queryCoordinates(jobForm[0].city); - - if (filterBy === "salary") { - jobForm[2].sort((a, b) => { - const avgA = (Number(a.salaryMax) + Number(a.salaryMin)) / 2; - const avgB = (Number(b.salaryMax) + Number(b.salaryMin)) / 2; - - if (isNaN(avgA)) return 1; - if (isNaN(avgB)) return -1; - - return avgB - avgA; - }); - } else if (filterBy === "alphabetical") { - jobForm[2].sort((a, b) => (a.title > b.title ? 1 : -1)); - } else if (filterBy === "date") { - jobForm[2].sort( - (a, b) => - new Date(b.created).getTime() - - new Date(a.created).getTime() - ); - } else if (filterBy === "distance") { - jobForm[2].sort((a, b) => { - const distanceA = this.calculateDistance( - cityCoordinates.lat, - cityCoordinates.lng, - Number(a.latitude), - Number(a.longitude) - ); - const distanceB = this.calculateDistance( - cityCoordinates.lat, - cityCoordinates.lng, - Number(b.latitude), - Number(b.longitude) - ); - - if (distanceA === -1) { - return 1; - } - - return distanceA - distanceB; - }); - } - - let jobList = ""; - for (let i = 0; i < jobForm[2].length; i++) { - const avgSalary = - (Number(jobForm[2][i].salaryMax) + - Number(jobForm[2][i].salaryMin)) / - 2; - const formattedAvgSalary = this.formatCurrency(avgSalary); - const formattedSalaryMax = - this.formatCurrency(Number(jobForm[2][i].salaryMax)) !== "N/A" - ? this.formatCurrency(Number(jobForm[2][i].salaryMax)) - : ""; - const formattedSalaryMin = - this.formatCurrency(Number(jobForm[2][i].salaryMin)) !== "N/A" - ? this.formatCurrency(Number(jobForm[2][i].salaryMin)) - : ""; - const jobDistance = this.calculateDistance( - cityCoordinates.lat, - cityCoordinates.lng, - Number(jobForm[2][i].latitude), - Number(jobForm[2][i].longitude) - ); - const formattedDistance = - jobDistance !== -1 ? `${jobDistance.toFixed(2)} miles` : "N/A"; - - const salaryDetails = - formattedSalaryMin && formattedSalaryMax - ? `, Min: ${formattedSalaryMin}, Max: ${formattedSalaryMax}` - : formattedAvgSalary; - - jobList += `${i + 1}. **${jobForm[2][i].title}** - \t\t* **Salary Average:** ${formattedAvgSalary}${salaryDetails} - \t\t* **Location:** ${jobForm[2][i].location} - \t\t* **Date Posted:** ${new Date( - jobForm[2][i].created - ).toDateString()} at ${new Date( - jobForm[2][i].created - ).toLocaleTimeString("en-US", { - hour: "2-digit", - minute: "2-digit", - })} - \t\t* **Apply here:** [read more about the job and apply here](${ - jobForm[2][i].link - }) - \t\t* **Distance:** ${formattedDistance} - ${i !== jobForm[2].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" From b77d92f887e556d2989b33806671df3997e63887 Mon Sep 17 00:00:00 2001 From: Nazmul Date: Mon, 5 May 2025 13:08:11 -0400 Subject: [PATCH 308/317] before pushing job.ts to main --- package-lock.json | 1625 +++++++++++++++++++++++++------------ src/commands/jobs/jobs.ts | 2 +- 2 files changed, 1087 insertions(+), 540 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb50ea1f..564fbd60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,26 +52,30 @@ "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "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.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "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==", + "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" @@ -81,6 +85,7 @@ "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==", + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -92,6 +97,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -105,6 +111,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -112,12 +119,14 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "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==", + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -126,6 +135,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", "engines": { "node": ">=4" } @@ -134,6 +144,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -142,32 +153,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.11.2", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.2.tgz", + "integrity": "sha512-F1WTABdd8/R9D1icJzajC4IuLyyS8f3rTOz66JsSI3pKvpCAtsMBweu8cyNYsIyvcrKAVn9EPK+Psoymq+XC0A==", "license": "Apache-2.0", "dependencies": { - "@discordjs/formatters": "^0.5.0", + "@discordjs/formatters": "^0.6.1", "@discordjs/util": "^1.1.1", "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "0.37.97", + "discord-api-types": "^0.38.1", "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", @@ -178,30 +183,25 @@ } }, "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.1", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.1.tgz", + "integrity": "sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==", "license": "Apache-2.0", "dependencies": { - "discord-api-types": "0.37.97" + "discord-api-types": "^0.38.1" }, "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", @@ -218,9 +218,9 @@ } }, "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.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.5.0.tgz", + "integrity": "sha512-PWhchxTzpn9EV3vvPRpwS0EE2rNYB9pvzDU/eLLW3mByJl0ZHZjHI2/wA8EbH2gRMQV7nu+0FoDF84oiPl8VAQ==", "license": "Apache-2.0", "dependencies": { "@discordjs/collection": "^2.1.1", @@ -228,10 +228,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.38.1", "magic-bytes.js": "^1.10.0", "tslib": "^2.6.3", - "undici": "6.19.8" + "undici": "6.21.1" }, "engines": { "node": ">=18" @@ -252,12 +252,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", @@ -271,20 +265,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.2", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.2.tgz", + "integrity": "sha512-dyfq7yn0wO0IYeYOs3z79I6/HumhmKISzFL0Z+007zQJMtAFGtt3AEoq1nuLXtcunUE5YYYQqgKvybXukAK8/w==", "license": "Apache-2.0", "dependencies": { "@discordjs/collection": "^2.1.0", - "@discordjs/rest": "^2.3.0", + "@discordjs/rest": "^2.5.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", + "discord-api-types": "^0.38.1", "tslib": "^2.6.2", - "ws": "^8.16.0" + "ws": "^8.17.0" }, "engines": { "node": ">=16.11.0" @@ -305,17 +299,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", @@ -336,6 +325,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" } @@ -344,7 +334,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", @@ -358,23 +350,28 @@ "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 + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@jonkemp/package-utils": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", - "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==" + "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==", + "license": "MIT" }, "node_modules/@kurkle/color": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==" + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" }, "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" @@ -388,6 +385,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" } @@ -397,6 +395,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" @@ -409,6 +408,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", + "license": "MIT", "engines": { "node": ">= 18" } @@ -417,6 +417,7 @@ "version": "6.1.5", "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", + "license": "MIT", "dependencies": { "@octokit/auth-token": "^5.0.0", "@octokit/graphql": "^8.2.2", @@ -434,6 +435,7 @@ "version": "10.1.4", "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", + "license": "MIT", "dependencies": { "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" @@ -446,6 +448,7 @@ "version": "8.2.2", "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", + "license": "MIT", "dependencies": { "@octokit/request": "^9.2.3", "@octokit/types": "^14.0.0", @@ -458,12 +461,14 @@ "node_modules/@octokit/openapi-types": { "version": "25.0.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", - "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==" + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { "version": "11.6.0", "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.10.0" }, @@ -477,12 +482,14 @@ "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { "version": "24.2.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { "version": "13.10.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } @@ -491,6 +498,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", + "license": "MIT", "engines": { "node": ">= 18" }, @@ -502,6 +510,7 @@ "version": "13.5.0", "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", + "license": "MIT", "dependencies": { "@octokit/types": "^13.10.0" }, @@ -515,12 +524,14 @@ "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { "version": "24.2.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "license": "MIT" }, "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { "version": "13.10.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } @@ -529,6 +540,7 @@ "version": "9.2.3", "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", + "license": "MIT", "dependencies": { "@octokit/endpoint": "^10.1.4", "@octokit/request-error": "^6.1.8", @@ -544,6 +556,7 @@ "version": "6.1.8", "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", + "license": "MIT", "dependencies": { "@octokit/types": "^14.0.0" }, @@ -555,6 +568,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", + "license": "MIT", "dependencies": { "@octokit/core": "^6.1.4", "@octokit/plugin-paginate-rest": "^11.4.2", @@ -569,6 +583,7 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^25.0.0" } @@ -577,6 +592,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "license": "MIT", "dependencies": { "pako": "^1.0.6" } @@ -585,14 +601,16 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "license": "MIT", "dependencies": { "pako": "^1.0.10" } }, "node_modules/@puppeteer/browsers": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.2.tgz", - "integrity": "sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.3.tgz", + "integrity": "sha512-iPpnFpX25gKIVsHsqVjHV+/GzW36xPgsscWkCnrrETndcdxNsXLdCrTwhkCJNR/FGWr122dJUBeyV4niz/j3TA==", + "license": "Apache-2.0", "dependencies": { "debug": "^4.4.0", "extract-zip": "^2.0.1", @@ -609,31 +627,11 @@ "node": ">=18" } }, - "node_modules/@puppeteer/browsers/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@puppeteer/browsers/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, "node_modules/@puppeteer/browsers/node_modules/tar-fs": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "license": "MIT", "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -647,6 +645,7 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -654,9 +653,9 @@ } }, "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", @@ -689,16 +688,17 @@ "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" }, "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": { @@ -706,21 +706,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": "*" @@ -733,57 +736,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.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -793,6 +786,7 @@ "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" @@ -803,6 +797,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", @@ -835,6 +830,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", @@ -854,29 +850,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", @@ -904,6 +883,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" @@ -921,6 +901,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" }, @@ -934,6 +915,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", @@ -961,6 +943,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" @@ -986,13 +969,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" }, @@ -1005,6 +990,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" } @@ -1013,6 +999,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" }, @@ -1025,6 +1012,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", @@ -1041,6 +1029,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" } @@ -1049,6 +1038,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" } @@ -1057,6 +1047,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" }, @@ -1070,12 +1061,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" @@ -1084,24 +1078,12 @@ "node": ">=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==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/argparse": { "version": "1.0.10", "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" } @@ -1111,6 +1093,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" } @@ -1119,6 +1102,7 @@ "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", "dependencies": { "tslib": "^2.0.1" }, @@ -1131,6 +1115,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" } @@ -1138,12 +1123,14 @@ "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.9.0", "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -1153,23 +1140,27 @@ "node_modules/b4a": { "version": "1.6.7", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" }, "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/bare-events": { "version": "2.5.4", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", "optional": true }, "node_modules/bare-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.3.tgz", - "integrity": "sha512-OeEZYIg+2qepaWLyphaOXHAHKo3xkM8y3BeGAvHdMN8GNWvEAU1Yw6rYpGzu/wDDbKxgEjVeVDpgGhDzaeMpjg==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.4.tgz", + "integrity": "sha512-r8+26Voz8dGX3AYpJdFb1ZPaUSM8XOLCZvy+YGpRTmwPHIxA7Z3Jov/oMPtV7hfRQbOnH8qGlLTzQAbgtdNN0Q==", + "license": "Apache-2.0", "optional": true, "dependencies": { "bare-events": "^2.5.4", @@ -1192,6 +1183,7 @@ "version": "3.6.1", "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "license": "Apache-2.0", "optional": true, "engines": { "bare": ">=1.14.0" @@ -1201,6 +1193,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", "optional": true, "dependencies": { "bare-os": "^3.0.1" @@ -1210,6 +1203,7 @@ "version": "2.6.5", "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "license": "Apache-2.0", "optional": true, "dependencies": { "streamx": "^2.21.0" @@ -1244,12 +1238,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -1257,63 +1253,97 @@ "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" }, "node_modules/before-after-hook": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", + "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" } }, + "node_modules/bl/node_modules/readable-stream": { + "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", + "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" + } + }, + "node_modules/bl/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" + }, + "node_modules/bl/node_modules/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" }, "node_modules/brace-expansion": { "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": { @@ -1334,6 +1364,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1343,14 +1374,29 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", "engines": { "node": "*" } }, + "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==", + "license": "MIT", "engines": { "node": ">=6" } @@ -1360,6 +1406,7 @@ "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" @@ -1372,6 +1419,7 @@ "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" @@ -1387,6 +1435,7 @@ "version": "4.4.9", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", + "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -1398,6 +1447,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-5.0.0.tgz", "integrity": "sha512-+Lc5phRWjb+UxAIiQpKgvOaG6Mw276YQx2jl2BrxoUtI3A4RYTZuGM5Dq+s4ReYmCY42WEPSR6viF3lDSTxpvw==", + "license": "MIT", "dependencies": { "canvas": "^3.1.0", "tslib": "^2.8.1" @@ -1410,6 +1460,7 @@ "version": "0.22.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", + "license": "MIT", "dependencies": { "css-select": "~1.2.0", "dom-serializer": "~0.1.0", @@ -1436,6 +1487,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" } @@ -1444,6 +1496,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-4.1.1.tgz", "integrity": "sha512-biR7t4vF3YluE6RlMSk9IWk+b9U+WWyzHp+N2pL9vRTk+UXHYRTVp7jTK58ZNzMLBgoLMHY4QyJMbeuw3eKxqg==", + "license": "Apache-2.0", "dependencies": { "mitt": "^3.0.1", "zod": "^3.24.1" @@ -1456,6 +1509,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -1469,6 +1523,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" }, @@ -1479,12 +1534,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" } @@ -1493,6 +1550,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" }, @@ -1503,34 +1561,39 @@ "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/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "license": "MIT", "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -1555,12 +1618,14 @@ "node_modules/cosmiconfig/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/cosmiconfig/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -1569,10 +1634,11 @@ } }, "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", @@ -1586,6 +1652,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", + "license": "MIT", "dependencies": { "cssom": "^0.5.0" } @@ -1594,6 +1661,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", + "license": "BSD-like", "dependencies": { "boolbase": "~1.0.0", "css-what": "2.1", @@ -1605,6 +1673,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "license": "BSD-2-Clause", "engines": { "node": "*" } @@ -1612,12 +1681,14 @@ "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "license": "MIT" }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", "engines": { "node": ">= 14" } @@ -1626,16 +1697,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" @@ -1650,6 +1723,7 @@ "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" }, @@ -1664,6 +1738,7 @@ "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" } @@ -1672,12 +1747,14 @@ "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/degenerator": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -1691,6 +1768,7 @@ "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" } @@ -1698,34 +1776,39 @@ "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" } }, "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==", - "engines": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { "node": ">=8" } }, "node_modules/devtools-protocol": { - "version": "0.0.1425554", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", - "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==" + "version": "0.0.1439962", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1439962.tgz", + "integrity": "sha512-jJF48UdryzKiWhJ1bLKr7BFWUQCEIT5uCNbDLqkQJBtkFxYzILJH44WN0PDKMIlGDN7Utb8vyUY85C3w4R/t2g==", + "license": "BSD-3-Clause" }, "node_modules/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, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -1734,29 +1817,30 @@ } }, "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.38.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.3.tgz", + "integrity": "sha512-vijevLh06Gtmex6BQzc9jRrGce6La0qnsF4bKwKM2L1ou0/sbJIOAkg7wz6YLLaodnUwQLljIhtrGxnkMjc1Ew==", "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.19.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.19.3.tgz", + "integrity": "sha512-lncTRk0k+8Q5D3nThnODBR8fR8x2fM798o8Vsr40Krx0DjPwpZCuxxTcFMrXMQVOqM1QB9wqWgaXPg3TbmlHqA==", "license": "Apache-2.0", "dependencies": { - "@discordjs/builders": "^1.9.0", + "@discordjs/builders": "^1.11.2", "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.5.0", - "@discordjs/rest": "^2.4.0", + "@discordjs/formatters": "^0.6.1", + "@discordjs/rest": "^2.5.0", "@discordjs/util": "^1.1.1", - "@discordjs/ws": "1.1.1", + "@discordjs/ws": "^1.2.2", "@sapphire/snowflake": "3.5.3", - "discord-api-types": "0.37.100", + "discord-api-types": "^0.38.1", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", + "magic-bytes.js": "^1.10.0", "tslib": "^2.6.3", - "undici": "6.19.8" + "undici": "6.21.1" }, "engines": { "node": ">=18" @@ -1770,6 +1854,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" }, @@ -1781,6 +1866,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "license": "MIT", "dependencies": { "domelementtype": "^1.3.0", "entities": "^1.1.1" @@ -1789,12 +1875,14 @@ "node_modules/domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "1" } @@ -1808,32 +1896,51 @@ "domelementtype": "1" } }, + "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" @@ -1842,12 +1949,14 @@ "node_modules/entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "license": "BSD-2-Clause" }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", "engines": { "node": ">=6" } @@ -1856,14 +1965,61 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, + "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/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -1873,6 +2029,7 @@ "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" }, @@ -1884,6 +2041,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -1904,6 +2062,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1912,7 +2071,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", @@ -1970,6 +2131,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" @@ -1979,10 +2141,40 @@ } }, "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, + "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" }, @@ -1993,29 +2185,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" } @@ -2025,6 +2210,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", @@ -2039,6 +2225,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" } @@ -2047,6 +2234,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -2056,10 +2244,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" }, @@ -2072,6 +2261,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" } @@ -2081,6 +2271,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" }, @@ -2093,6 +2284,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" } @@ -2102,6 +2294,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" } @@ -2110,6 +2303,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -2119,6 +2313,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", @@ -2133,6 +2328,7 @@ "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" } @@ -2141,6 +2337,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-2.0.1.tgz", "integrity": "sha512-DX3+27l6NIVYNidJjBJ4VU3Z5tk/0aEO/JJ6XEJIRPFum9kyA1PifPjnEa8Ztnv4DHNQg5EF27aypGz6s/fMdw==", + "license": "MIT", "dependencies": { "batch": "^0.6.1", "href-content": "^2.0.1", @@ -2152,6 +2349,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -2180,29 +2378,33 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] + ], + "license": "MIT" }, "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-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "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" @@ -2212,19 +2414,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" } @@ -2233,6 +2455,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", "dependencies": { "pend": "~1.2.0" } @@ -2242,6 +2465,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" }, @@ -2250,10 +2474,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" }, @@ -2265,6 +2490,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -2274,12 +2500,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": { @@ -2289,13 +2517,15 @@ "node_modules/flat-util": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.11.tgz", - "integrity": "sha512-h9ho3lHr5hDTQZKLqFDqIliDV/A8yCyP7UoSIBT4U3d7VfA/EeqsC8cxWJGIr5oCxZzMD/3BEx3SLYFX6hD8ng==" + "integrity": "sha512-h9ho3lHr5hDTQZKLqFDqIliDV/A8yCyP7UoSIBT4U3d7VfA/EeqsC8cxWJGIr5oCxZzMD/3BEx3SLYFX6hD8ng==", + "license": "MIT" }, "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.9", @@ -2307,6 +2537,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -2317,12 +2548,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": { @@ -2333,17 +2566,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==" + "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" }, @@ -2351,21 +2587,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", @@ -2385,14 +2646,53 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 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/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -2407,6 +2707,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", + "license": "MIT", "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -2419,12 +2720,15 @@ "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==" + "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", @@ -2445,6 +2749,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" }, @@ -2453,10 +2758,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" }, @@ -2472,6 +2778,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", @@ -2487,10 +2794,23 @@ "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/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -2511,19 +2831,61 @@ "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/href-content": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.3.tgz", "integrity": "sha512-ikrAoI1l5ihN5Be2cR9nozFfivVJxPQDpa4+sb6PLt/uaNE/a7A05rHbnJEUduoHddbB3GyT5tdqzXMUmPgJYA==", + "license": "MIT", "dependencies": { "remote-content": "^4.0.0" } @@ -2532,6 +2894,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/html-pdf-node/-/html-pdf-node-1.0.8.tgz", "integrity": "sha512-1PXbShoVXy8/86ZBY3xQNd5r2c/CPx/Me2wGtV0Z0Rekko5Tgow2hLms2n+OwA+PV7NyR7OPcTqsnhXIMUJLFw==", + "license": "ISC", "dependencies": { "bluebird": "^3.7.2", "handlebars": "^4.7.6", @@ -2542,12 +2905,14 @@ "node_modules/html-pdf-node/node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" }, "node_modules/html-pdf-node/node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -2563,12 +2928,14 @@ "node_modules/html-pdf-node/node_modules/devtools-protocol": { "version": "0.0.901419", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", - "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==" + "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", + "license": "BSD-3-Clause" }, "node_modules/html-pdf-node/node_modules/https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -2581,6 +2948,7 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -2588,10 +2956,17 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/html-pdf-node/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==", + "license": "MIT" + }, "node_modules/html-pdf-node/node_modules/node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "license": "MIT", "engines": { "node": "4.x || >=6.0.0" } @@ -2600,6 +2975,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -2610,6 +2986,7 @@ "integrity": "sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w==", "deprecated": "< 22.8.2 is no longer supported", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "debug": "4.3.1", "devtools-protocol": "0.0.901419", @@ -2632,6 +3009,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", + "license": "MIT", "dependencies": { "chownr": "^1.1.1", "mkdirp": "^0.5.1", @@ -2643,6 +3021,7 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -2663,6 +3042,7 @@ "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "license": "MIT", "dependencies": { "domelementtype": "^1.3.1", "domhandler": "^2.3.0", @@ -2672,23 +3052,11 @@ "readable-stream": "^3.1.1" } }, - "node_modules/htmlparser2/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/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -2701,6 +3069,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { "node": ">= 14" } @@ -2709,6 +3078,7 @@ "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" @@ -2734,21 +3104,24 @@ "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==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2765,6 +3138,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -2773,6 +3147,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" @@ -2781,17 +3157,20 @@ "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==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, "node_modules/inline-css": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-3.0.0.tgz", "integrity": "sha512-a+IE7oLaQqeVr3hMviekDDk94LA0+oZX8JEfJuXOm20diZAkOFrq/f/QZCEXpMK6qIbYr0nQNpsuioXQN1ZgXA==", + "license": "MIT", "dependencies": { "cheerio": "^0.22.0", "css-rules": "^1.0.9", @@ -2809,6 +3188,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -2820,18 +3200,21 @@ "node_modules/ip-address/node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "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" } @@ -2840,6 +3223,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" } @@ -2849,6 +3233,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" }, @@ -2861,6 +3246,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" } @@ -2868,24 +3254,28 @@ "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==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "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" @@ -2897,30 +3287,52 @@ "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" + }, + "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-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "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" @@ -2932,12 +3344,14 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/list-stylesheets": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-1.2.10.tgz", "integrity": "sha512-F85Yx9GKLJwDr1T9U34FST5m6iIXhPzqD+MRDsljZsdmoEZwllZBDbkAVaa+EpLKrr6de+P4SRGNHwrWv6zMZA==", + "license": "MIT", "dependencies": { "cheerio": "^0.22.0", "pick-util": "^1.1.4" @@ -2947,6 +3361,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -2963,93 +3378,109 @@ "node_modules/lodash.assignin": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==" + "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", + "license": "MIT" }, "node_modules/lodash.bind": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==" + "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", + "license": "MIT" }, "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" }, "node_modules/lodash.filter": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==" + "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", + "license": "MIT" }, "node_modules/lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "license": "MIT" }, "node_modules/lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", + "license": "MIT" }, "node_modules/lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==" + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", + "license": "MIT" }, "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==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" }, "node_modules/lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "deprecated": "This package is deprecated. Use destructuring assignment syntax instead." + "deprecated": "This package is deprecated. Use destructuring assignment syntax instead.", + "license": "MIT" }, "node_modules/lodash.reduce": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==" + "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", + "license": "MIT" }, "node_modules/lodash.reject": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==" + "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", + "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.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==" + "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", + "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 + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", "engines": { "node": ">=12" } }, "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==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz", + "integrity": "sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==", "license": "MIT" }, "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" }, @@ -3061,9 +3492,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" } @@ -3074,10 +3506,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/mediaquery-text": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", + "license": "MIT", "dependencies": { "cssom": "^0.5.0" } @@ -3086,6 +3528,7 @@ "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": { @@ -3093,17 +3536,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": { @@ -3114,6 +3559,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" } @@ -3122,6 +3568,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" }, @@ -3133,6 +3580,7 @@ "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" }, @@ -3144,6 +3592,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" }, @@ -3155,17 +3604,16 @@ "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" } @@ -3174,6 +3622,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" @@ -3182,15 +3631,29 @@ "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/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" }, "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" }, @@ -3201,17 +3664,20 @@ "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==" + "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": "*" } @@ -3255,39 +3721,36 @@ } } }, - "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/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==" + "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/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -3297,6 +3760,7 @@ "resolved": "https://registry.npmjs.org/node/-/node-23.11.0.tgz", "integrity": "sha512-IS7dwB4M8/iKCFuJVN4EQmMmpX1YLN/wLfkgcouPA99s9cQUpuUX7Ng0j0XIK+4Zhb4EhcDyea5P20hF26nVow==", "hasInstallScript": true, + "license": "ISC", "dependencies": { "node-bin-setup": "^1.0.0" }, @@ -3308,9 +3772,10 @@ } }, "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==", + "version": "3.75.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", + "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", + "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -3321,24 +3786,28 @@ "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==" + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" }, "node_modules/node-bin-setup": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", - "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==" + "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", + "license": "ISC" }, "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" @@ -3348,9 +3817,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" }, @@ -3367,9 +3837,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.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", + "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", + "license": "MIT-0", "engines": { "node": ">=6.0.0" } @@ -3378,6 +3849,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" }, @@ -3392,6 +3864,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", @@ -3403,6 +3877,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "~1.0.0" } @@ -3411,6 +3886,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" } @@ -3419,6 +3895,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" } @@ -3427,6 +3904,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" } @@ -3435,6 +3913,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" }, @@ -3443,17 +3922,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" @@ -3463,6 +3943,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -3477,6 +3958,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -3488,6 +3970,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -3496,6 +3979,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", @@ -3514,6 +3998,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { "node": ">= 14" } @@ -3522,6 +4007,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -3534,6 +4020,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -3545,12 +4032,14 @@ "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" }, "node_modules/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==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -3561,12 +4050,14 @@ "node_modules/parse-duration": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz", - "integrity": "sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg==" + "integrity": "sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg==", + "license": "MIT" }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -3584,6 +4075,7 @@ "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" } @@ -3592,6 +4084,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { "node": ">=8" } @@ -3600,6 +4093,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" } @@ -3609,6 +4103,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" } @@ -3618,6 +4113,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" } @@ -3627,6 +4123,10 @@ "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" } @@ -3635,6 +4135,7 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "license": "MIT", "dependencies": { "@pdf-lib/standard-fonts": "^1.0.0", "@pdf-lib/upng": "^1.0.1", @@ -3645,26 +4146,36 @@ "node_modules/pdf-lib/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" }, "node_modules/pick-util": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", + "license": "MIT", "dependencies": { "@jonkemp/package-utils": "^1.0.8" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/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" }, @@ -3676,6 +4187,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -3687,6 +4199,7 @@ "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", @@ -3713,6 +4226,7 @@ "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" } @@ -3721,6 +4235,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" }, @@ -3734,12 +4249,14 @@ "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==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -3748,6 +4265,7 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", @@ -3766,6 +4284,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { "node": ">= 14" } @@ -3774,6 +4293,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -3785,13 +4305,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" }, @@ -3806,31 +4328,34 @@ "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" } }, "node_modules/puppeteer": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.7.2.tgz", - "integrity": "sha512-ifYqoY6wGs0yZeFuFPn8BE9FhuveXkarF+eO18I2e/axdoCh4Qh1AE+qXdJBhdaeoPt6eRNTY4Dih29Jbq8wow==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.8.0.tgz", + "integrity": "sha512-8GPlUKXvZK8ANxab75UerMar14ZnJTJpPok3XN9Nx6f7SKyabyFK39pQruMni6zfrwVBrPXp3Mo6ztwKEmXaDQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.2", + "@puppeteer/browsers": "2.10.3", "chromium-bidi": "4.1.1", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1425554", - "puppeteer-core": "24.7.2", + "devtools-protocol": "0.0.1439962", + "puppeteer-core": "24.8.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -3841,14 +4366,15 @@ } }, "node_modules/puppeteer-core": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.7.2.tgz", - "integrity": "sha512-P9pZyTmJqKODFCnkZgemCpoFA4LbAa8+NumHVQKyP5X9IgdNS1ZnAnIh1sMAwhF8/xEUGf7jt+qmNLlKieFw1Q==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.8.0.tgz", + "integrity": "sha512-tDf2YKIo5kM5r0vOzT52+PTgN0bBZOA4OFgQaqYyfarrcXLLJ92wi/lSMe44hd+F+gk0gw9QsAzyRW8v6ra93w==", + "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.2", + "@puppeteer/browsers": "2.10.3", "chromium-bidi": "4.1.1", "debug": "^4.4.0", - "devtools-protocol": "0.0.1425554", + "devtools-protocol": "0.0.1439962", "typed-query-selector": "^2.12.0", "ws": "^8.18.1" }, @@ -3856,47 +4382,6 @@ "node": ">=18" } }, - "node_modules/puppeteer-core/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/puppeteer-core/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3915,12 +4400,14 @@ "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", @@ -3935,34 +4422,31 @@ "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": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { - "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" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "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==" - }, "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" }, @@ -3974,6 +4458,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-4.0.1.tgz", "integrity": "sha512-W2lDnjK4k1vAJg7UZArH/rkNYJqZuteHkX1jS7tO9TJUiLhDcu2Ejvj97gK/XbZNDhzld0sn11OW8vihin4cAg==", + "license": "MIT", "dependencies": { "axios": "^1.7.9", "proxy-from-env": "^1.1.0" @@ -3983,6 +4468,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" } @@ -3991,6 +4477,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4000,6 +4487,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" } @@ -4008,15 +4496,17 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "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" @@ -4026,6 +4516,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" }, @@ -4055,6 +4547,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -4076,12 +4569,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" @@ -4094,6 +4589,7 @@ "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" }, @@ -4104,13 +4600,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" }, @@ -4123,6 +4621,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" } @@ -4130,7 +4629,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", @@ -4149,7 +4649,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/simple-get": { "version": "4.0.1", @@ -4169,6 +4670,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -4180,6 +4682,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4189,6 +4692,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", @@ -4205,6 +4709,7 @@ "version": "1.12.2", "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", + "license": "MIT (http://mootools.net/license.txt)", "engines": { "node": "*" } @@ -4213,6 +4718,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -4222,6 +4728,7 @@ "version": "2.8.4", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -4235,6 +4742,7 @@ "version": "8.0.5", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", @@ -4248,6 +4756,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { "node": ">= 14" } @@ -4256,6 +4765,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -4264,6 +4774,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" @@ -4273,6 +4784,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "license": "MIT", "bin": { "specificity": "bin/specificity" } @@ -4282,6 +4794,7 @@ "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", "dev": true, + "license": "MIT", "dependencies": { "through": "2" }, @@ -4293,13 +4806,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" } @@ -4308,6 +4823,7 @@ "version": "2.22.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "license": "MIT", "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" @@ -4317,23 +4833,20 @@ } }, "node_modules/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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, - "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==" - }, "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" } @@ -4342,6 +4855,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", @@ -4355,6 +4869,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" }, @@ -4367,6 +4882,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" }, @@ -4378,6 +4894,7 @@ "version": "1.4.8", "resolved": "https://registry.npmjs.org/style-data/-/style-data-1.4.8.tgz", "integrity": "sha512-RBJD+YQef4PzYKqC4PQEjDvyX709mwEClYg9u0A5EPXqdSkN2BtMnF/tW7EtS9Q0FnBF+lrWsK5+bEKqA+++Dg==", + "license": "MIT", "dependencies": { "cheerio": "^0.22.0", "mediaquery-text": "^1.2.0", @@ -4388,6 +4905,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" }, @@ -4396,10 +4914,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", @@ -4412,15 +4931,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", @@ -4431,28 +4951,31 @@ "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", @@ -4463,12 +4986,14 @@ "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==" + "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", @@ -4484,29 +5009,18 @@ "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==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/text-decoder": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.4" } @@ -4515,18 +5029,21 @@ "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==" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "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" }, @@ -4537,7 +5054,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", @@ -4550,6 +5068,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", @@ -4570,13 +5089,15 @@ "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==" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "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" }, @@ -4591,12 +5112,14 @@ "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" }, @@ -4609,6 +5132,7 @@ "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" }, @@ -4621,6 +5145,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" }, @@ -4631,12 +5156,13 @@ "node_modules/typed-query-selector": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", - "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==" + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "license": "MIT" }, "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.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -4644,18 +5170,20 @@ "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/uglify-js": { "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -4668,15 +5196,16 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", + "license": "MIT", "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" } }, "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" @@ -4685,13 +5214,15 @@ "node_modules/universal-user-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==" + "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", + "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" } @@ -4699,23 +5230,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" @@ -4726,6 +5261,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" }, @@ -4740,15 +5276,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" } @@ -4756,12 +5294,14 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -4777,12 +5317,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.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -4804,6 +5345,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } @@ -4811,12 +5353,14 @@ "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" }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -4834,6 +5378,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -4842,15 +5387,17 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "node_modules/zod": { - "version": "3.24.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", - "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index b6f81c20..7961a94e 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -13,7 +13,7 @@ import { TextInputBuilder, TextInputStyle, ModalSubmitInteraction, - User, + User, } from "discord.js"; import fetchJobListings from "@root/src/lib/utils/jobUtils/Adzuna_job_search"; import { JobResult } from "@root/src/lib/types/JobResult"; From 64ae115937f201b296503af9a376b824784fb628 Mon Sep 17 00:00:00 2001 From: Nazmul Date: Mon, 5 May 2025 13:11:20 -0400 Subject: [PATCH 309/317] testPush --- 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 7961a94e..7c4da3ae 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -29,7 +29,7 @@ import { PDFDocument, StandardFonts, rgb } from "pdf-lib"; // Temporary storage for user job data const userJobData = new Map(); - +//adding something 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.`; From 9a9061e7d5af13e370d69522ee45ea41cb176bf0 Mon Sep 17 00:00:00 2001 From: BMKellner <145494653+BMKellner@users.noreply.github.com> Date: Mon, 5 May 2025 13:12:39 -0400 Subject: [PATCH 310/317] Job Form Fixed Questions Separated --- build/Makefile | 4 +- build/config.gypi | 24 +++---- build/sage.target.mk | 28 ++++---- src/commands/jobs/jobform.ts | 127 +++++++++++++++++++---------------- 4 files changed, 98 insertions(+), 85 deletions(-) diff --git a/build/Makefile b/build/Makefile index 01b31e7f..6782c762 100644 --- a/build/Makefile +++ b/build/Makefile @@ -331,8 +331,8 @@ ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ 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/23.11.0" "-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/Users/karansingh/Library/Caches/node-gyp/23.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/23.11.0/include/node/common.gypi "--toplevel-dir=." binding.gyp -Makefile: $(srcdir)/binding.gyp $(srcdir)/../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/build/config.gypi $(srcdir)/../Library/Caches/node-gyp/23.11.0/include/node/common.gypi +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/ben/Library/Caches/node-gyp/23.11.0" "-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/Users/ben/Library/Caches/node-gyp/23.11.0/<(target_arch)/node.lib" "-Dmodule_root_dir=/Users/ben/Documents/GitHub/SageTeamY" "-Dnode_engine=v8" "--depth=." "-Goutput_dir=." "--generator-output=build" -I/Users/ben/Documents/GitHub/SageTeamY/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/ben/Library/Caches/node-gyp/23.11.0/include/node/common.gypi "--toplevel-dir=." binding.gyp +Makefile: $(srcdir)/../../../Library/Caches/node-gyp/23.11.0/include/node/common.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp $(srcdir)/../../../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(call do_cmd,regen_makefile) # "all" is a concatenation of the "all" targets from all the included diff --git a/build/config.gypi b/build/config.gypi index 2f7495aa..f085a674 100644 --- a/build/config.gypi +++ b/build/config.gypi @@ -488,27 +488,27 @@ "v8_use_siphash": 1, "want_separate_host_toolset": 0, "xcode_version": "16.0", - "nodedir": "/Users/karansingh/Library/Caches/node-gyp/23.11.0", - "python": "/Library/Frameworks/Python.framework/Versions/3.11/bin/python3", + "nodedir": "/Users/ben/Library/Caches/node-gyp/23.11.0", + "python": "/opt/homebrew/opt/python@3.13/bin/python3.13", "standalone_static_library": 1, "fallback_to_build": "true", "build_from_source": "true", - "module": "/Users/karansingh/SageTeamY/lib/binding/your_module.node", + "module": "/Users/ben/Documents/GitHub/SageTeamY/lib/binding/your_module.node", "module_name": "your_module", - "module_path": "/Users/karansingh/SageTeamY/lib/binding", + "module_path": "/Users/ben/Documents/GitHub/SageTeamY/lib/binding", "napi_version": "10", "node_abi_napi": "napi", "node_napi_label": "node-v131", - "global_prefix": "/usr/local", - "local_prefix": "/Users/karansingh/SageTeamY", - "globalconfig": "/usr/local/etc/npmrc", + "global_prefix": "/Users/ben/.npm-global", + "local_prefix": "/Users/ben/Documents/GitHub/SageTeamY", + "globalconfig": "/Users/ben/.npm-global/etc/npmrc", "engine_strict": "true", - "userconfig": "/Users/karansingh/.npmrc", - "init_module": "/Users/karansingh/.npm-init.js", + "userconfig": "/Users/ben/.npmrc", + "init_module": "/Users/ben/.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" + "cache": "/Users/ben/.npm", + "user_agent": "npm/10.2.4 node/v20.11.1 darwin arm64 workspaces/false", + "prefix": "/Users/ben/.npm-global" } } diff --git a/build/sage.target.mk b/build/sage.target.mk index 66276dd5..5b032f9d 100644 --- a/build/sage.target.mk +++ b/build/sage.target.mk @@ -46,13 +46,13 @@ CFLAGS_OBJC_Debug := CFLAGS_OBJCC_Debug := INCS_Debug := \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/include/node \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/src \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/deps/openssl/config \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/deps/openssl/openssl/include \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/deps/uv/include \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/deps/zlib \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/deps/v8/include + -I/Users/ben/Library/Caches/node-gyp/23.11.0/include/node \ + -I/Users/ben/Library/Caches/node-gyp/23.11.0/src \ + -I/Users/ben/Library/Caches/node-gyp/23.11.0/deps/openssl/config \ + -I/Users/ben/Library/Caches/node-gyp/23.11.0/deps/openssl/openssl/include \ + -I/Users/ben/Library/Caches/node-gyp/23.11.0/deps/uv/include \ + -I/Users/ben/Library/Caches/node-gyp/23.11.0/deps/zlib \ + -I/Users/ben/Library/Caches/node-gyp/23.11.0/deps/v8/include DEFS_Release := \ '-DNODE_GYP_MODULE_NAME=sage' \ @@ -96,13 +96,13 @@ CFLAGS_OBJC_Release := CFLAGS_OBJCC_Release := INCS_Release := \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/include/node \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/src \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/deps/openssl/config \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/deps/openssl/openssl/include \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/deps/uv/include \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/deps/zlib \ - -I/Users/karansingh/Library/Caches/node-gyp/23.11.0/deps/v8/include + -I/Users/ben/Library/Caches/node-gyp/23.11.0/include/node \ + -I/Users/ben/Library/Caches/node-gyp/23.11.0/src \ + -I/Users/ben/Library/Caches/node-gyp/23.11.0/deps/openssl/config \ + -I/Users/ben/Library/Caches/node-gyp/23.11.0/deps/openssl/openssl/include \ + -I/Users/ben/Library/Caches/node-gyp/23.11.0/deps/uv/include \ + -I/Users/ben/Library/Caches/node-gyp/23.11.0/deps/zlib \ + -I/Users/ben/Library/Caches/node-gyp/23.11.0/deps/v8/include OBJS := diff --git a/src/commands/jobs/jobform.ts b/src/commands/jobs/jobform.ts index 99813b47..829dc710 100644 --- a/src/commands/jobs/jobform.ts +++ b/src/commands/jobs/jobform.ts @@ -1,48 +1,46 @@ import { Command } from '@root/src/lib/types/Command'; -import { ApplicationCommandOptionData, +import { + ApplicationCommandOptionData, ChatInputCommandInteraction, DMChannel, InteractionResponse, - MessageFlags } from 'discord.js'; + MessageFlags +} from 'discord.js'; import { validatePreferences } from '../../lib/utils/jobUtils/validatePreferences'; import { JobPreferenceAPI } from '@root/src/lib/utils/jobUtils/jobDatabase'; // prettier-ignore -// 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?', - 'Full time, Part time, and/or Internship?', - 'How far are you willing to travel? (in miles)', - 'What are your salary expectations?' - ], - [ - 'Interest 1', - 'Interest 2', - 'Interest 3', - 'Interest 4', - 'Interest 5' - ], - [ - 'Strength 1', - 'Strength 2', - 'Strength 3', - 'Goal 1', - 'Goal 2' - ] +const questions: string[] = [ + // Location & logistics + '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)', + 'What are your salary expectations?', + + // Interests + 'Interest 1', + 'Interest 2', + 'Interest 3', + 'Interest 4', + 'Interest 5', + + // Strengths & goals + 'Strength 1', + 'Strength 2', + 'Strength 3', + 'Goal 1', + 'Goal 2' ]; -// prettier-ignore -export default class extends Command { - +export default class JobFormCommand extends Command { name = 'jobform'; description = 'Starts a job preferences form via direct message.'; - - // Gives option to command to choose what question set user is answering. options: ApplicationCommandOptionData[] = []; - async run(interaction: ChatInputCommandInteraction): Promise | void> { + async run( + interaction: ChatInputCommandInteraction + ): Promise | void> { const dm = await interaction.user.createDM(); await interaction.reply({ content: 'I’ve sent you a DM with the job form questions.', @@ -51,7 +49,11 @@ export default class extends Command { this.collectAnswers(dm, interaction.user.id, interaction); } - private async collectAnswers(channel: DMChannel, userId: string, interaction: ChatInputCommandInteraction): Promise { + private async collectAnswers( + channel: DMChannel, + userId: string, + interaction: ChatInputCommandInteraction + ): Promise { const answers: string[] = []; const splitAnswers: string[] = []; let current = 0; @@ -62,7 +64,9 @@ export default class extends Command { ); const ask = () => { - channel.send(`**Question ${current + 1}/${questions.length}:** ${questions[current]}`); + channel.send( + `**Question ${current + 1}/${questions.length}:** ${questions[current]}` + ); }; const collector = channel.createMessageCollector({ @@ -70,7 +74,7 @@ export default class extends Command { time: 5 * 60 * 1000 // 5 minutes }); - collector.on('collect', async msg => { + collector.on('collect', async (msg) => { const content = msg.content.trim(); if (content.toLowerCase() === 'skip') { @@ -80,25 +84,29 @@ export default class extends Command { return ask(); } else { answers[current] = content; - // Validate formatting immediately + + // Split and validate all answers so far + splitAnswers.length = 0; for (let i = 0; i < questions.length; i++) { if (answers[i]) { - const newAnswers = answers[i].split(',').map((a) => a.trim()); - splitAnswers.push(...newAnswers); - } - - - const { isValid, errors } = validatePreferences(splitAnswers, 0, true); - if (!isValid) { - // Show errors and re-ask same question - await channel.send(`**Formatting error:**\n${errors.join('\n')}`); - answers[current] = ''; - return ask(); + splitAnswers.push( + ...answers[i].split(',').map((a) => a.trim()) + ); } } + const { isValid, errors } = validatePreferences( + splitAnswers, + 0, + true + ); + if (!isValid) { + await channel.send(`**Formatting error:**\n${errors.join('\n')}`); + answers[current] = ''; + return ask(); + } } - // Move on or finish + // next or finish if (current < questions.length - 1) { current++; ask(); @@ -109,30 +117,35 @@ export default class extends Command { collector.on('end', async (_collected, reason) => { if (reason !== 'completed') { - await channel.send('Form timed out. Please run `/jobform` again to restart.'); + await channel.send( + 'Form timed out. Please run `/jobform` again to restart.' + ); return; } - // Final validation - const { isValid, errors } = validatePreferences(splitAnswers, 0, true); + const { isValid, errors } = validatePreferences( + splitAnswers, + 0, + true + ); if (!isValid) { await channel.send(`Form validation failed:\n${errors.join('\n')}`); return; } - // Persist into Mongo - const jobPreferenceAPI = new JobPreferenceAPI(interaction.client.mongo); + // Persist into MongoDB + const jobPreferenceAPI = new JobPreferenceAPI( + interaction.client.mongo + ); await jobPreferenceAPI.storeFormResponses(userId, answers); await channel.send( - `${`✅ Preferences saved! `}\n` + - `You can now use the /jobs command to find job listings based on your preferences.` + `✅ Preferences saved!\n` + + `You can now use the /jobs command to find job listings based on your preferences.` ); }); - // Kick off the first question + // start the first question ask(); } - } - From bf31ee7df4f144fa83080aa8b06c48c5c495d6e4 Mon Sep 17 00:00:00 2001 From: Nazmul Date: Mon, 5 May 2025 13:16:04 -0400 Subject: [PATCH 311/317] fixed merge issues --- src/commands/jobs/jobs.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index 7c4da3ae..fac2218f 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -29,7 +29,6 @@ import { PDFDocument, StandardFonts, rgb } from "pdf-lib"; // Temporary storage for user job data const userJobData = new Map(); -//adding something 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.`; From 37c5c06da77a309f5b58b849c43847c643062a0e Mon Sep 17 00:00:00 2001 From: jmartgmz Date: Mon, 5 May 2025 13:19:07 -0400 Subject: [PATCH 312/317] added dependencies to package --- package-lock.json | 34 +++++++++++++++++++++++++++++++ package.json | 1 + src/commands/reminders/command.ts | 3 ++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 395f9f37..94642f82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@octokit/rest": "^18.3.5", "axios": "^1.4.0", "canvas": "^3.1.0", + "chartjs-node-canvas": "^5.0.0", "console-stamp": "^3.0.2", "discord.js": "^14.16.3", "module-alias": "^2.2.2", @@ -339,6 +340,13 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT", + "peer": true + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1339,6 +1347,32 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chart.js": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", + "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/chartjs-node-canvas": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-5.0.0.tgz", + "integrity": "sha512-+Lc5phRWjb+UxAIiQpKgvOaG6Mw276YQx2jl2BrxoUtI3A4RYTZuGM5Dq+s4ReYmCY42WEPSR6viF3lDSTxpvw==", + "license": "MIT", + "dependencies": { + "canvas": "^3.1.0", + "tslib": "^2.8.1" + }, + "peerDependencies": { + "chart.js": "^4.4.8" + } + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", diff --git a/package.json b/package.json index fad84fe0..9f6f15e1 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "@octokit/rest": "^18.3.5", "axios": "^1.4.0", "canvas": "^3.1.0", + "chartjs-node-canvas": "^5.0.0", "console-stamp": "^3.0.2", "discord.js": "^14.16.3", "module-alias": "^2.2.2", diff --git a/src/commands/reminders/command.ts b/src/commands/reminders/command.ts index 6f4391f2..eb65eb05 100644 --- a/src/commands/reminders/command.ts +++ b/src/commands/reminders/command.ts @@ -1,4 +1,5 @@ -// Main Command class for the reminder system +// This file contains the command handler for the reminder system of a Discord bot. + import { BOT } from '@root/config'; import { ChatInputCommandInteraction } from 'discord.js'; import { Command } from '@lib/types/Command'; From 05cd4e0ef9cf79ddd750a4ac72c2662ab26ba4dc Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Tue, 6 May 2025 22:18:24 -0400 Subject: [PATCH 313/317] Refactor build configuration and update paths - Removed the sage.target.mk file as it is no longer needed. - Updated the sage.vcxproj file to change the ProjectGuid and update include paths to reflect the new node-gyp cache location. - Modified sage.vcxproj.filters to adjust filters and include paths for the new node-gyp location. - Changed the include path for win_delay_load_hook.cc in the project filters. - Refactored distance calculation in jobs.ts to use a constant 'Radius' instead of 'R'. --- build/Makefile | 347 ----------------- build/binding.Makefile | 6 - build/binding.sln | 12 +- build/config.gypi | 56 +-- build/gyp-mac-tool | 772 ------------------------------------- build/sage.target.mk | 159 -------- build/sage.vcxproj | 16 +- build/sage.vcxproj.filters | 31 +- src/commands/jobs/jobs.ts | 2 +- 9 files changed, 55 insertions(+), 1346 deletions(-) delete mode 100644 build/Makefile delete mode 100644 build/binding.Makefile delete mode 100755 build/gyp-mac-tool delete mode 100644 build/sage.target.mk diff --git a/build/Makefile b/build/Makefile deleted file mode 100644 index 6782c762..00000000 --- a/build/Makefile +++ /dev/null @@ -1,347 +0,0 @@ -# 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/ben/Library/Caches/node-gyp/23.11.0" "-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/Users/ben/Library/Caches/node-gyp/23.11.0/<(target_arch)/node.lib" "-Dmodule_root_dir=/Users/ben/Documents/GitHub/SageTeamY" "-Dnode_engine=v8" "--depth=." "-Goutput_dir=." "--generator-output=build" -I/Users/ben/Documents/GitHub/SageTeamY/build/config.gypi -I/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/ben/Library/Caches/node-gyp/23.11.0/include/node/common.gypi "--toplevel-dir=." binding.gyp -Makefile: $(srcdir)/../../../Library/Caches/node-gyp/23.11.0/include/node/common.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp $(srcdir)/../../../../../usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.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 deleted file mode 100644 index e90d0e3d..00000000 --- a/build/binding.Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# 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 index faa27849..ca21bbd8 100644 --- a/build/binding.sln +++ b/build/binding.sln @@ -1,17 +1,17 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2015 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sage", "sage.vcxproj", "{27A859CD-4D6B-679F-943D-8D47ADCCBA5E}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sage", "sage.vcxproj", "{624B7F4D-9D3E-D315-6578-783939BDBFED}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 Release|x64 = Release|x64 + Debug|x64 = Debug|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {27A859CD-4D6B-679F-943D-8D47ADCCBA5E}.Debug|x64.ActiveCfg = Debug|x64 - {27A859CD-4D6B-679F-943D-8D47ADCCBA5E}.Debug|x64.Build.0 = Debug|x64 - {27A859CD-4D6B-679F-943D-8D47ADCCBA5E}.Release|x64.ActiveCfg = Release|x64 - {27A859CD-4D6B-679F-943D-8D47ADCCBA5E}.Release|x64.Build.0 = Release|x64 + {624B7F4D-9D3E-D315-6578-783939BDBFED}.Release|x64.ActiveCfg = Release|x64 + {624B7F4D-9D3E-D315-6578-783939BDBFED}.Release|x64.Build.0 = Release|x64 + {624B7F4D-9D3E-D315-6578-783939BDBFED}.Debug|x64.ActiveCfg = Debug|x64 + {624B7F4D-9D3E-D315-6578-783939BDBFED}.Debug|x64.Build.0 = Debug|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/build/config.gypi b/build/config.gypi index f085a674..e22e8098 100644 --- a/build/config.gypi +++ b/build/config.gypi @@ -16,13 +16,12 @@ "defines": [], "include_dirs": [], "libraries": [], - "msvs_configuration_platform": "ARM64", - "xcode_configuration_platform": "arm64" + "msbuild_toolset": "v143", + "msvs_windows_target_platform_version": "10.0.22621.0" }, "variables": { - "arm_fpu": "neon", "asan": 0, - "clang": 1, + "clang": 0, "control_flow_guard": "false", "coverage": "false", "dcheck_always_on": 0, @@ -33,16 +32,17 @@ "enable_pgo_use": "false", "error_on_warn": "false", "force_dynamic_crt": 0, - "host_arch": "arm64", - "icu_data_in": "../../deps/icu-tmp/icudt76l.dat", + "host_arch": "x64", + "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": "76", "libdir": "lib", - "llvm_version": "16.0", + "llvm_version": "0.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", @@ -427,7 +427,7 @@ ], "node_module_version": 131, "node_no_browser_globals": "false", - "node_prefix": "/", + "node_prefix": "\\usr\\local", "node_quic": "false", "node_release_urlbase": "https://nodejs.org/download/release/", "node_shared": "false", @@ -454,16 +454,16 @@ "node_use_node_snapshot": "true", "node_use_openssl": "true", "node_use_v8_platform": "true", - "node_with_ltcg": "false", + "node_with_ltcg": "true", "node_without_node_options": "false", - "node_write_snapshot_as_array_literals": "false", + "node_write_snapshot_as_array_literals": "true", "openssl_is_fips": "false", "openssl_quic": "false", "ossfuzz": "false", - "shlib_suffix": "131.dylib", + "shlib_suffix": "so.131", "single_executable_application": "true", "suppress_all_error_on_warn": "false", - "target_arch": "arm64", + "target_arch": "x64", "ubsan": 0, "use_ccache_win": 0, "use_prefix_to_find_headers": "false", @@ -480,6 +480,8 @@ "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_optimized_debug": 1, "v8_promise_internal_field_count": 1, @@ -487,28 +489,28 @@ "v8_trace_maps": 0, "v8_use_siphash": 1, "want_separate_host_toolset": 0, - "xcode_version": "16.0", - "nodedir": "/Users/ben/Library/Caches/node-gyp/23.11.0", - "python": "/opt/homebrew/opt/python@3.13/bin/python3.13", + "nodedir": "C:\\Users\\jason\\AppData\\Local\\node-gyp\\Cache\\23.11.0", + "python": "C:\\Python313\\python.exe", "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": "/Users/ben/Documents/GitHub/SageTeamY/lib/binding/your_module.node", + "module": "C:\\Users\\jason\\Desktop\\CISC367\\SageTeamY\\lib\\binding\\your_module.node", "module_name": "your_module", - "module_path": "/Users/ben/Documents/GitHub/SageTeamY/lib/binding", + "module_path": "C:\\Users\\jason\\Desktop\\CISC367\\SageTeamY\\lib\\binding", "napi_version": "10", "node_abi_napi": "napi", "node_napi_label": "node-v131", - "global_prefix": "/Users/ben/.npm-global", - "local_prefix": "/Users/ben/Documents/GitHub/SageTeamY", - "globalconfig": "/Users/ben/.npm-global/etc/npmrc", + "cache": "C:\\Users\\jason\\AppData\\Local\\npm-cache", "engine_strict": "true", - "userconfig": "/Users/ben/.npmrc", - "init_module": "/Users/ben/.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/ben/.npm", - "user_agent": "npm/10.2.4 node/v20.11.1 darwin arm64 workspaces/false", - "prefix": "/Users/ben/.npm-global" + "globalconfig": "C:\\Users\\jason\\AppData\\Roaming\\npm\\etc\\npmrc", + "global_prefix": "C:\\Users\\jason\\AppData\\Roaming\\npm", + "init_module": "C:\\Users\\jason\\.npm-init.js", + "local_prefix": "C:\\Users\\jason\\Desktop\\CISC367\\SageTeamY", + "node_gyp": "C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js", + "npm_version": "10.9.2", + "prefix": "C:\\Users\\jason\\AppData\\Roaming\\npm", + "userconfig": "C:\\Users\\jason\\.npmrc", + "user_agent": "npm/10.9.2 node/v23.11.0 win32 x64 workspaces/false" } } diff --git a/build/gyp-mac-tool b/build/gyp-mac-tool deleted file mode 100755 index ffef860c..00000000 --- a/build/gyp-mac-tool +++ /dev/null @@ -1,772 +0,0 @@ -#!/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( - " - {27A859CD-4D6B-679F-943D-8D47ADCCBA5E} + {624B7F4D-9D3E-D315-6578-783939BDBFED} Win32Proj sage true @@ -48,7 +48,7 @@ - C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\include\node;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\src;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\config;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\openssl\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\uv\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\zlib;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\v8\include;%(AdditionalIncludeDirectories) + C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\include\node;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\src;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\config;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\openssl\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\uv\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\zlib;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\v8\include;%(AdditionalIncludeDirectories) /Zc:__cplusplus -std:c++20 /Zm2000 %(AdditionalOptions) EnableFastChecks true @@ -72,7 +72,7 @@ /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\\selin\\AppData\\Local\\node-gyp\\Cache\\23.9.0\\x64\\node.lib" + 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\\jason\\AppData\\Local\\node-gyp\\Cache\\23.11.0\\x64\\node.lib" /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) node.exe;%(DelayLoadDLLs) true @@ -84,13 +84,13 @@ MachineX64 - C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\include\node;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\src;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\config;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\openssl\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\uv\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\zlib;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\v8\include;%(AdditionalIncludeDirectories) + C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\include\node;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\src;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\config;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\openssl\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\uv\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\zlib;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.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\selin\AppData\Local\node-gyp\Cache\23.9.0\include\node;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\src;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\config;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\openssl\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\uv\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\zlib;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\v8\include;%(AdditionalIncludeDirectories) + C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\include\node;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\src;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\config;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\openssl\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\uv\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\zlib;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\v8\include;%(AdditionalIncludeDirectories) /Zc:__cplusplus -std:c++20 /Zm2000 %(AdditionalOptions) true OldStyle @@ -117,7 +117,7 @@ /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\\selin\\AppData\\Local\\node-gyp\\Cache\\23.9.0\\x64\\node.lib" + 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\\jason\\AppData\\Local\\node-gyp\\Cache\\23.11.0\\x64\\node.lib" /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) node.exe;%(DelayLoadDLLs) true @@ -129,7 +129,7 @@ MachineX64 - C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\include\node;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\src;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\config;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\openssl\openssl\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\uv\include;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\zlib;C:\Users\selin\AppData\Local\node-gyp\Cache\23.9.0\deps\v8\include;%(AdditionalIncludeDirectories) + C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\include\node;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\src;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\config;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\openssl\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\uv\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\zlib;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.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) @@ -138,7 +138,7 @@ - + diff --git a/build/sage.vcxproj.filters b/build/sage.vcxproj.filters index 25be227f..8d7a3a8f 100644 --- a/build/sage.vcxproj.filters +++ b/build/sage.vcxproj.filters @@ -10,34 +10,25 @@ {7B735499-E5DD-1C2B-6C26-70023832A1CF} - - {E9F714C1-DA89-54E2-60CF-39FEB20BF756} + + {92EF4BA8-6BC2-65D1-451F-28EBD4AE726A} - - {45B03FE7-4348-5CE5-27CA-49253FE45921} + + {A3C8E949-BCF6-0C67-6656-340A2A097708} - - {F852EB63-437C-846A-220F-8D9ED6DAEC1D} - - - {D51E5808-912B-5C70-4BB7-475D1DBFA067} - - - {741E0E76-39B2-B1AB-9FA1-F1A20B16F295} - - + {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} @@ -48,8 +39,8 @@ ..\src - - C:\Users\selin\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\src + + C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\src .. diff --git a/src/commands/jobs/jobs.ts b/src/commands/jobs/jobs.ts index 603bea29..121baa70 100644 --- a/src/commands/jobs/jobs.ts +++ b/src/commands/jobs/jobs.ts @@ -654,7 +654,7 @@ export default class extends Command { const distance = (lat1 === 0 && lon1 === 0) || (lat2 === 0 && lon2 === 0) ? -1 - : R * c; + : Radius * c; return distance; } From dee93eef7e3631ff0cd6ca72ea5c8ecef5403c2c Mon Sep 17 00:00:00 2001 From: jmartgmz Date: Wed, 7 May 2025 13:00:47 -0400 Subject: [PATCH 314/317] feat(reminders): Implement email handling and job reminder functionality --- src/commands/reminders/{ => newreminders}/command.ts | 0 src/commands/reminders/{ => newreminders}/constants.ts | 0 src/commands/reminders/{ => newreminders}/email-handlers.ts | 0 src/commands/reminders/{ => newreminders}/index.ts | 0 src/commands/reminders/{ => newreminders}/job-handlers.ts | 0 src/commands/reminders/{ => newreminders}/menu-handlers.ts | 0 src/commands/reminders/{ => newreminders}/reminder-handlers.ts | 0 src/commands/reminders/{ => newreminders}/types.ts | 0 src/commands/reminders/{ => newreminders}/ui.ts | 0 src/commands/reminders/{ => newreminders}/utils.ts | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename src/commands/reminders/{ => newreminders}/command.ts (100%) rename src/commands/reminders/{ => newreminders}/constants.ts (100%) rename src/commands/reminders/{ => newreminders}/email-handlers.ts (100%) rename src/commands/reminders/{ => newreminders}/index.ts (100%) rename src/commands/reminders/{ => newreminders}/job-handlers.ts (100%) rename src/commands/reminders/{ => newreminders}/menu-handlers.ts (100%) rename src/commands/reminders/{ => newreminders}/reminder-handlers.ts (100%) rename src/commands/reminders/{ => newreminders}/types.ts (100%) rename src/commands/reminders/{ => newreminders}/ui.ts (100%) rename src/commands/reminders/{ => newreminders}/utils.ts (100%) diff --git a/src/commands/reminders/command.ts b/src/commands/reminders/newreminders/command.ts similarity index 100% rename from src/commands/reminders/command.ts rename to src/commands/reminders/newreminders/command.ts diff --git a/src/commands/reminders/constants.ts b/src/commands/reminders/newreminders/constants.ts similarity index 100% rename from src/commands/reminders/constants.ts rename to src/commands/reminders/newreminders/constants.ts diff --git a/src/commands/reminders/email-handlers.ts b/src/commands/reminders/newreminders/email-handlers.ts similarity index 100% rename from src/commands/reminders/email-handlers.ts rename to src/commands/reminders/newreminders/email-handlers.ts diff --git a/src/commands/reminders/index.ts b/src/commands/reminders/newreminders/index.ts similarity index 100% rename from src/commands/reminders/index.ts rename to src/commands/reminders/newreminders/index.ts diff --git a/src/commands/reminders/job-handlers.ts b/src/commands/reminders/newreminders/job-handlers.ts similarity index 100% rename from src/commands/reminders/job-handlers.ts rename to src/commands/reminders/newreminders/job-handlers.ts diff --git a/src/commands/reminders/menu-handlers.ts b/src/commands/reminders/newreminders/menu-handlers.ts similarity index 100% rename from src/commands/reminders/menu-handlers.ts rename to src/commands/reminders/newreminders/menu-handlers.ts diff --git a/src/commands/reminders/reminder-handlers.ts b/src/commands/reminders/newreminders/reminder-handlers.ts similarity index 100% rename from src/commands/reminders/reminder-handlers.ts rename to src/commands/reminders/newreminders/reminder-handlers.ts diff --git a/src/commands/reminders/types.ts b/src/commands/reminders/newreminders/types.ts similarity index 100% rename from src/commands/reminders/types.ts rename to src/commands/reminders/newreminders/types.ts diff --git a/src/commands/reminders/ui.ts b/src/commands/reminders/newreminders/ui.ts similarity index 100% rename from src/commands/reminders/ui.ts rename to src/commands/reminders/newreminders/ui.ts diff --git a/src/commands/reminders/utils.ts b/src/commands/reminders/newreminders/utils.ts similarity index 100% rename from src/commands/reminders/utils.ts rename to src/commands/reminders/newreminders/utils.ts From 996b0834c1a5d920793140ba46872d1e7e0986f4 Mon Sep 17 00:00:00 2001 From: jmartgmz Date: Wed, 7 May 2025 13:09:10 -0400 Subject: [PATCH 315/317] original reminders added --- src/commands/reminders/cancelreminder.ts | 44 ++++++ src/commands/reminders/remind.ts | 165 +++++++++++++++++++++++ src/commands/reminders/viewreminders.ts | 93 +++++++++++++ 3 files changed, 302 insertions(+) create mode 100644 src/commands/reminders/cancelreminder.ts create mode 100644 src/commands/reminders/remind.ts create mode 100644 src/commands/reminders/viewreminders.ts diff --git a/src/commands/reminders/cancelreminder.ts b/src/commands/reminders/cancelreminder.ts new file mode 100644 index 00000000..5ec67c16 --- /dev/null +++ b/src/commands/reminders/cancelreminder.ts @@ -0,0 +1,44 @@ +import { Reminder } from '@lib/types/Reminder'; +import { DB } from '@root/config'; +import { ApplicationCommandOptionData, ApplicationCommandOptionType, ChatInputCommandInteraction, InteractionResponse } from 'discord.js'; +import { Command } from '@lib/types/Command'; + +export default class extends Command { + + description = 'Cancel any pending reminders you may have.'; + extendedHelp = 'You can only cancel one reminder at a time'; + + options: ApplicationCommandOptionData[] = [ + { + name: 'remindernumber', + type: ApplicationCommandOptionType.Integer, + required: true, + description: 'ID of the reminder to cancel' + } + ] + + async run(interaction: ChatInputCommandInteraction): Promise | void> { + const remindNum = interaction.options.getInteger('remindernumber') - 1; + + 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()); + const reminder = reminders[remindNum]; + + if (!reminder) { + interaction.reply({ + content: `I couldn't find reminder **${remindNum}**. Use the \`viewremind\` command to see your current reminders.`, + ephemeral: true + }); + } + + interaction.client.mongo.collection(DB.REMINDERS).findOneAndDelete(reminder); + + const hidden = reminder.mode === 'private'; + return interaction.reply({ + content: `Canceled reminder: **${reminder.content}**`, + ephemeral: hidden + }); + } + +} diff --git a/src/commands/reminders/remind.ts b/src/commands/reminders/remind.ts new file mode 100644 index 00000000..ac8f78dc --- /dev/null +++ b/src/commands/reminders/remind.ts @@ -0,0 +1,165 @@ +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.'; + options: ApplicationCommandOptionData[] = [ + { + 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: 'jobs', + description: 'Create a job reminder', + type: ApplicationCommandOptionType.Subcommand, + options: [ + { + name: 'job-repeat', + description: 'How often you want the reminder to repeat', + choices: [ + { name: 'Daily', value: 'daily' }, + { name: 'Weekly', value: 'weekly' } + ], + 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' }, + { name: 'Default', value: 'default' } + ], + type: ApplicationCommandOptionType.String + } + ] + } + ]; + + async run( + interaction: ChatInputCommandInteraction + ): Promise | void> { + const subcommand: string = interaction.options.getSubcommand(); + + if (subcommand === 'jobs') { + const jobReminderRepeat = interaction.options.getString('job-repeat') as + | 'daily' + | 'weekly' || null; + + const filterBy = interaction.options.getString('filter-type') as + | 'relevance' + | 'salary' + | 'date' + | 'default' + || 'default'; // fallback to default if null + + const jobReminder: Reminder = { + owner: interaction.user.id, + content: 'Job Reminder', + mode: 'private', + expires: new Date(), + repeat: jobReminderRepeat, + filterBy + }; + + const existing = await interaction.client.mongo + .collection(DB.REMINDERS) + .findOne({ + owner: interaction.user.id, + content: 'Job Reminder', + filterBy + }); + + if (existing) { + return interaction.reply({ + content: `You already have a job reminder set with **${filterBy}** as the filter. Use /cancelreminder to remove it first.`, + ephemeral: true + }); + } + + await interaction.client.mongo + .collection(DB.REMINDERS) + .insertOne(jobReminder); + + console.log('[DEBUG] Inserted job reminder:', jobReminder); + + return interaction.reply({ + content: `I'll remind you about job offers ${jobReminderRepeat} at ${reminderTime( + jobReminder + )}.`, + ephemeral: true + }); + } else { + 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 + }; + + await interaction.client.mongo + .collection(DB.REMINDERS) + .insertOne(reminder); + + return interaction.reply({ + content: `I'll remind you about that at ${reminderTime(reminder)}.`, + ephemeral: true + }); + } + } + +} diff --git a/src/commands/reminders/viewreminders.ts b/src/commands/reminders/viewreminders.ts new file mode 100644 index 00000000..cb814ed3 --- /dev/null +++ b/src/commands/reminders/viewreminders.ts @@ -0,0 +1,93 @@ +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(); + + if (reminders.length < 1) { + return interaction.reply({ + content: 'You don\'t have any pending reminders!', + ephemeral: true + }); + } + + // Split reminders + const jobReminders = reminders.filter(r => r.content === 'Job Reminder'); + const normalReminders = reminders.filter(r => r.content !== 'Job Reminder'); + + // Sort job reminders by filter priority + const priorityOrder = { salary: 1, date: 2, relevance: 3, default: 4 }; + jobReminders.sort((a, b) => { + const aVal = priorityOrder[a.filterBy || 'default']; + const bVal = priorityOrder[b.filterBy || 'default']; + return aVal - bVal; + }); + + // Sort regular reminders by expiration + normalReminders.sort((a, b) => a.expires.valueOf() - b.expires.valueOf()); + + const sortedReminders = [...jobReminders, ...normalReminders]; + const embeds: Array = []; + + sortedReminders.forEach((reminder, i) => { + if (i % 25 === 0) { + embeds.push( + new EmbedBuilder() + .setTitle('📋 Pending Reminders') + .setColor('DarkAqua') + ); + } + + const hidden = reminder.mode === 'private'; + + let name = `${i + 1}. `; + if (hidden) { + name += reminder.content === 'Job Reminder' ? '[Job Reminder]' : 'Private reminder'; + } else { + name += reminder.content; + } + + let value = hidden + ? `This is a **${reminder.repeat}** job reminder` + : reminderTime(reminder); + + if (reminder.filterBy) { + value += `\n🔍 Sorting preference: **${reminder.filterBy}**`; + } + + embeds[Math.floor(i / 25)].addFields({ name, value }); + }); + + // Set sorting explanation at the top + if (embeds.length > 0) { + embeds[0].setDescription('Job reminders are sorted based on your selected filter type.'); + } + + // Add sorting logic at the bottom + embeds[embeds.length - 1].addFields({ + name: '\u200B', + value: '**Job Reminder Sorting:** salary > date > relevance > default' + }); + + return interaction.reply({ embeds }); + } + +} From c6b744956a600665877765c5457342b1196881f6 Mon Sep 17 00:00:00 2001 From: jmartgmz Date: Wed, 7 May 2025 14:22:58 -0400 Subject: [PATCH 316/317] reminders folders changed --- build/binding.sln | 19 --- build/config.gypi | 45 +++--- build/sage.vcxproj | 146 ------------------ build/sage.vcxproj.filters | 49 ------ .../command.ts => remindermenu.ts} | 6 +- .../reminders => }/newreminders/constants.ts | 0 .../newreminders/email-handlers.ts | 0 .../reminders => }/newreminders/index.ts | 2 +- .../newreminders/job-handlers.ts | 0 .../newreminders/menu-handlers.ts | 0 .../newreminders/reminder-handlers.ts | 0 .../reminders => }/newreminders/types.ts | 0 .../reminders => }/newreminders/ui.ts | 0 .../reminders => }/newreminders/utils.ts | 0 14 files changed, 26 insertions(+), 241 deletions(-) delete mode 100644 build/binding.sln delete mode 100644 build/sage.vcxproj delete mode 100644 build/sage.vcxproj.filters rename src/commands/reminders/{newreminders/command.ts => remindermenu.ts} (74%) rename src/{commands/reminders => }/newreminders/constants.ts (100%) rename src/{commands/reminders => }/newreminders/email-handlers.ts (100%) rename src/{commands/reminders => }/newreminders/index.ts (85%) rename src/{commands/reminders => }/newreminders/job-handlers.ts (100%) rename src/{commands/reminders => }/newreminders/menu-handlers.ts (100%) rename src/{commands/reminders => }/newreminders/reminder-handlers.ts (100%) rename src/{commands/reminders => }/newreminders/types.ts (100%) rename src/{commands/reminders => }/newreminders/ui.ts (100%) rename src/{commands/reminders => }/newreminders/utils.ts (100%) diff --git a/build/binding.sln b/build/binding.sln deleted file mode 100644 index ca21bbd8..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", "{624B7F4D-9D3E-D315-6578-783939BDBFED}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Release|x64 = Release|x64 - Debug|x64 = Debug|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {624B7F4D-9D3E-D315-6578-783939BDBFED}.Release|x64.ActiveCfg = Release|x64 - {624B7F4D-9D3E-D315-6578-783939BDBFED}.Release|x64.Build.0 = Release|x64 - {624B7F4D-9D3E-D315-6578-783939BDBFED}.Debug|x64.ActiveCfg = Debug|x64 - {624B7F4D-9D3E-D315-6578-783939BDBFED}.Debug|x64.Build.0 = Debug|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/build/config.gypi b/build/config.gypi index e22e8098..be36ba0a 100644 --- a/build/config.gypi +++ b/build/config.gypi @@ -15,9 +15,7 @@ "default_configuration": "Release", "defines": [], "include_dirs": [], - "libraries": [], - "msbuild_toolset": "v143", - "msvs_windows_target_platform_version": "10.0.22621.0" + "libraries": [] }, "variables": { "asan": 0, @@ -32,8 +30,9 @@ "enable_pgo_use": "false", "error_on_warn": "false", "force_dynamic_crt": 0, + "gas_version": "2.38", "host_arch": "x64", - "icu_data_in": "..\\..\\deps\\icu-tmp\\icudt76l.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", @@ -42,7 +41,6 @@ "libdir": "lib", "llvm_version": "0.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", @@ -427,9 +425,10 @@ ], "node_module_version": 131, "node_no_browser_globals": "false", - "node_prefix": "\\usr\\local", + "node_prefix": "/", "node_quic": "false", "node_release_urlbase": "https://nodejs.org/download/release/", + "node_section_ordering_info": "", "node_shared": "false", "node_shared_ada": "false", "node_shared_brotli": "false", @@ -454,9 +453,9 @@ "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": "false", "ossfuzz": "false", @@ -489,28 +488,28 @@ "v8_trace_maps": 0, "v8_use_siphash": 1, "want_separate_host_toolset": 0, - "nodedir": "C:\\Users\\jason\\AppData\\Local\\node-gyp\\Cache\\23.11.0", - "python": "C:\\Python313\\python.exe", + "nodedir": "/home/jmartinez/.cache/node-gyp/23.11.0", + "python": "/usr/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\\jason\\Desktop\\CISC367\\SageTeamY\\lib\\binding\\your_module.node", + "module": "/home/jmartinez/Desktop/CISC367/SageTeamY/lib/binding/your_module.node", "module_name": "your_module", - "module_path": "C:\\Users\\jason\\Desktop\\CISC367\\SageTeamY\\lib\\binding", + "module_path": "/home/jmartinez/Desktop/CISC367/SageTeamY/lib/binding", "napi_version": "10", "node_abi_napi": "napi", "node_napi_label": "node-v131", - "cache": "C:\\Users\\jason\\AppData\\Local\\npm-cache", - "engine_strict": "true", - "globalconfig": "C:\\Users\\jason\\AppData\\Roaming\\npm\\etc\\npmrc", - "global_prefix": "C:\\Users\\jason\\AppData\\Roaming\\npm", - "init_module": "C:\\Users\\jason\\.npm-init.js", - "local_prefix": "C:\\Users\\jason\\Desktop\\CISC367\\SageTeamY", - "node_gyp": "C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js", + "userconfig": "/home/jmartinez/.npmrc", + "cache": "/home/jmartinez/.npm", + "local_prefix": "/home/jmartinez/Desktop/CISC367/SageTeamY", + "globalconfig": "/etc/npmrc", + "init_module": "/home/jmartinez/.npm-init.js", "npm_version": "10.9.2", - "prefix": "C:\\Users\\jason\\AppData\\Roaming\\npm", - "userconfig": "C:\\Users\\jason\\.npmrc", - "user_agent": "npm/10.9.2 node/v23.11.0 win32 x64 workspaces/false" + "prefix": "/usr/local", + "user_agent": "npm/10.9.2 node/v22.14.0 linux x64 workspaces/false", + "node_gyp": "/usr/lib/node_modules_22/npm/node_modules/node-gyp/bin/node-gyp.js", + "global_prefix": "/usr/local", + "update_notifier": "", + "engine_strict": "true" } } diff --git a/build/sage.vcxproj b/build/sage.vcxproj deleted file mode 100644 index 4d7fbb3a..00000000 --- a/build/sage.vcxproj +++ /dev/null @@ -1,146 +0,0 @@ - - - - - Debug - x64 - - - Release - x64 - - - - {624B7F4D-9D3E-D315-6578-783939BDBFED} - 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\jason\AppData\Local\node-gyp\Cache\23.11.0\include\node;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\src;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\config;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\openssl\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\uv\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\zlib;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.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\\jason\\AppData\\Local\\node-gyp\\Cache\\23.11.0\\x64\\node.lib" - /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) - node.exe;%(DelayLoadDLLs) - true - true - true - $(OutDir)$(ProjectName).node - true - .node - MachineX64 - - - C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\include\node;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\src;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\config;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\openssl\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\uv\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\zlib;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.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\jason\AppData\Local\node-gyp\Cache\23.11.0\include\node;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\src;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\config;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\openssl\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\uv\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\zlib;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.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\\jason\\AppData\\Local\\node-gyp\\Cache\\23.11.0\\x64\\node.lib" - /LTCG:INCREMENTAL /ignore:4199 %(AdditionalOptions) - node.exe;%(DelayLoadDLLs) - true - true - true - $(OutDir)$(ProjectName).node - true - .node - MachineX64 - - - C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\include\node;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\src;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\config;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\openssl\openssl\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\uv\include;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.0\deps\zlib;C:\Users\jason\AppData\Local\node-gyp\Cache\23.11.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 8d7a3a8f..00000000 --- a/build/sage.vcxproj.filters +++ /dev/null @@ -1,49 +0,0 @@ - - - - - {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} - - - {8CDEE807-BC53-E450-C8B8-4DEBB66742D4} - - - {7B735499-E5DD-1C2B-6C26-70023832A1CF} - - - {92EF4BA8-6BC2-65D1-451F-28EBD4AE726A} - - - {A3C8E949-BCF6-0C67-6656-340A2A097708} - - - {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:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\src - - - .. - - - diff --git a/src/commands/reminders/newreminders/command.ts b/src/commands/reminders/remindermenu.ts similarity index 74% rename from src/commands/reminders/newreminders/command.ts rename to src/commands/reminders/remindermenu.ts index eb65eb05..22f1b964 100644 --- a/src/commands/reminders/newreminders/command.ts +++ b/src/commands/reminders/remindermenu.ts @@ -3,12 +3,12 @@ import { BOT } from '@root/config'; import { ChatInputCommandInteraction } from 'discord.js'; import { Command } from '@lib/types/Command'; -import { showMainMenu } from './menu-handlers'; +import { showMainMenu } from '../../newreminders/menu-handlers'; export default class extends Command { - description = `Have ${BOT.NAME} give you a reminder.`; + description = `View ${BOT.NAME} reminders menu.`; extendedHelp = 'Create reminders for anything - one-time or recurring job alerts with optional email notifications.'; - options = []; // No options needed as we're using buttons + options = []; // No options needed as we are using buttons async run( interaction: ChatInputCommandInteraction diff --git a/src/commands/reminders/newreminders/constants.ts b/src/newreminders/constants.ts similarity index 100% rename from src/commands/reminders/newreminders/constants.ts rename to src/newreminders/constants.ts diff --git a/src/commands/reminders/newreminders/email-handlers.ts b/src/newreminders/email-handlers.ts similarity index 100% rename from src/commands/reminders/newreminders/email-handlers.ts rename to src/newreminders/email-handlers.ts diff --git a/src/commands/reminders/newreminders/index.ts b/src/newreminders/index.ts similarity index 85% rename from src/commands/reminders/newreminders/index.ts rename to src/newreminders/index.ts index 1783a076..6fa0f90f 100644 --- a/src/commands/reminders/newreminders/index.ts +++ b/src/newreminders/index.ts @@ -1,5 +1,5 @@ // Main export file for the reminders system -import ReminderCommand from './command'; +import ReminderCommand from '../commands/reminders/remindermenu'; // Export the main command class export default ReminderCommand; diff --git a/src/commands/reminders/newreminders/job-handlers.ts b/src/newreminders/job-handlers.ts similarity index 100% rename from src/commands/reminders/newreminders/job-handlers.ts rename to src/newreminders/job-handlers.ts diff --git a/src/commands/reminders/newreminders/menu-handlers.ts b/src/newreminders/menu-handlers.ts similarity index 100% rename from src/commands/reminders/newreminders/menu-handlers.ts rename to src/newreminders/menu-handlers.ts diff --git a/src/commands/reminders/newreminders/reminder-handlers.ts b/src/newreminders/reminder-handlers.ts similarity index 100% rename from src/commands/reminders/newreminders/reminder-handlers.ts rename to src/newreminders/reminder-handlers.ts diff --git a/src/commands/reminders/newreminders/types.ts b/src/newreminders/types.ts similarity index 100% rename from src/commands/reminders/newreminders/types.ts rename to src/newreminders/types.ts diff --git a/src/commands/reminders/newreminders/ui.ts b/src/newreminders/ui.ts similarity index 100% rename from src/commands/reminders/newreminders/ui.ts rename to src/newreminders/ui.ts diff --git a/src/commands/reminders/newreminders/utils.ts b/src/newreminders/utils.ts similarity index 100% rename from src/commands/reminders/newreminders/utils.ts rename to src/newreminders/utils.ts From 1976c39cf917d7950e51246be203c6b3402b5a67 Mon Sep 17 00:00:00 2001 From: Jason Martinez Date: Thu, 8 May 2025 00:48:16 -0400 Subject: [PATCH 317/317] Update Windows paths and configurations for node-gyp --- build/config.gypi | 45 +++++++++++++------------- src/commands/reminders/remindermenu.ts | 2 +- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/build/config.gypi b/build/config.gypi index be36ba0a..c9c5bf22 100644 --- a/build/config.gypi +++ b/build/config.gypi @@ -15,7 +15,9 @@ "default_configuration": "Release", "defines": [], "include_dirs": [], - "libraries": [] + "libraries": [], + "msbuild_toolset": "v143", + "msvs_windows_target_platform_version": "10.0.22621.0" }, "variables": { "asan": 0, @@ -30,9 +32,8 @@ "enable_pgo_use": "false", "error_on_warn": "false", "force_dynamic_crt": 0, - "gas_version": "2.38", "host_arch": "x64", - "icu_data_in": "../../deps/icu-tmp/icudt76l.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", @@ -41,6 +42,7 @@ "libdir": "lib", "llvm_version": "0.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", @@ -425,10 +427,9 @@ ], "node_module_version": 131, "node_no_browser_globals": "false", - "node_prefix": "/", + "node_prefix": "\\usr\\local", "node_quic": "false", "node_release_urlbase": "https://nodejs.org/download/release/", - "node_section_ordering_info": "", "node_shared": "false", "node_shared_ada": "false", "node_shared_brotli": "false", @@ -453,9 +454,9 @@ "node_use_node_snapshot": "true", "node_use_openssl": "true", "node_use_v8_platform": "true", - "node_with_ltcg": "false", + "node_with_ltcg": "true", "node_without_node_options": "false", - "node_write_snapshot_as_array_literals": "false", + "node_write_snapshot_as_array_literals": "true", "openssl_is_fips": "false", "openssl_quic": "false", "ossfuzz": "false", @@ -488,28 +489,28 @@ "v8_trace_maps": 0, "v8_use_siphash": 1, "want_separate_host_toolset": 0, - "nodedir": "/home/jmartinez/.cache/node-gyp/23.11.0", - "python": "/usr/bin/python3", + "nodedir": "C:\\Users\\jason\\AppData\\Local\\node-gyp\\Cache\\23.11.0", + "python": "C:\\Python313\\python.exe", "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": "/home/jmartinez/Desktop/CISC367/SageTeamY/lib/binding/your_module.node", + "module": "C:\\Users\\jason\\Desktop\\SAGEBOT\\SageTeamY\\lib\\binding\\your_module.node", "module_name": "your_module", - "module_path": "/home/jmartinez/Desktop/CISC367/SageTeamY/lib/binding", + "module_path": "C:\\Users\\jason\\Desktop\\SAGEBOT\\SageTeamY\\lib\\binding", "napi_version": "10", "node_abi_napi": "napi", "node_napi_label": "node-v131", - "userconfig": "/home/jmartinez/.npmrc", - "cache": "/home/jmartinez/.npm", - "local_prefix": "/home/jmartinez/Desktop/CISC367/SageTeamY", - "globalconfig": "/etc/npmrc", - "init_module": "/home/jmartinez/.npm-init.js", + "cache": "C:\\Users\\jason\\AppData\\Local\\npm-cache", + "engine_strict": "true", + "globalconfig": "C:\\Users\\jason\\AppData\\Roaming\\npm\\etc\\npmrc", + "global_prefix": "C:\\Users\\jason\\AppData\\Roaming\\npm", + "init_module": "C:\\Users\\jason\\.npm-init.js", + "local_prefix": "C:\\Users\\jason\\Desktop\\SAGEBOT\\SageTeamY", + "node_gyp": "C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js", "npm_version": "10.9.2", - "prefix": "/usr/local", - "user_agent": "npm/10.9.2 node/v22.14.0 linux x64 workspaces/false", - "node_gyp": "/usr/lib/node_modules_22/npm/node_modules/node-gyp/bin/node-gyp.js", - "global_prefix": "/usr/local", - "update_notifier": "", - "engine_strict": "true" + "prefix": "C:\\Users\\jason\\AppData\\Roaming\\npm", + "userconfig": "C:\\Users\\jason\\.npmrc", + "user_agent": "npm/10.9.2 node/v23.11.0 win32 x64 workspaces/false" } } diff --git a/src/commands/reminders/remindermenu.ts b/src/commands/reminders/remindermenu.ts index 22f1b964..42840878 100644 --- a/src/commands/reminders/remindermenu.ts +++ b/src/commands/reminders/remindermenu.ts @@ -1,4 +1,4 @@ -// This file contains the command handler for the reminder system of a Discord bot. +// This file contains the command handler for the NEW reminder system of the Discord bot. import { BOT } from '@root/config'; import { ChatInputCommandInteraction } from 'discord.js';