diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..79fe8026 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +insert_final_newline = true diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index fbb854fc..00000000 --- a/.eslintrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "google", - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module", - "ecmaFeatures": { - "impliedStrict": true - } - }, - "env": { - "browser": true, - "es6": true, - "commonjs": true, - "jquery": true - }, - "rules": { - "no-new": 0 - } -} \ No newline at end of file diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml new file mode 100644 index 00000000..24411d3f --- /dev/null +++ b/.github/workflows/eslint.yml @@ -0,0 +1,33 @@ +name: Lint + +on: + # Replace pull_request with pull_request_target if you + # plan to use this action with forks, see the Limitations section + pull_request: + branches: + - develop + +# Down scope as necessary via https://docs.github.com/en/actions/security-guides/automatic-token-authentication#modifying-the-permissions-for-the-github_token +permissions: + checks: write + contents: read + +jobs: + run-eslint: + name: Run eslint + runs-on: ubuntu-latest + + steps: + - name: Check out Git repository + uses: actions/checkout@v7 + + - name: Set up Node.js + uses: actions/setup-node@v7 + with: + node-version: 25 + + - name: Install Node.js dependencies + run: npm ci + + - name: Run eslint + run: npm run lint diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 00000000..c5166c2a --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,3 @@ +module.exports = { + ...require('gts/.prettierrc.json'), +}; diff --git a/README.md b/README.md index fc01d576..1c306bad 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ python -m gunicorn You must create `config.py` in the top-level directory with the appropriate credentials for the application to run. See `config.env.py` for an example. ### Add OIDC Config -Reach out to an RTP to get OIDC credentials that will allow you to develop locally behind OIDC auth +Check the [SSO wiki page](https://wiki.csh.rit.edu/wiki/SSO#Where_can_I_get_credentials?) for development credentials. ```py # OIDC Config OIDC_ISSUER = "https://sso.csh.rit.edu/auth/realms/csh" diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..7dc990f1 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,50 @@ +const globals = require('globals'); +let customConfig = []; +let hasIgnoresFile = false; +try { + require.resolve('./eslint.ignores.js'); + hasIgnoresFile = true; +} catch { + // eslint.ignores.js doesn't exist +} + +if (hasIgnoresFile) { + const ignores = require('./eslint.ignores.js'); + customConfig = [{ignores}]; +} + +module.exports = [ + ...customConfig, + { + files: ['frontend/javascript/**/*.js'], + languageOptions: { + sourceType: 'module', + globals: { + ...globals.browser, + ...globals.jquery, + }, + }, + }, + { + files: ['frontend/javascript/modules/index.js'], + languageOptions: { + sourceType: 'commonjs', + globals: {...globals.browser}, + }, + }, + { + files: ['webpack.config.js'], + languageOptions: { + sourceType: 'commonjs', + globals: {...globals.node}, + }, + }, + { + files: ['frontend/javascript/app.js'], + languageOptions: { + sourceType: 'module', + globals: {...globals.node, ...globals.browser}, + }, + }, + ...require('gts'), +]; diff --git a/eslint.ignores.js b/eslint.ignores.js new file mode 100644 index 00000000..ff5733c8 --- /dev/null +++ b/eslint.ignores.js @@ -0,0 +1 @@ +module.exports = ['build/']; diff --git a/frontend/javascript/app.js b/frontend/javascript/app.js index 54a50d12..e3850d46 100644 --- a/frontend/javascript/app.js +++ b/frontend/javascript/app.js @@ -1,28 +1,26 @@ // Install Sentry to send errors to Sentry import * as Sentry from '@sentry/browser'; -if (process.env.SENTRY_ENV !== "local-development") { - Sentry.init( - { - dsn: 'https://151ecfab1a8242009012d45a19064cfd@sentry.io/133175' - } - ); +if (process.env.SENTRY_ENV !== 'local-development') { + Sentry.init({ + dsn: 'https://151ecfab1a8242009012d45a19064cfd@sentry.io/133175', + }); - // Capture unhandled exceptions in promises - window.addEventListener('unhandledrejection', err => { - Sentry.captureException(err.reason); - }); + // Capture unhandled exceptions in promises + window.addEventListener('unhandledrejection', err => { + Sentry.captureException(err.reason); + }); } // Load the rest of the modules -import "jquery"; -import "bootstrap"; -import "./modules"; +import 'jquery'; +import 'bootstrap'; +import './modules'; // Load fonts -import "bootstrap-icons/font/fonts/bootstrap-icons.woff" -import "bootstrap-icons/font/fonts/bootstrap-icons.woff2" +import 'bootstrap-icons/font/fonts/bootstrap-icons.woff'; +import 'bootstrap-icons/font/fonts/bootstrap-icons.woff2'; // Load styles -import "../stylesheets/app.scss" -import "../stylesheets/presentations.scss" +import '../stylesheets/app.scss'; +import '../stylesheets/presentations.scss'; diff --git a/frontend/javascript/exceptions/adhocException.js b/frontend/javascript/exceptions/adhocException.js index 2aa52b06..0bd50a0d 100644 --- a/frontend/javascript/exceptions/adhocException.js +++ b/frontend/javascript/exceptions/adhocException.js @@ -1,8 +1,12 @@ -import { Enumify } from 'enumify'; +import {Enumify} from 'enumify'; export default class AdHocException extends Enumify { - NO_FOLLOW_ATTRIBUTE = AdHocException("Unable to find follow query selector for adhoc module"); - NO_PARENT_ATTRIBUTE = AdHocException("Unable to find parent element id for adhoc module"); + NO_FOLLOW_ATTRIBUTE = AdHocException( + 'Unable to find follow query selector for adhoc module', + ); + NO_PARENT_ATTRIBUTE = AdHocException( + 'Unable to find parent element id for adhoc module', + ); _ = AdHocException.closeEnum(); constructor(message) { diff --git a/frontend/javascript/exceptions/attendanceException.js b/frontend/javascript/exceptions/attendanceException.js index 0a4fa4f3..185d798d 100644 --- a/frontend/javascript/exceptions/attendanceException.js +++ b/frontend/javascript/exceptions/attendanceException.js @@ -1,7 +1,9 @@ -import { Enumify } from 'enumify'; +import {Enumify} from 'enumify'; export default class AttendanceException extends Enumify { - NO_SRC_ATTRIBUTE = AttendanceException("Unable to find data source for attendance module"); + NO_SRC_ATTRIBUTE = AttendanceException( + 'Unable to find data source for attendance module', + ); _ = AttendanceException.closeEnum(); constructor(message) { diff --git a/frontend/javascript/exceptions/cmAttendanceException.js b/frontend/javascript/exceptions/cmAttendanceException.js index 5992ca5e..3c7cf380 100644 --- a/frontend/javascript/exceptions/cmAttendanceException.js +++ b/frontend/javascript/exceptions/cmAttendanceException.js @@ -1,7 +1,9 @@ -import { Enumify } from 'enumify'; +import {Enumify} from 'enumify'; export default class CmAttendanceException extends Enumify { - SUBMIT_BEFORE_RENDER = CmAttendanceException("Cannot submit updated attendance before the modal renders."); + SUBMIT_BEFORE_RENDER = CmAttendanceException( + 'Cannot submit updated attendance before the modal renders.', + ); _ = CmAttendanceException.closeEnum(); constructor(message) { @@ -9,4 +11,3 @@ export default class CmAttendanceException extends Enumify { this.message = message; } } - diff --git a/frontend/javascript/exceptions/exception.js b/frontend/javascript/exceptions/exception.js index 9369f8d1..a12527f7 100644 --- a/frontend/javascript/exceptions/exception.js +++ b/frontend/javascript/exceptions/exception.js @@ -1,29 +1,29 @@ -import { Enumify } from 'enumify'; +import {Enumify} from 'enumify'; export default class ConditionalException extends Error { constructor(exception, additionalMessage) { - let message = ""; + let message = ''; if (exception instanceof Enumify) { try { message += exception.message; - } catch (e) { + } catch { message += exception.name; } } else { try { message += exception; - } catch (e) { - message += "An unknown error has occured"; + } catch { + message += 'An unknown error has occured'; } } if (additionalMessage) { - message += ": " + additionalMessage; + message += ': ' + additionalMessage; } super(message); - this.name = "ConditionalException"; + this.name = 'ConditionalException'; this.message = message; } } diff --git a/frontend/javascript/exceptions/fetchException.js b/frontend/javascript/exceptions/fetchException.js index 84d24dcc..37d93705 100644 --- a/frontend/javascript/exceptions/fetchException.js +++ b/frontend/javascript/exceptions/fetchException.js @@ -1,7 +1,7 @@ -import { Enumify } from 'enumify'; +import {Enumify} from 'enumify'; export default class FetchException extends Enumify { - REQUEST_FAILED = new FetchException("Unable to retrieve data from server"); + REQUEST_FAILED = new FetchException('Unable to retrieve data from server'); _ = FetchException.closeEnum(); constructor(message) { diff --git a/frontend/javascript/exceptions/hmSearchException.js b/frontend/javascript/exceptions/hmSearchException.js index 0b2c01d5..6577646c 100644 --- a/frontend/javascript/exceptions/hmSearchException.js +++ b/frontend/javascript/exceptions/hmSearchException.js @@ -1,12 +1,16 @@ -import { Enumify } from 'enumify'; +import {Enumify} from 'enumify'; export default class HmSearchException extends Enumify { - TARGET_REQUIRED = HmSearchException("A target selector is required to use HouseMeetingSearch"); - NOT_A_TABLE = HmSearchException("The HouseMeetingSearch module requires the target to be a table"); + TARGET_REQUIRED = HmSearchException( + 'A target selector is required to use HouseMeetingSearch', + ); + NOT_A_TABLE = HmSearchException( + 'The HouseMeetingSearch module requires the target to be a table', + ); _ = HmSearchException.closeEnum(); constructor(message) { - super() + super(); this.message = message; } } diff --git a/frontend/javascript/exceptions/housingException.js b/frontend/javascript/exceptions/housingException.js index 37b5dc8f..ae42d501 100644 --- a/frontend/javascript/exceptions/housingException.js +++ b/frontend/javascript/exceptions/housingException.js @@ -1,7 +1,9 @@ -import { Enumify } from 'enumify'; +import {Enumify} from 'enumify'; export default class HousingException extends Enumify { - SUBMIT_BEFORE_RENDER = HousingException("Cannot submit updated roster before the modal renders."); + SUBMIT_BEFORE_RENDER = HousingException( + 'Cannot submit updated roster before the modal renders.', + ); _ = HousingException.closeEnum(); constructor(message) { diff --git a/frontend/javascript/exceptions/masonryException.js b/frontend/javascript/exceptions/masonryException.js index d56271d9..aa47f04a 100644 --- a/frontend/javascript/exceptions/masonryException.js +++ b/frontend/javascript/exceptions/masonryException.js @@ -1,7 +1,9 @@ -import { Enumify } from 'enumify'; +import {Enumify} from 'enumify'; export default class MasonryException extends Enumify { - CANT_FIND_SHARED_SELECTOR = new MasonryException("Unable to find shared selector for Masonry grid items"); + CANT_FIND_SHARED_SELECTOR = new MasonryException( + 'Unable to find shared selector for Masonry grid items', + ); _ = MasonryException.closeEnum(); constructor(message) { diff --git a/frontend/javascript/models/frequencyMap.js b/frontend/javascript/models/frequencyMap.js index dd494010..24362d0f 100644 --- a/frontend/javascript/models/frequencyMap.js +++ b/frontend/javascript/models/frequencyMap.js @@ -32,7 +32,7 @@ export default class FrequencyMap { let highestFreq = 0; let highestKey = null; - for (let [key, freq] of this.entries()) { + for (const [key, freq] of this.entries()) { if (freq > highestFreq) { highestKey = key; highestFreq = freq; diff --git a/frontend/javascript/modules/acceptDuesDatepicker.js b/frontend/javascript/modules/acceptDuesDatepicker.js index 305cefe3..2a48bdf3 100644 --- a/frontend/javascript/modules/acceptDuesDatepicker.js +++ b/frontend/javascript/modules/acceptDuesDatepicker.js @@ -1,10 +1,9 @@ -/* global $ */ -import "bootstrap-material-datetimepicker"; -import "whatwg-fetch"; -import FetchUtil from "../utils/fetchUtil"; -import Exception from "../exceptions/exception"; -import FetchException from "../exceptions/fetchException"; -import sweetAlert from "bootstrap-sweetalert/dev/sweetalert.es6.js"; +import 'bootstrap-material-datetimepicker'; +import 'whatwg-fetch'; +import FetchUtil from '../utils/fetchUtil'; +import Exception from '../exceptions/exception'; +import FetchException from '../exceptions/fetchException'; +import sweetAlert from 'bootstrap-sweetalert/dev/sweetalert.es6.js'; export default class DatePicker { constructor(input) { @@ -17,41 +16,50 @@ export default class DatePicker { render() { $(this.input).bootstrapMaterialDatePicker({ weekStart: 0, - time: false + time: false, }); - document.getElementsByClassName('dtp-btn-ok')[0].addEventListener('click', - () => { - this._updateSetting(); - }); + document + .getElementsByClassName('dtp-btn-ok')[0] + .addEventListener('click', () => { + this._updateSetting(); + }); } _updateSetting() { - console.log("Update dues until: " + this.input.value); - let payload = {}; + console.log('Update dues until: ' + this.input.value); + const payload = {}; payload[this.setting] = this.input.value; fetch(this.endpoint, { method: 'PUT', headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' + Accept: 'application/json', + 'Content-Type': 'application/json', }, credentials: 'same-origin', - body: JSON.stringify(payload) + body: JSON.stringify(payload), }) .then(FetchUtil.checkStatus) .then(FetchUtil.parseJSON) .then(response => { - if (!response.hasOwnProperty('success') || !response.success) { - sweetAlert("Uh oh...", "We're having trouble submitting this " + - "form right now. Please try again later.", "error"); + if (!Object.hasOwn(response, 'success') || !response.success) { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this " + + 'form right now. Please try again later.', + 'error', + ); throw new Exception(FetchException.REQUEST_FAILED, response); } }) .catch(error => { - sweetAlert("Uh oh...", "We're having trouble submitting this " + - "form right now. Please try again later.", "error"); + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this " + + 'form right now. Please try again later.', + 'error', + ); throw new Exception(FetchException.REQUEST_FAILED, error); }); } diff --git a/frontend/javascript/modules/addUser.js b/frontend/javascript/modules/addUser.js index 3cacfa28..641fd7d3 100644 --- a/frontend/javascript/modules/addUser.js +++ b/frontend/javascript/modules/addUser.js @@ -1,4 +1,4 @@ -import FetchUtil from "../utils/fetchUtil"; +import FetchUtil from '../utils/fetchUtil'; export default class AddUser { constructor(form) { @@ -8,21 +8,22 @@ export default class AddUser { } render() { - this.form.querySelector('input[type=submit]') + this.form + .querySelector('input[type=submit]') .addEventListener('click', e => this._submitForm(e)); } _submitForm(e) { e.preventDefault(); - let payload = { + const payload = { name: this.form.querySelector('input[name=name]').value, onfloor: this.form.querySelector('input[name=onfloor]').checked, - roomNumber: this.form.querySelector('input[name=room]').value + roomNumber: this.form.querySelector('input[name=room]').value, }; FetchUtil.post(this.endpoint, payload, { - successText: "User has been created." + successText: 'User has been created.', }); } } diff --git a/frontend/javascript/modules/adhoc.js b/frontend/javascript/modules/adhoc.js index f0e53a1d..16c715e5 100644 --- a/frontend/javascript/modules/adhoc.js +++ b/frontend/javascript/modules/adhoc.js @@ -1,11 +1,10 @@ -/* global fetch */ -import "whatwg-fetch"; -import "@selectize/selectize"; -import FetchUtil from "../utils/fetchUtil"; -import Exception from "../exceptions/exception"; -import AttendanceException from "../exceptions/attendanceException"; -import AdHocException from "../exceptions/adhocException"; -import FetchException from "../exceptions/fetchException"; +import 'whatwg-fetch'; +import '@selectize/selectize'; +import FetchUtil from '../utils/fetchUtil'; +import Exception from '../exceptions/exception'; +import AttendanceException from '../exceptions/attendanceException'; +import AdHocException from '../exceptions/adhocException'; +import FetchException from '../exceptions/fetchException'; export default class AdHoc { constructor(element) { @@ -16,26 +15,26 @@ export default class AdHoc { this.list = element.list; if (!this.followSelector) { - throw new Exception(AdHocException.NO_FOLLOW_ATTRIBUTE); + throw new Exception(AdHocException.NO_FOLLOW_ATTRIBUTE); } else if (!this.parentId) { - throw new Exception(AdHocException.NO_PARENT_ATTRIBUTE); + throw new Exception(AdHocException.NO_PARENT_ATTRIBUTE); } if (this.dataSrc) { fetch('/attendance/' + this.dataSrc, { method: 'GET', headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' + Accept: 'application/json', + 'Content-Type': 'application/json', }, - credentials: 'same-origin' + credentials: 'same-origin', }) .then(FetchUtil.checkResponse) .then(FetchUtil.parseJSON) .then(response => { response.adhocs.forEach(item => { const option = document.createElement('option'); - option.value = item + option.value = item; element.list.appendChild(option); }); this.render(); @@ -52,15 +51,15 @@ export default class AdHoc { const parentElem = document.getElementById(this.parentId); document.querySelectorAll(this.followSelector).forEach(input => { - if (input.value === "Ad-Hoc") { - parentElem.style.display = "block"; + if (input.value === 'Ad-Hoc') { + parentElem.style.display = 'block'; } - input.addEventListener("change", event => { - if (event.target.value === "Ad-Hoc") { - parentElem.style.display = "block"; + input.addEventListener('change', event => { + if (event.target.value === 'Ad-Hoc') { + parentElem.style.display = 'block'; } else { - parentElem.style.display = "none"; + parentElem.style.display = 'none'; } }); }); diff --git a/frontend/javascript/modules/attendanceForm.js b/frontend/javascript/modules/attendanceForm.js index b8ebb3d2..1baa447f 100644 --- a/frontend/javascript/modules/attendanceForm.js +++ b/frontend/javascript/modules/attendanceForm.js @@ -1,5 +1,5 @@ -import FetchUtil from "../utils/fetchUtil"; -import MemberUtil from "../utils/memberUtil"; +import FetchUtil from '../utils/fetchUtil'; +import MemberUtil from '../utils/memberUtil'; export default class AttendanceForm { constructor(form) { @@ -7,15 +7,15 @@ export default class AttendanceForm { this.fields = { timestamp: this.form.elements.date, - attendees: this.form.elements.attendees + attendees: this.form.elements.attendees, }; this.endpoint = ''; - if (this.form.dataset.type === "committee") { + if (this.form.dataset.type === 'committee') { this.endpoint = '/attendance/submit/cm'; this.fields.committee = this.form.elements.committee; - } else if (this.form.dataset.type === "seminar") { + } else if (this.form.dataset.type === 'seminar') { this.endpoint = '/attendance/submit/ts'; this.fields.name = this.form.elements.name; this.fields.host = this.form.elements.host; @@ -27,35 +27,39 @@ export default class AttendanceForm { render() { // Prevent the form from submitting if the user hits the enter key ['keyup', 'keypress'].forEach(keyevent => - this.form.addEventListener(keyevent, event => { - let keyCode = event.keyCode || event.which; - if (keyCode === 13) { - event.preventDefault(); - return false; - } - }, true)); + this.form.addEventListener( + keyevent, + event => { + const keyCode = event.keyCode || event.which; + if (keyCode === 13) { + event.preventDefault(); + return false; + } + }, + true, + ), + ); // Form submit handler - this.form.querySelectorAll("input[type=submit]").forEach(submitBtn => { - submitBtn.addEventListener("click", e => { + this.form.querySelectorAll('input[type=submit]').forEach(submitBtn => { + submitBtn.addEventListener('click', e => { e.preventDefault(); - let payload = {}; - + const payload = {}; - if (this.fields.committee.value === "Ad-Hoc") { + if (this.fields.committee.value === 'Ad-Hoc') { this.fields.adhoc = this.form.elements.adhoc; } Object.keys(this.fields).forEach(field => { - if (field === "attendees") { - let membersSplit = MemberUtil.splitFreshmenUpperclassmen( - this.fields[field].value.split(',') + if (field === 'attendees') { + const membersSplit = MemberUtil.splitFreshmenUpperclassmen( + this.fields[field].value.split(','), ); payload.freshmen = membersSplit.freshmen; payload.members = membersSplit.upperclassmen; - } else if (field === "host") { - let hostSplit = MemberUtil.splitFreshmenUpperclassmen( - this.fields[field].value.split(',') + } else if (field === 'host') { + const hostSplit = MemberUtil.splitFreshmenUpperclassmen( + this.fields[field].value.split(','), ); payload.freshman_host = hostSplit.freshmen; payload.member_host = hostSplit.upperclassmen; @@ -65,7 +69,7 @@ export default class AttendanceForm { }); FetchUtil.post(this.endpoint, payload, { - successText: "Attendance has been submitted." + successText: 'Attendance has been submitted.', }); }); }); diff --git a/frontend/javascript/modules/becomeActive.js b/frontend/javascript/modules/becomeActive.js index 4de6d1f0..5d60b851 100644 --- a/frontend/javascript/modules/becomeActive.js +++ b/frontend/javascript/modules/becomeActive.js @@ -1,4 +1,4 @@ -import FetchUtil from "../utils/fetchUtil"; +import FetchUtil from '../utils/fetchUtil'; export default class becomeActive { constructor(link) { @@ -14,13 +14,18 @@ export default class becomeActive { _delete(e) { e.preventDefault(); - FetchUtil.postWithWarning(this.endpoint, {}, { - warningText: "Becoming an active member means that you will be charged" + - " dues, which are detailed in the CSH Constitution.", - successText: "You are now an active member." - }, () => { - document.getElementById('becomeActive').remove(); - }); + FetchUtil.postWithWarning( + this.endpoint, + {}, + { + warningText: + 'Becoming an active member means that you will be charged' + + ' dues, which are detailed in the CSH Constitution.', + successText: 'You are now an active member.', + }, + () => { + document.getElementById('becomeActive').remove(); + }, + ); } } - diff --git a/frontend/javascript/modules/cmReview.js b/frontend/javascript/modules/cmReview.js index dff4d285..7377f530 100644 --- a/frontend/javascript/modules/cmReview.js +++ b/frontend/javascript/modules/cmReview.js @@ -1,10 +1,9 @@ -/* global fetch */ import 'whatwg-fetch'; -import Exception from "../exceptions/exception"; -import CmAttendanceException from "../exceptions/cmAttendanceException"; -import FetchUtil from "../utils/fetchUtil"; -import MemberUtil from "../utils/memberUtil"; -import MemberSelect from "./memberSelect"; +import Exception from '../exceptions/exception'; +import CmAttendanceException from '../exceptions/cmAttendanceException'; +import FetchUtil from '../utils/fetchUtil'; +import MemberUtil from '../utils/memberUtil'; +import MemberSelect from './memberSelect'; export default class ReviewMeeting { constructor(link) { @@ -17,7 +16,7 @@ export default class ReviewMeeting { this.endpoints = { meetingDetails: '/attendance/' + this.meeting + '/', - alterAttendance: '/attendance/alter/' + this.meeting + '/' + alterAttendance: '/attendance/alter/' + this.meeting + '/', }; this.render(); @@ -30,73 +29,75 @@ export default class ReviewMeeting { fetch(this.endpoints.meetingDetails + this.cid, { method: 'GET', headers: { - Accept: 'application/json' + Accept: 'application/json', }, - credentials: 'same-origin' + credentials: 'same-origin', }) - .then(FetchUtil.checkStatus) - .then(FetchUtil.parseJSON) - .then(data => { - this.data = data; - this._renderModal(); - }); + .then(FetchUtil.checkStatus) + .then(FetchUtil.parseJSON) + .then(data => { + this.data = data; + this._renderModal(); + }); }); } _renderModal() { // Clone template modal this.modal = this.modalTpl.cloneNode(true); - this.modal.setAttribute('id', - this.modal.getAttribute('id') + '-' + this.cid); + this.modal.setAttribute( + 'id', + this.modal.getAttribute('id') + '-' + this.cid, + ); // Submit button - this.modal.querySelector('input[type="submit"]').addEventListener('click', - e => { + this.modal + .querySelector('input[type="submit"]') + .addEventListener('click', e => { e.preventDefault(); this._submitForm(); }); // Delete Button - this.modal.querySelector('button.delete-btn').addEventListener('click', e => - this._deleteMeeting() - ); + this.modal + .querySelector('button.delete-btn') + .addEventListener('click', () => this._deleteMeeting()); - if (this.meeting == "ts") { + if (this.meeting === 'ts') { // Host const hostInput = this.modal.querySelector('input[name="host"]'); - let hostStr = ""; + let hostStr = ''; this.data.host.forEach(h => { - hostStr += h.value + ","; + hostStr += h.value + ','; }); hostInput.value = hostStr; - - hostInput.dataset.src = "cm_members"; - new MemberSelect(hostInput); // eslint-disable-line no-new - } else { // Hide host section if not technical seminar - this.modal.querySelector(".host-edit-row").style.display = "none"; + hostInput.dataset.src = 'cm_members'; + new MemberSelect(hostInput); + } else { + // Hide host section if not technical seminar + this.modal.querySelector('.host-edit-row').style.display = 'none'; } - // Attendees const attendeesInput = this.modal.querySelector('input[name="attendees"]'); - let attendeesStr = ""; + let attendeesStr = ''; this.data.attendees.forEach(attendee => { - attendeesStr += attendee.value + ","; + attendeesStr += attendee.value + ','; }); attendeesInput.value = attendeesStr; // Initialize selector control - attendeesInput.dataset.src = "cm_members"; - new MemberSelect(attendeesInput); // eslint-disable-line no-new + attendeesInput.dataset.src = 'cm_members'; + new MemberSelect(attendeesInput); // Add to DOM and show, then remove on hide document.getElementsByTagName('body')[0].appendChild(this.modal); $(this.modal) - .on('hidden.bs.modal', e => { - document.getElementsByTagName('body')[0].removeChild(e.target); - }) - .modal('show'); + .on('hidden.bs.modal', e => { + document.getElementsByTagName('body')[0].removeChild(e.target); + }) + .modal('show'); } _submitForm() { @@ -106,12 +107,12 @@ export default class ReviewMeeting { }); // Save details - let payload = {}; - let membersSplit = MemberUtil.splitFreshmenUpperclassmen( - this.modal.querySelector('input[name="attendees"]').value.split(',') + const payload = {}; + const membersSplit = MemberUtil.splitFreshmenUpperclassmen( + this.modal.querySelector('input[name="attendees"]').value.split(','), ); - let hostSplit = MemberUtil.splitFreshmenUpperclassmen( - this.modal.querySelector('input[name="host"]').value.split(",") + const hostSplit = MemberUtil.splitFreshmenUpperclassmen( + this.modal.querySelector('input[name="host"]').value.split(','), ); payload.freshmen = membersSplit.freshmen; payload.members = membersSplit.upperclassmen; @@ -121,17 +122,22 @@ export default class ReviewMeeting { fetch(this.endpoints.meetingDetails + this.cid + '/approve', { method: 'POST', headers: { - Accept: 'application/json' + Accept: 'application/json', }, - credentials: 'same-origin' + credentials: 'same-origin', }); - FetchUtil.post(this.endpoints.alterAttendance + this.cid, payload, { - successText: 'Attendance has been updated.' - }, () => { - $(this.modal).modal('hide'); - window.location.reload(); - }); + FetchUtil.post( + this.endpoints.alterAttendance + this.cid, + payload, + { + successText: 'Attendance has been updated.', + }, + () => { + $(this.modal).modal('hide'); + window.location.reload(); + }, + ); } else { throw new Exception(CmAttendanceException.SUBMIT_BEFORE_RENDER); } @@ -144,17 +150,20 @@ export default class ReviewMeeting { }); // Delete details - FetchUtil.fetchWithWarning(this.endpoints.meetingDetails + this.cid, { - method: 'DELETE', - warningText: "Attendance will be permanently deleted.", - successText: "Attendance has been deleted." - }, () => { - $(this.modal).modal('hide'); - window.location.reload(); - }); + FetchUtil.fetchWithWarning( + this.endpoints.meetingDetails + this.cid, + { + method: 'DELETE', + warningText: 'Attendance will be permanently deleted.', + successText: 'Attendance has been deleted.', + }, + () => { + $(this.modal).modal('hide'); + window.location.reload(); + }, + ); } else { throw new Exception(CmAttendanceException.SUBMIT_BEFORE_RENDER); } } - } diff --git a/frontend/javascript/modules/conditionalActions.js b/frontend/javascript/modules/conditionalActions.js index d71a8338..2d372fc3 100644 --- a/frontend/javascript/modules/conditionalActions.js +++ b/frontend/javascript/modules/conditionalActions.js @@ -18,26 +18,30 @@ export default class ConditionalActions { _handleAction(e) { const action = e.target.dataset.action; - if (action === "delete") { - FetchUtil.fetchWithWarning(this.deleteEndpoint, { - method: 'DELETE', - warningText: "Are you sure you want to delete this conditional?", - successText: "The conditional has been deleted." - }, () => { - $(e.target.closest("tr")).hide(); - }); + if (action === 'delete') { + FetchUtil.fetchWithWarning( + this.deleteEndpoint, + { + method: 'DELETE', + warningText: 'Are you sure you want to delete this conditional?', + successText: 'The conditional has been deleted.', + }, + () => { + $(e.target.closest('tr')).hide(); + }, + ); } else { - const actionExt = (action === "pass") ? "Passed" : "Failed"; - let payload = { + const actionExt = action === 'pass' ? 'Passed' : 'Failed'; + const payload = { id: this.id, - status: actionExt + status: actionExt, }; FetchUtil.postWithWarning(this.endpoint, payload, { - warningText: "Are you sure you want to " + action + - " this conditional?", - successText: "The conditional has been marked as " + - actionExt.toLowerCase() + "." + warningText: + 'Are you sure you want to ' + action + ' this conditional?', + successText: + 'The conditional has been marked as ' + actionExt.toLowerCase() + '.', }); } } diff --git a/frontend/javascript/modules/conditionalForm.js b/frontend/javascript/modules/conditionalForm.js index 8cd4ad89..1dab6451 100644 --- a/frontend/javascript/modules/conditionalForm.js +++ b/frontend/javascript/modules/conditionalForm.js @@ -1,4 +1,4 @@ -import FetchUtil from "../utils/fetchUtil"; +import FetchUtil from '../utils/fetchUtil'; import reveal from 'reveal.js'; export default class ConditionalForm { @@ -9,39 +9,44 @@ export default class ConditionalForm { } render() { - this.form.querySelector('input[type=submit]') - .addEventListener('click', e => this._submitForm(e)); + this.form + .querySelector('input[type=submit]') + .addEventListener('click', e => this._submitForm(e)); } _submitForm(e) { e.preventDefault(); - let uid = this.form.uid.value; + const uid = this.form.uid.value; let evaluation = null; - if (location.pathname.split('/')[1] === "slideshow") { + if (location.pathname.split('/')[1] === 'slideshow') { evaluation = location.pathname.split('/')[2]; } - let payload = { + const payload = { uid: uid, description: this.form.querySelector('input[name=description]').value, dueDate: this.form.querySelector('input[name=due_date]').value, - evaluation: evaluation + evaluation: evaluation, }; - FetchUtil.postWithWarning(this.endpoint, payload, { - warningText: "Are you sure you want to create this conditional?", - successText: "The conditional has been created." - }, () => { - $(this.form.closest('.modal')).modal('hide'); - if (location.pathname.split('/')[1] === "slideshow") { - $('#createConditional').on('hidden.bs.modal', function() { - var condBtn = $('div[data-uid="' + uid + '"] button') - .first(); - $(condBtn).text("Conditionaled").off("click").addClass("disabled"); - $(condBtn).next().hide(); - }); - reveal.right(); - } else { - location.reload(); - } - }); + FetchUtil.postWithWarning( + this.endpoint, + payload, + { + warningText: 'Are you sure you want to create this conditional?', + successText: 'The conditional has been created.', + }, + () => { + $(this.form.closest('.modal')).modal('hide'); + if (location.pathname.split('/')[1] === 'slideshow') { + $('#createConditional').on('hidden.bs.modal', () => { + const condBtn = $('div[data-uid="' + uid + '"] button').first(); + $(condBtn).text('Conditionaled').off('click').addClass('disabled'); + $(condBtn).next().hide(); + }); + reveal.right(); + } else { + location.reload(); + } + }, + ); } } diff --git a/frontend/javascript/modules/coopDelete.js b/frontend/javascript/modules/coopDelete.js index cb944da0..6a84b7a1 100644 --- a/frontend/javascript/modules/coopDelete.js +++ b/frontend/javascript/modules/coopDelete.js @@ -1,4 +1,4 @@ -import FetchUtil from "../utils/fetchUtil"; +import FetchUtil from '../utils/fetchUtil'; export default class coopDelete { constructor(link) { @@ -15,13 +15,18 @@ export default class coopDelete { _delete(e) { e.preventDefault(); - FetchUtil.fetchWithWarning(this.endpoint, { - method: 'DELETE', - warningText: "This co-op entry will be deleted and the user will no" + - " longer be excluded from attendance and vote counts.", - successText: "Co-op has been deleted." - }, () => { - document.getElementById('coop-' + this.uid).remove(); - }); + FetchUtil.fetchWithWarning( + this.endpoint, + { + method: 'DELETE', + warningText: + 'This co-op entry will be deleted and the user will no' + + ' longer be excluded from attendance and vote counts.', + successText: 'Co-op has been deleted.', + }, + () => { + document.getElementById('coop-' + this.uid).remove(); + }, + ); } } diff --git a/frontend/javascript/modules/coopSubmitForm.js b/frontend/javascript/modules/coopSubmitForm.js index 493a1b02..b27125de 100644 --- a/frontend/javascript/modules/coopSubmitForm.js +++ b/frontend/javascript/modules/coopSubmitForm.js @@ -1,4 +1,4 @@ -import FetchUtil from "../utils/fetchUtil"; +import FetchUtil from '../utils/fetchUtil'; export default class coopSubmitForm { constructor(form) { @@ -8,21 +8,23 @@ export default class coopSubmitForm { } render() { - this.form.querySelector('input[type=submit]') + this.form + .querySelector('input[type=submit]') .addEventListener('click', e => this._submitForm(e)); } _submitForm(e) { e.preventDefault(); - let payload = { - semester: this.form.querySelector('input[name=semester]:checked').value + const payload = { + semester: this.form.querySelector('input[name=semester]:checked').value, }; FetchUtil.postWithWarning(this.endpoint, payload, { - warningText: "You will not be able to edit your " + - "submission once it is submitted!", - successText: "Your co-op has been submitted." + warningText: + 'You will not be able to edit your ' + + 'submission once it is submitted!', + successText: 'Your co-op has been submitted.', }); } } diff --git a/frontend/javascript/modules/datepicker.js b/frontend/javascript/modules/datepicker.js index 268e0996..a5763392 100644 --- a/frontend/javascript/modules/datepicker.js +++ b/frontend/javascript/modules/datepicker.js @@ -1,5 +1,4 @@ -/* global $ */ -import "bootstrap-material-datetimepicker"; +import 'bootstrap-material-datetimepicker'; export default class DatePicker { constructor(input) { @@ -11,7 +10,7 @@ export default class DatePicker { render() { $(this.input).bootstrapMaterialDatePicker({ weekStart: 0, - time: false + time: false, }); } } diff --git a/frontend/javascript/modules/dropzone.js b/frontend/javascript/modules/dropzone.js index 2b04a87e..b7528a39 100644 --- a/frontend/javascript/modules/dropzone.js +++ b/frontend/javascript/modules/dropzone.js @@ -1,4 +1,4 @@ -import Dropzone from "dropzone"; +import Dropzone from 'dropzone'; Dropzone.autoDiscover = false; export default class DropzoneUpload { @@ -8,11 +8,11 @@ export default class DropzoneUpload { } render() { - const dz = new Dropzone(this.element); // eslint-disable-line new-cap - dz.on("complete", () => window.location.reload()); + const dz = new Dropzone(this.element); + dz.on('complete', () => window.location.reload()); } } Dropzone.options.uploadUser = { - acceptedFiles: ".csv" + acceptedFiles: '.csv', }; diff --git a/frontend/javascript/modules/editUser.js b/frontend/javascript/modules/editUser.js index 6d119a1b..9c146d9d 100644 --- a/frontend/javascript/modules/editUser.js +++ b/frontend/javascript/modules/editUser.js @@ -1,11 +1,10 @@ -/* global fetch */ -import "whatwg-fetch"; -import FetchUtil from "../utils/fetchUtil"; -import Exception from "../exceptions/exception"; -import FetchException from "../exceptions/fetchException"; -import sweetAlert from "../../../node_modules/bootstrap-sweetalert/dev/sweetalert.es6.js"; // eslint-disable-line max-len -import _ from "lodash"; -import DatePicker from "./datepicker"; +import 'whatwg-fetch'; +import FetchUtil from '../utils/fetchUtil'; +import Exception from '../exceptions/exception'; +import FetchException from '../exceptions/fetchException'; +import sweetAlert from '../../../node_modules/bootstrap-sweetalert/dev/sweetalert.es6.js'; +import _ from 'lodash'; +import DatePicker from './datepicker'; export default class EditUser { constructor(link) { @@ -17,44 +16,43 @@ export default class EditUser { this.endpoints = { userDetails: '/manage/user/', alterHmAttendance: '/attendance/alter/hm/', - userUpgrade: '/manage/upgrade_user' + userUpgrade: '/manage/upgrade_user', }; this.render(); } render() { - this.link.addEventListener("click", e => { + this.link.addEventListener('click', e => { e.preventDefault(); fetch(this.endpoints.userDetails + this.uid, { method: 'GET', headers: { - Accept: 'application/json' + Accept: 'application/json', }, - credentials: "same-origin" + credentials: 'same-origin', }) - .then(FetchUtil.checkStatus) - .then(FetchUtil.parseJSON) - .then(data => { - this.data = data; - - if (this.type === "financial") { - this._renderFinancialModal(); - } else if (this.type === "freshman") { - this._renderFreshmanModal(); - } else { - this._renderModal(); - } - }); + .then(FetchUtil.checkStatus) + .then(FetchUtil.parseJSON) + .then(data => { + this.data = data; + + if (this.type === 'financial') { + this._renderFinancialModal(); + } else if (this.type === 'freshman') { + this._renderFreshmanModal(); + } else { + this._renderModal(); + } + }); }); } _renderModal() { // Clone template modal - let modal = this.modal.cloneNode(true); - modal.setAttribute("id", - this.modal.getAttribute("id") + "-" + this.uid); + const modal = this.modal.cloneNode(true); + modal.setAttribute('id', this.modal.getAttribute('id') + '-' + this.uid); // Member Name modal.querySelector('input[name=name]').value = this.data.name; @@ -65,76 +63,80 @@ export default class EditUser { // On-floor Status modal.querySelector('input[name=onfloor]').checked = - this.data.onfloor_status; + this.data.onfloor_status; // Dues - modal.querySelector('input[name=dues]').checked = - this.data.active_member; + modal.querySelector('input[name=dues]').checked = this.data.active_member; // Housing Points modal.querySelector('input[name=points]').value = this.data.housing_points; // Missed House Meetings if (this.data.missed_hm.length > 0) { - modal.querySelector('.modal-body') - .removeChild(modal.querySelector('.no-missed-hm-alert')); + modal + .querySelector('.modal-body') + .removeChild(modal.querySelector('.no-missed-hm-alert')); - let missedHmTpl = modal.querySelector('.missed-hm-tpl'); - modal.querySelector(".modal-body").removeChild(missedHmTpl); + const missedHmTpl = modal.querySelector('.missed-hm-tpl'); + modal.querySelector('.modal-body').removeChild(missedHmTpl); this.data.missed_hm.forEach(hm => { - let node = missedHmTpl.cloneNode(true); + const node = missedHmTpl.cloneNode(true); - node.setAttribute("id", "missedHm-" + this.uid + "-" + hm.id); + node.setAttribute('id', 'missedHm-' + this.uid + '-' + hm.id); node.dataset.id = hm.id; - node.querySelector(".hm-date").textContent = hm.date; + node.querySelector('.hm-date').textContent = hm.date; - if (hm.status === "Excused") { - node.querySelector("input[name=hm-excused]").checked = true; + if (hm.status === 'Excused') { + node.querySelector('input[name=hm-excused]').checked = true; } - node.querySelector("input[name=reason]").value = hm.excuse; + node.querySelector('input[name=reason]').value = hm.excuse; - node.querySelector("input[name=hm-excused]").addEventListener( - 'click', e => e.target.classList.add('status-changed') - ); + node + .querySelector('input[name=hm-excused]') + .addEventListener('click', e => + e.target.classList.add('status-changed'), + ); - node.querySelector("input[name=reason]").addEventListener( - 'input', e => e.target.classList.add('excuse-changed') - ); + node + .querySelector('input[name=reason]') + .addEventListener('input', e => + e.target.classList.add('excuse-changed'), + ); - node.querySelector("button").addEventListener("click", e => { + node.querySelector('button').addEventListener('click', e => { e.preventDefault(); this._markMissedHmAsPresent(hm.id); }); - modal.querySelector(".modal-body").appendChild(node); + modal.querySelector('.modal-body').appendChild(node); }); } else { - modal.querySelector('.modal-body') - .removeChild(modal.querySelector('.missed-hm-tpl')); + modal + .querySelector('.modal-body') + .removeChild(modal.querySelector('.missed-hm-tpl')); } // Save button - modal.querySelector('button.save-btn').addEventListener('click', e => { - this._submitForm("#" + this.modal.getAttribute("id") + "-" + this.uid); + modal.querySelector('button.save-btn').addEventListener('click', () => { + this._submitForm('#' + this.modal.getAttribute('id') + '-' + this.uid); }); // Add to DOM and show, then remove on hide - document.getElementsByTagName("body")[0].appendChild(modal); - $("#" + this.modal.getAttribute("id") + "-" + this.uid) - .on('hidden.bs.modal', e => { - document.getElementsByTagName("body")[0].removeChild(e.target); - }) - .modal('show'); + document.getElementsByTagName('body')[0].appendChild(modal); + $('#' + this.modal.getAttribute('id') + '-' + this.uid) + .on('hidden.bs.modal', e => { + document.getElementsByTagName('body')[0].removeChild(e.target); + }) + .modal('show'); } _renderFinancialModal() { // Clone template modal - let modal = this.modal.cloneNode(true); - modal.setAttribute("id", - this.modal.getAttribute("id") + "-" + this.uid); + const modal = this.modal.cloneNode(true); + modal.setAttribute('id', this.modal.getAttribute('id') + '-' + this.uid); // Member Name modal.querySelector('input[name=name]').value = this.data.name; @@ -144,37 +146,39 @@ export default class EditUser { modal.querySelector('input[name=dues]').checked = this.data.active_member; // Save button - modal.querySelector('button.save-btn').addEventListener('click', e => { - this._submitForm("#" + this.modal.getAttribute("id") + "-" + this.uid); + modal.querySelector('button.save-btn').addEventListener('click', () => { + this._submitForm('#' + this.modal.getAttribute('id') + '-' + this.uid); }); // Add to DOM and show, then remove on hide - document.getElementsByTagName("body")[0].appendChild(modal); - $("#" + this.modal.getAttribute("id") + "-" + this.uid) - .on('hidden.bs.modal', e => { - document.getElementsByTagName("body")[0].removeChild(e.target); - }) - .modal('show'); + document.getElementsByTagName('body')[0].appendChild(modal); + $('#' + this.modal.getAttribute('id') + '-' + this.uid) + .on('hidden.bs.modal', e => { + document.getElementsByTagName('body')[0].removeChild(e.target); + }) + .modal('show'); } _markMissedHmAsPresent(id) { FetchUtil.fetchWithWarning( - this.endpoints.alterHmAttendance + this.uid + "/" + id, { - method: 'GET', - warningText: "You will not be able to re-mark this user as absent " + - "once they have been marked as present.", - successText: "User has been marked as present." - }, () => { - $("#missedHm-" + this.uid + "-" + id).fadeOut(); - } + this.endpoints.alterHmAttendance + this.uid + '/' + id, + { + method: 'GET', + warningText: + 'You will not be able to re-mark this user as absent ' + + 'once they have been marked as present.', + successText: 'User has been marked as present.', + }, + () => { + $('#missedHm-' + this.uid + '-' + id).fadeOut(); + }, ); } _renderFreshmanModal() { // Clone template modal - let modal = this.modal.cloneNode(true); - modal.setAttribute("id", - this.modal.getAttribute("id") + "-" + this.uid); + const modal = this.modal.cloneNode(true); + modal.setAttribute('id', this.modal.getAttribute('id') + '-' + this.uid); // Freshman Name modal.querySelector('input[name=name]').value = this.data.name; @@ -184,199 +188,236 @@ export default class EditUser { // On-floor Status modal.querySelector('input[name=onfloor]').checked = - this.data.onfloor_status; + this.data.onfloor_status; // Evaluation Date - modal.querySelector('input[name=evalDate]').value = - this.data.eval_date; + modal.querySelector('input[name=evalDate]').value = this.data.eval_date; new DatePicker(modal.querySelector('input[name=evalDate]')); // Freshmen Signatures Missed - modal.querySelector('input[name=sigMissed]').value = - this.data.sig_missed; + modal.querySelector('input[name=sigMissed]').value = this.data.sig_missed; // Missed House Meetings if (this.data.missed_hm.length > 0) { - modal.querySelector('.modal-body') - .removeChild(modal.querySelector('.no-missed-hm-alert')); + modal + .querySelector('.modal-body') + .removeChild(modal.querySelector('.no-missed-hm-alert')); - let missedHmTpl = modal.querySelector('.missed-hm-tpl'); - modal.querySelector(".modal-body").removeChild(missedHmTpl); + const missedHmTpl = modal.querySelector('.missed-hm-tpl'); + modal.querySelector('.modal-body').removeChild(missedHmTpl); this.data.missed_hm.forEach(hm => { - let node = missedHmTpl.cloneNode(true); + const node = missedHmTpl.cloneNode(true); - node.setAttribute("id", "missedHm-" + this.uid + "-" + hm.id); + node.setAttribute('id', 'missedHm-' + this.uid + '-' + hm.id); node.dataset.id = hm.id; - node.querySelector(".hm-date").textContent = hm.date; + node.querySelector('.hm-date').textContent = hm.date; - if (hm.status === "Excused") { - node.querySelector("input[name=hm-excused]").checked = true; + if (hm.status === 'Excused') { + node.querySelector('input[name=hm-excused]').checked = true; } - node.querySelector("input[name=reason]").value = hm.excuse; + node.querySelector('input[name=reason]').value = hm.excuse; - node.querySelector("input[name=hm-excused]").addEventListener( - 'click', e => e.target.classList.add('status-changed') - ); + node + .querySelector('input[name=hm-excused]') + .addEventListener('click', e => + e.target.classList.add('status-changed'), + ); - node.querySelector("input[name=reason]").addEventListener( - 'input', e => e.target.classList.add('excuse-changed') - ); + node + .querySelector('input[name=reason]') + .addEventListener('input', e => + e.target.classList.add('excuse-changed'), + ); - node.querySelector("button").addEventListener("click", e => { + node.querySelector('button').addEventListener('click', e => { e.preventDefault(); this._markMissedHmAsPresent(hm.id); }); - modal.querySelector(".modal-body").appendChild(node); + modal.querySelector('.modal-body').appendChild(node); }); } else { - modal.querySelector('.modal-body') - .removeChild(modal.querySelector('.missed-hm-tpl')); + modal + .querySelector('.modal-body') + .removeChild(modal.querySelector('.missed-hm-tpl')); } // Save button - modal.querySelector('button.save-btn').addEventListener('click', e => - this._submitForm() - ); + modal + .querySelector('button.save-btn') + .addEventListener('click', () => this._submitForm()); // Delete button - modal.querySelector('button.delete-btn').addEventListener('click', e => - this._deleteFreshman() - ); + modal + .querySelector('button.delete-btn') + .addEventListener('click', () => this._deleteFreshman()); // Upgrade button - modal.querySelector('button.upgrade-btn').addEventListener('click', e => - this._upgradeFreshman() - ); + modal + .querySelector('button.upgrade-btn') + .addEventListener('click', () => this._upgradeFreshman()); // Add to DOM and show, then remove on hide - document.getElementsByTagName("body")[0].appendChild(modal); - $("#" + this.modal.getAttribute("id") + "-" + this.uid) - .on('hidden.bs.modal', e => { - document.getElementsByTagName("body")[0].removeChild(e.target); - }) - .modal('show'); + document.getElementsByTagName('body')[0].appendChild(modal); + $('#' + this.modal.getAttribute('id') + '-' + this.uid) + .on('hidden.bs.modal', e => { + document.getElementsByTagName('body')[0].removeChild(e.target); + }) + .modal('show'); } _submitForm() { - let modal = document.querySelector("#" + this.modal.getAttribute("id") + - "-" + this.uid); + const modal = document.querySelector( + '#' + this.modal.getAttribute('id') + '-' + this.uid, + ); modal.querySelectorAll('button').forEach(btn => { btn.disabled = true; }); - if (this.type === "financial") { + if (this.type === 'financial') { // Save user details - let payload = { - activeMember: modal.querySelector('input[name=dues]').checked + const payload = { + activeMember: modal.querySelector('input[name=dues]').checked, }; - FetchUtil.post(this.endpoints.userDetails + this.uid, payload, { - successText: "User details have been updated." - }, () => { - $(modal).modal('hide'); - }); + FetchUtil.post( + this.endpoints.userDetails + this.uid, + payload, + { + successText: 'User details have been updated.', + }, + () => { + $(modal).modal('hide'); + }, + ); } else { // Save missed house meetings - let missedHms = modal.querySelectorAll('.hm-wrapper'); + const missedHms = modal.querySelectorAll('.hm-wrapper'); missedHms.forEach(hm => { - let payload = { + const payload = { id: hm.dataset.id, - status: hm.querySelector("input[name=hm-excused]").checked ? - 'Excused' : 'Absent', - excuse: hm.querySelector(".hm-reason").value + status: hm.querySelector('input[name=hm-excused]').checked + ? 'Excused' + : 'Absent', + excuse: hm.querySelector('.hm-reason').value, }; - fetch(this.endpoints.alterHmAttendance + this.uid + - "/" + hm.dataset.id, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - credentials: "same-origin", - body: JSON.stringify(payload) - }) - .then(FetchUtil.checkStatus) - .then(FetchUtil.parseJSON) - .then(response => { - if (!response.hasOwnProperty('success') || - !response.success) { - sweetAlert("Uh oh...", "We're having trouble submitting this " + - "form right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, response); - } - }) - .catch(error => { - sweetAlert("Uh oh...", "We're having trouble submitting this " + - "form right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, error); - }); + fetch( + this.endpoints.alterHmAttendance + this.uid + '/' + hm.dataset.id, + { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + credentials: 'same-origin', + body: JSON.stringify(payload), + }, + ) + .then(FetchUtil.checkStatus) + .then(FetchUtil.parseJSON) + .then(response => { + if (!Object.hasOwn(response, 'success') || !response.success) { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this " + + 'form right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, response); + } + }) + .catch(error => { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this " + + 'form right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, error); + }); }); // Save user details - let payload = { + const payload = { roomNumber: null, - onfloorStatus: modal.querySelector('input[name=onfloor]').checked + onfloorStatus: modal.querySelector('input[name=onfloor]').checked, }; - if (this.type === "member") { + if (this.type === 'member') { payload.activeMember = modal.querySelector('input[name=dues]').checked; payload.housingPoints = modal.querySelector('input[name=points]').value; - } else if (this.type === "freshman") { + } else if (this.type === 'freshman') { payload.name = modal.querySelector('input[name=name]').value; payload.evalDate = modal.querySelector('input[name=evalDate]').value; payload.sigMissed = modal.querySelector('input[name=sigMissed]').value; } - let roomNumber = modal.querySelector('input[name=room]').value; - if (roomNumber !== "N/A" && !_.isNil(roomNumber)) { + const roomNumber = modal.querySelector('input[name=room]').value; + if (roomNumber !== 'N/A' && !_.isNil(roomNumber)) { payload.roomNumber = roomNumber; } - FetchUtil.post(this.endpoints.userDetails + this.uid, payload, { - successText: "User details have been updated." - }, () => { - $(modal).modal('hide'); - }); + FetchUtil.post( + this.endpoints.userDetails + this.uid, + payload, + { + successText: 'User details have been updated.', + }, + () => { + $(modal).modal('hide'); + }, + ); } } _deleteFreshman() { - let modal = document.querySelector("#" + this.modal.getAttribute("id") + - "-" + this.uid); - - FetchUtil.fetchWithWarning(this.endpoints.userDetails + this.uid, { - method: 'DELETE', - warningText: "This account's data will be permanently deleted.", - successText: "Freshman account has been deleted." - }, () => { - $(modal).modal('hide'); - window.location.reload(); - }); + const modal = document.querySelector( + '#' + this.modal.getAttribute('id') + '-' + this.uid, + ); + + FetchUtil.fetchWithWarning( + this.endpoints.userDetails + this.uid, + { + method: 'DELETE', + warningText: "This account's data will be permanently deleted.", + successText: 'Freshman account has been deleted.', + }, + () => { + $(modal).modal('hide'); + window.location.reload(); + }, + ); } _upgradeFreshman() { - let modal = document.querySelector("#" + this.modal.getAttribute("id") + - "-" + this.uid); + const modal = document.querySelector( + '#' + this.modal.getAttribute('id') + '-' + this.uid, + ); - let payload = { + const payload = { fid: this.uid, uid: modal.querySelector('input[name=upgradeUid]').value, - sigsMissed: modal.querySelector('input[name=upgradeSigsMissed]').value + sigsMissed: modal.querySelector('input[name=upgradeSigsMissed]').value, }; - FetchUtil.postWithWarning(this.endpoints.userUpgrade, payload, { - warningText: "This will irreversibly migrate all of this " + - "freshman's data to the specified member account.", - successText: "Account has been upgraded." - }, () => { - $(modal).modal('hide'); - window.location.reload(); - }); + FetchUtil.postWithWarning( + this.endpoints.userUpgrade, + payload, + { + warningText: + 'This will irreversibly migrate all of this ' + + "freshman's data to the specified member account.", + successText: 'Account has been upgraded.', + }, + () => { + $(modal).modal('hide'); + window.location.reload(); + }, + ); } } diff --git a/frontend/javascript/modules/errorReport.js b/frontend/javascript/modules/errorReport.js index 6852df3d..ad22845c 100644 --- a/frontend/javascript/modules/errorReport.js +++ b/frontend/javascript/modules/errorReport.js @@ -13,7 +13,7 @@ export default class ErrorReport { _invokeSentryModal() { Sentry.showReportDialog({ - eventId: this.eventId + eventId: this.eventId, }); } } diff --git a/frontend/javascript/modules/evalToggle.js b/frontend/javascript/modules/evalToggle.js index dc80c04a..c13dbcd8 100644 --- a/frontend/javascript/modules/evalToggle.js +++ b/frontend/javascript/modules/evalToggle.js @@ -13,11 +13,11 @@ export default class EvalToggle { _toggleTable() { if (this.toggle.checked) { - $("#eval-blocks").hide(); - $("#eval-table").show(); + $('#eval-blocks').hide(); + $('#eval-table').show(); } else { - $("#eval-table").hide(); - $("#eval-blocks").show(); + $('#eval-table').hide(); + $('#eval-blocks').show(); } } } diff --git a/frontend/javascript/modules/hmForm.js b/frontend/javascript/modules/hmForm.js index 63432890..dfd787b2 100644 --- a/frontend/javascript/modules/hmForm.js +++ b/frontend/javascript/modules/hmForm.js @@ -1,5 +1,5 @@ -import _ from "lodash"; -import FetchUtil from "../utils/fetchUtil"; +import _ from 'lodash'; +import FetchUtil from '../utils/fetchUtil'; export default class HouseMeetingForm { constructor(form) { @@ -7,7 +7,7 @@ export default class HouseMeetingForm { this.endpoint = '/attendance/submit/hm'; this.fields = { - timestamp: this.form.elements.date + timestamp: this.form.elements.date, }; this.render(); @@ -16,40 +16,45 @@ export default class HouseMeetingForm { render() { // Prevent the form from submitting if the user hits the enter key ['keyup', 'keypress'].forEach(keyevent => - this.form.addEventListener(keyevent, event => { - let keyCode = event.keyCode || event.which; - if (keyCode === 13) { - event.preventDefault(); - return false; - } - }, true)); + this.form.addEventListener( + keyevent, + event => { + const keyCode = event.keyCode || event.which; + if (keyCode === 13) { + event.preventDefault(); + return false; + } + }, + true, + ), + ); // Form submit handler - this.form.querySelectorAll("input[type=submit]").forEach(submitBtn => { - submitBtn.addEventListener("click", e => { + this.form.querySelectorAll('input[type=submit]').forEach(submitBtn => { + submitBtn.addEventListener('click', e => { e.preventDefault(); - let payload = {}; + const payload = {}; Object.keys(this.fields).forEach(field => { payload[field] = this.fields[field].value; }); - let freshmen = []; - let upperclassmen = []; + const freshmen = []; + const upperclassmen = []; - this.form.querySelectorAll("input[type=checkbox]").forEach(checkbox => { + this.form.querySelectorAll('input[type=checkbox]').forEach(checkbox => { const uid = checkbox.name; - const status = checkbox.checked ? "Attended" : "Absent"; + const status = checkbox.checked ? 'Attended' : 'Absent'; if (_.isNaN(_.toNumber(uid))) { upperclassmen.push({ uid: uid, - status: status + status: status, }); } else { freshmen.push({ id: uid, - status: status + status: status, }); } }); @@ -58,9 +63,10 @@ export default class HouseMeetingForm { payload.members = upperclassmen; FetchUtil.postWithWarning(this.endpoint, payload, { - warningText: "You will not be able to unmark a member as present " + - "once attendance has been recorded.", - successText: "Attendance has been submitted." + warningText: + 'You will not be able to unmark a member as present ' + + 'once attendance has been recorded.', + successText: 'Attendance has been submitted.', }); }); }); diff --git a/frontend/javascript/modules/hmSearch.js b/frontend/javascript/modules/hmSearch.js index 6ec645ed..e3084d23 100644 --- a/frontend/javascript/modules/hmSearch.js +++ b/frontend/javascript/modules/hmSearch.js @@ -1,6 +1,5 @@ -/* global $ */ -import Exception from "../exceptions/exception"; -import HmSearchException from "../exceptions/hmSearchException"; +import Exception from '../exceptions/exception'; +import HmSearchException from '../exceptions/hmSearchException'; export default class HouseMeetingSearch { constructor(input) { @@ -11,7 +10,7 @@ export default class HouseMeetingSearch { throw new Exception(HmSearchException.TARGET_REQUIRED); } - if (this.target.tagName !== "TABLE") { + if (this.target.tagName !== 'TABLE') { throw new Exception(HmSearchException.NOT_A_TABLE); } @@ -22,29 +21,29 @@ export default class HouseMeetingSearch { } else { // No, wait until it initializes before rendering // Must use jQuery to listen to events fired by DataTables - $(this.target).on("init.dt", () => this.render()); + $(this.target).on('init.dt', () => this.render()); } } render() { // Remove the event listner so this module doesn't try to render again - $(this.target).off("init.dt"); + $(this.target).off('init.dt'); // Add custom filtering function $.fn.dataTable.ext.search.push(HouseMeetingSearch._alreadySelectedFilter); // Retrieve the target's DataTable API object - this.api = $(this.target).DataTable({ // eslint-disable-line new-cap - retrieve: true + this.api = $(this.target).DataTable({ + retrieve: true, }); // Bind to the input - this.input.addEventListener("keydown", event => this._handleKey(event)); + this.input.addEventListener('keydown', event => this._handleKey(event)); } _handleKey(event) { // Did the user press enter? - let keyCode = event.keyCode || event.which; + const keyCode = event.keyCode || event.which; if (keyCode === 13) { // Yes, prevent form submission event.preventDefault(); @@ -55,7 +54,7 @@ export default class HouseMeetingSearch { this.api.search('').draw(); // Clear and refocus input - this.input.value = ""; + this.input.value = ''; this.input.focus(); } else { // No, search and redraw the table @@ -65,8 +64,10 @@ export default class HouseMeetingSearch { _handleKeyAction() { // Check the first visible table row's checkbox - this.api.table().body().firstElementChild - .querySelector("input[type=checkbox]").checked = true; + this.api + .table() + .body() + .firstElementChild.querySelector('input[type=checkbox]').checked = true; } /* @@ -74,10 +75,13 @@ export default class HouseMeetingSearch { */ static _alreadySelectedFilter(settings, data, dataIndex) { // Only apply the filter if we're currently searching - if (typeof settings.oPreviousSearch.sSearch !== "undefined" && - settings.oPreviousSearch.sSearch !== "") { - return !settings.aoData[dataIndex].anCells[1] - .querySelector("input[type=checkbox]").checked; + if ( + typeof settings.oPreviousSearch.sSearch !== 'undefined' && + settings.oPreviousSearch.sSearch !== '' + ) { + return !settings.aoData[dataIndex].anCells[1].querySelector( + 'input[type=checkbox]', + ).checked; } return true; diff --git a/frontend/javascript/modules/housingEdit.js b/frontend/javascript/modules/housingEdit.js index cc8b5dbe..2d766136 100644 --- a/frontend/javascript/modules/housingEdit.js +++ b/frontend/javascript/modules/housingEdit.js @@ -1,9 +1,8 @@ -/* global fetch */ import 'whatwg-fetch'; -import Exception from "../exceptions/exception"; -import HousingException from "../exceptions/housingException"; -import FetchUtil from "../utils/fetchUtil"; -import MemberSelect from "./memberSelect"; +import Exception from '../exceptions/exception'; +import HousingException from '../exceptions/housingException'; +import FetchUtil from '../utils/fetchUtil'; +import MemberSelect from './memberSelect'; export default class EditHousing { constructor(link) { @@ -16,7 +15,7 @@ export default class EditHousing { this.endpoints = { roomDetails: '/housing/room/', alterRoom: '/housing/update/', - memberDetails: '/member/' + memberDetails: '/member/', }; this.render(); @@ -26,7 +25,7 @@ export default class EditHousing { this.link.addEventListener('click', e => { e.preventDefault(); - if (this.rmnumber === "") { + if (this.rmnumber === '') { this.data = {}; this.data.occupants = []; this._renderModal(); @@ -34,16 +33,16 @@ export default class EditHousing { fetch(this.endpoints.roomDetails + this.rmnumber, { method: 'GET', headers: { - Accept: 'application/json' + Accept: 'application/json', }, - credentials: 'same-origin' + credentials: 'same-origin', }) - .then(FetchUtil.checkStatus) - .then(FetchUtil.parseJSON) - .then(data => { - this.data = data; - this._renderModal(); - }); + .then(FetchUtil.checkStatus) + .then(FetchUtil.parseJSON) + .then(data => { + this.data = data; + this._renderModal(); + }); } }); } @@ -51,12 +50,15 @@ export default class EditHousing { _renderModal() { // Clone template modal this.modal = this.modalTpl.cloneNode(true); - this.modal.setAttribute('id', - this.modal.getAttribute('id') + '-' + this.rmnumber); + this.modal.setAttribute( + 'id', + this.modal.getAttribute('id') + '-' + this.rmnumber, + ); // Submit button - this.modal.querySelector('input[type="submit"]').addEventListener('click', - e => { + this.modal + .querySelector('input[type="submit"]') + .addEventListener('click', e => { e.preventDefault(); this._submitForm(); }); @@ -67,23 +69,23 @@ export default class EditHousing { // Occupants const occupantsInput = this.modal.querySelector('input[name="occupants"]'); - let occupantsStr = ""; + let occupantsStr = ''; this.data.occupants.forEach(occupant => { - occupantsStr += occupant + ","; + occupantsStr += occupant + ','; }); occupantsInput.value = occupantsStr; // Initialize selector control - occupantsInput.dataset.src = "cm_members"; - new MemberSelect(occupantsInput); // eslint-disable-line no-new + occupantsInput.dataset.src = 'cm_members'; + new MemberSelect(occupantsInput); // Add to DOM and show, then remove on hide document.getElementsByTagName('body')[0].appendChild(this.modal); $(this.modal) - .on('hidden.bs.modal', e => { - document.getElementsByTagName('body')[0].removeChild(e.target); - }) - .modal('show'); + .on('hidden.bs.modal', e => { + document.getElementsByTagName('body')[0].removeChild(e.target); + }) + .modal('show'); } _submitForm() { @@ -93,86 +95,93 @@ export default class EditHousing { }); // Save details - let payload = {}; - payload.occupants = this.modal.querySelector('input[name="occupants"]').value.split(','); // eslint-disable-line max-len - let room = this.modal.querySelector('input[name="rmnumber"]').value; + const payload = {}; + payload.occupants = this.modal + .querySelector('input[name="occupants"]') + .value.split(','); + const room = this.modal.querySelector('input[name="rmnumber"]').value; - FetchUtil.post(this.endpoints.alterRoom + room, payload, { - successText: 'Occupants have been updated.' - }, () => { - // Hide the modal. - $(this.modal).modal('hide'); + FetchUtil.post( + this.endpoints.alterRoom + room, + payload, + { + successText: 'Occupants have been updated.', + }, + () => { + // Hide the modal. + $(this.modal).modal('hide'); - // Update the DOM to reflect the new occupants. - var occupantList = document.getElementById(room); - if (occupantList) { - // The room already exists in the list, update it. - occupantList.innerHTML = ''; - payload.occupants.forEach(occupant => { - fetch(this.endpoints.memberDetails + occupant, { - method: 'GET', - headers: { - Accept: 'application/json' - }, - credentials: 'same-origin' - }) + // Update the DOM to reflect the new occupants. + const occupantList = document.getElementById(room); + if (occupantList) { + // The room already exists in the list, update it. + occupantList.innerHTML = ''; + payload.occupants.forEach(occupant => { + fetch(this.endpoints.memberDetails + occupant, { + method: 'GET', + headers: { + Accept: 'application/json', + }, + credentials: 'same-origin', + }) .then(FetchUtil.checkStatus) .then(FetchUtil.parseJSON) .then(data => { - var newName = document.createElement("li"); + const newName = document.createElement('li'); newName.appendChild(document.createTextNode(data.name)); - newName.setAttribute("class", "room-name"); + newName.setAttribute('class', 'room-name'); occupantList.appendChild(newName); }); - }); - } else { - // The room is new and needs to be created. - var roomTable = document.getElementById("housing-table"); - var newRoom = document.createElement("tr"); - var newRoomNbrCol = document.createElement("td"); - var newRoomNbr = document.createElement("h3"); - newRoomNbr.appendChild(document.createTextNode(room)); - newRoomNbr.setAttribute("class", "room-number"); - newRoomNbrCol.appendChild(newRoomNbr); - newRoomNbrCol.setAttribute("class", "new-table-col"); - newRoom.appendChild(newRoomNbrCol); - // Add new occupants to room. - var newOccupantCol = document.createElement("td"); - var newOccupantList = document.createElement("ul"); - newOccupantList.setAttribute("id", room); - newOccupantList.setAttribute("class", "occupant-list"); - payload.occupants.forEach(occupant => { - fetch(this.endpoints.memberDetails + occupant, { - method: 'GET', - headers: { - Accept: 'application/json' - }, - credentials: 'same-origin' - }) + }); + } else { + // The room is new and needs to be created. + const roomTable = document.getElementById('housing-table'); + const newRoom = document.createElement('tr'); + const newRoomNbrCol = document.createElement('td'); + const newRoomNbr = document.createElement('h3'); + newRoomNbr.appendChild(document.createTextNode(room)); + newRoomNbr.setAttribute('class', 'room-number'); + newRoomNbrCol.appendChild(newRoomNbr); + newRoomNbrCol.setAttribute('class', 'new-table-col'); + newRoom.appendChild(newRoomNbrCol); + // Add new occupants to room. + const newOccupantCol = document.createElement('td'); + const newOccupantList = document.createElement('ul'); + newOccupantList.setAttribute('id', room); + newOccupantList.setAttribute('class', 'occupant-list'); + payload.occupants.forEach(occupant => { + fetch(this.endpoints.memberDetails + occupant, { + method: 'GET', + headers: { + Accept: 'application/json', + }, + credentials: 'same-origin', + }) .then(FetchUtil.checkStatus) .then(FetchUtil.parseJSON) .then(data => { - var newName = document.createElement("li"); + const newName = document.createElement('li'); newName.appendChild(document.createTextNode(data.name)); - newName.setAttribute("class", "room-name"); + newName.setAttribute('class', 'room-name'); newOccupantList.appendChild(newName); }); - }); - newOccupantCol.appendChild(newOccupantList); - newOccupantCol.setAttribute("class", "new-table-col"); - newRoom.appendChild(newOccupantCol); - // Add edit button for new room. - var newEditCol = document.createElement("td"); - var editBtn = document.getElementById("rm-edit-btn"); - var newEditBtn = editBtn.cloneNode(true); - newEditBtn.setAttribute("data-rmnumber", room); - new EditHousing(newEditBtn); // eslint-disable-no-new - newEditCol.appendChild(newEditBtn); - newEditCol.setAttribute("class", "new-table-col"); - newRoom.appendChild(newEditCol); - roomTable.appendChild(newRoom); - } - }); + }); + newOccupantCol.appendChild(newOccupantList); + newOccupantCol.setAttribute('class', 'new-table-col'); + newRoom.appendChild(newOccupantCol); + // Add edit button for new room. + const newEditCol = document.createElement('td'); + const editBtn = document.getElementById('rm-edit-btn'); + const newEditBtn = editBtn.cloneNode(true); + newEditBtn.setAttribute('data-rmnumber', room); + new EditHousing(newEditBtn); // eslint-disable-no-new + newEditCol.appendChild(newEditBtn); + newEditCol.setAttribute('class', 'new-table-col'); + newRoom.appendChild(newEditCol); + roomTable.appendChild(newRoom); + } + }, + ); } else { throw new Exception(HousingException.SUBMIT_BEFORE_RENDER); } diff --git a/frontend/javascript/modules/housingQueue.js b/frontend/javascript/modules/housingQueue.js index f63d7cc6..fe941377 100644 --- a/frontend/javascript/modules/housingQueue.js +++ b/frontend/javascript/modules/housingQueue.js @@ -1,9 +1,8 @@ -/* global fetch */ import 'whatwg-fetch'; import Exception from '../exceptions/exception'; import FetchException from '../exceptions/fetchException'; import FetchUtil from '../utils/fetchUtil'; -import sweetAlert from '../../../node_modules/bootstrap-sweetalert/dev/sweetalert.es6.js'; // eslint-disable-line max-len +import sweetAlert from '../../../node_modules/bootstrap-sweetalert/dev/sweetalert.es6.js'; export default class HousingQueue { constructor(queuePanel) { @@ -28,8 +27,8 @@ export default class HousingQueue { $(this.queueTable).off('init.dt'); // Retrieve the queue table's DataTables API object - this.queueTableApi = $(this.queueTable).DataTable({ // eslint-disable-line new-cap - retrieve: true + this.queueTableApi = $(this.queueTable).DataTable({ + retrieve: true, }); // Add custom filtering function @@ -43,12 +42,16 @@ export default class HousingQueue { const filterButton = this.queuePanel.querySelector('#queueFilterToggle'); filterButton.addEventListener('click', () => { if (this.queueTable.dataset.show === 'all') { - filterButton.innerHTML = - filterButton.innerHTML.replace('Show Current Queue', 'Show All'); + filterButton.innerHTML = filterButton.innerHTML.replace( + 'Show Current Queue', + 'Show All', + ); this.queueTable.dataset.show = 'current'; } else { - filterButton.innerHTML = - filterButton.innerHTML.replace('Show All', 'Show Current Queue'); + filterButton.innerHTML = filterButton.innerHTML.replace( + 'Show All', + 'Show Current Queue', + ); this.queueTable.dataset.show = 'all'; } @@ -57,49 +60,57 @@ export default class HousingQueue { } bindCheckboxes() { - this.queuePanel.querySelectorAll('.col-in-queue > input[type="checkbox"]') - .forEach(toggle => { - toggle.addEventListener('click', () => { - const row = toggle.parentNode.parentNode; - this.updateInQueue(toggle.dataset.uid, toggle.checked, row); - }); + this.queuePanel + .querySelectorAll('.col-in-queue > input[type="checkbox"]') + .forEach(toggle => { + toggle.addEventListener('click', () => { + const row = toggle.parentNode.parentNode; + this.updateInQueue(toggle.dataset.uid, toggle.checked, row); }); + }); } updateInQueue(uid, inQueue, row) { - let payload = { + const payload = { uid: uid, - inQueue: inQueue + inQueue: inQueue, }; fetch(this.endpoint, { method: 'PUT', headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' + Accept: 'application/json', + 'Content-Type': 'application/json', }, credentials: 'same-origin', - body: JSON.stringify(payload) + body: JSON.stringify(payload), }) .then(FetchUtil.checkStatus) .then(FetchUtil.parseJSON) .then(response => { - if (response.hasOwnProperty('success') && - response.success === true) { + if (Object.hasOwn(response, 'success') && response.success === true) { if (inQueue) { row.classList.remove('disabled'); } else { row.classList.add('disabled'); } } else { - sweetAlert('Uh oh...', 'We\'re having trouble updating ' + - 'the queue right now. Please try again later.', 'error'); + sweetAlert( + 'Uh oh...', + "We're having trouble updating " + + 'the queue right now. Please try again later.', + 'error', + ); throw new Exception(FetchException.REQUEST_FAILED, response); } }) .catch(error => { - sweetAlert('Uh oh...', 'We\'re having trouble updating ' + - 'the queue right now. Please try again later.', 'error'); + sweetAlert( + 'Uh oh...', + "We're having trouble updating " + + 'the queue right now. Please try again later.', + 'error', + ); throw new Exception(FetchException.REQUEST_FAILED, error); }); } @@ -110,8 +121,9 @@ export default class HousingQueue { static _inQueueFilter(settings, data, dataIndex) { // Check to see if we should apply the filter if (settings.nTable.dataset.show === 'current') { - return settings.aoData[dataIndex].anCells[2] - .querySelector('input[type=checkbox]').checked; + return settings.aoData[dataIndex].anCells[2].querySelector( + 'input[type=checkbox]', + ).checked; } return true; diff --git a/frontend/javascript/modules/index.js b/frontend/javascript/modules/index.js index f520603e..2f364bf6 100644 --- a/frontend/javascript/modules/index.js +++ b/frontend/javascript/modules/index.js @@ -8,7 +8,7 @@ for (let i = 0; i < moduleElements.length; i++) { const el = moduleElements[i]; const name = el.getAttribute('data-module'); const Module = require(`./${name}`).default; - new Module(el); // eslint-disable-line no-new + new Module(el); } /* diff --git a/frontend/javascript/modules/introEvalsForm.js b/frontend/javascript/modules/introEvalsForm.js index 7701b2a5..599654c0 100644 --- a/frontend/javascript/modules/introEvalsForm.js +++ b/frontend/javascript/modules/introEvalsForm.js @@ -1,4 +1,4 @@ -import FetchUtil from "../utils/fetchUtil"; +import FetchUtil from '../utils/fetchUtil'; export default class IntroEvalsForm { constructor(form) { @@ -8,22 +8,22 @@ export default class IntroEvalsForm { } render() { - this.form.querySelector('input[type=submit]') + this.form + .querySelector('input[type=submit]') .addEventListener('click', e => this._submitForm(e)); } _submitForm(e) { e.preventDefault(); - let payload = { - socialEvents: - this.form.querySelector('textarea[name=social_events]').value, - comments: - this.form.querySelector('textarea[name=comments]').value + const payload = { + socialEvents: this.form.querySelector('textarea[name=social_events]') + .value, + comments: this.form.querySelector('textarea[name=comments]').value, }; FetchUtil.post(this.endpoint, payload, { - successText: "Your social events and comments have been updated." + successText: 'Your social events and comments have been updated.', }); } } diff --git a/frontend/javascript/modules/ipSearch.js b/frontend/javascript/modules/ipSearch.js index 36103b90..70eade81 100644 --- a/frontend/javascript/modules/ipSearch.js +++ b/frontend/javascript/modules/ipSearch.js @@ -1,14 +1,19 @@ -import HouseMeetingSearch from "./hmSearch"; +import HouseMeetingSearch from './hmSearch'; export default class IntroductoryProjectSearch extends HouseMeetingSearch { constructor(input) { super(input); HouseMeetingSearch._alreadySelectedFilter = (settings, data, dataIndex) => { // Only apply the filter if we're currently searching - if (typeof settings.oPreviousSearch.sSearch !== "undefined" && - settings.oPreviousSearch.sSearch !== "") { - return !(settings.aoData[dataIndex].anCells[1] - .querySelector('.dropdown-toggle').dataset.selected === "Passed"); + if ( + typeof settings.oPreviousSearch.sSearch !== 'undefined' && + settings.oPreviousSearch.sSearch !== '' + ) { + return !( + settings.aoData[dataIndex].anCells[1].querySelector( + '.dropdown-toggle', + ).dataset.selected === 'Passed' + ); } return true; @@ -17,18 +22,20 @@ export default class IntroductoryProjectSearch extends HouseMeetingSearch { _handleKeyAction() { // Set the status of the first visible table row's selector to Passed - let toggle = this.api.table().body().firstElementChild - .querySelector(".dropdown-toggle"); + const toggle = this.api + .table() + .body() + .firstElementChild.querySelector('.dropdown-toggle'); - ["btn-success", "btn-danger", "btn-warning"] - .forEach(classToRemove => - toggle.classList.remove(classToRemove)); + ['btn-success', 'btn-danger', 'btn-warning'].forEach(classToRemove => + toggle.classList.remove(classToRemove), + ); const caret = document.createElement('span'); caret.classList.add('caret'); - toggle.text = "Passed "; + toggle.text = 'Passed '; toggle.appendChild(caret); - toggle.classList.add("btn-success"); - toggle.dataset.selected = "Passed"; + toggle.classList.add('btn-success'); + toggle.dataset.selected = 'Passed'; } } diff --git a/frontend/javascript/modules/majorProjectForm.js b/frontend/javascript/modules/majorProjectForm.js index 36250529..ae9c4230 100644 --- a/frontend/javascript/modules/majorProjectForm.js +++ b/frontend/javascript/modules/majorProjectForm.js @@ -1,95 +1,115 @@ -import FetchUtil from "../utils/fetchUtil"; +import FetchUtil from '../utils/fetchUtil'; export default class MajorProjectForm { - - - constructor(form) { - this.form = form; - this.endpoint = '/major_project/submit'; - this.tags_written = false; - this.tag_keys = ["Enter", "Comma", "Tab"]; - this.render(); + constructor(form) { + this.form = form; + this.endpoint = '/major_project/submit'; + this.tags_written = false; + this.tag_keys = ['Enter', 'Comma', 'Tab']; + this.render(); + } + + render() { + this.form + .querySelector('input[type=submit]') + .addEventListener('click', e => this._submitForm(e)); + this.form + .querySelector('input[id=skill-input]') + .addEventListener('focusout', e => this.onWriteSkill(e)); + this.form + .querySelector('input[id=skill-input]') + .addEventListener('keypress', e => this.onKeyPress(e)); + } + + onKeyPress(e) { + if (this.tag_keys.includes(e.code)) { + e.preventDefault(); + this.onWriteSkill(e); } + return false; + } - render() { - this.form.querySelector('input[type=submit]') - .addEventListener('click', e => this._submitForm(e)); - this.form.querySelector('input[id=skill-input]') - .addEventListener('focusout', e => this.onWriteSkill(e)); - this.form.querySelector('input[id=skill-input]') - .addEventListener('keypress', e => this.onKeyPress(e)); - } + onWriteSkill() { + const input = document.getElementById('skill-input'); + if (!this.tags_written) { + this.tags_written = true; - onKeyPress(e) { - if (this.tag_keys.includes(e.code)) { - e.preventDefault(); - this.onWriteSkill(e); - } - return false; + const firstTag = document.getElementsByClassName('skill-tag').item(0); + if (firstTag) firstTag.remove(); } - onWriteSkill(e) { - let input = document.getElementById("skill-input") - if (!this.tags_written) { - this.tags_written = true - - const firstTag = document.getElementsByClassName("skill-tag").item(0); - if (firstTag) firstTag.remove(); - } - - let txt = input.value.replaceAll(/[^a-zA-Z0-9\+\-\.\# ]/g, ''); // allowed characters list - if (txt) input.insertAdjacentHTML("beforebegin", '' + txt + ''); - let skills = this.form.getElementsByClassName("skill-tag") - skills.item(skills.length - 1).addEventListener('click', e => this.onRemoveTag(e)); - input.value = ""; + const txt = input.value.replaceAll(/[^a-zA-Z0-9+\-.# ]/g, ''); // allowed characters list + if (txt) + input.insertAdjacentHTML( + 'beforebegin', + '' + txt + '', + ); + const skills = this.form.getElementsByClassName('skill-tag'); + skills + .item(skills.length - 1) + .addEventListener('click', e => this.onRemoveTag(e)); + input.value = ''; + } + + onRemoveTag(e) { + e.target.remove(); + } + + _submitForm(e) { + e.preventDefault(); + + const skills = []; + + for (const tag of this.form.getElementsByClassName('skill-tag')) { + skills.push(tag.textContent); } - onRemoveTag(e) { - e.target.remove(); + let projectName = this.form.querySelector('input[name=name]').value; + let projectTldr = this.form.querySelector('input[name=tldr]').value; + let projectTimeSpent = this.form.querySelector( + 'textarea[name=time-commitment]', + ).value; + let projectDescription = this.form.querySelector( + 'textarea[name=description]', + ).value; + const projectLinks = this.form.querySelector('textarea[name=links]').value; + + // For each field, if it is not empty, trim it. + if (projectName !== '') projectName = projectName.trim(); + if (projectTldr !== '') projectTldr = projectTldr.trim(); + if (projectTimeSpent !== '') projectTimeSpent = projectTimeSpent.trim(); + if (projectDescription !== '') + projectDescription = projectDescription.trim(); + + if ( + !projectName || + !projectTldr || + !projectTimeSpent || + !projectDescription || + skills.length === 0 + ) { + alert( + 'Error: At least one required field is empty. \n\nProject Name, TLDR, Time Commitment, Description, and at least one skill are required.', + ); + return; } - _submitForm(e) { - e.preventDefault(); - - let skills = []; - - for (const tag of this.form.getElementsByClassName('skill-tag')) { - skills.push(tag.textContent); - } - - let projectName = this.form.querySelector('input[name=name]').value; - let projectTldr = this.form.querySelector('input[name=tldr]').value; - let projectTimeSpent = this.form.querySelector('textarea[name=time-commitment]').value; - let projectDescription = this.form.querySelector('textarea[name=description]').value; - let projectLinks = this.form.querySelector('textarea[name=links]').value; - - // For each field, if it is not empty, trim it. - if (projectName !== "") projectName = projectName.trim(); - if (projectTldr !== "") projectTldr = projectTldr.trim(); - if (projectTimeSpent !== "") projectTimeSpent = projectTimeSpent.trim(); - if (projectDescription !== "") projectDescription = projectDescription.trim(); - - if (!projectName || !projectTldr || !projectTimeSpent || !projectDescription || skills.length === 0) { - alert("Error: At least one required field is empty. \n\nProject Name, TLDR, Time Commitment, Description, and at least one skill are required."); - return; - } - - let payload = { - projectName: projectName, - projectTldr: projectTldr, - projectTimeSpent: projectTimeSpent, - projectSkills: skills, - projectDescription: projectDescription, - projectLinks: projectLinks - }; - - - console.log(payload) - - FetchUtil.postWithWarning(this.endpoint, payload, { - warningText: "You will not be able to edit your " + - "project once it has been submitted.", - successText: "Your project has been submitted." - }); - } -} \ No newline at end of file + const payload = { + projectName: projectName, + projectTldr: projectTldr, + projectTimeSpent: projectTimeSpent, + projectSkills: skills, + projectDescription: projectDescription, + projectLinks: projectLinks, + }; + + console.log(payload); + + FetchUtil.postWithWarning(this.endpoint, payload, { + warningText: + 'You will not be able to edit your ' + + 'project once it has been submitted.', + successText: 'Your project has been submitted.', + }); + } +} diff --git a/frontend/javascript/modules/majorProjectStatus.js b/frontend/javascript/modules/majorProjectStatus.js index 7ca87ad3..bfebf152 100644 --- a/frontend/javascript/modules/majorProjectStatus.js +++ b/frontend/javascript/modules/majorProjectStatus.js @@ -1,9 +1,8 @@ -/* global fetch */ -import "whatwg-fetch"; -import Exception from "../exceptions/exception"; -import FetchException from "../exceptions/fetchException"; -import FetchUtil from "../utils/fetchUtil"; -import sweetAlert from "../../../node_modules/bootstrap-sweetalert/dev/sweetalert.es6.js"; // eslint-disable-line max-len +import 'whatwg-fetch'; +import Exception from '../exceptions/exception'; +import FetchException from '../exceptions/fetchException'; +import FetchUtil from '../utils/fetchUtil'; +import sweetAlert from '../../../node_modules/bootstrap-sweetalert/dev/sweetalert.es6.js'; export default class MajorProjectStatus { constructor(control) { @@ -15,7 +14,7 @@ export default class MajorProjectStatus { } render() { - if (this.control.tagName.toLowerCase() === "div") { + if (this.control.tagName.toLowerCase() === 'div') { // Evals director dropdown const options = this.control.querySelectorAll('[data-option]'); options.forEach(option => { @@ -26,75 +25,87 @@ export default class MajorProjectStatus { }); } else { // Member self-delete button - this.control.addEventListener('click', - () => this._changeStatus('Delete')); + this.control.addEventListener('click', () => + this._changeStatus('Delete'), + ); } } _changeStatus(option) { - if (option === "Delete") { - FetchUtil.fetchWithWarning(this.deleteEndpoint, { - method: 'DELETE', - warningText: 'This action cannot be undone.', - successText: 'Major project deleted.' - }, () => { - let dashboardContainer = this.control.closest(".mp-container"); - if (dashboardContainer) { - // Dashboard button - $(dashboardContainer).hide(); - } else { - // Major projects page button - $(this.control.closest(".card")).fadeOut(); - } - }); + if (option === 'Delete') { + FetchUtil.fetchWithWarning( + this.deleteEndpoint, + { + method: 'DELETE', + warningText: 'This action cannot be undone.', + successText: 'Major project deleted.', + }, + () => { + const dashboardContainer = this.control.closest('.mp-container'); + if (dashboardContainer) { + // Dashboard button + $(dashboardContainer).hide(); + } else { + // Major projects page button + $(this.control.closest('.card')).fadeOut(); + } + }, + ); } else { - let payload = { + const payload = { id: this.id, - status: option + status: option, }; fetch(this.endpoint, { method: 'POST', headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' + Accept: 'application/json', + 'Content-Type': 'application/json', }, - credentials: "same-origin", - body: JSON.stringify(payload) + credentials: 'same-origin', + body: JSON.stringify(payload), }) - .then(FetchUtil.checkStatus) - .then(FetchUtil.parseJSON) - .then(response => { - if (response.hasOwnProperty('success') && - response.success === true) { - let toggle = this.control.querySelector('.dropdown-toggle'); - ["btn-success", "btn-danger", "btn-warning"] - .forEach(classToRemove => - toggle.classList.remove(classToRemove)); + .then(FetchUtil.checkStatus) + .then(FetchUtil.parseJSON) + .then(response => { + if (Object.hasOwn(response, 'success') && response.success === true) { + const toggle = this.control.querySelector('.dropdown-toggle'); + ['btn-success', 'btn-danger', 'btn-warning'].forEach( + classToRemove => toggle.classList.remove(classToRemove), + ); - const caret = document.createElement('span'); - caret.classList.add('caret'); - toggle.text = option + " "; - toggle.appendChild(caret); + const caret = document.createElement('span'); + caret.classList.add('caret'); + toggle.text = option + ' '; + toggle.appendChild(caret); - if (option === "Passed") { - toggle.classList.add("btn-success"); - } else if (option === "Failed") { - toggle.classList.add("btn-danger"); - } else { - toggle.classList.add("btn-warning"); - } + if (option === 'Passed') { + toggle.classList.add('btn-success'); + } else if (option === 'Failed') { + toggle.classList.add('btn-danger'); } else { - sweetAlert("Uh oh...", "We're having trouble updating " + - "this project right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, response); + toggle.classList.add('btn-warning'); } - }) - .catch(error => { - sweetAlert("Uh oh...", "We're having trouble updating " + - "this project right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, error); - }); + } else { + sweetAlert( + 'Uh oh...', + "We're having trouble updating " + + 'this project right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, response); + } + }) + .catch(error => { + sweetAlert( + 'Uh oh...', + "We're having trouble updating " + + 'this project right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, error); + }); } } } diff --git a/frontend/javascript/modules/masonry.js b/frontend/javascript/modules/masonry.js index a4ded294..0e23be54 100644 --- a/frontend/javascript/modules/masonry.js +++ b/frontend/javascript/modules/masonry.js @@ -1,7 +1,7 @@ -import SimpleMasonry from "simple-masonry"; -import FreqencyMap from "../models/frequencyMap"; -import Exception from "../exceptions/exception"; -import MasonryException from "../exceptions/masonryException"; +import SimpleMasonry from 'simple-masonry'; +import FreqencyMap from '../models/frequencyMap'; +import Exception from '../exceptions/exception'; +import MasonryException from '../exceptions/masonryException'; export default class Masonry { constructor(grid) { @@ -9,7 +9,7 @@ export default class Masonry { this.masonry = new SimpleMasonry({ masonryBox: this.grid, - masonryColumn: this._findSharedSelector(this.grid) + masonryColumn: this._findSharedSelector(this.grid), }); this.render(); @@ -20,7 +20,7 @@ export default class Masonry { } _findSharedSelector(parent) { - let selectors = new FreqencyMap(); + const selectors = new FreqencyMap(); let sharedSelector = null; try { @@ -30,12 +30,12 @@ export default class Masonry { } if (child.id) { - selectors.increment("#" + child.id); + selectors.increment('#' + child.id); } if (child.className) { child.className.split(/\s+/).forEach(className => { - selectors.increment("." + className); + selectors.increment('.' + className); }); } }); @@ -44,7 +44,7 @@ export default class Masonry { } catch (e) { throw new Exception( MasonryException.CANT_FIND_SHARED_SELECTOR, - e.message + e.message, ); } diff --git a/frontend/javascript/modules/memberSelect.js b/frontend/javascript/modules/memberSelect.js index 048fe2b4..f602544c 100644 --- a/frontend/javascript/modules/memberSelect.js +++ b/frontend/javascript/modules/memberSelect.js @@ -1,10 +1,9 @@ -/* global fetch */ -import "whatwg-fetch"; -import "@selectize/selectize"; -import FetchUtil from "../utils/fetchUtil"; -import Exception from "../exceptions/exception"; -import AttendanceException from "../exceptions/attendanceException"; -import FetchException from "../exceptions/fetchException"; +import 'whatwg-fetch'; +import '@selectize/selectize'; +import FetchUtil from '../utils/fetchUtil'; +import Exception from '../exceptions/exception'; +import AttendanceException from '../exceptions/attendanceException'; +import FetchException from '../exceptions/fetchException'; export default class MemberSelect { constructor(element) { @@ -15,10 +14,10 @@ export default class MemberSelect { fetch('/attendance/' + this.dataSrc, { method: 'GET', headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' + Accept: 'application/json', + 'Content-Type': 'application/json', }, - credentials: 'same-origin' + credentials: 'same-origin', }) .then(FetchUtil.checkResponse) .then(FetchUtil.parseJSON) @@ -44,7 +43,7 @@ export default class MemberSelect { labelField: 'display', searchField: 'display', selectOnTab: true, - options: this.members + options: this.members, }); } } diff --git a/frontend/javascript/modules/newYear.js b/frontend/javascript/modules/newYear.js index 3928449e..72424504 100644 --- a/frontend/javascript/modules/newYear.js +++ b/frontend/javascript/modules/newYear.js @@ -1,7 +1,7 @@ import FetchUtil from '../utils/fetchUtil'; -import Exception from "../exceptions/exception"; -import FetchException from "../exceptions/fetchException"; -import sweetAlert from "../../../node_modules/bootstrap-sweetalert/dev/sweetalert.es6.js"; // eslint-disable-line max-len +import Exception from '../exceptions/exception'; +import FetchException from '../exceptions/fetchException'; +import sweetAlert from '../../../node_modules/bootstrap-sweetalert/dev/sweetalert.es6.js'; export default class NewYear { constructor(link) { @@ -12,7 +12,7 @@ export default class NewYear { this.endpoints = { housing: '/housing', active: '/manage/active', - current: '/manage/current/' + current: '/manage/current/', }; this.render(); @@ -21,61 +21,84 @@ export default class NewYear { this.link.addEventListener('click', e => { e.preventDefault(); - if (this.step === "welcome") { + if (this.step === 'welcome') { $('#new-welcome').fadeOut(() => { - $("#new-clear").fadeIn(); + $('#new-clear').fadeIn(); }); - } else if (this.step === "clear") { - FetchUtil.fetchWithWarning(this.endpoints.active, { - method: 'DELETE', - warningText: "This will clear active members and room assignments!", - successText: "Data successfully cleared."}, () => { + } else if (this.step === 'clear') { + FetchUtil.fetchWithWarning( + this.endpoints.active, + { + method: 'DELETE', + warningText: 'This will clear active members and room assignments!', + successText: 'Data successfully cleared.', + }, + () => { fetch(this.endpoints.housing, { method: 'DELETE', - credentials: "same-origin" - }) - .then($('#new-clear').fadeOut(() => { - $("#new-current").fadeIn(); + credentials: 'same-origin', }) - ).catch(error => { - sweetAlert("Uh oh...", "We're having trouble submitting that " + - "action right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, error); - }); - }); + .then( + $('#new-clear').fadeOut(() => { + $('#new-current').fadeIn(); + }), + ) + .catch(error => { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting that " + + 'action right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, error); + }); + }, + ); } else if (this.uid) { - if ($('#rem-' + this.uid).is(":visible")) { + if ($('#rem-' + this.uid).is(':visible')) { fetch(this.endpoints.current + this.uid, { method: 'DELETE', - credentials: "same-origin" - }).then(() => { - $('#rem-' + this.uid).hide(); - $('#add-' + this.uid).show(); - var userRow = $('#row-' + this.uid)[0]; - userRow.style.setProperty("text-decoration", "line-through"); - }).catch(error => { - sweetAlert("Uh oh...", "We're having trouble submitting that " + - "action right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, error); - }); + credentials: 'same-origin', + }) + .then(() => { + $('#rem-' + this.uid).hide(); + $('#add-' + this.uid).show(); + const userRow = $('#row-' + this.uid)[0]; + userRow.style.setProperty('text-decoration', 'line-through'); + }) + .catch(error => { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting that " + + 'action right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, error); + }); } else { fetch(this.endpoints.current + this.uid, { method: 'POST', - credentials: "same-origin" - }).then(() => { - $('#add-' + this.uid).hide(); - $('#rem-' + this.uid).show(); - var lineRow = $('#row-' + this.uid)[0]; - lineRow.style.setProperty("text-decoration", "none"); - }).catch(error => { - sweetAlert("Uh oh...", "We're having trouble submitting that " + - "action right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, error); - }); + credentials: 'same-origin', + }) + .then(() => { + $('#add-' + this.uid).hide(); + $('#rem-' + this.uid).show(); + const lineRow = $('#row-' + this.uid)[0]; + lineRow.style.setProperty('text-decoration', 'none'); + }) + .catch(error => { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting that " + + 'action right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, error); + }); } - } else if (this.step === "current") { - $('#new-current').fadeOut(function() { - $("#new-housing").fadeIn(); + } else if (this.step === 'current') { + $('#new-current').fadeOut(() => { + $('#new-housing').fadeIn(); }); } }); diff --git a/frontend/javascript/modules/presentation.js b/frontend/javascript/modules/presentation.js index 7bac5e36..c95fed07 100644 --- a/frontend/javascript/modules/presentation.js +++ b/frontend/javascript/modules/presentation.js @@ -3,7 +3,7 @@ import reveal from 'reveal.js'; export default class Presentation { constructor(element) { this.element = element; - if (location.pathname.split('/')[2] === "intro") { + if (location.pathname.split('/')[2] === 'intro') { this.endpoint = '/slideshow/intro/review'; } else { this.endpoint = '/slideshow/spring/review'; @@ -17,55 +17,67 @@ export default class Presentation { const nameHeight = name.height(); const nameLineheight = parseFloat(name.css('line-height')); const nameRows = nameHeight / nameLineheight; // get # lines of name elem - if (nameRows > 1) { // if name wraps to two lines + if (nameRows > 1) { + // if name wraps to two lines name.css('font-size', '1.5em'); } $('.reveal button.pass').click(e => { - let uid = e.target.parentElement.dataset.uid; // Ex: ID of 'pass-ram' => 'ram' - let cn = e.target.parentElement.dataset.cn; + const uid = e.target.parentElement.dataset.uid; // Ex: ID of 'pass-ram' => 'ram' + const cn = e.target.parentElement.dataset.cn; e.preventDefault(); - let payload = { + const payload = { uid: uid, - status: "Passed" + status: 'Passed', }; - FetchUtil.postWithWarning(this.endpoint, payload, { - warningText: "Are you sure you want to pass " + cn + "?", - successText: cn + " has been marked as passed." - }, () => { - $(e.target).text("Passed").off("click").addClass("disabled"); - $(e.target).next().hide(); - reveal.right(); - }); + FetchUtil.postWithWarning( + this.endpoint, + payload, + { + warningText: 'Are you sure you want to pass ' + cn + '?', + successText: cn + ' has been marked as passed.', + }, + () => { + $(e.target).text('Passed').off('click').addClass('disabled'); + $(e.target).next().hide(); + reveal.right(); + }, + ); }); $('.reveal button.fail').click(e => { - let uid = e.target.parentElement.dataset.uid; // Ex: ID of 'pass-ram' => 'ram' - let cn = e.target.parentElement.dataset.cn; - $(e.target).prev() + const uid = e.target.parentElement.dataset.uid; // Ex: ID of 'pass-ram' => 'ram' + const cn = e.target.parentElement.dataset.cn; + $(e.target) + .prev() .removeClass('pass') .addClass('conditional') .text('Conditional') - .attr("id", "conditional-" + uid) + .attr('id', 'conditional-' + uid) .off('click') - .click(e => { + .click(() => { $('#createConditional').modal(); $('#createConditional input[type="text"]').val(''); $('#createConditional input[name="uid"]').val(uid); }); $(e.target).click(e => { e.preventDefault(); - let payload = { + const payload = { uid: uid, - status: "Failed" + status: 'Failed', }; - FetchUtil.postWithWarning(this.endpoint, payload, { - warningText: "Are you sure you want to fail " + cn + "?", - successText: cn + " has been marked as failed." - }, () => { - $(e.target).text("Failed").off("click").addClass("disabled"); - $(e.target).prev().hide(); - reveal.right(); - }); + FetchUtil.postWithWarning( + this.endpoint, + payload, + { + warningText: 'Are you sure you want to fail ' + cn + '?', + successText: cn + ' has been marked as failed.', + }, + () => { + $(e.target).text('Failed').off('click').addClass('disabled'); + $(e.target).prev().hide(); + reveal.right(); + }, + ); }); }); } diff --git a/frontend/javascript/modules/siteSettings.js b/frontend/javascript/modules/siteSettings.js index 15a515e0..70138ffe 100644 --- a/frontend/javascript/modules/siteSettings.js +++ b/frontend/javascript/modules/siteSettings.js @@ -1,9 +1,8 @@ -/* global fetch */ -import "whatwg-fetch"; -import FetchUtil from "../utils/fetchUtil"; -import Exception from "../exceptions/exception"; -import FetchException from "../exceptions/fetchException"; -import sweetAlert from "../../../node_modules/bootstrap-sweetalert/dev/sweetalert.es6.js"; // eslint-disable-line max-len +import 'whatwg-fetch'; +import FetchUtil from '../utils/fetchUtil'; +import Exception from '../exceptions/exception'; +import FetchException from '../exceptions/fetchException'; +import sweetAlert from '../../../node_modules/bootstrap-sweetalert/dev/sweetalert.es6.js'; export default class SiteSettings { constructor(toggle) { @@ -22,31 +21,39 @@ export default class SiteSettings { } _updateSetting() { - let payload = {}; + const payload = {}; payload[this.setting] = this.toggle.checked; fetch(this.endpoint, { method: 'PUT', headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' + Accept: 'application/json', + 'Content-Type': 'application/json', }, - credentials: "same-origin", - body: JSON.stringify(payload) + credentials: 'same-origin', + body: JSON.stringify(payload), }) - .then(FetchUtil.checkStatus) - .then(FetchUtil.parseJSON) - .then(response => { - if (!response.hasOwnProperty('success') || !response.success) { - sweetAlert("Uh oh...", "We're having trouble submitting this " + - "form right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, response); - } - }) - .catch(error => { - sweetAlert("Uh oh...", "We're having trouble submitting this " + - "form right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, error); - }); + .then(FetchUtil.checkStatus) + .then(FetchUtil.parseJSON) + .then(response => { + if (!Object.hasOwn(response, 'success') || !response.success) { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this " + + 'form right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, response); + } + }) + .catch(error => { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this " + + 'form right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, error); + }); } } diff --git a/frontend/javascript/modules/table.js b/frontend/javascript/modules/table.js index 7cdae7f4..ae084b66 100644 --- a/frontend/javascript/modules/table.js +++ b/frontend/javascript/modules/table.js @@ -1,8 +1,7 @@ -/* global $ */ -import DataTable from "datatables.net-bs"; +import DataTable from 'datatables.net-bs'; export default class Table { constructor(table) { - this.table = new DataTable(table) + this.table = new DataTable(table); } } diff --git a/frontend/javascript/utils/fetchUtil.js b/frontend/javascript/utils/fetchUtil.js index 354a60d1..3e9f1d60 100644 --- a/frontend/javascript/utils/fetchUtil.js +++ b/frontend/javascript/utils/fetchUtil.js @@ -1,17 +1,20 @@ -/* global fetch */ -import "whatwg-fetch"; -import Exception from "../exceptions/exception"; -import FetchException from "../exceptions/fetchException"; -import sweetAlert from "bootstrap-sweetalert/dev/sweetalert.es6.js"; +import 'whatwg-fetch'; +import Exception from '../exceptions/exception'; +import FetchException from '../exceptions/fetchException'; +import sweetAlert from 'bootstrap-sweetalert/dev/sweetalert.es6.js'; export default class FetchUtil { static checkStatus(response) { if (response.status < 200 || response.status > 300) { - sweetAlert("Uh oh...", "We're having trouble submitting this form" + - "right now. Please try again later.", "error"); + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this form" + + 'right now. Please try again later.', + 'error', + ); throw new Exception( FetchException.REQUEST_FAILED, - "received response code " + response.status + 'received response code ' + response.status, ); } @@ -26,171 +29,225 @@ export default class FetchUtil { fetch(endpoint, { method: 'POST', headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' + Accept: 'application/json', + 'Content-Type': 'application/json', }, - credentials: "same-origin", - body: JSON.stringify(payload) + credentials: 'same-origin', + body: JSON.stringify(payload), }) - .then(FetchUtil.checkStatus) - .then(FetchUtil.parseJSON) - .then(response => { - if (response.hasOwnProperty('success') && response.success === true) { - sweetAlert({ - title: "Success!", + .then(FetchUtil.checkStatus) + .then(FetchUtil.parseJSON) + .then(response => { + if (Object.hasOwn(response, 'success') && response.success === true) { + sweetAlert( + { + title: 'Success!', text: settings.successText, - type: "success", - confirmButtonText: "OK" - }, () => { - if (typeof callback === "function") { + type: 'success', + confirmButtonText: 'OK', + }, + () => { + if (typeof callback === 'function') { callback(); } else { window.location.reload(); } - }); - } else { - sweetAlert("Uh oh...", "We're having trouble submitting this " + - "form right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, response); - } - }) - .catch(error => { - sweetAlert("Uh oh...", "We're having trouble submitting this form " + - "right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, error); - }); + }, + ); + } else { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this " + + 'form right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, response); + } + }) + .catch(error => { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this form " + + 'right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, error); + }); } static postWithWarning(endpoint, payload, settings, callback) { - sweetAlert({ - title: "Are you sure?", - text: settings.warningText, - type: "warning", - showCancelButton: true, - closeOnConfirm: false, - showLoaderOnConfirm: true - }, () => { - fetch(endpoint, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - credentials: "same-origin", - body: JSON.stringify(payload) - }) - .then(FetchUtil.checkStatus) - .then(FetchUtil.parseJSON) - .then(response => { - if (response.hasOwnProperty('success') && response.success === true) { - sweetAlert({ - title: "Success!", - text: settings.successText, - type: "success", - confirmButtonText: "OK" - }, () => { - if (typeof callback === "function") { - callback(); - } else { - window.location.reload(); - } - }); - } else { - sweetAlert("Uh oh...", "We're having trouble submitting this " + - "form right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, response); - } + sweetAlert( + { + title: 'Are you sure?', + text: settings.warningText, + type: 'warning', + showCancelButton: true, + closeOnConfirm: false, + showLoaderOnConfirm: true, + }, + () => { + fetch(endpoint, { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + credentials: 'same-origin', + body: JSON.stringify(payload), }) - .catch(error => { - sweetAlert("Uh oh...", "We're having trouble submitting this form " + - "right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, error); - }); - }); + .then(FetchUtil.checkStatus) + .then(FetchUtil.parseJSON) + .then(response => { + if ( + Object.hasOwn(response, 'success') && + response.success === true + ) { + sweetAlert( + { + title: 'Success!', + text: settings.successText, + type: 'success', + confirmButtonText: 'OK', + }, + () => { + if (typeof callback === 'function') { + callback(); + } else { + window.location.reload(); + } + }, + ); + } else { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this " + + 'form right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, response); + } + }) + .catch(error => { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this form " + + 'right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, error); + }); + }, + ); } static fetch(endpoint, settings, callback) { fetch(endpoint, { method: settings.method, headers: { - Accept: 'application/json' + Accept: 'application/json', }, - credentials: "same-origin" + credentials: 'same-origin', }) - .then(FetchUtil.checkStatus) - .then(FetchUtil.parseJSON) - .then(response => { - if (response.hasOwnProperty('success') && - response.success === true) { - sweetAlert({ - title: "Success!", + .then(FetchUtil.checkStatus) + .then(FetchUtil.parseJSON) + .then(response => { + if (Object.hasOwn(response, 'success') && response.success === true) { + sweetAlert( + { + title: 'Success!', text: settings.successText, - type: "success", - confirmButtonText: "OK" - }, () => { - if (typeof callback === "function") { + type: 'success', + confirmButtonText: 'OK', + }, + () => { + if (typeof callback === 'function') { callback(); } else { window.location.reload(); } - }); - } else { - sweetAlert("Uh oh...", "We're having trouble submitting " + - "this form right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, response); - } - }) - .catch(error => { - sweetAlert("Uh oh...", "We're having trouble submitting this " + - "form right now. Please try again later.", "error"); - throw new Exception(FetchException.REQUEST_FAILED, error); - }); + }, + ); + } else { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting " + + 'this form right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, response); + } + }) + .catch(error => { + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this " + + 'form right now. Please try again later.', + 'error', + ); + throw new Exception(FetchException.REQUEST_FAILED, error); + }); } static fetchWithWarning(endpoint, settings, callback) { - sweetAlert({ - title: "Are you sure?", - text: settings.warningText, - type: "warning", - showCancelButton: true, - closeOnConfirm: false, - showLoaderOnConfirm: true - }, () => { - fetch(endpoint, { - method: settings.method, - headers: { - Accept: 'application/json' - }, - credentials: "same-origin" - }) + sweetAlert( + { + title: 'Are you sure?', + text: settings.warningText, + type: 'warning', + showCancelButton: true, + closeOnConfirm: false, + showLoaderOnConfirm: true, + }, + () => { + fetch(endpoint, { + method: settings.method, + headers: { + Accept: 'application/json', + }, + credentials: 'same-origin', + }) .then(FetchUtil.checkStatus) .then(FetchUtil.parseJSON) .then(response => { - if (response.hasOwnProperty('success') && - response.success === true) { - sweetAlert({ - title: "Success!", - text: settings.successText, - type: "success", - confirmButtonText: "OK" - }, () => { - if (typeof callback === "function") { - callback(); - } else { - window.location.reload(); - } - }); + if ( + Object.hasOwn(response, 'success') && + response.success === true + ) { + sweetAlert( + { + title: 'Success!', + text: settings.successText, + type: 'success', + confirmButtonText: 'OK', + }, + () => { + if (typeof callback === 'function') { + callback(); + } else { + window.location.reload(); + } + }, + ); } else { - sweetAlert("Uh oh...", "We're having trouble submitting " + - "this form right now. Please try again later.", "error"); + sweetAlert( + 'Uh oh...', + "We're having trouble submitting " + + 'this form right now. Please try again later.', + 'error', + ); throw new Exception(FetchException.REQUEST_FAILED, response); } }) .catch(error => { - sweetAlert("Uh oh...", "We're having trouble submitting this " + - "form right now. Please try again later.", "error"); + sweetAlert( + 'Uh oh...', + "We're having trouble submitting this " + + 'form right now. Please try again later.', + 'error', + ); throw new Exception(FetchException.REQUEST_FAILED, error); }); - }); + }, + ); } } diff --git a/frontend/javascript/utils/memberUtil.js b/frontend/javascript/utils/memberUtil.js index 57ab41c5..57f563f6 100644 --- a/frontend/javascript/utils/memberUtil.js +++ b/frontend/javascript/utils/memberUtil.js @@ -1,10 +1,10 @@ -import _ from "lodash"; +import _ from 'lodash'; export default class MemberUtil { static splitFreshmenUpperclassmen(memberIds) { - let result = { + const result = { freshmen: [], - upperclassmen: [] + upperclassmen: [], }; memberIds.forEach(memberId => { diff --git a/package-lock.json b/package-lock.json index 9428be90..88c1d20e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,8 +33,9 @@ "copy-webpack-plugin": "^14.0.0", "css-loader": "^7.1.4", "dotenv": "^18.0.5", - "eslint-config-google": "^0.14.0", + "eslint": "^10.12.0", "expose-loader": "^5.0.1", + "gts": "^7.0.0", "imports-loader": "^5.0.0", "sass": "^1.93.3", "sass-loader": "^16.0.7", @@ -85,6 +86,7 @@ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -117,19 +119,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1648,6 +1637,30 @@ "node": ">=6.9.0" } }, + "node_modules/@cacheable/memory": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", + "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.5.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", + "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.5.1", + "keyv": "^5.6.0" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", @@ -1659,12 +1672,11 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -1684,7 +1696,6 @@ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -1698,71 +1709,66 @@ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^10.2.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@eslint/core": "^0.17.0" + "@eslint/core": "^1.2.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz", + "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", + "js-yaml": "^4.3.2", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -1772,13 +1778,74 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1787,29 +1854,27 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", + "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@eslint/core": "^0.17.0", + "@eslint/core": "^1.2.1", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@humanfs/core": { @@ -1818,7 +1883,6 @@ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=18.18.0" } @@ -1829,7 +1893,6 @@ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" @@ -1844,7 +1907,6 @@ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=12.22" }, @@ -1859,7 +1921,6 @@ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=18.18" }, @@ -1929,6 +1990,30 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT" + }, "node_modules/@parcel/watcher": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", @@ -2307,6 +2392,19 @@ "node": ">=8.0" } }, + "node_modules/@pkgr/core": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, "node_modules/@selectize/selectize": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/@selectize/selectize/-/selectize-0.15.2.tgz", @@ -2403,6 +2501,7 @@ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -2419,6 +2518,13 @@ "@types/estree": "*" } }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -2433,119 +2539,364 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/node": { - "version": "25.3.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz", - "integrity": "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==", + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.18.0" - } + "license": "MIT" }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "node_modules/@types/node": { + "version": "22.20.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.5.tgz", + "integrity": "sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "undici-types": "~6.21.0" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true, "license": "MIT" }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.71.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.71.0.tgz", + "integrity": "sha512-pqcS9c1HxZTHt7End4nXqd0s5lJrrFzrgCkKFJrsbUnaL6M3+6oBFZaslg6Gjsl3argl2DDRFROnXARaZ2e4Nw==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.71.0", + "@typescript-eslint/type-utils": "8.71.0", + "@typescript-eslint/utils": "8.71.0", + "@typescript-eslint/visitor-keys": "8.71.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.71.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.12.tgz", + "integrity": "sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 4" + } }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "node_modules/@typescript-eslint/parser": { + "version": "8.71.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.71.0.tgz", + "integrity": "sha512-CG4nPk1f2zc8yw4pALqHsFYH2hdo+h1T9daSp21+Hnxi9LOE3GT9hAfTKJCBXVNM2GmYs1eMEP615wPoeOgk3A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "@typescript-eslint/scope-manager": "8.71.0", + "@typescript-eslint/types": "8.71.0", + "@typescript-eslint/typescript-estree": "8.71.0", + "@typescript-eslint/visitor-keys": "8.71.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.71.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.71.0.tgz", + "integrity": "sha512-aABjw5rjBacYONVPaPiWOCjJu0vEF4a25iQuodlmQYL1trtLZ0X/y+2Vzl3BKI1odM4LnwLE1oUDXYp1wzx1TQ==", "dev": true, "license": "MIT", "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "@typescript-eslint/tsconfig-utils": "^8.71.0", + "@typescript-eslint/types": "^8.71.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.71.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.71.0.tgz", + "integrity": "sha512-gWF0BhUcnjZxSpLE8ngS/59n2SB0J3YqRxvX1+2aoRJk9hNtHSLOV+TcarFiOr5ipXm3yc1QrI4c9YZc8zyCxw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@xtuc/long": "4.2.2" + "@typescript-eslint/types": "8.71.0", + "@typescript-eslint/visitor-keys": "8.71.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.71.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.71.0.tgz", + "integrity": "sha512-Z1UlWHADEK2Mlb9NpWfDeSjqoZ5EyrOv4R3eQpbkzqn/EwaIdOpXXupEA1+0ZIOSJSZZDBHG0BrQyN8zUG6Pwg==", "dev": true, "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.71.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.71.0.tgz", + "integrity": "sha512-i8uO1qbdxeKgRnS5sCRt6On3/nfo2d2DwQe3Yvjx543zLy7r8ySqRuPPiIIXAhS03U0v5NfAFx+rUgxFzKKwNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.71.0", + "@typescript-eslint/typescript-estree": "8.71.0", + "@typescript-eslint/utils": "8.71.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.71.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.71.0.tgz", + "integrity": "sha512-cJ4OoxPGWvFnBTnSZyaU+qJzGTqPTGJY+gDchj6cRyLRdmIdt4rcsE4twj+zPfrNiWuVi38wijHzShL++Z9atQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.71.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.71.0.tgz", + "integrity": "sha512-PEEF4G5sLLWAS5BpPrUvms4ySZkiBQQZM4z+3ReI46axK5Vqr/vXBQatJQIZZOYdGyPUAKTtsrWzpqKuU+3DEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.71.0", + "@typescript-eslint/tsconfig-utils": "8.71.0", + "@typescript-eslint/types": "8.71.0", + "@typescript-eslint/visitor-keys": "8.71.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.71.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.71.0.tgz", + "integrity": "sha512-pKR/tEMVrXZG23UFKUn5BQf3zfmfk7KQceI2cGzywZ5nxM5Eu3hEJU1utjWzydtzBbcJAQhHN8iPCxobHpPcZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.71.0", + "@typescript-eslint/types": "8.71.0", + "@typescript-eslint/typescript-estree": "8.71.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.71.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.71.0.tgz", + "integrity": "sha512-8eQ9R218XORK+KLosnf4bu/QsUXvUyVwTbArg7/0NMB1Pu87OJKvj4nhFblkYE8gQV73mW1dx1ptlPCkwRGa7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.71.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-opt": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1", "@webassemblyjs/wast-printer": "1.14.1" @@ -2671,6 +3022,7 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2684,18 +3036,16 @@ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.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==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2747,16 +3097,66 @@ "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/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, "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==", "dev": true, - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/babel-loader": { "version": "10.0.0", @@ -2845,11 +3245,14 @@ } }, "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==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "peer": true + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/baseline-browser-mapping": { "version": "2.10.0", @@ -2940,14 +3343,16 @@ } }, "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==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/browserslist": { @@ -2970,6 +3375,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -2991,17 +3397,58 @@ "dev": true, "license": "MIT" }, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" + } + }, "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", - "peer": true, "engines": { "node": ">=6" } }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001775", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz", @@ -3023,6 +3470,43 @@ ], "license": "CC-BY-4.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==", + "dev": true, + "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/chalk/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -3033,6 +3517,29 @@ "node": ">=6.0" } }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -3054,7 +3561,6 @@ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3067,8 +3573,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", @@ -3087,9 +3592,9 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/copy-webpack-plugin": { "version": "14.0.0", @@ -3249,13 +3754,49 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.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", - "peer": true + "license": "MIT" }, "node_modules/detect-libc": { "version": "1.0.3", @@ -3300,6 +3841,13 @@ "dev": true, "license": "ISC" }, + "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==", + "dev": true, + "license": "MIT" + }, "node_modules/enhanced-resolve": { "version": "5.20.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", @@ -3333,6 +3881,16 @@ "node": ">=4" } }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-module-lexer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", @@ -3350,46 +3908,55 @@ "node": ">=6" } }, + "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" + } + }, "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "version": "10.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.12.0.tgz", + "integrity": "sha512-npHjrHb2o4ehH3mE+YuxABR+0gyb0aVWCIolgJDArwCiHEIsonBm3ZKjel5b0U5+a+MbEvIyRCGCzD3eKKK2NA==", "dev": true, "license": "MIT", "peer": true, + "workspaces": [ + "packages/*" + ], "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", - "@eslint/plugin-kit": "^0.4.1", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", + "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "11.1.5 || >11.1.6 <12", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -3397,7 +3964,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -3411,80 +3978,157 @@ } } }, - "node_modules/eslint-config-google": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", - "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" }, "peerDependencies": { - "eslint": ">=5.16.0" + "eslint": ">=6.0.0" } }, - "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==", + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "peer": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" }, "engines": { - "node": ">=8.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" } }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/eslint-plugin-n": { + "version": "17.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz", + "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==", "dev": true, - "license": "Apache-2.0", - "peer": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "semver": "^7.6.3", + "ts-declaration-location": "^1.0.6" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" } }, - "node_modules/eslint/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==", + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz", + "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.13" }, "engines": { - "node": ">=8" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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": "MIT", - "peer": true, + "license": "BSD-2-Clause", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/escape-string-regexp": { @@ -3493,7 +4137,6 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -3502,18 +4145,19 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3525,7 +4169,6 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=4.0" } @@ -3536,7 +4179,6 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3548,46 +4190,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/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==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -3601,7 +4227,6 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=4.0" } @@ -3655,6 +4280,30 @@ "node": ">=0.8.x" } }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/expose-loader": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-5.0.1.tgz", @@ -3672,6 +4321,21 @@ "webpack": "^5.0.0" } }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3679,21 +4343,26 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.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", - "peer": 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", - "peer": true + "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", @@ -3722,18 +4391,30 @@ "node": ">= 4.9.1" } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "flat-cache": "^4.0.0" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">=16.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz", + "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.23" } }, "node_modules/find-up": { @@ -3803,27 +4484,23 @@ } }, "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "version": "6.1.23", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", + "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" + "cacheable": "^2.5.0", + "flatted": "^3.4.2", + "hookified": "^1.15.0" } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.2", @@ -3845,6 +4522,32 @@ "node": ">=6.9.0" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz", + "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -3871,7 +4574,6 @@ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -3879,6 +4581,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3886,6 +4595,332 @@ "dev": true, "license": "ISC" }, + "node_modules/gts": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/gts/-/gts-7.0.0.tgz", + "integrity": "sha512-5Sb73zpklh7GyYRd14QUwa6+4n99b7JqECc+bS2fRYlSK40SXu7Po3//q4jBAP/CQwR+VbUPiOLxJf5zpp4Ajw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/js": "^9.37.0", + "@typescript-eslint/eslint-plugin": "^8.46.1", + "@typescript-eslint/parser": "^8.46.1", + "chalk": "^4.1.2", + "eslint": "^9.37.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-n": "^17.23.1", + "eslint-plugin-prettier": "^5.5.4", + "execa": "^5.0.0", + "inquirer": "^7.3.3", + "json5": "^2.1.3", + "meow": "^9.0.0", + "ncp": "^2.0.0", + "prettier": "^3.6.2", + "typescript-eslint": "^8.46.1", + "write-file-atomic": "^6.0.0" + }, + "bin": { + "gts": "build/src/cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/gts/node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/gts/node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/gts/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/gts/node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/gts/node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/gts/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/gts/node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/gts/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/gts/node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/gts/node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/gts/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/gts/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/gts/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/gts/node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/gts/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gts/node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/gts/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/gts/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3896,6 +4931,19 @@ "node": ">=8" } }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -3909,6 +4957,49 @@ "node": ">= 0.4" } }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -3928,7 +5019,6 @@ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } @@ -3939,7 +5029,6 @@ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3998,11 +5087,45 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/interpret": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", @@ -4013,6 +5136,13 @@ "node": ">=10.13.0" } }, + "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==", + "dev": true, + "license": "MIT" + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -4039,6 +5169,16 @@ "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==", + "dev": true, + "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", @@ -4052,6 +5192,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -4065,6 +5215,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4101,7 +5264,8 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jquery-ui": { "version": "1.14.1", @@ -4114,12 +5278,21 @@ } }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", - "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -4145,8 +5318,7 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -4167,18 +5339,30 @@ "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/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "license": "MIT", - "peer": true + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, "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==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "json-buffer": "3.0.1" + "@keyv/serialize": "^1.1.1" } }, "node_modules/kind-of": { @@ -4197,7 +5381,6 @@ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -4206,6 +5389,13 @@ "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==", + "dev": true, + "license": "MIT" + }, "node_modules/loader-runner": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", @@ -4254,8 +5444,80 @@ "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/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-cache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, "license": "MIT", - "peer": true + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -4285,18 +5547,55 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, - "license": "ISC", - "peer": true, + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.8" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" } }, "node_modules/moment": { @@ -4314,6 +5613,13 @@ "dev": true, "license": "MIT" }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -4338,8 +5644,17 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, + "license": "MIT" + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "dev": true, "license": "MIT", - "peer": true + "bin": { + "ncp": "bin/ncp" + } }, "node_modules/neo-async": { "version": "2.6.2", @@ -4363,6 +5678,22 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4373,13 +5704,41 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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", - "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -4392,6 +5751,16 @@ "node": ">= 0.8.0" } }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4440,7 +5809,6 @@ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -4448,6 +5816,25 @@ "node": ">=6" } }, + "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==", + "dev": true, + "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/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4528,6 +5915,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -4611,36 +5999,178 @@ "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=4" + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "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/prettier": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.9.tgz", + "integrity": "sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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/qified": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", + "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^2.1.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", + "dev": true, + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "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==", + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8.0" + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.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==", + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "MIT", - "peer": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/rechoir": { @@ -4656,6 +6186,20 @@ "node": ">= 10.13.0" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -4774,11 +6318,34 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/reveal.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/reveal.js/-/reveal.js-5.2.1.tgz", @@ -4788,6 +6355,36 @@ "node": ">=18.0.0" } }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, "node_modules/sass": { "version": "1.93.3", "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.3.tgz", @@ -4913,6 +6510,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -4986,6 +6584,13 @@ "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==", + "dev": true, + "license": "ISC" + }, "node_modules/simple-masonry": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/simple-masonry/-/simple-masonry-1.0.5.tgz", @@ -5022,6 +6627,70 @@ "source-map": "^0.6.0" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.24.tgz", + "integrity": "sha512-cLS9TtWkIQFyLkJ3/5aFQAOHOSKTlOs/7WDut/XPSdjom1fJhUdkepeJAKXa9Y05+FabHd0sti+Et559vDtkpQ==", + "dev": true, + "license": "CC0-1.0" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", @@ -5032,13 +6701,35 @@ "node": ">=10" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "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", - "peer": true, "engines": { "node": ">=8" }, @@ -5092,6 +6783,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", + "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.3.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", @@ -5159,6 +6866,13 @@ } } }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -5200,6 +6914,79 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", + "dev": true, + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, + "node_modules/ts-declaration-location/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5207,13 +6994,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "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/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", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -5221,10 +7014,62 @@ "node": ">= 0.8.0" } }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.71.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.71.0.tgz", + "integrity": "sha512-fBdHYiqQ14RW6mOMXD14Svn82ZsCYAoQSzGRzyEjR59S5A2Krh/l7fGTOQ7iCr8gGy/mHVXtEF7s5fgjEdV0Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.71.0", + "@typescript-eslint/parser": "8.71.0", + "@typescript-eslint/typescript-estree": "8.71.0", + "@typescript-eslint/utils": "8.71.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -5309,7 +7154,6 @@ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -5321,6 +7165,17 @@ "dev": true, "license": "MIT" }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/watchpack": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", @@ -5341,6 +7196,7 @@ "integrity": "sha512-LLBBA4oLmT7sZdHiYE/PeVuifOxYyE2uL/V+9VQP7YSYdJU7bSf7H8bZRRxW8kEPMkmVjnrXmoR3oejIdX0xbg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -5390,6 +7246,7 @@ "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.6.1", "@webpack-cli/configtest": "^3.0.1", @@ -5510,11 +7367,37 @@ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/write-file-atomic": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz", + "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -5522,6 +7405,16 @@ "dev": true, "license": "ISC" }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 4c0264bd..5051f053 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,9 @@ }, "scripts": { "webpack": "webpack-cli", - "build": "npm run webpack && npm run scss && cp -r node_modules/bootstrap-icons/font/fonts conditional/static/css/fonts" + "build": "npm run webpack && npm run scss && cp -r node_modules/bootstrap-icons/font/fonts conditional/static/css/fonts", + "lint": "eslint", + "fix": "eslint --fix" }, "dependencies": { "@selectize/selectize": "^0.15.2", @@ -45,8 +47,9 @@ "copy-webpack-plugin": "^14.0.0", "css-loader": "^7.1.4", "dotenv": "^18.0.5", - "eslint-config-google": "^0.14.0", + "eslint": "^10.12.0", "expose-loader": "^5.0.1", + "gts": "^7.0.0", "imports-loader": "^5.0.0", "sass": "^1.93.3", "sass-loader": "^16.0.7", diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..d1646f01 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./node_modules/gts/tsconfig-google.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "build" + }, + "include": [ + "src/**/*.ts", + "test/**/*.ts" + ] +} diff --git a/webpack.config.js b/webpack.config.js index b2e0b6db..ea134e95 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,24 +1,24 @@ const webpack = require('webpack'); -const CopyPlugin = require('copy-webpack-plugin') +const CopyPlugin = require('copy-webpack-plugin'); const path = require('path'); const sass = require('sass'); const dotenv = require('dotenv'); -var jsSrc = path.resolve('./frontend'); -var jsDest = path.resolve('./conditional/static'); -var publicPath = 'static/js'; +const jsSrc = path.resolve('./frontend'); +const jsDest = path.resolve('./conditional/static'); +const publicPath = 'static/js'; dotenv.config(); -var babelQuery = { - "presets": ["@babel/preset-env"], - "plugins": [] -} +const babelQuery = { + presets: ['@babel/preset-env'], + plugins: [], +}; -var webpackConfig = { +const webpackConfig = { context: jsSrc, - entry: ["./javascript/app.js"], - devtool: "source-map", + entry: ['./javascript/app.js'], + devtool: 'source-map', output: { path: path.normalize(jsDest), filename: 'js/app.js', @@ -28,15 +28,15 @@ var webpackConfig = { plugins: [ new webpack.DefinePlugin({ 'process.env': { - 'NODE_ENV': JSON.stringify('production'), - 'SENTRY_ENV': JSON.stringify(process.env.CONDITIONAL_SENTRY_ENV ?? "local-development") - } + NODE_ENV: JSON.stringify('production'), + SENTRY_ENV: JSON.stringify( + process.env.CONDITIONAL_SENTRY_ENV ?? 'local-development', + ), + }, }), new CopyPlugin({ - patterns: [ - { from: "images", to: "images" }, - ], - }) + patterns: [{from: 'images', to: 'images'}], + }), ], mode: 'production', module: { @@ -45,13 +45,13 @@ var webpackConfig = { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader', - options: babelQuery + options: babelQuery, }, { - test: require.resolve("jquery"), + test: require.resolve('jquery'), loader: 'expose-loader', options: { - exposes: ["$", "jQuery"], + exposes: ['$', 'jQuery'], }, }, { @@ -70,45 +70,43 @@ var webpackConfig = { { test: /bootstrap-sweetalert.*$/, loader: 'babel-loader', - options: babelQuery + options: babelQuery, }, { test: /\.s[ac]ss$/i, - loader: "sass-loader", - type: "asset/resource", + loader: 'sass-loader', + type: 'asset/resource', generator: { - filename: "css/[name].css", + filename: 'css/[name].css', }, options: { sassOptions: { loadPaths: [ - "./node_modules/csh-material-bootstrap/dist", - "./node_modules/csh-material-bootstrap/dist/css", - "./node_modules/datatables.net-bs/css", - "./node_modules/bootstrap-material-datetimepicker/css", - "./node_modules/load-awesome/css", - "./node_modules/reveal.js/css", - "./node_modules", - ".", - ], - importers: [ - new sass.NodePackageImporter() + './node_modules/csh-material-bootstrap/dist', + './node_modules/csh-material-bootstrap/dist/css', + './node_modules/datatables.net-bs/css', + './node_modules/bootstrap-material-datetimepicker/css', + './node_modules/load-awesome/css', + './node_modules/reveal.js/css', + './node_modules', + '.', ], - } - } + importers: [new sass.NodePackageImporter()], + }, + }, }, { test: /\.(woff|woff2|eot|ttf|otf)$/i, - type: "asset/resource", + type: 'asset/resource', generator: { - filename: "fonts/[name][ext]", + filename: 'fonts/[name][ext]', }, - } - ] + }, + ], }, optimization: { emitOnErrors: true, - } + }, }; module.exports = webpackConfig;