From 54f33a4a22f20ce01579adf0d80a0fa1d303a654 Mon Sep 17 00:00:00 2001 From: ambers7 <95728455+ambers7@users.noreply.github.com> Date: Sun, 29 Mar 2026 16:32:30 -0400 Subject: [PATCH 1/5] Rename ><.png to angle_brackets.png to match Windows compatability --- .../buildabear/eyes/{><.png => angle_brackets.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename game/assets/buildabear/eyes/{><.png => angle_brackets.png} (100%) diff --git a/game/assets/buildabear/eyes/><.png b/game/assets/buildabear/eyes/angle_brackets.png similarity index 100% rename from game/assets/buildabear/eyes/><.png rename to game/assets/buildabear/eyes/angle_brackets.png From 1e893156504a4cd0e502005281635fd3bb5d2ee1 Mon Sep 17 00:00:00 2001 From: ambers7 Date: Sun, 29 Mar 2026 20:55:27 -0400 Subject: [PATCH 2/5] Added functions to create a google calendar link from an event and tests --- game/lib/utils/gcal_url.dart | 67 ++++++++++++++++++++++++++++++++++++ game/test/gcal_url_test.dart | 56 ++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 game/lib/utils/gcal_url.dart create mode 100644 game/test/gcal_url_test.dart diff --git a/game/lib/utils/gcal_url.dart b/game/lib/utils/gcal_url.dart new file mode 100644 index 00000000..42b3b01c --- /dev/null +++ b/game/lib/utils/gcal_url.dart @@ -0,0 +1,67 @@ +/// Takes event fields (title, description, startTime, endTime, locationName) and returns a Google Calendar URL +/// Separate file from utility_functions.dart so can run gcal_url_test.dart without needing any flutter dart:ui + +String getGcalUrl(String title, String description, DateTime startTime, + DateTime endTime, String locationName) { + final dates = formatDates(startTime, endTime); + return Uri( + scheme: 'https', + host: 'calendar.google.com', + path: '/calendar/u/0/r/eventedit', + queryParameters: { + 'text': title, + 'dates': dates, + 'details': description, + 'location': locationName, + }, + ).toString(); +} + +/// Google Calendar days have format YYYYMMDD/YYYYMMDD for all day events and starts and ends at midnight of the first day and +/// midnight at the day following the last day (ex. 3/29 midnight to 3/31 midnight is an all day event from 3/29-3/30) +/// Timed events: YYYYMMDDTHHmmssZ (T "time follows", Z for Zulu aka UTC) +/// Assumes a timed event is in EST (since it will take place in Ithaca, NY), and converts to UTC for gcal format +/// + +String formatDates(DateTime startTime, DateTime endTime) { + if (isMidnight(startTime) && isMidnight(endTime)) { + // all day event + final startYmd = allDay(startTime); + var endYmd = allDay(endTime); + if (startYmd == endYmd) { + // change end date to one day after since exclusive + final localStart = startTime.toLocal(); + final nextDay = DateTime( + localStart.year, + localStart.month, + localStart.day, + ).add(const Duration(days: 1)); + endYmd = allDay(nextDay); + } + return '$startYmd/$endYmd'; + } // timed event + return '${formatTime(startTime)}/${formatTime(endTime)}'; +} + +bool isMidnight(DateTime d) { + return d.hour == 0 && d.minute == 0 && d.second == 0 && d.microsecond == 0; +} + +String allDay(DateTime d) { + final l = d.toLocal(); //convert to local date + final y = l.year.toString().padLeft(4, '0'); + final m = l.month.toString().padLeft(2, '0'); + final day = l.day.toString().padLeft(2, '0'); + return '$y$m$day'; +} + +String formatTime(DateTime d) { + final u = d.toUtc(); + final y = u.year.toString().padLeft(4, '0'); + final m = u.month.toString().padLeft(2, '0'); + final day = u.day.toString().padLeft(2, '0'); + final h = u.hour.toString().padLeft(2, '0'); + final min = u.minute.toString().padLeft(2, '0'); + final s = u.second.toString().padLeft(2, '0'); + return '$y$m${day}T$h$min${s}Z'; +} diff --git a/game/test/gcal_url_test.dart b/game/test/gcal_url_test.dart new file mode 100644 index 00000000..cc3417aa --- /dev/null +++ b/game/test/gcal_url_test.dart @@ -0,0 +1,56 @@ +// Manual testing for Google Calendar URLs. +// +// From the `game` directory run: +// dart run test/gcal_url_test.dart + +import 'package:game/utils/gcal_url.dart'; + +void main() { + // Timed event (local wall clock — same as typical app DateTime) + final timedStart = DateTime(2025, 3, 29, 14, 30); + final timedEnd = DateTime(2025, 3, 29, 15, 30); + print('timed'); + print('dates: ${formatDates(timedStart, timedEnd)}'); + print(getGcalUrl( + 'Sample timed event', + 'Description line', + timedStart, + timedEnd, + 'Ithaca, NY', + )); + print(''); + + // Time event that lasts multiple days + final timedStart1 = DateTime(2025, 3, 29, 1, 30); + final timedEnd1 = DateTime(2025, 3, 31, 12, 30); + print('timed'); + print('dates: ${formatDates(timedStart1, timedEnd1)}'); + print(getGcalUrl( + 'Sample timed event 1', + 'Heyy what\'s up eveyrone! \n How you doing?', + timedStart1, + timedEnd1, + 'Bailey Hall', + )); + print(''); + + // All-day (both at local midnight) midnight 3/29 to midnight 3/31, so 3/29-3/30 + final allDayStart = DateTime(2025, 3, 29); + final allDayEnd = DateTime(2025, 3, 31); + print('all-day (two midnights)'); + print('dates: ${formatDates(allDayStart, allDayEnd)}'); + print(getGcalUrl( + 'Sample all-day', + '', + allDayStart, + allDayEnd, + '', + )); + print(''); + + // Single calendar day all-day + final single = DateTime(2025, 3, 29); + print('all-day same start/end midnight'); + print('dates: ${formatDates(single, single)}'); + print(getGcalUrl('One day', '', single, single, '')); +} From 06d6ab97ad895cf021eb18db5bb6de681c7fd20b Mon Sep 17 00:00:00 2001 From: ambers7 Date: Wed, 22 Apr 2026 18:03:26 -0400 Subject: [PATCH 3/5] Changed gcal function to take in CampusEvent, add more descriptive names --- game/lib/utils/gcal_url.dart | 68 +++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/game/lib/utils/gcal_url.dart b/game/lib/utils/gcal_url.dart index 42b3b01c..cd16f61d 100644 --- a/game/lib/utils/gcal_url.dart +++ b/game/lib/utils/gcal_url.dart @@ -1,18 +1,21 @@ /// Takes event fields (title, description, startTime, endTime, locationName) and returns a Google Calendar URL /// Separate file from utility_functions.dart so can run gcal_url_test.dart without needing any flutter dart:ui -String getGcalUrl(String title, String description, DateTime startTime, - DateTime endTime, String locationName) { - final dates = formatDates(startTime, endTime); +import 'package:game/api/game_client_dto.dart'; + +String getGcalUrl(CampusEventDto event) { + final startTime = DateTime.parse(event.startTime); + final endTime = DateTime.parse(event.endTime); + final dates = formatDates(startTime, endTime, allDayEvent: event.allDay); return Uri( scheme: 'https', host: 'calendar.google.com', path: '/calendar/u/0/r/eventedit', queryParameters: { - 'text': title, + 'text': event.title, 'dates': dates, - 'details': description, - 'location': locationName, + 'details': event.description, + 'location': event.locationName, }, ).toString(); } @@ -23,45 +26,44 @@ String getGcalUrl(String title, String description, DateTime startTime, /// Assumes a timed event is in EST (since it will take place in Ithaca, NY), and converts to UTC for gcal format /// -String formatDates(DateTime startTime, DateTime endTime) { - if (isMidnight(startTime) && isMidnight(endTime)) { +String formatDates( + DateTime startTime, + DateTime endTime, { + required bool allDayEvent, +}) { + if (allDayEvent) { // all day event - final startYmd = allDay(startTime); - var endYmd = allDay(endTime); + final startYmd = formatToAllDay(startTime); + var endYmd = formatToAllDay(endTime); if (startYmd == endYmd) { // change end date to one day after since exclusive - final localStart = startTime.toLocal(); final nextDay = DateTime( - localStart.year, - localStart.month, - localStart.day, + startTime.year, + startTime.month, + startTime.day, ).add(const Duration(days: 1)); - endYmd = allDay(nextDay); + endYmd = formatToAllDay(nextDay); } return '$startYmd/$endYmd'; } // timed event return '${formatTime(startTime)}/${formatTime(endTime)}'; } -bool isMidnight(DateTime d) { - return d.hour == 0 && d.minute == 0 && d.second == 0 && d.microsecond == 0; -} -String allDay(DateTime d) { - final l = d.toLocal(); //convert to local date - final y = l.year.toString().padLeft(4, '0'); - final m = l.month.toString().padLeft(2, '0'); - final day = l.day.toString().padLeft(2, '0'); - return '$y$m$day'; +String formatToAllDay(DateTime date) { + final yr = date.year.toString().padLeft(4, '0'); + final mon = date.month.toString().padLeft(2, '0'); + final day = date.day.toString().padLeft(2, '0'); + return '$yr$mon$day'; } -String formatTime(DateTime d) { - final u = d.toUtc(); - final y = u.year.toString().padLeft(4, '0'); - final m = u.month.toString().padLeft(2, '0'); - final day = u.day.toString().padLeft(2, '0'); - final h = u.hour.toString().padLeft(2, '0'); - final min = u.minute.toString().padLeft(2, '0'); - final s = u.second.toString().padLeft(2, '0'); - return '$y$m${day}T$h$min${s}Z'; +String formatTime(DateTime date) { + final universalTime = date.toUtc(); + final yr = universalTime.year.toString().padLeft(4, '0'); + final mon = universalTime.month.toString().padLeft(2, '0'); + final day = universalTime.day.toString().padLeft(2, '0'); + final hr = universalTime.hour.toString().padLeft(2, '0'); + final min = universalTime.minute.toString().padLeft(2, '0'); + final sec = universalTime.second.toString().padLeft(2, '0'); + return '$yr$mon${day}T$hr$min${sec}Z'; } From 7513559b753c9c565e14c1af596c1a4f082d76d4 Mon Sep 17 00:00:00 2001 From: ambers7 Date: Wed, 22 Apr 2026 18:06:02 -0400 Subject: [PATCH 4/5] Changed gcal tests to use dart test --- game/test/gcal_url_test.dart | 167 +++++++++++++++++++++++++---------- 1 file changed, 118 insertions(+), 49 deletions(-) diff --git a/game/test/gcal_url_test.dart b/game/test/gcal_url_test.dart index cc3417aa..a6ecb40f 100644 --- a/game/test/gcal_url_test.dart +++ b/game/test/gcal_url_test.dart @@ -1,56 +1,125 @@ -// Manual testing for Google Calendar URLs. +// Testing for Google Calendar URLs. // // From the `game` directory run: -// dart run test/gcal_url_test.dart +// dart test test/gcal_url_test.dart +import 'package:game/api/game_client_dto.dart'; import 'package:game/utils/gcal_url.dart'; +import 'package:test/test.dart'; + +CampusEventDto _campusEvent({ + required String id, + required String title, + required String description, + required DateTime startTime, + required DateTime endTime, + required bool allDay, + required String locationName, +}) { + return CampusEventDto( + id: id, + title: title, + description: description, + startTime: startTime.toIso8601String(), + endTime: endTime.toIso8601String(), + allDay: allDay, + locationName: locationName, + latitude: 0, + longitude: 0, + categories: [CampusEventCategoriesDto.values.first], + tags: const [], + source: CampusEventSourceDto.values.first, + checkInMethod: CampusEventCheckInMethodDto.values.first, + pointsForAttendance: 0, + featured: false, + attendanceCount: 0, + rsvpCount: 0, + ); +} void main() { - // Timed event (local wall clock — same as typical app DateTime) - final timedStart = DateTime(2025, 3, 29, 14, 30); - final timedEnd = DateTime(2025, 3, 29, 15, 30); - print('timed'); - print('dates: ${formatDates(timedStart, timedEnd)}'); - print(getGcalUrl( - 'Sample timed event', - 'Description line', - timedStart, - timedEnd, - 'Ithaca, NY', - )); - print(''); - - // Time event that lasts multiple days - final timedStart1 = DateTime(2025, 3, 29, 1, 30); - final timedEnd1 = DateTime(2025, 3, 31, 12, 30); - print('timed'); - print('dates: ${formatDates(timedStart1, timedEnd1)}'); - print(getGcalUrl( - 'Sample timed event 1', - 'Heyy what\'s up eveyrone! \n How you doing?', - timedStart1, - timedEnd1, - 'Bailey Hall', - )); - print(''); - - // All-day (both at local midnight) midnight 3/29 to midnight 3/31, so 3/29-3/30 - final allDayStart = DateTime(2025, 3, 29); - final allDayEnd = DateTime(2025, 3, 31); - print('all-day (two midnights)'); - print('dates: ${formatDates(allDayStart, allDayEnd)}'); - print(getGcalUrl( - 'Sample all-day', - '', - allDayStart, - allDayEnd, - '', - )); - print(''); - - // Single calendar day all-day - final single = DateTime(2025, 3, 29); - print('all-day same start/end midnight'); - print('dates: ${formatDates(single, single)}'); - print(getGcalUrl('One day', '', single, single, '')); + group('formatDates', () { + test('timed event uses UTC timestamps', () { + final start = DateTime(2025, 3, 29, 14, 30); + final end = DateTime(2025, 3, 29, 15, 30); + + final dates = formatDates(start, end, allDayEvent: false); + + expect(dates, '${formatTime(start)}/${formatTime(end)}'); + expect(dates, contains('T')); + expect(dates, endsWith('Z/${formatTime(end)}'.split('/').last)); + }); + + test('all-day multi-day uses YYYYMMDD/YYYYMMDD', () { + final start = DateTime(2025, 3, 29); + final end = DateTime(2025, 3, 31); + + final dates = formatDates(start, end, allDayEvent: true); + + expect(dates, '${formatToAllDay(start)}/${formatToAllDay(end)}'); + expect(dates, isNot(contains('T'))); + }); + + test('all-day single-day expands end date by one day', () { + final single = DateTime(2025, 3, 29); + + final dates = formatDates(single, single, allDayEvent: true); + + final nextDay = DateTime(single.year, single.month, single.day) + .add(const Duration(days: 1)); + expect(dates, '${formatToAllDay(single)}/${formatToAllDay(nextDay)}'); + }); + }); + + group('getGcalUrl', () { + test('builds expected Google Calendar event-edit URI', () { + final ev = _campusEvent( + id: '1', + title: 'Sample timed event', + description: 'Description line', + startTime: DateTime(2025, 3, 29, 14, 30), + endTime: DateTime(2025, 3, 29, 15, 30), + allDay: false, + locationName: 'Ithaca, NY', + ); + + final url = getGcalUrl(ev); + print('Timed event URL: $url'); + final uri = Uri.parse(url); + + expect(uri.scheme, 'https'); + expect(uri.host, 'calendar.google.com'); + expect(uri.path, '/calendar/u/0/r/eventedit'); + + final start = DateTime.parse(ev.startTime); + final end = DateTime.parse(ev.endTime); + expect(uri.queryParameters['text'], ev.title); + expect(uri.queryParameters['details'], ev.description); + expect(uri.queryParameters['location'], ev.locationName); + expect( + uri.queryParameters['dates'], + formatDates(start, end, allDayEvent: ev.allDay), + ); + }); + + test('all-day event uses allDay flag', () { + final ev = _campusEvent( + id: '2', + title: 'All day (flagged)', + description: '', + startTime: DateTime(2025, 3, 29, 12, 0), + endTime: DateTime(2025, 3, 29, 12, 0), + allDay: true, + locationName: '', + ); + + final url = getGcalUrl(ev); + print('All-day (flagged) URL: $url'); + final uri = Uri.parse(url); + final dates = uri.queryParameters['dates']!; + + expect(dates, contains('/')); + expect(dates, isNot(contains('T'))); + }); + }); } From 4773de74f2eca27deab96fdc0564ed1752415b34 Mon Sep 17 00:00:00 2001 From: ambers7 Date: Wed, 22 Apr 2026 18:06:28 -0400 Subject: [PATCH 5/5] Merged main --- admin/src/App.tsx | 16 + admin/src/all.dto.ts | 329 +- admin/src/components/BearItems.tsx | 207 + .../components/ChallengeCardComponents.tsx | 39 + admin/src/components/Challenges.tsx | 10 +- admin/src/components/EntryModal.tsx | 136 +- admin/src/components/Feedback.tsx | 157 + admin/src/components/Journeys.tsx | 10 +- admin/src/components/ServerApi.tsx | 114 + admin/src/components/ServerData.tsx | 40 + game/android/build.gradle | 13 - game/assets/buildabear/eyes/squinty_eyes.png | Bin 0 -> 1638 bytes game/ios/Podfile.lock | 2 +- game/lib/api/game_client_api.dart | 40 + game/lib/api/game_client_dto.dart | 1669 +++++++- game/lib/api/game_server_api.dart | 72 +- game/lib/challenges/challenges_page.dart | 4 +- game/lib/feedback/feedback_page.dart | 201 + game/lib/gameplay/arrival_dialog.dart | 41 +- game/lib/gameplay/challenge_completed.dart | 78 +- .../journey_challenge_list_sheet.dart | 392 +- game/lib/journeys/journeys_page.dart | 6 +- game/lib/main.dart | 12 + game/lib/model/campus_event_model.dart | 82 + game/lib/model/feature_flags_model.dart | 21 + game/lib/profile/profile_page.dart | 34 +- game/lib/profile/settings_page.dart | 8 +- game/lib/quiz/quiz_page.dart | 91 +- game/lib/utils/utility_functions.dart | 12 +- game/pubspec.lock | 242 +- game/pubspec.yaml | 5 +- package.json | 1 + scripts/bulk-add-challenges.js | 384 ++ scripts/updateapi-lib/apiscanner.js | 38 +- scripts/updateapi-lib/apiscanner.ts | 51 +- scripts/updateapi-lib/dartgen.js | 26 +- scripts/updateapi-lib/dartgen.ts | 10 +- scripts/updateapi-lib/dtoscanner.js | 101 +- scripts/updateapi-lib/dtoscanner.ts | 117 +- scripts/updateapi-lib/tsgen.js | 20 +- scripts/updateapi-lib/tsgen.ts | 14 +- server/.env.example | 3 + server/package-lock.json | 3494 ++++++----------- .../migration.sql | 21 + .../migration.sql | 2 + .../migration.sql | 21 + .../migration.sql | 6 + server/prisma/schema.prisma | 35 +- server/prisma/seed.ts | 2 +- server/src/app.module.ts | 6 +- server/src/auth/auth.service.ts | 3 + server/src/avatar/avatar.dto.ts | 20 + server/src/avatar/avatar.gateway.spec.ts | 255 ++ server/src/avatar/avatar.gateway.ts | 109 + server/src/avatar/avatar.service.spec.ts | 336 ++ server/src/avatar/avatar.service.ts | 142 +- server/src/challenge/challenge.dto.ts | 2 + server/src/challenge/challenge.service.ts | 103 + server/src/client/client.service.ts | 4 + server/src/event/event.dto.ts | 11 +- server/src/event/event.service.ts | 1 + .../feature-flags/feature-flags.controller.ts | 11 + server/src/feedback/feedback.dto.ts | 28 + server/src/feedback/feedback.gateway.ts | 48 + server/src/feedback/feedback.module.ts | 12 + server/src/feedback/feedback.service.ts | 78 + .../frontend-config.controller.ts | 11 + server/src/user/user.service.ts | 32 + 68 files changed, 6738 insertions(+), 2903 deletions(-) create mode 100644 admin/src/components/BearItems.tsx create mode 100644 admin/src/components/Feedback.tsx create mode 100644 game/assets/buildabear/eyes/squinty_eyes.png create mode 100644 game/lib/feedback/feedback_page.dart create mode 100644 game/lib/model/campus_event_model.dart create mode 100644 game/lib/model/feature_flags_model.dart create mode 100644 scripts/bulk-add-challenges.js create mode 100644 server/prisma/migrations/20260316174619_add_feedback_model/migration.sql create mode 100644 server/prisma/migrations/20260324180000_feedback_unique_per_challenge/migration.sql create mode 100644 server/prisma/migrations/20260414000000_expand_event_categories/migration.sql create mode 100644 server/prisma/migrations/20260414212655_add_scheduled_time_to_challenge/migration.sql create mode 100644 server/src/avatar/avatar.gateway.spec.ts create mode 100644 server/src/avatar/avatar.service.spec.ts create mode 100644 server/src/feature-flags/feature-flags.controller.ts create mode 100644 server/src/feedback/feedback.dto.ts create mode 100644 server/src/feedback/feedback.gateway.ts create mode 100644 server/src/feedback/feedback.module.ts create mode 100644 server/src/feedback/feedback.service.ts create mode 100644 server/src/frontend-config/frontend-config.controller.ts diff --git a/admin/src/App.tsx b/admin/src/App.tsx index c155c354..999271d7 100644 --- a/admin/src/App.tsx +++ b/admin/src/App.tsx @@ -5,6 +5,8 @@ import { Organizations } from './components/Organizations'; import { ErrorAlert } from './components/ErrorAlert'; import { Users } from './components/Users'; import { Notifications } from './components/Notifications'; +import { Feedback } from './components/Feedback'; +import { BearItems } from './components/BearItems'; import { AppBar, @@ -30,6 +32,8 @@ import { faBuilding, faPerson, faBell, + faComment, + faPaw, } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; @@ -91,6 +95,18 @@ const routes = [ icon: faBell, name: 'Notifications', }, + { + path: '/feedback', + element: , + icon: faComment, + name: 'Feedback', + }, + { + path: '/bear-items', + element: , + icon: faPaw, + name: 'Bear Items', + }, ]; const SidebarIcon = styled.span` diff --git a/admin/src/all.dto.ts b/admin/src/all.dto.ts index 8544a099..e1c54b7a 100644 --- a/admin/src/all.dto.ts +++ b/admin/src/all.dto.ts @@ -29,6 +29,90 @@ export enum BearSlotDto { ACCESSORY = 'ACCESSORY', } +export enum CampusEventCategoryDto { + SOCIAL = 'SOCIAL', + CULTURAL = 'CULTURAL', + ATHLETIC = 'ATHLETIC', + WELLNESS = 'WELLNESS', + ACADEMIC = 'ACADEMIC', + ARTS = 'ARTS', + CAREER = 'CAREER', + COMMUNITY = 'COMMUNITY', + OTHER = 'OTHER', +} + +export enum EventSourceDto { + API_EVENTS = 'API_EVENTS', + ADMIN_CREATED = 'ADMIN_CREATED', + COMMUNITY_SUBMITTED = 'COMMUNITY_SUBMITTED', +} + +export enum CheckInMethodDto { + LOCATION = 'LOCATION', + QR_CODE = 'QR_CODE', + EITHER = 'EITHER', +} + +export enum CampusEventCategoriesDto { + SOCIAL = 'SOCIAL', + CULTURAL = 'CULTURAL', + ATHLETIC = 'ATHLETIC', + WELLNESS = 'WELLNESS', + ACADEMIC = 'ACADEMIC', + ARTS = 'ARTS', + CAREER = 'CAREER', + COMMUNITY = 'COMMUNITY', + OTHER = 'OTHER', +} + +export enum CampusEventSourceDto { + API_EVENTS = 'API_EVENTS', + ADMIN_CREATED = 'ADMIN_CREATED', + COMMUNITY_SUBMITTED = 'COMMUNITY_SUBMITTED', +} + +export enum CampusEventCheckInMethodDto { + LOCATION = 'LOCATION', + QR_CODE = 'QR_CODE', + EITHER = 'EITHER', +} + +export enum RequestCampusEventsCategoriesDto { + SOCIAL = 'SOCIAL', + CULTURAL = 'CULTURAL', + ATHLETIC = 'ATHLETIC', + WELLNESS = 'WELLNESS', + ACADEMIC = 'ACADEMIC', + ARTS = 'ARTS', + CAREER = 'CAREER', + COMMUNITY = 'COMMUNITY', + OTHER = 'OTHER', +} + +export enum UpsertCampusEventCategoriesDto { + SOCIAL = 'SOCIAL', + CULTURAL = 'CULTURAL', + ATHLETIC = 'ATHLETIC', + WELLNESS = 'WELLNESS', + ACADEMIC = 'ACADEMIC', + ARTS = 'ARTS', + CAREER = 'CAREER', + COMMUNITY = 'COMMUNITY', + OTHER = 'OTHER', +} + +export enum UpsertCampusEventSourceDto { + API_EVENTS = 'API_EVENTS', + ADMIN_CREATED = 'ADMIN_CREATED', + COMMUNITY_SUBMITTED = 'COMMUNITY_SUBMITTED', +} + +export enum UpsertCampusEventCheckInMethodDto { + LOCATION = 'LOCATION', + QR_CODE = 'QR_CODE', + EITHER = 'EITHER', +} + export enum ChallengeLocationDto { ENG_QUAD = 'ENG_QUAD', ARTS_QUAD = 'ARTS_QUAD', @@ -43,13 +127,45 @@ export enum ChallengeLocationDto { ANY = 'ANY', } +export enum CheckInResultCheckInMethodDto { + LOCATION = 'LOCATION', + QR_CODE = 'QR_CODE', +} + +export enum CheckInErrorCodeDto { + EVENT_NOT_FOUND = 'EVENT_NOT_FOUND', + EVENT_NOT_ACTIVE = 'EVENT_NOT_ACTIVE', + EVENT_NOT_APPROVED = 'EVENT_NOT_APPROVED', + ALREADY_CHECKED_IN = 'ALREADY_CHECKED_IN', + OUT_OF_RADIUS = 'OUT_OF_RADIUS', + METHOD_NOT_ALLOWED = 'METHOD_NOT_ALLOWED', + INVALID_QR_CODE = 'INVALID_QR_CODE', + UNKNOWN_ERROR = 'UNKNOWN_ERROR', +} + +export enum ClubSubmissionCategoryDto { + SOCIAL = 'SOCIAL', + CULTURAL = 'CULTURAL', + ATHLETIC = 'ATHLETIC', + WELLNESS = 'WELLNESS', + ACADEMIC = 'ACADEMIC', + ARTS = 'ARTS', + CAREER = 'CAREER', + COMMUNITY = 'COMMUNITY', + OTHER = 'OTHER', +} + export enum EventCategoryDto { FOOD = 'FOOD', NATURE = 'NATURE', HISTORICAL = 'HISTORICAL', - CAFE = 'CAFE', - DININGHALL = 'DININGHALL', - DORM = 'DORM', + RESIDENTIAL = 'RESIDENTIAL', + LANDMARK = 'LANDMARK', + ARTS = 'ARTS', + ATHLETICS = 'ATHLETICS', + LIBRARY = 'LIBRARY', + ACADEMIC = 'ACADEMIC', + RECREATION = 'RECREATION', } export enum EventTimeLimitationDto { @@ -63,6 +179,12 @@ export enum EventDifficultyDto { Hard = 'Hard', } +export enum FeedbackCategoryDto { + BUG_REPORT = 'BUG_REPORT', + SUGGESTION = 'SUGGESTION', + GENERAL = 'GENERAL', +} + export enum QuizErrorCodeDto { NO_QUESTIONS = 'NO_QUESTIONS', ALREADY_ANSWERED = 'ALREADY_ANSWERED', @@ -210,6 +332,119 @@ export interface UpdatePurchaseResultDto { itemId: string; } +export interface AdminBearItemDto { + id: string; + name?: string; + slot?: BearSlotDto; + cost?: number; + assetKey?: string; + mimeType?: string; + zIndex?: number; + isDefault?: boolean; +} + +export interface UpdateBearItemDataDto { + bearItem: AdminBearItemDto; + deleted: boolean; +} + +export interface RequestAllBearItemsDto {} + +export interface CampusEventDto { + id: string; + title: string; + description: string; + imageUrl?: string; + startTime: string; + endTime: string; + allDay: boolean; + locationName: string; + address?: string; + latitude: number; + longitude: number; + categories: CampusEventCategoriesDto[]; + tags: string[]; + source: CampusEventSourceDto; + externalUrl?: string; + organizerName?: string; + registrationUrl?: string; + checkInMethod: CampusEventCheckInMethodDto; + pointsForAttendance: number; + featured: boolean; + attendanceCount: number; + rsvpCount: number; +} + +export interface RequestCampusEventsDto { + page: number; + limit: number; + dateFrom?: string; + dateTo?: string; + categories?: RequestCampusEventsCategoriesDto[]; + search?: string; + featured?: boolean; +} + +export interface CampusEventListDto { + events: CampusEventDto[]; + total: number; + page: number; + limit: number; + totalPages: number; +} + +export interface RequestCampusEventDetailsDto { + eventId: string; +} + +export interface UpsertCampusEventDto { + id?: string; + title: string; + description: string; + imageUrl?: string; + startTime: string; + endTime: string; + allDay?: boolean; + locationName: string; + address?: string; + latitude: number; + longitude: number; + checkInRadius?: number; + categories: UpsertCampusEventCategoriesDto[]; + tags: string[]; + source: UpsertCampusEventSourceDto; + externalId?: string; + externalUrl?: string; + organizerName?: string; + organizerEmail?: string; + organizerId?: string; + checkInMethod?: UpsertCampusEventCheckInMethodDto; + pointsForAttendance?: number; + featured?: boolean; + registrationUrl?: string; +} + +export interface DeleteCampusEventDto { + eventId: string; +} + +export interface RsvpCampusEventDto { + eventId: string; +} + +export interface UnRsvpCampusEventDto { + eventId: string; +} + +export interface UpdateCampusEventDataDto { + event: CampusEventDto; + deleted: boolean; +} + +export interface CampusEventListResponseDto { + list: CampusEventListDto; +} + export interface CompletedChallengeDto {} export interface ChallengeDto { @@ -225,6 +460,8 @@ export interface ChallengeDto { closeRadiusF?: number; linkedEventId?: string; timerLength?: number; + scheduledStartTime?: string; + scheduledEndTime?: string; } export interface RequestChallengeDataDto { @@ -250,11 +487,54 @@ export interface AvailableChallengesResponseDto { challenges: ChallengeDto[]; } +export interface LocationCheckInDto { + campusEventId: string; + latitude: number; + longitude: number; +} + +export interface QrCodeCheckInDto { + qrCode: string; +} + +export interface GenerateQrCodeDto { + campusEventId: string; +} + +export interface CheckInResultDto { + attendanceId: string; + campusEventId: string; + checkInMethod: CheckInResultCheckInMethodDto; + pointsAwarded: number; + newTotalScore: number; +} + +export interface CheckInErrorDto { + message: string; + code: CheckInErrorCodeDto; +} + export interface UpdateErrorDto { id: string; message: string; } +export interface ClubSubmissionDto { + clubName: string; + contactEmail: string; + eventTitle: string; + description: string; + startTime: string; + endTime: string; + location: string; + latitude?: number; + longitude?: number; + category: ClubSubmissionCategoryDto; + address?: string; + imageUrl?: string; + registrationLink?: string; +} + export interface RequestFilteredEventsDto { difficulty: string[]; location: string[]; @@ -323,6 +603,7 @@ export interface PrevChallengeDto { extensionsUsed?: number; dateCompleted: string; failed?: boolean; + dateExpired?: boolean; } export interface EventTrackerDto { @@ -344,6 +625,48 @@ export interface UpdateEventDataDto { export interface UseEventTrackerHintDto {} +export interface TriggerEventSyncDto { + days?: number; +} + +export interface EventSyncResultDto { + created: number; + updated: number; + archived: number; + totalFetched: number; + syncedAt: string; +} + +export interface RequestEventSyncStatusDto {} + +export interface UpdateEventSyncStatusDto { + running: boolean; + lastResult: EventSyncResultDto; +} + +export interface SubmitFeedbackDto { + category: FeedbackCategoryDto; + text: string; + rating?: boolean; + challengeId?: string; +} + +export interface FeedbackDto { + id: string; + createdAt: string; + category: FeedbackCategoryDto; + text: string; + rating?: boolean; + challengeId?: string; + userId: string; + username?: string; + challengeName?: string; +} + +export interface UpdateFeedbackDataDto { + feedbacks: FeedbackDto[]; +} + export interface JoinGroupDto { groupId: string; } diff --git a/admin/src/components/BearItems.tsx b/admin/src/components/BearItems.tsx new file mode 100644 index 00000000..29c6c9ee --- /dev/null +++ b/admin/src/components/BearItems.tsx @@ -0,0 +1,207 @@ +import { useContext, useState } from 'react'; +import { DeleteModal } from './DeleteModal'; +import { + EntryModal, + EntryForm, + NumberEntryForm, + OptionEntryForm, + FreeEntryForm, +} from './EntryModal'; +import { HButton } from './HButton'; +import { + CenterText, + ListCardBody, + ListCardBox, + ListCardButtons, + ListCardTitle, +} from './ListCard'; +import { SearchBar } from './SearchBar'; +import { ServerDataContext } from './ServerData'; + +import { compareTwoStrings } from 'string-similarity'; +import { AdminBearItemDto, BearSlotDto } from '../all.dto'; + +const slotOptions = [ + BearSlotDto.EYES, + BearSlotDto.MOUTH, + BearSlotDto.COLOR, + BearSlotDto.ACCESSORY, +]; + +const defaultOptions = ['No', 'Yes']; + +function BearItemCard(props: { + item: AdminBearItemDto; + onEdit: () => void; + onDelete: () => void; +}) { + return ( + + {props.item.name} + + Id: {props.item.id}
+ Slot: {props.item.slot}
+ Cost: {props.item.cost}
+ Asset Key: {props.item.assetKey}
+ MIME Type: {props.item.mimeType || 'N/A'}
+ Z-Index: {props.item.zIndex ?? 'N/A'}
+ Default: {props.item.isDefault ? 'Yes' : 'No'}
+
+ + DELETE + + EDIT + + +
+ ); +} + +function makeForm(): EntryForm[] { + return [ + { name: 'Name', characterLimit: 256, value: '' }, + { + name: 'Slot', + options: slotOptions as string[], + value: 0, + }, + { name: 'Cost', value: 0, min: 0, max: 99999 }, + { name: 'Asset Key', characterLimit: 512, value: '' }, + { name: 'MIME Type', characterLimit: 128, value: '' }, + { name: 'Z-Index', value: 0, min: -100, max: 100 }, + { + name: 'Is Default', + options: defaultOptions, + value: 0, + }, + ]; +} + +function fromForm(form: EntryForm[], id: string): AdminBearItemDto { + return { + id, + name: (form[0] as FreeEntryForm).value, + slot: slotOptions[(form[1] as OptionEntryForm).value], + cost: (form[2] as NumberEntryForm).value, + assetKey: (form[3] as FreeEntryForm).value, + mimeType: (form[4] as FreeEntryForm).value, + zIndex: (form[5] as NumberEntryForm).value, + isDefault: (form[6] as OptionEntryForm).value === 1, + }; +} + +function toForm(item: AdminBearItemDto): EntryForm[] { + return [ + { name: 'Name', characterLimit: 256, value: item.name ?? '' }, + { + name: 'Slot', + options: slotOptions as string[], + value: slotOptions.indexOf(item.slot ?? BearSlotDto.ACCESSORY), + }, + { name: 'Cost', value: item.cost ?? 0, min: 0, max: 99999 }, + { name: 'Asset Key', characterLimit: 512, value: item.assetKey ?? '' }, + { name: 'MIME Type', characterLimit: 128, value: item.mimeType ?? '' }, + { name: 'Z-Index', value: item.zIndex ?? 0, min: -100, max: 100 }, + { + name: 'Is Default', + options: defaultOptions, + value: item.isDefault ? 1 : 0, + }, + ]; +} + +export function BearItems() { + const serverData = useContext(ServerDataContext); + const [isCreateModalOpen, setCreateModalOpen] = useState(false); + const [isEditModalOpen, setEditModalOpen] = useState(false); + const [isDeleteModalOpen, setDeleteModalOpen] = useState(false); + + const [form, setForm] = useState(() => makeForm()); + const [currentId, setCurrentId] = useState(''); + const [query, setQuery] = useState(''); + + const allItems = Array.from(serverData.bearItems.values()); + + return ( + <> + { + serverData.updateBearItem(fromForm(form, '')); + setCreateModalOpen(false); + }} + onCancel={() => setCreateModalOpen(false)} + form={form} + /> + { + serverData.updateBearItem(fromForm(form, currentId)); + setEditModalOpen(false); + }} + onCancel={() => setEditModalOpen(false)} + form={form} + /> + setDeleteModalOpen(false)} + onDelete={() => { + serverData.deleteBearItem(currentId); + setDeleteModalOpen(false); + }} + /> + { + setForm(makeForm()); + setCreateModalOpen(true); + }} + onSearch={q => setQuery(q)} + /> + {allItems.length === 0 && No bear items found} + {allItems + .filter(item => { + if (query === '') return true; + const q = query.toLowerCase(); + return ( + (item.name ?? '').toLowerCase().includes(q) || + (item.slot ?? '').toLowerCase().includes(q) || + (item.assetKey ?? '').toLowerCase().includes(q) + ); + }) + .sort((a, b) => { + if (query === '') { + const slotCmp = (a.slot ?? '').localeCompare(b.slot ?? ''); + if (slotCmp !== 0) return slotCmp; + return (a.name ?? '').localeCompare(b.name ?? ''); + } + return ( + compareTwoStrings(b.name ?? '', query) - + compareTwoStrings(a.name ?? '', query) + ); + }) + .map(item => ( + { + setCurrentId(item.id); + setDeleteModalOpen(true); + }} + onEdit={() => { + const fresh = serverData.bearItems.get(item.id); + if (fresh) { + setCurrentId(item.id); + setForm(toForm(fresh)); + setEditModalOpen(true); + } + }} + /> + ))} + + ); +} diff --git a/admin/src/components/ChallengeCardComponents.tsx b/admin/src/components/ChallengeCardComponents.tsx index 3c87cef6..2359ac68 100644 --- a/admin/src/components/ChallengeCardComponents.tsx +++ b/admin/src/components/ChallengeCardComponents.tsx @@ -12,6 +12,7 @@ import { OptionEntryForm, MapEntryForm, CheckboxNumberEntryForm, + CheckboxDateEntryForm, AnswersEntryForm, OptionWithCustomEntryForm, } from './EntryModal'; @@ -223,6 +224,16 @@ export function makeChallengeForm(): EntryForm[] { max: 3600, numberLabel: 'Timer Length (seconds)', }, + { + name: 'Scheduled Start Time', + checked: false, + date: new Date(), + }, + { + name: 'Scheduled End Time', + checked: false, + date: new Date(), + }, ]; } @@ -285,6 +296,20 @@ export function challengeToForm(challenge: ChallengeDto) { max: 3600, numberLabel: 'Timer Length (seconds)', }, + { + name: 'Scheduled Start Time', + checked: !!challenge.scheduledStartTime, + date: challenge.scheduledStartTime + ? new Date(challenge.scheduledStartTime) + : new Date(), + }, + { + name: 'Scheduled End Time', + checked: !!challenge.scheduledEndTime, + date: challenge.scheduledEndTime + ? new Date(challenge.scheduledEndTime) + : new Date(), + }, ]; } @@ -294,6 +319,8 @@ export function challengeFromForm( id: string, ): ChallengeDto { const timerForm = form[8] as CheckboxNumberEntryForm; + const startForm = form[9] as CheckboxDateEntryForm; + const endForm = form[10] as CheckboxDateEntryForm; return { id, name: (form[2] as FreeEntryForm).value, @@ -307,6 +334,10 @@ export function challengeFromForm( closeRadiusF: (form[7] as NumberEntryForm).value, linkedEventId: eventId, timerLength: timerForm.checked ? timerForm.value : undefined, + scheduledStartTime: startForm.checked + ? startForm.date.toISOString() + : undefined, + scheduledEndTime: endForm.checked ? endForm.date.toISOString() : undefined, }; } @@ -412,6 +443,14 @@ export function ChallengeCard(props: { ? `${Math.floor(props.challenge.timerLength / 60)}m ${props.challenge.timerLength % 60}s` : 'None'} +
+ Scheduled:{' '} + + {props.challenge.scheduledStartTime || + props.challenge.scheduledEndTime + ? `${props.challenge.scheduledStartTime ? new Date(props.challenge.scheduledStartTime).toLocaleString() : '—'} to ${props.challenge.scheduledEndTime ? new Date(props.challenge.scheduledEndTime).toLocaleString() : '—'}` + : 'None'} + UP diff --git a/admin/src/components/Challenges.tsx b/admin/src/components/Challenges.tsx index 93166685..a97340ac 100644 --- a/admin/src/components/Challenges.tsx +++ b/admin/src/components/Challenges.tsx @@ -45,9 +45,13 @@ const eventCategoryOptions = [ 'FOOD', 'NATURE', 'HISTORICAL', - 'CAFE', - 'DININGHALL', - 'DORM', + 'RESIDENTIAL', + 'LANDMARK', + 'ARTS', + 'ATHLETICS', + 'LIBRARY', + 'ACADEMIC', + 'RECREATION', ]; // Combined form indices: diff --git a/admin/src/components/EntryModal.tsx b/admin/src/components/EntryModal.tsx index 0c63d374..98ecf35e 100644 --- a/admin/src/components/EntryModal.tsx +++ b/admin/src/components/EntryModal.tsx @@ -60,6 +60,12 @@ export type AnswersEntryForm = { maxAnswers: number; }; +export type CheckboxDateEntryForm = { + name: string; + checked: boolean; + date: Date; +}; + export type OptionWithCustomEntryForm = { name: string; value: number; @@ -76,7 +82,8 @@ export type EntryForm = | DateEntryForm | CheckboxNumberEntryForm | AnswersEntryForm - | OptionWithCustomEntryForm; + | OptionWithCustomEntryForm + | CheckboxDateEntryForm; const EntryBox = styled.div` margin-bottom: 12px; @@ -256,6 +263,46 @@ function CheckboxNumberEntryFormBox(props: { form: CheckboxNumberEntryForm }) { ); } +function CheckboxDateEntryFormBox(props: { form: CheckboxDateEntryForm }) { + const [checked, setChecked] = useState(props.form.checked); + const [val, setVal] = useState(''); + + useEffect(() => { + setChecked(props.form.checked); + setVal(props.form.date.toISOString().slice(0, 16)); + }, [props.form]); + + return ( + <> + + + + {checked && ( + + { + setVal(e.target.value); + props.form.date = new Date(e.target.value); + }} + /> + + )} + + ); +} + const MapBox = styled.div` width: 100%; height: 300px; @@ -270,9 +317,81 @@ const mapContainerStyle = { height: '300px', }; +type FrontendConfigResponse = { + googleMapsApiKey?: string; +}; + function MapEntryFormBox(props: { form: MapEntryForm; allForms?: EntryForm[]; +}) { + const [googleMapsApiKey, setGoogleMapsApiKey] = useState( + process.env.REACT_APP_GOOGLE_MAPS_API_KEY || '', + ); + const [hasLoadedConfig, setHasLoadedConfig] = useState( + Boolean(process.env.REACT_APP_GOOGLE_MAPS_API_KEY), + ); + + useEffect(() => { + if (googleMapsApiKey) { + setHasLoadedConfig(true); + return; + } + + let isCancelled = false; + + fetch('/frontend-config') + .then(async response => { + if (!response.ok) { + throw new Error(`Failed to load config: ${response.status}`); + } + + const config = (await response.json()) as FrontendConfigResponse; + + if (isCancelled) { + return; + } + + setGoogleMapsApiKey(config.googleMapsApiKey || ''); + setHasLoadedConfig(true); + }) + .catch(() => { + if (!isCancelled) { + setHasLoadedConfig(true); + } + }); + + return () => { + isCancelled = true; + }; + }, [googleMapsApiKey]); + + if (!hasLoadedConfig) { + return Loading map configuration...; + } + + if (!googleMapsApiKey) { + return ( + + Google Maps is unavailable. Set `REACT_APP_GOOGLE_MAPS_API_KEY` in the + running server environment. + + ); + } + + return ( + + ); +} + +function LoadedMapEntryFormBox(props: { + form: MapEntryForm; + allForms?: EntryForm[]; + googleMapsApiKey: string; }) { const [lat, setLat] = useState(props.form.latitude); const [lng, setLng] = useState(props.form.longitude); @@ -282,8 +401,8 @@ function MapEntryFormBox(props: { lng: props.form.longitude, }); - const { isLoaded } = useJsApiLoader({ - googleMapsApiKey: process.env.REACT_APP_GOOGLE_MAPS_API_KEY || '', + const { isLoaded, loadError } = useJsApiLoader({ + googleMapsApiKey: props.googleMapsApiKey, }); // Derive radii from form so map updates when Awarding/Close Distance fields change @@ -343,6 +462,15 @@ function MapEntryFormBox(props: { } }; + if (loadError) { + return ( + + Unable to load Google Maps. Verify the API key, referrer restrictions, + and that the Maps JavaScript API is enabled. + + ); + } + if (!isLoaded) return Loading map...; return ( @@ -607,6 +735,8 @@ export function EntryModal(props: { return ; } else if ('characterLimit' in form) { return ; + } else if ('date' in form && 'checked' in form) { + return ; } else if ('checked' in form) { return ; } else if ('min' in form) { diff --git a/admin/src/components/Feedback.tsx b/admin/src/components/Feedback.tsx new file mode 100644 index 00000000..eba84459 --- /dev/null +++ b/admin/src/components/Feedback.tsx @@ -0,0 +1,157 @@ +import { useContext, useEffect, useMemo, useState } from 'react'; +import styled from 'styled-components'; +import { ServerConnectionContext } from './ServerConnection'; +import { ServerApi } from './ServerApi'; +import { FeedbackDto } from '../all.dto'; +import { + ListCardBox, + ListCardTitle, + ListCardBody, + CenterText, +} from './ListCard'; + +const SearchBarBox = styled.div` + display: flex; + flex-direction: row; + position: sticky; + justify-content: space-between; + top: 0; + border-radius: 6px; + width: 100%; + height: 48px; + box-shadow: 0 0 2px black; + padding: 6px; + margin-bottom: 12px; + line-height: 30px; + font-size: 18px; + background-color: white; + opacity: 0.9; + z-index: 10; +`; + +const SearchTextBox = styled.input` + flex-shrink: 1; + margin-left: 12px; + width: calc(100% - 12px); + font-size: 18px; + justify-self: flex-end; +`; + +const CategoryBadge = styled.span<{ category: string }>` + display: inline-block; + padding: 2px 8px; + border-radius: 4px; + font-size: 12px; + font-weight: bold; + color: white; + background-color: ${props => { + switch (props.category) { + case 'BUG_REPORT': + return '#e74c3c'; + case 'SUGGESTION': + return '#3498db'; + case 'LIKE': + return '#27ae60'; + default: + return '#95a5a6'; + } + }}; +`; + +const FeedbackMeta = styled.div` + color: gray; + font-size: 14px; + margin-bottom: 8px; +`; + +const RatingIcon = styled.span` + margin-left: 8px; +`; + +export function Feedback() { + const connection = useContext(ServerConnectionContext); + const [feedbacks, setFeedbacks] = useState([]); + const [query, setQuery] = useState(''); + + const sock = useMemo( + () => (connection.connection ? new ServerApi(connection.connection) : null), + [connection], + ); + + useEffect(() => { + if (!sock) return; + + sock.onUpdateFeedbackData(data => { + setFeedbacks(data.feedbacks); + }); + + sock.requestFeedbackData(); + }, [sock]); + + const filtered = feedbacks.filter( + f => + f.text.toLowerCase().includes(query.toLowerCase()) || + (f.username ?? '').toLowerCase().includes(query.toLowerCase()) || + f.category.toLowerCase().includes(query.toLowerCase()), + ); + + const categoryLabel = (f: FeedbackDto) => { + if (f.rating === true && f.text === 'Liked this challenge') return 'Like'; + switch (f.category) { + case 'BUG_REPORT': + return 'Bug Report'; + case 'SUGGESTION': + return 'Suggestion'; + default: + return 'General'; + } + }; + + const categoryForBadge = (f: FeedbackDto) => { + if (f.rating === true && f.text === 'Liked this challenge') return 'LIKE'; + return f.category; + }; + + return ( + <> + + setQuery(e.target.value)} + /> + + {filtered.length === 0 ? ( + No feedback found + ) : ( + filtered.map(f => ( + + + + {categoryLabel(f)} + + {f.rating != null && ( + {f.rating ? '👍' : '👎'} + )} + + + {f.rating === true && f.text === 'Liked this challenge' + ? `${f.username ?? 'User'} liked this challenge` + : f.text} + + + {f.username ?? f.userId} ·{' '} + {new Date(f.createdAt).toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: 'numeric', + minute: '2-digit', + })} + {f.challengeName && <> · {f.challengeName}} + + + )) + )} + + ); +} diff --git a/admin/src/components/Journeys.tsx b/admin/src/components/Journeys.tsx index 63abbcba..09154e30 100644 --- a/admin/src/components/Journeys.tsx +++ b/admin/src/components/Journeys.tsx @@ -48,9 +48,13 @@ const categoryOptions = [ 'FOOD', 'NATURE', 'HISTORICAL', - 'CAFE', - 'DININGHALL', - 'DORM', + 'RESIDENTIAL', + 'LANDMARK', + 'ARTS', + 'ATHLETICS', + 'LIBRARY', + 'ACADEMIC', + 'RECREATION', ]; // Event form helpers diff --git a/admin/src/components/ServerApi.tsx b/admin/src/components/ServerApi.tsx index 41a66f25..cb57926f 100644 --- a/admin/src/components/ServerApi.tsx +++ b/admin/src/components/ServerApi.tsx @@ -55,6 +55,64 @@ export class ServerApi { return this.send('equipBearItem', data) as Promise; } + requestAllBearItems(data: dto.RequestAllBearItemsDto) { + return this.send('requestAllBearItems', data) as Promise< + number | undefined + >; + } + + updateBearItemData(data: dto.UpdateBearItemDataDto) { + return this.send('updateBearItemData', data) as Promise; + } + + requestCampusEvents(data: dto.RequestCampusEventsDto) { + return this.send('requestCampusEvents', data) as Promise< + number | undefined + >; + } + + requestCampusEventDetails(data: dto.RequestCampusEventDetailsDto) { + return this.send('requestCampusEventDetails', data) as Promise< + string | undefined + >; + } + + requestAllCampusEvents(data: dto.RequestCampusEventsDto) { + return this.send('requestAllCampusEvents', data) as Promise< + number | undefined + >; + } + + createCampusEvent(data: dto.UpsertCampusEventDto) { + return this.send('createCampusEvent', data) as Promise; + } + + updateCampusEvent(data: dto.UpsertCampusEventDto) { + return this.send('updateCampusEvent', data) as Promise; + } + + deleteCampusEvent(data: dto.DeleteCampusEventDto) { + return this.send('deleteCampusEvent', data) as Promise; + } + + rsvpCampusEvent(data: dto.RsvpCampusEventDto) { + return this.send('rsvpCampusEvent', data) as Promise; + } + + unRsvpCampusEvent(data: dto.UnRsvpCampusEventDto) { + return this.send('unRsvpCampusEvent', data) as Promise; + } + + requestAvailableChallenges(data: dto.RequestAvailableChallengesDto) { + return this.send('requestAvailableChallenges', data) as Promise< + any | undefined + >; + } + + setCurrentChallenge(data: dto.SetCurrentChallengeDto) { + return this.send('setCurrentChallenge', data) as Promise; + } + requestChallengeData(data: dto.RequestChallengeDataDto) { return this.send('requestChallengeData', data) as Promise< number | undefined @@ -71,6 +129,16 @@ export class ServerApi { >; } + checkInWithLocation(data: dto.LocationCheckInDto) { + return this.send('checkInWithLocation', data) as Promise< + boolean | undefined + >; + } + + checkInWithQrCode(data: dto.QrCodeCheckInDto) { + return this.send('checkInWithQrCode', data) as Promise; + } + requestEventData(data: dto.RequestEventDataDto) { return this.send('requestEventData', data) as Promise; } @@ -109,6 +177,22 @@ export class ServerApi { return this.send('updateEventData', data) as Promise; } + triggerEventSync(data: dto.TriggerEventSyncDto) { + return this.send('triggerEventSync', data) as Promise; + } + + requestEventSyncStatus() { + return this.send('requestEventSyncStatus', {}) as Promise; + } + + submitFeedback(data: dto.SubmitFeedbackDto) { + return this.send('submitFeedback', data) as Promise; + } + + requestFeedbackData() { + return this.send('requestFeedbackData', {}) as Promise; + } + requestGroupData(data: dto.RequestGroupDataDto) { return this.send('requestGroupData', data) as Promise; } @@ -137,6 +221,14 @@ export class ServerApi { return this.send('updateFcmToken', data) as Promise; } + sendNotification(data: dto.SendNotificationDto) { + return this.send('sendNotification', data) as Promise; + } + + removeFcmToken() { + return this.send('removeFcmToken', {}) as Promise; + } + requestOrganizationData(data: dto.RequestOrganizationDataDto) { return this.send('requestOrganizationData', data) as Promise< number | undefined @@ -314,6 +406,11 @@ export class ServerApi { this.socket.on('updateBearItemsData', data => callback(data)); } + onUpdateBearItemData(callback: (data: dto.UpdateBearItemDataDto) => void) { + this.socket.removeAllListeners('updateBearItemData'); + this.socket.on('updateBearItemData', data => callback(data)); + } + onUpdateUserInventoryData( callback: (data: dto.UpdateUserInventoryDataDto) => void, ) { @@ -386,4 +483,21 @@ export class ServerApi { this.socket.removeAllListeners('quizProgress'); this.socket.on('quizProgress', data => callback(data)); } + + onUpdateFeedbackData(callback: (data: dto.UpdateFeedbackDataDto) => void) { + this.socket.removeAllListeners('updateFeedbackData'); + this.socket.on('updateFeedbackData', data => callback(data)); + } + + onUpdateCampusEventData( + callback: (data: dto.UpdateCampusEventDataDto) => void, + ) { + this.socket.removeAllListeners('updateCampusEventData'); + this.socket.on('updateCampusEventData', data => callback(data)); + } + + onCampusEventList(callback: (data: dto.CampusEventListResponseDto) => void) { + this.socket.removeAllListeners('campusEventList'); + this.socket.on('campusEventList', data => callback(data)); + } } diff --git a/admin/src/components/ServerData.tsx b/admin/src/components/ServerData.tsx index daef87c3..077dd9eb 100644 --- a/admin/src/components/ServerData.tsx +++ b/admin/src/components/ServerData.tsx @@ -7,6 +7,7 @@ import { useState, } from 'react'; import { + AdminBearItemDto, ChallengeDto, UpdateErrorDto, EventDto, @@ -29,6 +30,7 @@ const defaultData = { users: new Map(), groups: new Map(), quizQuestions: new Map(), + bearItems: new Map(), selectedEvent: '' as string, selectedOrg: '' as string, errors: new Map(), @@ -93,6 +95,17 @@ const defaultData = { async requestQuizQuestions(challengeId: string): Promise { return undefined; }, + async updateBearItem( + bearItem: AdminBearItemDto, + ): Promise { + return undefined; + }, + async deleteBearItem(id: string): Promise { + return undefined; + }, + async requestAllBearItems(): Promise { + return undefined; + }, }; export const ServerDataContext = createContext(defaultData); @@ -206,6 +219,18 @@ export function ServerDataProvider(props: { children: ReactNode }) { requestQuizQuestions(challengeId: string) { return sock.requestQuizQuestions({ challengeId }); }, + updateBearItem(bearItem: AdminBearItemDto) { + return sock.updateBearItemData({ bearItem, deleted: false }); + }, + deleteBearItem(id: string) { + return sock.updateBearItemData({ + bearItem: { id }, + deleted: true, + }); + }, + requestAllBearItems() { + return sock.requestAllBearItems({}); + }, }), [sock], ); @@ -214,6 +239,7 @@ export function ServerDataProvider(props: { children: ReactNode }) { sock.send('requestOrganizationData', { admin: true }); sock.requestAllUserData({}); sock.requestGroupData({}); + sock.requestAllBearItems({}); }, [sock]); /** Update defaultData object when ServerApi websocket receives a response */ @@ -350,6 +376,20 @@ export function ServerDataProvider(props: { children: ReactNode }) { return { ...prev, quizQuestions: newQuizQuestions }; }); }); + sock.onUpdateBearItemData(data => { + setServerData(prev => { + const newBearItems = new Map(prev.bearItems); + if (data.deleted) { + newBearItems.delete(data.bearItem.id); + } else { + newBearItems.set( + (data.bearItem as AdminBearItemDto).id, + data.bearItem as AdminBearItemDto, + ); + } + return { ...prev, bearItems: newBearItems }; + }); + }); }, [sock]); if (!connection.connection) return <>{props.children}; diff --git a/game/android/build.gradle b/game/android/build.gradle index fb2577b7..2387ccac 100644 --- a/game/android/build.gradle +++ b/game/android/build.gradle @@ -34,19 +34,6 @@ subprojects { subproject -> subproject.evaluationDependsOn(':app') } -subprojects { project -> - def disableExtract = { - project.tasks.matching { it.name.contains('extractDebugAnnotations') }.configureEach { - enabled = false - } - } - try { - project.afterEvaluate(disableExtract) - } catch (Exception ignored) { - disableExtract() - } -} - tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/game/assets/buildabear/eyes/squinty_eyes.png b/game/assets/buildabear/eyes/squinty_eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..89d10de54155f89fecaa14bb22d1c1b101608168 GIT binary patch literal 1638 zcmbtU`!^E`93LggqsZA%>561Kv@Gm41!!R|djNv{cR;DL`HM@SZXk@1<<9j_5 zL}E|nyCaWK#?vU3*|dSOZQsKco4k^U)HU_07(TN6bJ@N?+!V)8^x>{d>MV)bSDmGk z^g&GgP^nW~iu8NSl37T_ZDZOtW14J@z_TyHD+RS7A`-+iFUc$KX-vR383-iG=W=wb z0tL3wM!vh?{LQMR(De{T37Z5#5QNqpSEZ8_PMiDqwf*Bi>ViIBcot;jQB1gIJ15Nr zK_!YQQ(~2)Tk&2@8f_kub?ntY6CXJtRlP3J&PW2LAkiYEpN_U&a)8H6p66wM3CoAk z7ySu;{~?3rXSlat`t-)@({RjoN6Y!-umX@ss>aZAuvwL^C7r!vt7ebgoDr@&4k~z$ z;@(=Vg?iPDkxDm8W=nJzQYS@A-qLfIkMe1pi{$%=UHr&40R-}URq*%KCMV5Qr14QFt zOFLty7cRID2N15Ud%c#IgZC{yA=Q-HVv*MU+l(h%j_y7Si;4(y)*Q7;cg*l^OD#Z0 zb`Vn;LGp-%S46k;=H})lyPHKIio$2D(QPq{LZNh(J15oD^}#i-BXHu05E8qJ5DPI}X?6#Vm{JZJ00`*c8JGY-o?dqrUg(8Ju_uGaa)h4$vV1 zJU}a{IQD#cxmm#tl+g)LZWr3%Bxs(WC5dGB-ZE;~3aJ3L3j`mM&Xt%Z79LxgVA$t~J&?o5=! zih30<0pVJK^R4@-xuR+;(#ia+rwqFUoH|^&aJE|KVHhzg?e08Rhmp-^F&D2FoPnp^ zE#V!L@|e8g@fz1LrP=h?>jyLCsZmC*iu^05+^6>D%(;skb}mINV+LZ{2o&7PT?Eo5O4-=R@?^5H-7{Oc>&DmiU0VCmJf&4=p6)%%wn^ zO4OTrGNgF$8m5m|Ht2X}{)d8m<9a-J+fco3AJonu!iPoi{Sq@VE~j`7JNvGAF?}O> zG3ReJ58T#O%`v}v*o>!`%W-}~82dg7eX=bnCT6nOyF>Pk89@)hfCWi~883lu;r2k6 zb<~ZqARb*H5SX}287iXsYJ&Gk)cZbbb+$AM-T__}%~;wgfa={vQj{>T8J%gaW^^yB znJj7}x-3n|F1WMkm{CuP9Ws(+3H@{}-@?4ZPpaTiZ6j~Cu$E*FnR3bfE28j)c5S%D zo`Jv=MmZGyqv7R@%{yKB(GRQSz(oeb;u8vZ z7WuK`x=W96y1zoi`aF2QUaI!#R1rG~Q`-8!`B^pN$4k=zjpd6t^vSx$Uuh^$e?MPI@OS>1 literal 0 HcmV?d00001 diff --git a/game/ios/Podfile.lock b/game/ios/Podfile.lock index 76700fce..cd48c01c 100644 --- a/game/ios/Podfile.lock +++ b/game/ios/Podfile.lock @@ -270,7 +270,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 - device_info_plus: 335f3ce08d2e174b9fdc3db3db0f4e3b1f66bd89 + device_info_plus: 71ffc6ab7634ade6267c7a93088ed7e4f74e5896 Firebase: d99ac19b909cd2c548339c2241ecd0d1599ab02e firebase_core: 995454a784ff288be5689b796deb9e9fa3601818 firebase_messaging: f4a41dd102ac18b840eba3f39d67e77922d3f707 diff --git a/game/lib/api/game_client_api.dart b/game/lib/api/game_client_api.dart index 99a14b22..890905c1 100644 --- a/game/lib/api/game_client_api.dart +++ b/game/lib/api/game_client_api.dart @@ -73,6 +73,11 @@ class GameClientApi { Stream get updateBearItemsDataStream => _updateBearItemsDataController.stream; + final _updateBearItemDataController = + StreamController.broadcast(sync: true); + Stream get updateBearItemDataStream => + _updateBearItemDataController.stream; + final _updateUserInventoryDataController = StreamController.broadcast(sync: true); Stream get updateUserInventoryDataStream => @@ -136,6 +141,21 @@ class GameClientApi { Stream get quizProgressStream => _quizProgressController.stream; + final _updateFeedbackDataController = + StreamController.broadcast(sync: true); + Stream get updateFeedbackDataStream => + _updateFeedbackDataController.stream; + + final _updateCampusEventDataController = + StreamController.broadcast(sync: true); + Stream get updateCampusEventDataStream => + _updateCampusEventDataController.stream; + + final _campusEventListController = + StreamController.broadcast(sync: true); + Stream get campusEventListStream => + _campusEventListController.stream; + final _reconnectedController = StreamController.broadcast(sync: true); Stream get reconnectedStream => _reconnectedController.stream; @@ -218,6 +238,11 @@ class GameClientApi { (data) => _updateBearItemsDataController .add(UpdateBearItemsDataDto.fromJson(data))); + sock.on( + "updateBearItemData", + (data) => _updateBearItemDataController + .add(UpdateBearItemDataDto.fromJson(data))); + sock.on( "updateUserInventoryData", (data) => _updateUserInventoryDataController @@ -271,6 +296,21 @@ class GameClientApi { sock.on("quizProgress", (data) => _quizProgressController.add(QuizProgressDto.fromJson(data))); + sock.on( + "updateFeedbackData", + (data) => _updateFeedbackDataController + .add(UpdateFeedbackDataDto.fromJson(data))); + + sock.on( + "updateCampusEventData", + (data) => _updateCampusEventDataController + .add(UpdateCampusEventDataDto.fromJson(data))); + + sock.on( + "campusEventList", + (data) => _campusEventListController + .add(CampusEventListResponseDto.fromJson(data))); + _connectedController.add(true); } diff --git a/game/lib/api/game_client_dto.dart b/game/lib/api/game_client_dto.dart index 572e9fa3..ae0a9ba7 100644 --- a/game/lib/api/game_client_dto.dart +++ b/game/lib/api/game_client_dto.dart @@ -29,6 +29,90 @@ enum BearSlotDto { ACCESSORY, } +enum CampusEventCategoryDto { + SOCIAL, + CULTURAL, + ATHLETIC, + WELLNESS, + ACADEMIC, + ARTS, + CAREER, + COMMUNITY, + OTHER, +} + +enum EventSourceDto { + API_EVENTS, + ADMIN_CREATED, + COMMUNITY_SUBMITTED, +} + +enum CheckInMethodDto { + LOCATION, + QR_CODE, + EITHER, +} + +enum CampusEventCategoriesDto { + SOCIAL, + CULTURAL, + ATHLETIC, + WELLNESS, + ACADEMIC, + ARTS, + CAREER, + COMMUNITY, + OTHER, +} + +enum CampusEventSourceDto { + API_EVENTS, + ADMIN_CREATED, + COMMUNITY_SUBMITTED, +} + +enum CampusEventCheckInMethodDto { + LOCATION, + QR_CODE, + EITHER, +} + +enum RequestCampusEventsCategoriesDto { + SOCIAL, + CULTURAL, + ATHLETIC, + WELLNESS, + ACADEMIC, + ARTS, + CAREER, + COMMUNITY, + OTHER, +} + +enum UpsertCampusEventCategoriesDto { + SOCIAL, + CULTURAL, + ATHLETIC, + WELLNESS, + ACADEMIC, + ARTS, + CAREER, + COMMUNITY, + OTHER, +} + +enum UpsertCampusEventSourceDto { + API_EVENTS, + ADMIN_CREATED, + COMMUNITY_SUBMITTED, +} + +enum UpsertCampusEventCheckInMethodDto { + LOCATION, + QR_CODE, + EITHER, +} + enum ChallengeLocationDto { ENG_QUAD, ARTS_QUAD, @@ -43,13 +127,45 @@ enum ChallengeLocationDto { ANY, } +enum CheckInResultCheckInMethodDto { + LOCATION, + QR_CODE, +} + +enum CheckInErrorCodeDto { + EVENT_NOT_FOUND, + EVENT_NOT_ACTIVE, + EVENT_NOT_APPROVED, + ALREADY_CHECKED_IN, + OUT_OF_RADIUS, + METHOD_NOT_ALLOWED, + INVALID_QR_CODE, + UNKNOWN_ERROR, +} + +enum ClubSubmissionCategoryDto { + SOCIAL, + CULTURAL, + ATHLETIC, + WELLNESS, + ACADEMIC, + ARTS, + CAREER, + COMMUNITY, + OTHER, +} + enum EventCategoryDto { FOOD, NATURE, HISTORICAL, - CAFE, - DININGHALL, - DORM, + RESIDENTIAL, + LANDMARK, + ARTS, + ATHLETICS, + LIBRARY, + ACADEMIC, + RECREATION, } enum EventTimeLimitationDto { @@ -63,6 +179,12 @@ enum EventDifficultyDto { Hard, } +enum FeedbackCategoryDto { + BUG_REPORT, + SUGGESTION, + GENERAL, +} + enum QuizErrorCodeDto { NO_QUESTIONS, ALREADY_ANSWERED, @@ -828,267 +950,1137 @@ class UpdatePurchaseResultDto { late String itemId; } -class CompletedChallengeDto { - Map toJson() { - Map fields = {}; - return fields; - } - - CompletedChallengeDto.fromJson(Map fields) {} - - void partialUpdate(CompletedChallengeDto other) {} - - CompletedChallengeDto(); -} - -class ChallengeDto { +class AdminBearItemDto { Map toJson() { Map fields = {}; fields['id'] = id; if (name != null) { fields['name'] = name; } - if (location != null) { - fields['location'] = location!.name; - } - if (description != null) { - fields['description'] = description; - } - if (points != null) { - fields['points'] = points; - } - if (imageUrl != null) { - fields['imageUrl'] = imageUrl; - } - if (latF != null) { - fields['latF'] = latF; + if (slot != null) { + fields['slot'] = slot!.name; } - if (longF != null) { - fields['longF'] = longF; + if (cost != null) { + fields['cost'] = cost; } - if (awardingRadiusF != null) { - fields['awardingRadiusF'] = awardingRadiusF; + if (assetKey != null) { + fields['assetKey'] = assetKey; } - if (closeRadiusF != null) { - fields['closeRadiusF'] = closeRadiusF; + if (mimeType != null) { + fields['mimeType'] = mimeType; } - if (linkedEventId != null) { - fields['linkedEventId'] = linkedEventId; + if (zIndex != null) { + fields['zIndex'] = zIndex; } - if (timerLength != null) { - fields['timerLength'] = timerLength; + if (isDefault != null) { + fields['isDefault'] = isDefault; } return fields; } - ChallengeDto.fromJson(Map fields) { + AdminBearItemDto.fromJson(Map fields) { id = fields["id"]; name = fields.containsKey('name') ? (fields["name"]) : null; - location = fields.containsKey('location') - ? (ChallengeLocationDto.values.byName(fields['location'])) - : null; - description = - fields.containsKey('description') ? (fields["description"]) : null; - points = fields.containsKey('points') ? (fields["points"]) : null; - imageUrl = fields.containsKey('imageUrl') ? (fields["imageUrl"]) : null; - latF = fields.containsKey('latF') ? (fields["latF"]!.toDouble()) : null; - longF = fields.containsKey('longF') ? (fields["longF"]!.toDouble()) : null; - awardingRadiusF = fields.containsKey('awardingRadiusF') - ? (fields["awardingRadiusF"]!.toDouble()) - : null; - closeRadiusF = fields.containsKey('closeRadiusF') - ? (fields["closeRadiusF"]!.toDouble()) + slot = fields.containsKey('slot') + ? (BearSlotDto.values.byName(fields['slot'])) : null; - linkedEventId = - fields.containsKey('linkedEventId') ? (fields["linkedEventId"]) : null; - timerLength = - fields.containsKey('timerLength') ? (fields["timerLength"]) : null; + cost = fields.containsKey('cost') ? (fields["cost"]) : null; + assetKey = fields.containsKey('assetKey') ? (fields["assetKey"]) : null; + mimeType = fields.containsKey('mimeType') ? (fields["mimeType"]) : null; + zIndex = fields.containsKey('zIndex') ? (fields["zIndex"]) : null; + isDefault = fields.containsKey('isDefault') ? (fields["isDefault"]) : null; } - void partialUpdate(ChallengeDto other) { + void partialUpdate(AdminBearItemDto other) { id = other.id; name = other.name == null ? name : other.name; - location = other.location == null ? location : other.location; - description = other.description == null ? description : other.description; - points = other.points == null ? points : other.points; - imageUrl = other.imageUrl == null ? imageUrl : other.imageUrl; - latF = other.latF == null ? latF : other.latF; - longF = other.longF == null ? longF : other.longF; - awardingRadiusF = - other.awardingRadiusF == null ? awardingRadiusF : other.awardingRadiusF; - closeRadiusF = - other.closeRadiusF == null ? closeRadiusF : other.closeRadiusF; - linkedEventId = - other.linkedEventId == null ? linkedEventId : other.linkedEventId; - timerLength = other.timerLength == null ? timerLength : other.timerLength; + slot = other.slot == null ? slot : other.slot; + cost = other.cost == null ? cost : other.cost; + assetKey = other.assetKey == null ? assetKey : other.assetKey; + mimeType = other.mimeType == null ? mimeType : other.mimeType; + zIndex = other.zIndex == null ? zIndex : other.zIndex; + isDefault = other.isDefault == null ? isDefault : other.isDefault; } - ChallengeDto({ + AdminBearItemDto({ required this.id, this.name, - this.location, - this.description, - this.points, - this.imageUrl, - this.latF, - this.longF, - this.awardingRadiusF, - this.closeRadiusF, - this.linkedEventId, - this.timerLength, + this.slot, + this.cost, + this.assetKey, + this.mimeType, + this.zIndex, + this.isDefault, }); late String id; late String? name; - late ChallengeLocationDto? location; - late String? description; - late int? points; - late String? imageUrl; - late double? latF; - late double? longF; - late double? awardingRadiusF; - late double? closeRadiusF; - late String? linkedEventId; - late int? timerLength; + late BearSlotDto? slot; + late int? cost; + late String? assetKey; + late String? mimeType; + late int? zIndex; + late bool? isDefault; } -class RequestChallengeDataDto { +class UpdateBearItemDataDto { Map toJson() { Map fields = {}; - fields['challenges'] = challenges; + fields['bearItem'] = bearItem!.toJson(); + fields['deleted'] = deleted; return fields; } - RequestChallengeDataDto.fromJson(Map fields) { - challenges = List.from(fields['challenges']); + UpdateBearItemDataDto.fromJson(Map fields) { + bearItem = AdminBearItemDto.fromJson(fields['bearItem']); + deleted = fields["deleted"]; } - void partialUpdate(RequestChallengeDataDto other) { - challenges = other.challenges; + void partialUpdate(UpdateBearItemDataDto other) { + bearItem = other.bearItem; + deleted = other.deleted; } - RequestChallengeDataDto({ - required this.challenges, + UpdateBearItemDataDto({ + required this.bearItem, + required this.deleted, }); - late List challenges; + late AdminBearItemDto bearItem; + late bool deleted; } -class UpdateChallengeDataDto { +class RequestAllBearItemsDto { Map toJson() { Map fields = {}; - fields['challenge'] = challenge!.toJson(); - fields['deleted'] = deleted; return fields; } - UpdateChallengeDataDto.fromJson(Map fields) { - challenge = ChallengeDto.fromJson(fields['challenge']); - deleted = fields["deleted"]; - } - - void partialUpdate(UpdateChallengeDataDto other) { - challenge = other.challenge; - deleted = other.deleted; - } + RequestAllBearItemsDto.fromJson(Map fields) {} - UpdateChallengeDataDto({ - required this.challenge, - required this.deleted, - }); + void partialUpdate(RequestAllBearItemsDto other) {} - late ChallengeDto challenge; - late bool deleted; + RequestAllBearItemsDto(); } -class RequestEventTrackerDataDto { +class CampusEventDto { Map toJson() { Map fields = {}; - fields['trackedEvents'] = trackedEvents; + fields['id'] = id; + fields['title'] = title; + fields['description'] = description; + if (imageUrl != null) { + fields['imageUrl'] = imageUrl; + } + fields['startTime'] = startTime; + fields['endTime'] = endTime; + fields['allDay'] = allDay; + fields['locationName'] = locationName; + if (address != null) { + fields['address'] = address; + } + fields['latitude'] = latitude; + fields['longitude'] = longitude; + fields['categories'] = + categories!.map((dynamic val) => val!.name).toList(); + fields['tags'] = tags; + fields['source'] = source!.name; + if (externalUrl != null) { + fields['externalUrl'] = externalUrl; + } + if (organizerName != null) { + fields['organizerName'] = organizerName; + } + if (registrationUrl != null) { + fields['registrationUrl'] = registrationUrl; + } + fields['checkInMethod'] = checkInMethod!.name; + fields['pointsForAttendance'] = pointsForAttendance; + fields['featured'] = featured; + fields['attendanceCount'] = attendanceCount; + fields['rsvpCount'] = rsvpCount; return fields; } - RequestEventTrackerDataDto.fromJson(Map fields) { - trackedEvents = List.from(fields['trackedEvents']); - } - - void partialUpdate(RequestEventTrackerDataDto other) { - trackedEvents = other.trackedEvents; + CampusEventDto.fromJson(Map fields) { + id = fields["id"]; + title = fields["title"]; + description = fields["description"]; + imageUrl = fields.containsKey('imageUrl') ? (fields["imageUrl"]) : null; + startTime = fields["startTime"]; + endTime = fields["endTime"]; + allDay = fields["allDay"]; + locationName = fields["locationName"]; + address = fields.containsKey('address') ? (fields["address"]) : null; + latitude = fields["latitude"]; + longitude = fields["longitude"]; + categories = fields["categories"] + .map( + (dynamic val) => CampusEventCategoriesDto.values.byName(val)) + .toList(); + tags = List.from(fields['tags']); + source = CampusEventSourceDto.values.byName(fields['source']); + externalUrl = + fields.containsKey('externalUrl') ? (fields["externalUrl"]) : null; + organizerName = + fields.containsKey('organizerName') ? (fields["organizerName"]) : null; + registrationUrl = fields.containsKey('registrationUrl') + ? (fields["registrationUrl"]) + : null; + checkInMethod = + CampusEventCheckInMethodDto.values.byName(fields['checkInMethod']); + pointsForAttendance = fields["pointsForAttendance"]; + featured = fields["featured"]; + attendanceCount = fields["attendanceCount"]; + rsvpCount = fields["rsvpCount"]; } - RequestEventTrackerDataDto({ - required this.trackedEvents, + void partialUpdate(CampusEventDto other) { + id = other.id; + title = other.title; + description = other.description; + imageUrl = other.imageUrl == null ? imageUrl : other.imageUrl; + startTime = other.startTime; + endTime = other.endTime; + allDay = other.allDay; + locationName = other.locationName; + address = other.address == null ? address : other.address; + latitude = other.latitude; + longitude = other.longitude; + categories = other.categories; + tags = other.tags; + source = other.source; + externalUrl = other.externalUrl == null ? externalUrl : other.externalUrl; + organizerName = + other.organizerName == null ? organizerName : other.organizerName; + registrationUrl = + other.registrationUrl == null ? registrationUrl : other.registrationUrl; + checkInMethod = other.checkInMethod; + pointsForAttendance = other.pointsForAttendance; + featured = other.featured; + attendanceCount = other.attendanceCount; + rsvpCount = other.rsvpCount; + } + + CampusEventDto({ + required this.id, + required this.title, + required this.description, + this.imageUrl, + required this.startTime, + required this.endTime, + required this.allDay, + required this.locationName, + this.address, + required this.latitude, + required this.longitude, + required this.categories, + required this.tags, + required this.source, + this.externalUrl, + this.organizerName, + this.registrationUrl, + required this.checkInMethod, + required this.pointsForAttendance, + required this.featured, + required this.attendanceCount, + required this.rsvpCount, }); - late List trackedEvents; + late String id; + late String title; + late String description; + late String? imageUrl; + late String startTime; + late String endTime; + late bool allDay; + late String locationName; + late String? address; + late int latitude; + late int longitude; + late List categories; + late List tags; + late CampusEventSourceDto source; + late String? externalUrl; + late String? organizerName; + late String? registrationUrl; + late CampusEventCheckInMethodDto checkInMethod; + late int pointsForAttendance; + late bool featured; + late int attendanceCount; + late int rsvpCount; } -class SetCurrentChallengeDto { +class RequestCampusEventsDto { Map toJson() { Map fields = {}; - fields['challengeId'] = challengeId; + fields['page'] = page; + fields['limit'] = limit; + if (dateFrom != null) { + fields['dateFrom'] = dateFrom; + } + if (dateTo != null) { + fields['dateTo'] = dateTo; + } + if (categories != null) { + fields['categories'] = + categories!.map((dynamic val) => val!.name).toList(); + } + if (search != null) { + fields['search'] = search; + } + if (featured != null) { + fields['featured'] = featured; + } return fields; } - SetCurrentChallengeDto.fromJson(Map fields) { - challengeId = fields["challengeId"]; + RequestCampusEventsDto.fromJson(Map fields) { + page = fields["page"]; + limit = fields["limit"]; + dateFrom = fields.containsKey('dateFrom') ? (fields["dateFrom"]) : null; + dateTo = fields.containsKey('dateTo') ? (fields["dateTo"]) : null; + categories = fields.containsKey('categories') + ? (fields["categories"] + .map((dynamic val) => + RequestCampusEventsCategoriesDto.values.byName(val)) + .toList()) + : null; + search = fields.containsKey('search') ? (fields["search"]) : null; + featured = fields.containsKey('featured') ? (fields["featured"]) : null; } - void partialUpdate(SetCurrentChallengeDto other) { - challengeId = other.challengeId; + void partialUpdate(RequestCampusEventsDto other) { + page = other.page; + limit = other.limit; + dateFrom = other.dateFrom == null ? dateFrom : other.dateFrom; + dateTo = other.dateTo == null ? dateTo : other.dateTo; + categories = other.categories == null ? categories : other.categories; + search = other.search == null ? search : other.search; + featured = other.featured == null ? featured : other.featured; } - SetCurrentChallengeDto({ - required this.challengeId, + RequestCampusEventsDto({ + required this.page, + required this.limit, + this.dateFrom, + this.dateTo, + this.categories, + this.search, + this.featured, }); - late String challengeId; + late int page; + late int limit; + late String? dateFrom; + late String? dateTo; + late List? categories; + late String? search; + late bool? featured; } -class RequestAvailableChallengesDto { +class CampusEventListDto { Map toJson() { Map fields = {}; + fields['events'] = events! + .map>((dynamic val) => val!.toJson()) + .toList(); + fields['total'] = total; + fields['page'] = page; + fields['limit'] = limit; + fields['totalPages'] = totalPages; return fields; } - RequestAvailableChallengesDto.fromJson(Map fields) {} - - void partialUpdate(RequestAvailableChallengesDto other) {} + CampusEventListDto.fromJson(Map fields) { + events = fields["events"] + .map((dynamic val) => CampusEventDto.fromJson(val)) + .toList(); + total = fields["total"]; + page = fields["page"]; + limit = fields["limit"]; + totalPages = fields["totalPages"]; + } + + void partialUpdate(CampusEventListDto other) { + events = other.events; + total = other.total; + page = other.page; + limit = other.limit; + totalPages = other.totalPages; + } + + CampusEventListDto({ + required this.events, + required this.total, + required this.page, + required this.limit, + required this.totalPages, + }); - RequestAvailableChallengesDto(); + late List events; + late int total; + late int page; + late int limit; + late int totalPages; } -class AvailableChallengesResponseDto { +class RequestCampusEventDetailsDto { Map toJson() { Map fields = {}; - fields['challenges'] = challenges! - .map>((dynamic val) => val!.toJson()) - .toList(); + fields['eventId'] = eventId; return fields; } - AvailableChallengesResponseDto.fromJson(Map fields) { - challenges = fields["challenges"] - .map((dynamic val) => ChallengeDto.fromJson(val)) - .toList(); + RequestCampusEventDetailsDto.fromJson(Map fields) { + eventId = fields["eventId"]; } - void partialUpdate(AvailableChallengesResponseDto other) { - challenges = other.challenges; + void partialUpdate(RequestCampusEventDetailsDto other) { + eventId = other.eventId; } - AvailableChallengesResponseDto({ - required this.challenges, + RequestCampusEventDetailsDto({ + required this.eventId, }); - late List challenges; + late String eventId; } -class UpdateErrorDto { +class UpsertCampusEventDto { Map toJson() { Map fields = {}; - fields['id'] = id; - fields['message'] = message; + if (id != null) { + fields['id'] = id; + } + fields['title'] = title; + fields['description'] = description; + if (imageUrl != null) { + fields['imageUrl'] = imageUrl; + } + fields['startTime'] = startTime; + fields['endTime'] = endTime; + if (allDay != null) { + fields['allDay'] = allDay; + } + fields['locationName'] = locationName; + if (address != null) { + fields['address'] = address; + } + fields['latitude'] = latitude; + fields['longitude'] = longitude; + if (checkInRadius != null) { + fields['checkInRadius'] = checkInRadius; + } + fields['categories'] = + categories!.map((dynamic val) => val!.name).toList(); + fields['tags'] = tags; + fields['source'] = source!.name; + if (externalId != null) { + fields['externalId'] = externalId; + } + if (externalUrl != null) { + fields['externalUrl'] = externalUrl; + } + if (organizerName != null) { + fields['organizerName'] = organizerName; + } + if (organizerEmail != null) { + fields['organizerEmail'] = organizerEmail; + } + if (organizerId != null) { + fields['organizerId'] = organizerId; + } + if (checkInMethod != null) { + fields['checkInMethod'] = checkInMethod!.name; + } + if (pointsForAttendance != null) { + fields['pointsForAttendance'] = pointsForAttendance; + } + if (featured != null) { + fields['featured'] = featured; + } + if (registrationUrl != null) { + fields['registrationUrl'] = registrationUrl; + } + return fields; + } + + UpsertCampusEventDto.fromJson(Map fields) { + id = fields.containsKey('id') ? (fields["id"]) : null; + title = fields["title"]; + description = fields["description"]; + imageUrl = fields.containsKey('imageUrl') ? (fields["imageUrl"]) : null; + startTime = fields["startTime"]; + endTime = fields["endTime"]; + allDay = fields.containsKey('allDay') ? (fields["allDay"]) : null; + locationName = fields["locationName"]; + address = fields.containsKey('address') ? (fields["address"]) : null; + latitude = fields["latitude"]; + longitude = fields["longitude"]; + checkInRadius = + fields.containsKey('checkInRadius') ? (fields["checkInRadius"]) : null; + categories = fields["categories"] + .map( + (dynamic val) => UpsertCampusEventCategoriesDto.values.byName(val)) + .toList(); + tags = List.from(fields['tags']); + source = UpsertCampusEventSourceDto.values.byName(fields['source']); + externalId = + fields.containsKey('externalId') ? (fields["externalId"]) : null; + externalUrl = + fields.containsKey('externalUrl') ? (fields["externalUrl"]) : null; + organizerName = + fields.containsKey('organizerName') ? (fields["organizerName"]) : null; + organizerEmail = fields.containsKey('organizerEmail') + ? (fields["organizerEmail"]) + : null; + organizerId = + fields.containsKey('organizerId') ? (fields["organizerId"]) : null; + checkInMethod = fields.containsKey('checkInMethod') + ? (UpsertCampusEventCheckInMethodDto.values + .byName(fields['checkInMethod'])) + : null; + pointsForAttendance = fields.containsKey('pointsForAttendance') + ? (fields["pointsForAttendance"]) + : null; + featured = fields.containsKey('featured') ? (fields["featured"]) : null; + registrationUrl = fields.containsKey('registrationUrl') + ? (fields["registrationUrl"]) + : null; + } + + void partialUpdate(UpsertCampusEventDto other) { + id = other.id == null ? id : other.id; + title = other.title; + description = other.description; + imageUrl = other.imageUrl == null ? imageUrl : other.imageUrl; + startTime = other.startTime; + endTime = other.endTime; + allDay = other.allDay == null ? allDay : other.allDay; + locationName = other.locationName; + address = other.address == null ? address : other.address; + latitude = other.latitude; + longitude = other.longitude; + checkInRadius = + other.checkInRadius == null ? checkInRadius : other.checkInRadius; + categories = other.categories; + tags = other.tags; + source = other.source; + externalId = other.externalId == null ? externalId : other.externalId; + externalUrl = other.externalUrl == null ? externalUrl : other.externalUrl; + organizerName = + other.organizerName == null ? organizerName : other.organizerName; + organizerEmail = + other.organizerEmail == null ? organizerEmail : other.organizerEmail; + organizerId = other.organizerId == null ? organizerId : other.organizerId; + checkInMethod = + other.checkInMethod == null ? checkInMethod : other.checkInMethod; + pointsForAttendance = other.pointsForAttendance == null + ? pointsForAttendance + : other.pointsForAttendance; + featured = other.featured == null ? featured : other.featured; + registrationUrl = + other.registrationUrl == null ? registrationUrl : other.registrationUrl; + } + + UpsertCampusEventDto({ + this.id, + required this.title, + required this.description, + this.imageUrl, + required this.startTime, + required this.endTime, + this.allDay, + required this.locationName, + this.address, + required this.latitude, + required this.longitude, + this.checkInRadius, + required this.categories, + required this.tags, + required this.source, + this.externalId, + this.externalUrl, + this.organizerName, + this.organizerEmail, + this.organizerId, + this.checkInMethod, + this.pointsForAttendance, + this.featured, + this.registrationUrl, + }); + + late String? id; + late String title; + late String description; + late String? imageUrl; + late String startTime; + late String endTime; + late bool? allDay; + late String locationName; + late String? address; + late int latitude; + late int longitude; + late int? checkInRadius; + late List categories; + late List tags; + late UpsertCampusEventSourceDto source; + late String? externalId; + late String? externalUrl; + late String? organizerName; + late String? organizerEmail; + late String? organizerId; + late UpsertCampusEventCheckInMethodDto? checkInMethod; + late int? pointsForAttendance; + late bool? featured; + late String? registrationUrl; +} + +class DeleteCampusEventDto { + Map toJson() { + Map fields = {}; + fields['eventId'] = eventId; + return fields; + } + + DeleteCampusEventDto.fromJson(Map fields) { + eventId = fields["eventId"]; + } + + void partialUpdate(DeleteCampusEventDto other) { + eventId = other.eventId; + } + + DeleteCampusEventDto({ + required this.eventId, + }); + + late String eventId; +} + +class RsvpCampusEventDto { + Map toJson() { + Map fields = {}; + fields['eventId'] = eventId; + return fields; + } + + RsvpCampusEventDto.fromJson(Map fields) { + eventId = fields["eventId"]; + } + + void partialUpdate(RsvpCampusEventDto other) { + eventId = other.eventId; + } + + RsvpCampusEventDto({ + required this.eventId, + }); + + late String eventId; +} + +class UnRsvpCampusEventDto { + Map toJson() { + Map fields = {}; + fields['eventId'] = eventId; + return fields; + } + + UnRsvpCampusEventDto.fromJson(Map fields) { + eventId = fields["eventId"]; + } + + void partialUpdate(UnRsvpCampusEventDto other) { + eventId = other.eventId; + } + + UnRsvpCampusEventDto({ + required this.eventId, + }); + + late String eventId; +} + +class UpdateCampusEventDataDto { + Map toJson() { + Map fields = {}; + fields['event'] = event!.toJson(); + fields['deleted'] = deleted; + return fields; + } + + UpdateCampusEventDataDto.fromJson(Map fields) { + event = CampusEventDto.fromJson(fields['event']); + deleted = fields["deleted"]; + } + + void partialUpdate(UpdateCampusEventDataDto other) { + event = other.event; + deleted = other.deleted; + } + + UpdateCampusEventDataDto({ + required this.event, + required this.deleted, + }); + + late CampusEventDto event; + late bool deleted; +} + +class CampusEventListResponseDto { + Map toJson() { + Map fields = {}; + fields['list'] = list!.toJson(); + return fields; + } + + CampusEventListResponseDto.fromJson(Map fields) { + list = CampusEventListDto.fromJson(fields['list']); + } + + void partialUpdate(CampusEventListResponseDto other) { + list = other.list; + } + + CampusEventListResponseDto({ + required this.list, + }); + + late CampusEventListDto list; +} + +class CompletedChallengeDto { + Map toJson() { + Map fields = {}; + return fields; + } + + CompletedChallengeDto.fromJson(Map fields) {} + + void partialUpdate(CompletedChallengeDto other) {} + + CompletedChallengeDto(); +} + +class ChallengeDto { + Map toJson() { + Map fields = {}; + fields['id'] = id; + if (name != null) { + fields['name'] = name; + } + if (location != null) { + fields['location'] = location!.name; + } + if (description != null) { + fields['description'] = description; + } + if (points != null) { + fields['points'] = points; + } + if (imageUrl != null) { + fields['imageUrl'] = imageUrl; + } + if (latF != null) { + fields['latF'] = latF; + } + if (longF != null) { + fields['longF'] = longF; + } + if (awardingRadiusF != null) { + fields['awardingRadiusF'] = awardingRadiusF; + } + if (closeRadiusF != null) { + fields['closeRadiusF'] = closeRadiusF; + } + if (linkedEventId != null) { + fields['linkedEventId'] = linkedEventId; + } + if (timerLength != null) { + fields['timerLength'] = timerLength; + } + if (scheduledStartTime != null) { + fields['scheduledStartTime'] = scheduledStartTime; + } + if (scheduledEndTime != null) { + fields['scheduledEndTime'] = scheduledEndTime; + } + return fields; + } + + ChallengeDto.fromJson(Map fields) { + id = fields["id"]; + name = fields.containsKey('name') ? (fields["name"]) : null; + location = fields.containsKey('location') + ? (ChallengeLocationDto.values.byName(fields['location'])) + : null; + description = + fields.containsKey('description') ? (fields["description"]) : null; + points = fields.containsKey('points') ? (fields["points"]) : null; + imageUrl = fields.containsKey('imageUrl') ? (fields["imageUrl"]) : null; + latF = fields.containsKey('latF') ? (fields["latF"]!.toDouble()) : null; + longF = fields.containsKey('longF') ? (fields["longF"]!.toDouble()) : null; + awardingRadiusF = fields.containsKey('awardingRadiusF') + ? (fields["awardingRadiusF"]!.toDouble()) + : null; + closeRadiusF = fields.containsKey('closeRadiusF') + ? (fields["closeRadiusF"]!.toDouble()) + : null; + linkedEventId = + fields.containsKey('linkedEventId') ? (fields["linkedEventId"]) : null; + timerLength = + fields.containsKey('timerLength') ? (fields["timerLength"]) : null; + scheduledStartTime = fields.containsKey('scheduledStartTime') + ? (fields["scheduledStartTime"]) + : null; + scheduledEndTime = fields.containsKey('scheduledEndTime') + ? (fields["scheduledEndTime"]) + : null; + } + + void partialUpdate(ChallengeDto other) { + id = other.id; + name = other.name == null ? name : other.name; + location = other.location == null ? location : other.location; + description = other.description == null ? description : other.description; + points = other.points == null ? points : other.points; + imageUrl = other.imageUrl == null ? imageUrl : other.imageUrl; + latF = other.latF == null ? latF : other.latF; + longF = other.longF == null ? longF : other.longF; + awardingRadiusF = + other.awardingRadiusF == null ? awardingRadiusF : other.awardingRadiusF; + closeRadiusF = + other.closeRadiusF == null ? closeRadiusF : other.closeRadiusF; + linkedEventId = + other.linkedEventId == null ? linkedEventId : other.linkedEventId; + timerLength = other.timerLength == null ? timerLength : other.timerLength; + scheduledStartTime = other.scheduledStartTime == null + ? scheduledStartTime + : other.scheduledStartTime; + scheduledEndTime = other.scheduledEndTime == null + ? scheduledEndTime + : other.scheduledEndTime; + } + + ChallengeDto({ + required this.id, + this.name, + this.location, + this.description, + this.points, + this.imageUrl, + this.latF, + this.longF, + this.awardingRadiusF, + this.closeRadiusF, + this.linkedEventId, + this.timerLength, + this.scheduledStartTime, + this.scheduledEndTime, + }); + + late String id; + late String? name; + late ChallengeLocationDto? location; + late String? description; + late int? points; + late String? imageUrl; + late double? latF; + late double? longF; + late double? awardingRadiusF; + late double? closeRadiusF; + late String? linkedEventId; + late int? timerLength; + late String? scheduledStartTime; + late String? scheduledEndTime; +} + +class RequestChallengeDataDto { + Map toJson() { + Map fields = {}; + fields['challenges'] = challenges; + return fields; + } + + RequestChallengeDataDto.fromJson(Map fields) { + challenges = List.from(fields['challenges']); + } + + void partialUpdate(RequestChallengeDataDto other) { + challenges = other.challenges; + } + + RequestChallengeDataDto({ + required this.challenges, + }); + + late List challenges; +} + +class UpdateChallengeDataDto { + Map toJson() { + Map fields = {}; + fields['challenge'] = challenge!.toJson(); + fields['deleted'] = deleted; + return fields; + } + + UpdateChallengeDataDto.fromJson(Map fields) { + challenge = ChallengeDto.fromJson(fields['challenge']); + deleted = fields["deleted"]; + } + + void partialUpdate(UpdateChallengeDataDto other) { + challenge = other.challenge; + deleted = other.deleted; + } + + UpdateChallengeDataDto({ + required this.challenge, + required this.deleted, + }); + + late ChallengeDto challenge; + late bool deleted; +} + +class RequestEventTrackerDataDto { + Map toJson() { + Map fields = {}; + fields['trackedEvents'] = trackedEvents; + return fields; + } + + RequestEventTrackerDataDto.fromJson(Map fields) { + trackedEvents = List.from(fields['trackedEvents']); + } + + void partialUpdate(RequestEventTrackerDataDto other) { + trackedEvents = other.trackedEvents; + } + + RequestEventTrackerDataDto({ + required this.trackedEvents, + }); + + late List trackedEvents; +} + +class SetCurrentChallengeDto { + Map toJson() { + Map fields = {}; + fields['challengeId'] = challengeId; + return fields; + } + + SetCurrentChallengeDto.fromJson(Map fields) { + challengeId = fields["challengeId"]; + } + + void partialUpdate(SetCurrentChallengeDto other) { + challengeId = other.challengeId; + } + + SetCurrentChallengeDto({ + required this.challengeId, + }); + + late String challengeId; +} + +class RequestAvailableChallengesDto { + Map toJson() { + Map fields = {}; + return fields; + } + + RequestAvailableChallengesDto.fromJson(Map fields) {} + + void partialUpdate(RequestAvailableChallengesDto other) {} + + RequestAvailableChallengesDto(); +} + +class AvailableChallengesResponseDto { + Map toJson() { + Map fields = {}; + fields['challenges'] = challenges! + .map>((dynamic val) => val!.toJson()) + .toList(); + return fields; + } + + AvailableChallengesResponseDto.fromJson(Map fields) { + challenges = fields["challenges"] + .map((dynamic val) => ChallengeDto.fromJson(val)) + .toList(); + } + + void partialUpdate(AvailableChallengesResponseDto other) { + challenges = other.challenges; + } + + AvailableChallengesResponseDto({ + required this.challenges, + }); + + late List challenges; +} + +class LocationCheckInDto { + Map toJson() { + Map fields = {}; + fields['campusEventId'] = campusEventId; + fields['latitude'] = latitude; + fields['longitude'] = longitude; + return fields; + } + + LocationCheckInDto.fromJson(Map fields) { + campusEventId = fields["campusEventId"]; + latitude = fields["latitude"]; + longitude = fields["longitude"]; + } + + void partialUpdate(LocationCheckInDto other) { + campusEventId = other.campusEventId; + latitude = other.latitude; + longitude = other.longitude; + } + + LocationCheckInDto({ + required this.campusEventId, + required this.latitude, + required this.longitude, + }); + + late String campusEventId; + late int latitude; + late int longitude; +} + +class QrCodeCheckInDto { + Map toJson() { + Map fields = {}; + fields['qrCode'] = qrCode; + return fields; + } + + QrCodeCheckInDto.fromJson(Map fields) { + qrCode = fields["qrCode"]; + } + + void partialUpdate(QrCodeCheckInDto other) { + qrCode = other.qrCode; + } + + QrCodeCheckInDto({ + required this.qrCode, + }); + + late String qrCode; +} + +class GenerateQrCodeDto { + Map toJson() { + Map fields = {}; + fields['campusEventId'] = campusEventId; + return fields; + } + + GenerateQrCodeDto.fromJson(Map fields) { + campusEventId = fields["campusEventId"]; + } + + void partialUpdate(GenerateQrCodeDto other) { + campusEventId = other.campusEventId; + } + + GenerateQrCodeDto({ + required this.campusEventId, + }); + + late String campusEventId; +} + +class CheckInResultDto { + Map toJson() { + Map fields = {}; + fields['attendanceId'] = attendanceId; + fields['campusEventId'] = campusEventId; + fields['checkInMethod'] = checkInMethod!.name; + fields['pointsAwarded'] = pointsAwarded; + fields['newTotalScore'] = newTotalScore; + return fields; + } + + CheckInResultDto.fromJson(Map fields) { + attendanceId = fields["attendanceId"]; + campusEventId = fields["campusEventId"]; + checkInMethod = + CheckInResultCheckInMethodDto.values.byName(fields['checkInMethod']); + pointsAwarded = fields["pointsAwarded"]; + newTotalScore = fields["newTotalScore"]; + } + + void partialUpdate(CheckInResultDto other) { + attendanceId = other.attendanceId; + campusEventId = other.campusEventId; + checkInMethod = other.checkInMethod; + pointsAwarded = other.pointsAwarded; + newTotalScore = other.newTotalScore; + } + + CheckInResultDto({ + required this.attendanceId, + required this.campusEventId, + required this.checkInMethod, + required this.pointsAwarded, + required this.newTotalScore, + }); + + late String attendanceId; + late String campusEventId; + late CheckInResultCheckInMethodDto checkInMethod; + late int pointsAwarded; + late int newTotalScore; +} + +class CheckInErrorDto { + Map toJson() { + Map fields = {}; + fields['message'] = message; + fields['code'] = code!.name; + return fields; + } + + CheckInErrorDto.fromJson(Map fields) { + message = fields["message"]; + code = CheckInErrorCodeDto.values.byName(fields['code']); + } + + void partialUpdate(CheckInErrorDto other) { + message = other.message; + code = other.code; + } + + CheckInErrorDto({ + required this.message, + required this.code, + }); + + late String message; + late CheckInErrorCodeDto code; +} + +class UpdateErrorDto { + Map toJson() { + Map fields = {}; + fields['id'] = id; + fields['message'] = message; return fields; } @@ -1111,6 +2103,102 @@ class UpdateErrorDto { late String message; } +class ClubSubmissionDto { + Map toJson() { + Map fields = {}; + fields['clubName'] = clubName; + fields['contactEmail'] = contactEmail; + fields['eventTitle'] = eventTitle; + fields['description'] = description; + fields['startTime'] = startTime; + fields['endTime'] = endTime; + fields['location'] = location; + if (latitude != null) { + fields['latitude'] = latitude; + } + if (longitude != null) { + fields['longitude'] = longitude; + } + fields['category'] = category!.name; + if (address != null) { + fields['address'] = address; + } + if (imageUrl != null) { + fields['imageUrl'] = imageUrl; + } + if (registrationLink != null) { + fields['registrationLink'] = registrationLink; + } + return fields; + } + + ClubSubmissionDto.fromJson(Map fields) { + clubName = fields["clubName"]; + contactEmail = fields["contactEmail"]; + eventTitle = fields["eventTitle"]; + description = fields["description"]; + startTime = fields["startTime"]; + endTime = fields["endTime"]; + location = fields["location"]; + latitude = fields.containsKey('latitude') ? (fields["latitude"]) : null; + longitude = fields.containsKey('longitude') ? (fields["longitude"]) : null; + category = ClubSubmissionCategoryDto.values.byName(fields['category']); + address = fields.containsKey('address') ? (fields["address"]) : null; + imageUrl = fields.containsKey('imageUrl') ? (fields["imageUrl"]) : null; + registrationLink = fields.containsKey('registrationLink') + ? (fields["registrationLink"]) + : null; + } + + void partialUpdate(ClubSubmissionDto other) { + clubName = other.clubName; + contactEmail = other.contactEmail; + eventTitle = other.eventTitle; + description = other.description; + startTime = other.startTime; + endTime = other.endTime; + location = other.location; + latitude = other.latitude == null ? latitude : other.latitude; + longitude = other.longitude == null ? longitude : other.longitude; + category = other.category; + address = other.address == null ? address : other.address; + imageUrl = other.imageUrl == null ? imageUrl : other.imageUrl; + registrationLink = other.registrationLink == null + ? registrationLink + : other.registrationLink; + } + + ClubSubmissionDto({ + required this.clubName, + required this.contactEmail, + required this.eventTitle, + required this.description, + required this.startTime, + required this.endTime, + required this.location, + this.latitude, + this.longitude, + required this.category, + this.address, + this.imageUrl, + this.registrationLink, + }); + + late String clubName; + late String contactEmail; + late String eventTitle; + late String description; + late String startTime; + late String endTime; + late String location; + late int? latitude; + late int? longitude; + late ClubSubmissionCategoryDto category; + late String? address; + late String? imageUrl; + late String? registrationLink; +} + class RequestFilteredEventsDto { Map toJson() { Map fields = {}; @@ -1522,6 +2610,9 @@ class PrevChallengeDto { if (failed != null) { fields['failed'] = failed; } + if (dateExpired != null) { + fields['dateExpired'] = dateExpired; + } return fields; } @@ -1533,6 +2624,8 @@ class PrevChallengeDto { : null; dateCompleted = fields["dateCompleted"]; failed = fields.containsKey('failed') ? (fields["failed"]) : null; + dateExpired = + fields.containsKey('dateExpired') ? (fields["dateExpired"]) : null; } void partialUpdate(PrevChallengeDto other) { @@ -1542,6 +2635,7 @@ class PrevChallengeDto { other.extensionsUsed == null ? extensionsUsed : other.extensionsUsed; dateCompleted = other.dateCompleted; failed = other.failed == null ? failed : other.failed; + dateExpired = other.dateExpired == null ? dateExpired : other.dateExpired; } PrevChallengeDto({ @@ -1550,6 +2644,7 @@ class PrevChallengeDto { this.extensionsUsed, required this.dateCompleted, this.failed, + this.dateExpired, }); late String challengeId; @@ -1557,6 +2652,7 @@ class PrevChallengeDto { late int? extensionsUsed; late String dateCompleted; late bool? failed; + late bool? dateExpired; } class EventTrackerDto { @@ -1672,6 +2768,253 @@ class UseEventTrackerHintDto { UseEventTrackerHintDto(); } +class TriggerEventSyncDto { + Map toJson() { + Map fields = {}; + if (days != null) { + fields['days'] = days; + } + return fields; + } + + TriggerEventSyncDto.fromJson(Map fields) { + days = fields.containsKey('days') ? (fields["days"]) : null; + } + + void partialUpdate(TriggerEventSyncDto other) { + days = other.days == null ? days : other.days; + } + + TriggerEventSyncDto({ + this.days, + }); + + late int? days; +} + +class EventSyncResultDto { + Map toJson() { + Map fields = {}; + fields['created'] = created; + fields['updated'] = updated; + fields['archived'] = archived; + fields['totalFetched'] = totalFetched; + fields['syncedAt'] = syncedAt; + return fields; + } + + EventSyncResultDto.fromJson(Map fields) { + created = fields["created"]; + updated = fields["updated"]; + archived = fields["archived"]; + totalFetched = fields["totalFetched"]; + syncedAt = fields["syncedAt"]; + } + + void partialUpdate(EventSyncResultDto other) { + created = other.created; + updated = other.updated; + archived = other.archived; + totalFetched = other.totalFetched; + syncedAt = other.syncedAt; + } + + EventSyncResultDto({ + required this.created, + required this.updated, + required this.archived, + required this.totalFetched, + required this.syncedAt, + }); + + late int created; + late int updated; + late int archived; + late int totalFetched; + late String syncedAt; +} + +class RequestEventSyncStatusDto { + Map toJson() { + Map fields = {}; + return fields; + } + + RequestEventSyncStatusDto.fromJson(Map fields) {} + + void partialUpdate(RequestEventSyncStatusDto other) {} + + RequestEventSyncStatusDto(); +} + +class UpdateEventSyncStatusDto { + Map toJson() { + Map fields = {}; + fields['running'] = running; + fields['lastResult'] = lastResult!.toJson(); + return fields; + } + + UpdateEventSyncStatusDto.fromJson(Map fields) { + running = fields["running"]; + lastResult = EventSyncResultDto.fromJson(fields['lastResult']); + } + + void partialUpdate(UpdateEventSyncStatusDto other) { + running = other.running; + lastResult = other.lastResult; + } + + UpdateEventSyncStatusDto({ + required this.running, + required this.lastResult, + }); + + late bool running; + late EventSyncResultDto lastResult; +} + +class SubmitFeedbackDto { + Map toJson() { + Map fields = {}; + fields['category'] = category!.name; + fields['text'] = text; + if (rating != null) { + fields['rating'] = rating; + } + if (challengeId != null) { + fields['challengeId'] = challengeId; + } + return fields; + } + + SubmitFeedbackDto.fromJson(Map fields) { + category = FeedbackCategoryDto.values.byName(fields['category']); + text = fields["text"]; + rating = fields.containsKey('rating') ? (fields["rating"]) : null; + challengeId = + fields.containsKey('challengeId') ? (fields["challengeId"]) : null; + } + + void partialUpdate(SubmitFeedbackDto other) { + category = other.category; + text = other.text; + rating = other.rating == null ? rating : other.rating; + challengeId = other.challengeId == null ? challengeId : other.challengeId; + } + + SubmitFeedbackDto({ + required this.category, + required this.text, + this.rating, + this.challengeId, + }); + + late FeedbackCategoryDto category; + late String text; + late bool? rating; + late String? challengeId; +} + +class FeedbackDto { + Map toJson() { + Map fields = {}; + fields['id'] = id; + fields['createdAt'] = createdAt; + fields['category'] = category!.name; + fields['text'] = text; + if (rating != null) { + fields['rating'] = rating; + } + if (challengeId != null) { + fields['challengeId'] = challengeId; + } + fields['userId'] = userId; + if (username != null) { + fields['username'] = username; + } + if (challengeName != null) { + fields['challengeName'] = challengeName; + } + return fields; + } + + FeedbackDto.fromJson(Map fields) { + id = fields["id"]; + createdAt = fields["createdAt"]; + category = FeedbackCategoryDto.values.byName(fields['category']); + text = fields["text"]; + rating = fields.containsKey('rating') ? (fields["rating"]) : null; + challengeId = + fields.containsKey('challengeId') ? (fields["challengeId"]) : null; + userId = fields["userId"]; + username = fields.containsKey('username') ? (fields["username"]) : null; + challengeName = + fields.containsKey('challengeName') ? (fields["challengeName"]) : null; + } + + void partialUpdate(FeedbackDto other) { + id = other.id; + createdAt = other.createdAt; + category = other.category; + text = other.text; + rating = other.rating == null ? rating : other.rating; + challengeId = other.challengeId == null ? challengeId : other.challengeId; + userId = other.userId; + username = other.username == null ? username : other.username; + challengeName = + other.challengeName == null ? challengeName : other.challengeName; + } + + FeedbackDto({ + required this.id, + required this.createdAt, + required this.category, + required this.text, + this.rating, + this.challengeId, + required this.userId, + this.username, + this.challengeName, + }); + + late String id; + late String createdAt; + late FeedbackCategoryDto category; + late String text; + late bool? rating; + late String? challengeId; + late String userId; + late String? username; + late String? challengeName; +} + +class UpdateFeedbackDataDto { + Map toJson() { + Map fields = {}; + fields['feedbacks'] = feedbacks! + .map>((dynamic val) => val!.toJson()) + .toList(); + return fields; + } + + UpdateFeedbackDataDto.fromJson(Map fields) { + feedbacks = fields["feedbacks"] + .map((dynamic val) => FeedbackDto.fromJson(val)) + .toList(); + } + + void partialUpdate(UpdateFeedbackDataDto other) { + feedbacks = other.feedbacks; + } + + UpdateFeedbackDataDto({ + required this.feedbacks, + }); + + late List feedbacks; +} + class JoinGroupDto { Map toJson() { Map fields = {}; diff --git a/game/lib/api/game_server_api.dart b/game/lib/api/game_server_api.dart index d8dcfaba..56ece362 100644 --- a/game/lib/api/game_server_api.dart +++ b/game/lib/api/game_server_api.dart @@ -45,7 +45,12 @@ class GameServerApi { completer.complete(arg); }; - Future.delayed(Duration(seconds: 5)).then((value) => completionFunc(null)); + // Set up timeout - only complete if not already completed + Future.delayed(Duration(seconds: 5)).then((value) { + if (!completer.isCompleted) { + completionFunc(null); + } + }); _refreshEv = ev; _refreshDat = data; @@ -82,6 +87,44 @@ class GameServerApi { Future equipBearItem(EquipBearItemDto dto) async => await _invokeWithRefresh("equipBearItem", dto.toJson()); + Future requestAllBearItems(RequestAllBearItemsDto dto) async => + await _invokeWithRefresh("requestAllBearItems", dto.toJson()); + + Future updateBearItemData(UpdateBearItemDataDto dto) async => + await _invokeWithRefresh("updateBearItemData", dto.toJson()); + + Future requestCampusEvents(RequestCampusEventsDto dto) async => + await _invokeWithRefresh("requestCampusEvents", dto.toJson()); + + Future requestCampusEventDetails( + RequestCampusEventDetailsDto dto) async => + await _invokeWithRefresh("requestCampusEventDetails", dto.toJson()); + + Future requestAllCampusEvents(RequestCampusEventsDto dto) async => + await _invokeWithRefresh("requestAllCampusEvents", dto.toJson()); + + Future createCampusEvent(UpsertCampusEventDto dto) async => + await _invokeWithRefresh("createCampusEvent", dto.toJson()); + + Future updateCampusEvent(UpsertCampusEventDto dto) async => + await _invokeWithRefresh("updateCampusEvent", dto.toJson()); + + Future deleteCampusEvent(DeleteCampusEventDto dto) async => + await _invokeWithRefresh("deleteCampusEvent", dto.toJson()); + + Future rsvpCampusEvent(RsvpCampusEventDto dto) async => + await _invokeWithRefresh("rsvpCampusEvent", dto.toJson()); + + Future unRsvpCampusEvent(UnRsvpCampusEventDto dto) async => + await _invokeWithRefresh("unRsvpCampusEvent", dto.toJson()); + + Future requestAvailableChallenges( + RequestAvailableChallengesDto dto) async => + await _invokeWithRefresh("requestAvailableChallenges", dto.toJson()); + + Future setCurrentChallenge(SetCurrentChallengeDto dto) async => + await _invokeWithRefresh("setCurrentChallenge", dto.toJson()); + Future requestChallengeData(RequestChallengeDataDto dto) async => await _invokeWithRefresh("requestChallengeData", dto.toJson()); @@ -91,12 +134,11 @@ class GameServerApi { Future updateChallengeData(UpdateChallengeDataDto dto) async => await _invokeWithRefresh("updateChallengeData", dto.toJson()); - Future requestAvailableChallenges( - RequestAvailableChallengesDto dto) async => - await _invokeWithRefresh("requestAvailableChallenges", dto.toJson()); + Future checkInWithLocation(LocationCheckInDto dto) async => + await _invokeWithRefresh("checkInWithLocation", dto.toJson()); - Future setCurrentChallenge(SetCurrentChallengeDto dto) async => - await _invokeWithRefresh("setCurrentChallenge", dto.toJson()); + Future checkInWithQrCode(QrCodeCheckInDto dto) async => + await _invokeWithRefresh("checkInWithQrCode", dto.toJson()); Future requestEventData(RequestEventDataDto dto) async => await _invokeWithRefresh("requestEventData", dto.toJson()); @@ -120,6 +162,18 @@ class GameServerApi { Future updateEventData(UpdateEventDataDto dto) async => await _invokeWithRefresh("updateEventData", dto.toJson()); + Future triggerEventSync(TriggerEventSyncDto dto) async => + await _invokeWithRefresh("triggerEventSync", dto.toJson()); + + Future requestEventSyncStatus(Map dto) async => + await _invokeWithRefresh("requestEventSyncStatus", dto); + + Future submitFeedback(SubmitFeedbackDto dto) async => + await _invokeWithRefresh("submitFeedback", dto.toJson()); + + Future requestFeedbackData(Map dto) async => + await _invokeWithRefresh("requestFeedbackData", dto); + Future requestGroupData(RequestGroupDataDto dto) async => await _invokeWithRefresh("requestGroupData", dto.toJson()); @@ -141,6 +195,12 @@ class GameServerApi { Future updateFcmToken(UpdatePushTokenDto dto) async => await _invokeWithRefresh("updateFcmToken", dto.toJson()); + Future sendNotification(SendNotificationDto dto) async => + await _invokeWithRefresh("sendNotification", dto.toJson()); + + Future removeFcmToken(Map dto) async => + await _invokeWithRefresh("removeFcmToken", dto); + Future requestOrganizationData(RequestOrganizationDataDto dto) async => await _invokeWithRefresh("requestOrganizationData", dto.toJson()); diff --git a/game/lib/challenges/challenges_page.dart b/game/lib/challenges/challenges_page.dart index f36b7e72..d3ed112c 100644 --- a/game/lib/challenges/challenges_page.dart +++ b/game/lib/challenges/challenges_page.dart @@ -241,8 +241,10 @@ class _ChallengesPageState extends State { ); if (event.isJourney == true) continue; if (event.indexable == false) continue; + if (event.challenges == null || + event.challenges!.isEmpty) continue; var challenge = challengeModel.getChallengeById( - event.challenges?[0] ?? "", + event.challenges![0], ); if (challenge == null) { diff --git a/game/lib/feedback/feedback_page.dart b/game/lib/feedback/feedback_page.dart new file mode 100644 index 00000000..0bf275ba --- /dev/null +++ b/game/lib/feedback/feedback_page.dart @@ -0,0 +1,201 @@ +import 'package:flutter/material.dart'; +import 'package:game/api/game_api.dart'; +import 'package:game/api/game_client_dto.dart'; +import 'package:game/details_page/dropdown_widget.dart'; +import 'package:game/utils/utility_functions.dart'; +import 'package:provider/provider.dart'; + +import 'package:game/constants/constants.dart'; + +class FeedbackPage extends StatefulWidget { + final String? challengeId; + final bool? rating; + + const FeedbackPage({Key? key, this.challengeId, this.rating}) + : super(key: key); + + @override + State createState() => _FeedbackPageState(); +} + +class _FeedbackPageState extends State { + String? selectedCategory; + String feedbackText = ''; + bool isSubmitting = false; + + final _categories = ['Bug Report', 'Suggestion', 'General']; + + final _categoryMap = { + 'Bug Report': FeedbackCategoryDto.BUG_REPORT, + 'Suggestion': FeedbackCategoryDto.SUGGESTION, + 'General': FeedbackCategoryDto.GENERAL, + }; + + var headingStyle = TextStyle( + color: Colors.black.withOpacity(0.8), + fontSize: 18, + fontFamily: 'Poppins', + fontWeight: FontWeight.w600, + height: 0, + ); + + var buttonStyle = TextStyle( + color: Colors.white, + fontSize: 16, + fontFamily: 'Poppins', + fontWeight: FontWeight.w600, + height: 0, + ); + + var fieldDecoration = InputDecoration( + contentPadding: EdgeInsets.only( + left: 20.0, + right: 20.0, + top: 15, + bottom: 15, + ), + hintText: 'Tell us what you think...', + hintStyle: TextStyle( + color: Colors.black.withOpacity(0.2), + fontWeight: FontWeight.w400, + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.black.withOpacity(0.2), width: 1.5), + borderRadius: BorderRadius.all(Radius.circular(10.0)), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderSide: BorderSide( + color: AppColors.orange, + width: 1.5, + ), + ), + fillColor: Colors.white, + filled: true, + ); + + bool get canSubmit => + selectedCategory != null && + feedbackText.trim().isNotEmpty && + !isSubmitting; + + Future _submitFeedback() async { + if (!canSubmit) return; + + setState(() => isSubmitting = true); + + final apiClient = Provider.of(context, listen: false); + final result = await apiClient.serverApi?.submitFeedback( + SubmitFeedbackDto( + category: _categoryMap[selectedCategory]!, + text: feedbackText.trim(), + rating: widget.rating, + challengeId: widget.challengeId, + ), + ); + + setState(() => isSubmitting = false); + + if (result == true) { + displayToast('Feedback submitted, thank you!', Status.success); + Navigator.pop(context); + } else { + displayToast('Failed to submit feedback', Status.error); + } + } + + @override + Widget build(BuildContext context) { + var headerStyle = TextStyle( + color: AppColors.warmWhite, + fontSize: 20, + fontFamily: 'Poppins', + fontWeight: FontWeight.w600, + ); + + return Scaffold( + backgroundColor: AppColors.warmWhite, + appBar: AppBar( + toolbarHeight: 70, + backgroundColor: AppColors.primaryRed, + leading: IconButton( + icon: const Icon(Icons.navigate_before), + color: Colors.white, + onPressed: () => Navigator.pop(context), + ), + title: Padding( + padding: EdgeInsets.only( + top: MediaQuery.of(context).size.height * 0.01, + ), + child: Text('Feedback', style: headerStyle), + ), + centerTitle: true, + ), + body: LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + return Align( + alignment: Alignment.topCenter, + child: SizedBox( + width: constraints.maxWidth * 0.85, + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 30), + Text('Category', style: headingStyle), + SizedBox(height: 5), + DropdownWidget( + selectedCategory, + _categories, + notifyParent: (val) { + setState(() => selectedCategory = val); + }, + ), + SizedBox(height: 20), + Text('Your Feedback', style: headingStyle), + SizedBox(height: 5), + TextFormField( + decoration: fieldDecoration, + maxLines: 6, + minLines: 4, + onChanged: (value) { + setState(() => feedbackText = value); + }, + ), + Padding( + padding: const EdgeInsets.only(top: 30, bottom: 60), + child: SizedBox( + width: double.infinity, + child: TextButton( + onPressed: canSubmit ? _submitFeedback : null, + style: TextButton.styleFrom( + backgroundColor: AppColors.accentRed, + disabledBackgroundColor: Color(0xFFB9B9B9), + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + child: isSubmitting + ? SizedBox( + height: 20, + width: 20, + child: CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2, + ), + ) + : Text('Submit', style: buttonStyle), + ), + ), + ), + ], + ), + ), + ), + ); + }, + ), + ); + } +} diff --git a/game/lib/gameplay/arrival_dialog.dart b/game/lib/gameplay/arrival_dialog.dart index 6da79309..e821965d 100644 --- a/game/lib/gameplay/arrival_dialog.dart +++ b/game/lib/gameplay/arrival_dialog.dart @@ -9,7 +9,6 @@ import 'package:game/model/tracker_model.dart'; import 'package:game/model/group_model.dart'; import 'package:game/gameplay/challenge_completed.dart'; import 'package:game/quiz/quiz_page.dart'; -import 'package:game/gameplay/gameplay_page.dart'; import 'package:game/constants/constants.dart'; /// Widget that displays the arrival dialog for challenges @@ -92,16 +91,6 @@ class _ArrivedDialog extends StatelessWidget { Widget build(BuildContext context) { final name = challengeName ?? ""; - // Check if this is a journey completed or single challenge - final eventId = groupModel.curEventId; - final event = eventModel.getEventById(eventId ?? ""); - final tracker = trackerModel.trackerByEventId(eventId ?? ""); - final isJourney = event?.isJourney == true; - final journeyCompleted = isJourney && - tracker != null && - tracker.prevChallenges.length >= (event?.challenges?.length ?? 0); - final shouldCheckQuiz = journeyCompleted || !isJourney; - return Container( color: Colors.white, padding: EdgeInsets.all(25), @@ -145,8 +134,6 @@ class _ArrivedDialog extends StatelessWidget { return _ButtonRow( challengeId: challengeId, hasQuiz: hasQuiz, - isJourneyInProgress: - !shouldCheckQuiz, // Journey in progress if not completed/single ); }, ), @@ -193,13 +180,11 @@ class _ArrivedDialog extends StatelessWidget { class _ButtonRow extends StatelessWidget { final String challengeId; final bool hasQuiz; - final bool isJourneyInProgress; const _ButtonRow({ Key? key, required this.challengeId, required this.hasQuiz, - required this.isJourneyInProgress, }) : super(key: key); @override @@ -211,23 +196,13 @@ class _ButtonRow extends StatelessWidget { child: ElevatedButton( onPressed: () { Navigator.pop(context); - if (isJourneyInProgress) { - // Journey in progress - go to next challenge (GameplayPage) - Navigator.pushReplacement( - context, - MaterialPageRoute(builder: (context) => GameplayPage()), - ); - } else { - // Journey completed or single challenge - go directly to ChallengeCompletedPage - // (regardless of whether quiz exists, since user clicked "Point Breakdown") - Navigator.pushReplacement( - context, - MaterialPageRoute( - builder: (context) => - ChallengeCompletedPage(challengeId: challengeId), - ), - ); - } + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => + ChallengeCompletedPage(challengeId: challengeId), + ), + ); }, style: ButtonStyle( padding: MaterialStateProperty.all( @@ -254,7 +229,7 @@ class _ButtonRow extends StatelessWidget { child: FittedBox( fit: BoxFit.scaleDown, child: Text( - isJourneyInProgress ? "Next Challenge" : "Point Breakdown", + "Point Breakdown", style: TextStyle( fontSize: MediaQuery.devicePixelRatioOf(context) < 3 ? 12 : 14, diff --git a/game/lib/gameplay/challenge_completed.dart b/game/lib/gameplay/challenge_completed.dart index 2fe45a3a..7d061ab2 100644 --- a/game/lib/gameplay/challenge_completed.dart +++ b/game/lib/gameplay/challenge_completed.dart @@ -22,6 +22,7 @@ import 'dart:math'; import 'dart:async'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:game/feedback/feedback_page.dart'; // TIMER: LoadingBar widget (unchanged from Timer version) class LoadingBar extends StatelessWidget { @@ -124,10 +125,14 @@ class _ChallengeCompletedState extends State { // BOTH: journeyCompleted state bool journeyCompleted = false; + // Feedback thumbs state: null = not selected, true = thumbs up, false = thumbs down + bool? thumbsSelection; + // QUIZ: Quiz-related state variables int totalQuizPoints = 0; bool isLoadingQuizPoints = false; Map quizPointsByChallenge = {}; + bool hasFetchedQuizPoints = false; @override void initState() { @@ -195,6 +200,7 @@ class _ChallengeCompletedState extends State { if (mounted) { setState(() { isLoadingQuizPoints = false; + hasFetchedQuizPoints = true; }); } } @@ -297,7 +303,7 @@ class _ChallengeCompletedState extends State { overflow: TextOverflow.ellipsis, ), ), - SizedBox(width: 8), + Spacer(), Text( // TIMER: Show "0 points" if failed prevChal.failed == true @@ -314,7 +320,7 @@ class _ChallengeCompletedState extends State { // QUIZ: Fetch quiz points for journeys when on journey page and completed // Changed from Quiz's (isJourney && journeyCompleted) to (journeyPage && journeyCompleted) // because Timer version uses journeyPage state toggle - if (journeyPage && journeyCompleted && !isLoadingQuizPoints) { + if (journeyPage && !isLoadingQuizPoints && !hasFetchedQuizPoints) { WidgetsBinding.instance.addPostFrameCallback((_) { _fetchQuizPointsForJourney( apiClient, @@ -327,8 +333,8 @@ class _ChallengeCompletedState extends State { // QUIZ: Determine quiz points to display // Changed from Quiz's isJourney to journeyPage to match Timer's state-based approach int displayQuizPoints = 0; - if (journeyPage && journeyCompleted) { - // For completed journey page: use accumulated quiz points from all challenges + if (journeyPage) { + // For journey page (in progress or completed): use accumulated quiz points from all challenges displayQuizPoints = totalQuizPoints; } else if (!journeyPage) { // For single challenge view: use quiz points specifically earned for THIS challenge @@ -628,6 +634,70 @@ class _ChallengeCompletedState extends State { fontWeight: FontWeight.bold, ), ), + SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'How was this experience?', + style: TextStyle( + color: Colors.white.withOpacity(0.8), + fontSize: 14.0, + ), + ), + SizedBox(width: 12), + IconButton( + icon: Icon( + thumbsSelection == true + ? Icons.thumb_up + : Icons.thumb_up_outlined, + color: thumbsSelection == true + ? Colors.blue + : Colors.white, + size: 28, + ), + onPressed: thumbsSelection != null + ? null + : () { + setState(() => thumbsSelection = true); + apiClient.serverApi?.submitFeedback( + SubmitFeedbackDto( + category: FeedbackCategoryDto.GENERAL, + text: 'Liked this challenge', + rating: true, + challengeId: challenge.id, + ), + ); + }, + ), + SizedBox(width: 8), + IconButton( + icon: Icon( + thumbsSelection == false + ? Icons.thumb_down + : Icons.thumb_down_outlined, + color: thumbsSelection == false + ? Colors.blue + : Colors.white, + size: 28, + ), + onPressed: thumbsSelection != null + ? null + : () { + setState(() => thumbsSelection = false); + Navigator.push( + context, + MaterialPageRoute( + builder: (_) => FeedbackPage( + challengeId: challenge.id, + rating: false, + ), + ), + ); + }, + ), + ], + ), // Only use Spacer for single challenge view (journey page has Expanded ListView) if (!journeyPage) Spacer(), // TIMER: Button logic with journeyPage state toggle diff --git a/game/lib/journeys/journey_challenge_list_sheet.dart b/game/lib/journeys/journey_challenge_list_sheet.dart index d65fc531..65e3d852 100644 --- a/game/lib/journeys/journey_challenge_list_sheet.dart +++ b/game/lib/journeys/journey_challenge_list_sheet.dart @@ -14,6 +14,7 @@ import 'package:game/navigation_page/bottom_navbar.dart'; import 'package:game/utils/utility_functions.dart'; import 'package:game/widget/cached_image.dart'; import 'package:geolocator/geolocator.dart'; +import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'dart:async'; @@ -182,8 +183,29 @@ class _JourneyChallengeListSheetState extends State { final totalChallenges = event?.challenges?.length ?? 0; final remaining = availableChallenges.length; + // Partition available challenges into available now vs upcoming + final now = DateTime.now(); + final availableNow = []; + final upcoming = []; + + for (final challenge in availableChallenges) { + final startStr = challenge.scheduledStartTime; + final endStr = challenge.scheduledEndTime; + final start = startStr != null ? DateTime.tryParse(startStr) : null; + final end = endStr != null ? DateTime.tryParse(endStr) : null; + + if (start != null && now.isBefore(start)) { + upcoming.add(challenge); + } else if (end != null && now.isAfter(end)) { + // Should already be auto-completed by server, skip + continue; + } else { + availableNow.add(challenge); + } + } + // Sort available challenges by distance - final sortedAvailable = List.from(availableChallenges); + final sortedAvailable = List.from(availableNow); sortedAvailable.sort((a, b) { final distA = _distanceTo(a); final distB = _distanceTo(b); @@ -368,6 +390,59 @@ class _JourneyChallengeListSheetState extends State { ), ), ], + // Upcoming section + if (upcoming.isNotEmpty) ...[ + Padding( + padding: + const EdgeInsets.only(top: 12, bottom: 4), + child: Text( + 'Upcoming', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 14, + fontWeight: FontWeight.bold, + color: AppColors.grayText, + ), + ), + ), + ...upcoming.map( + (challenge) => _JourneyChallengeCard( + challenge: challenge, + isCompleted: false, + isUpcoming: true, + walkingTime: + _walkingTime(_distanceTo(challenge)), + onTap: () { + final startStr = + challenge.scheduledStartTime; + final start = startStr != null + ? DateTime.tryParse(startStr) + : null; + final formatted = start != null + ? DateFormat.yMMMd() + .add_jm() + .format(start.toLocal()) + : 'a future date'; + showDialog( + context: context, + builder: (_) => AlertDialog( + title: Text('Not Yet Available'), + content: Text( + 'This challenge is available on $formatted. Come back then!', + ), + actions: [ + TextButton( + onPressed: () => + Navigator.pop(context), + child: Text('OK'), + ), + ], + ), + ); + }, + ), + ), + ], // Completed section if (completedChallenges.isNotEmpty) ...[ Padding( @@ -386,6 +461,8 @@ class _JourneyChallengeListSheetState extends State { ...completedChallenges.map( (challenge) { final prev = prevChallengeMap[challenge.id]; + final isDateExpired = + prev?.dateExpired == true; final totalPts = challenge.points ?? 0; int earned; if (prev?.failed == true) { @@ -406,6 +483,7 @@ class _JourneyChallengeListSheetState extends State { return _JourneyChallengeCard( challenge: challenge, isCompleted: true, + isDateExpired: isDateExpired, walkingTime: _walkingTime(_distanceTo(challenge)), earnedPoints: earned, @@ -429,6 +507,8 @@ class _JourneyChallengeListSheetState extends State { class _JourneyChallengeCard extends StatelessWidget { final ChallengeDto challenge; final bool isCompleted; + final bool isUpcoming; + final bool isDateExpired; final String walkingTime; final int? earnedPoints; final VoidCallback? onTap; @@ -437,133 +517,235 @@ class _JourneyChallengeCard extends StatelessWidget { required this.challenge, required this.isCompleted, required this.walkingTime, + this.isUpcoming = false, + this.isDateExpired = false, this.earnedPoints, this.onTap, }); + bool get _isTodayOnly { + final startStr = challenge.scheduledStartTime; + final endStr = challenge.scheduledEndTime; + if (startStr == null && endStr == null) return false; + final start = startStr != null ? DateTime.tryParse(startStr) : null; + final end = endStr != null ? DateTime.tryParse(endStr) : null; + final now = DateTime.now(); + final today = DateTime(now.year, now.month, now.day); + final tomorrow = today.add(Duration(days: 1)); + final isAfterStart = start == null || !now.isBefore(start); + final isBeforeEnd = end == null || now.isBefore(end); + final endsToday = end != null && end.isBefore(tomorrow); + return isAfterStart && isBeforeEnd && endsToday; + } + @override Widget build(BuildContext context) { + final isGrayed = isUpcoming || isCompleted; + final cardColor = isGrayed ? AppColors.lightGray : Colors.white; + return GestureDetector( onTap: onTap, - child: Container( - margin: const EdgeInsets.only(bottom: 8), - padding: const EdgeInsets.all(8), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - boxShadow: [ - BoxShadow( - color: AppColors.black10, - offset: Offset(0, 2), - blurRadius: 6, - ), - ], - ), - child: Row( - children: [ - // Left content - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Name + walking time row - Row( - children: [ - Flexible( - child: Text( - challenge.name ?? '', - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontFamily: 'Poppins', - fontSize: 16, - fontWeight: FontWeight.bold, - color: AppColors.darkGrayText, + child: Opacity( + opacity: isGrayed ? 0.6 : 1.0, + child: Container( + margin: const EdgeInsets.only(bottom: 8), + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: cardColor, + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: AppColors.black10, + offset: Offset(0, 2), + blurRadius: 6, + ), + ], + ), + child: Row( + children: [ + // Left content + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Name + walking time row + badges + Row( + children: [ + Flexible( + child: Text( + challenge.name ?? '', + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 16, + fontWeight: FontWeight.bold, + color: AppColors.darkGrayText, + ), ), ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Container( - width: 4, - height: 4, - decoration: BoxDecoration( + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Container( + width: 4, + height: 4, + decoration: BoxDecoration( + color: AppColors.darkGrayText, + shape: BoxShape.circle, + ), + ), + ), + if (isUpcoming) ...[ + Icon( + Icons.calendar_today, + size: 16, + color: AppColors.grayText, + ), + SizedBox(width: 4), + Text( + _formatScheduledDate(), + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 12, + fontWeight: FontWeight.bold, + color: AppColors.grayText, + ), + ), + ] else ...[ + Icon( + Icons.directions_walk, + size: 18, color: AppColors.darkGrayText, - shape: BoxShape.circle, ), + SizedBox(width: 2), + Text( + walkingTime, + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 12, + fontWeight: FontWeight.bold, + color: AppColors.darkGrayText, + ), + ), + ], + ], + ), + SizedBox(height: 8), + // Badges row + if (_isTodayOnly || isDateExpired) + Padding( + padding: const EdgeInsets.only(bottom: 4), + child: Row( + children: [ + if (_isTodayOnly) + Container( + padding: EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + decoration: BoxDecoration( + color: AppColors.orange, + borderRadius: BorderRadius.circular(20), + ), + child: Text( + 'Today Only', + style: TextStyle( + color: Colors.white, + fontSize: 11, + fontFamily: 'Poppins', + fontWeight: FontWeight.w500, + ), + ), + ), + if (isDateExpired) + Container( + padding: EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + decoration: BoxDecoration( + color: AppColors.mediumGray, + borderRadius: BorderRadius.circular(20), + ), + child: Text( + 'Expired', + style: TextStyle( + color: Colors.white, + fontSize: 11, + fontFamily: 'Poppins', + fontWeight: FontWeight.w500, + ), + ), + ), + ], ), ), - Icon( - Icons.directions_walk, - size: 18, - color: AppColors.darkGrayText, - ), - SizedBox(width: 2), - Text( - walkingTime, - style: TextStyle( - fontFamily: 'Poppins', - fontSize: 12, - fontWeight: FontWeight.bold, - color: AppColors.darkGrayText, - ), + // Description + Text( + challenge.description ?? '', + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 12, + fontWeight: + isCompleted ? FontWeight.bold : FontWeight.normal, + color: AppColors.grayText, ), - ], - ), - SizedBox(height: 8), - // Description - Text( - challenge.description ?? '', - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontFamily: 'Poppins', - fontSize: 12, - fontWeight: - isCompleted ? FontWeight.bold : FontWeight.normal, - color: AppColors.grayText, ), - ), - SizedBox(height: 12), - // Points - Row( - children: [ - SvgPicture.asset( - 'assets/icons/bearcoins.svg', - width: 20, - height: 20, - ), - SizedBox(width: 5), - Text( - isCompleted - ? '${earnedPoints ?? challenge.points ?? 0} PTS / ${challenge.points ?? 0} PTS' - : '${challenge.points ?? 0} PTS', - style: TextStyle( - fontFamily: 'Poppins', - fontSize: 12, - fontWeight: FontWeight.bold, - color: AppColors.gold, + SizedBox(height: 12), + // Points + Row( + children: [ + SvgPicture.asset( + 'assets/icons/bearcoins.svg', + width: 20, + height: 20, ), - ), - ], - ), - ], + SizedBox(width: 5), + Text( + isDateExpired + ? 'Expired — 0 PTS' + : isCompleted + ? '${earnedPoints ?? challenge.points ?? 0} PTS / ${challenge.points ?? 0} PTS' + : '${challenge.points ?? 0} PTS', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 12, + fontWeight: FontWeight.bold, + color: isDateExpired + ? AppColors.mediumGray + : AppColors.gold, + ), + ), + ], + ), + ], + ), ), - ), - SizedBox(width: 8), - // Thumbnail - ClipRRect( - borderRadius: BorderRadius.circular(8), - child: AppCachedImage( - imageUrl: challenge.imageUrl ?? '', - width: 82, - height: 81, + SizedBox(width: 8), + // Thumbnail + ClipRRect( + borderRadius: BorderRadius.circular(8), + child: AppCachedImage( + imageUrl: challenge.imageUrl ?? '', + width: 82, + height: 81, + ), ), - ), - ], + ], + ), ), ), ); } + + String _formatScheduledDate() { + final startStr = challenge.scheduledStartTime; + if (startStr == null) return ''; + final start = DateTime.tryParse(startStr); + if (start == null) return ''; + return DateFormat.MMMd().format(start.toLocal()); + } } /// Launcher scaffold that immediately shows the challenge list bottom sheet. diff --git a/game/lib/journeys/journeys_page.dart b/game/lib/journeys/journeys_page.dart index 46fa8718..6740e891 100644 --- a/game/lib/journeys/journeys_page.dart +++ b/game/lib/journeys/journeys_page.dart @@ -181,6 +181,8 @@ class _JourneysPageState extends State { ShowcaseView.getNamed("journeys_page").dismiss(); Provider.of(context, listen: false).completeStep4(); + if (eventData.isEmpty) return; + // Onboarding: Navigate to gameplay page to continue onboarding flow apiClient.serverApi?.setCurrentEvent( SetCurrentEventDto(eventId: eventData[0].eventId), @@ -323,10 +325,12 @@ class _JourneysPageState extends State { if (event.isJourney != true) continue; if (event.indexable == false) continue; + if (event.challenges == null || + event.challenges!.isEmpty) continue; var totalPoints = 0; var challenge = challengeModel.getChallengeById( - event.challenges?[0] ?? "", + event.challenges![0], ); if (challenge == null) continue; diff --git a/game/lib/main.dart b/game/lib/main.dart index f391c22a..da6e05fc 100644 --- a/game/lib/main.dart +++ b/game/lib/main.dart @@ -11,9 +11,11 @@ import 'package:game/api/geopoint.dart'; import 'package:game/api/notification_service.dart'; import 'package:game/loading_page/loading_page.dart'; import 'package:game/model/achievement_model.dart'; +import 'package:game/model/campus_event_model.dart'; import 'package:device_preview/device_preview.dart'; import 'package:game/model/onboarding_model.dart'; import 'package:game/model/timer_model.dart'; +import 'package:game/model/feature_flags_model.dart'; import 'package:game/model/quiz_model.dart'; // imports for google maps @@ -39,6 +41,7 @@ const bool USE_DEVICE_PREVIEW = false; final storage = FlutterSecureStorage(); late final String API_URL; late final ApiClient client; +late final FeatureFlagsModel featureFlags; final GlobalKey navigatorKey = GlobalKey(); void main() async { @@ -68,6 +71,10 @@ void main() async { // Initialize API client client = ApiClient(storage, API_URL); + // Load feature flags from server + featureFlags = FeatureFlagsModel(); + await featureFlags.load(API_URL); + // Initialize notification service with callback to send token to server await NotificationService().initialize( onTokenRefresh: (token) { @@ -132,6 +139,7 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MultiProvider( providers: [ + ChangeNotifierProvider.value(value: featureFlags), ChangeNotifierProvider.value(value: client), ChangeNotifierProvider(create: (_) => UserModel(client), lazy: false), ChangeNotifierProvider( @@ -154,6 +162,10 @@ class MyApp extends StatelessWidget { ), ChangeNotifierProvider(create: (_) => TimerModel(client), lazy: false), ChangeNotifierProvider(create: (_) => QuizModel(client), lazy: false), + ChangeNotifierProvider( + create: (_) => CampusEventModel(client), + lazy: false, + ), ], child: GameWidget( child: MaterialApp( diff --git a/game/lib/model/campus_event_model.dart b/game/lib/model/campus_event_model.dart new file mode 100644 index 00000000..dff3bd27 --- /dev/null +++ b/game/lib/model/campus_event_model.dart @@ -0,0 +1,82 @@ +import 'package:flutter/foundation.dart'; +import 'package:game/api/game_api.dart'; +import 'package:game/api/game_client_dto.dart'; + +class CampusEventModel extends ChangeNotifier { + final Map _eventsById = {}; + CampusEventListDto? _currentList; + final ApiClient _client; + + CampusEventModel(ApiClient client) : _client = client { + client.clientApi.updateCampusEventDataStream.listen((event) { + if (event.deleted) { + _eventsById.remove(event.event.id); + } else { + _eventsById[event.event.id] = event.event; + } + notifyListeners(); + }); + + client.clientApi.campusEventListStream.listen((event) { + _currentList = event.list; + for (final campusEvent in event.list.events) { + _eventsById[campusEvent.id] = campusEvent; + } + notifyListeners(); + }); + + client.clientApi.connectedStream.listen((event) { + _eventsById.clear(); + _currentList = null; + notifyListeners(); + }); + } + + CampusEventDto? getCampusEventById(String id) { + final event = _eventsById[id]; + if (event == null) { + _client.serverApi?.requestCampusEventDetails( + RequestCampusEventDetailsDto(eventId: id), + ); + } + return event; + } + + CampusEventListDto? get currentList => _currentList; + + List get allCachedEvents => _eventsById.values.toList(); + + void requestCampusEvents({ + int page = 1, + int limit = 20, + String? dateFrom, + String? dateTo, + List? categories, + String? search, + bool? featured, + }) { + _client.serverApi?.requestCampusEvents( + RequestCampusEventsDto( + page: page, + limit: limit, + dateFrom: dateFrom, + dateTo: dateTo, + categories: categories, + search: search, + featured: featured, + ), + ); + } + + void rsvpCampusEvent(String campusEventId) { + _client.serverApi?.rsvpCampusEvent( + RsvpCampusEventDto(eventId: campusEventId), + ); + } + + void unRsvpCampusEvent(String campusEventId) { + _client.serverApi?.unRsvpCampusEvent( + UnRsvpCampusEventDto(eventId: campusEventId), + ); + } +} diff --git a/game/lib/model/feature_flags_model.dart b/game/lib/model/feature_flags_model.dart new file mode 100644 index 00000000..e9dfee13 --- /dev/null +++ b/game/lib/model/feature_flags_model.dart @@ -0,0 +1,21 @@ +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:http/http.dart' as http; + +class FeatureFlagsModel extends ChangeNotifier { + bool enableBuildABear = false; + + Future load(String apiUrl) async { + try { + final response = await http.get(Uri.parse('$apiUrl/feature-flags')); + if (response.statusCode == 200) { + final data = jsonDecode(response.body) as Map; + enableBuildABear = data['enableBuildABear'] ?? false; + notifyListeners(); + } + } catch (_) { + // Default to false — feature stays hidden + } + } +} diff --git a/game/lib/profile/profile_page.dart b/game/lib/profile/profile_page.dart index 2310d1e0..35a25bdb 100644 --- a/game/lib/profile/profile_page.dart +++ b/game/lib/profile/profile_page.dart @@ -10,6 +10,7 @@ import 'package:game/model/achievement_model.dart'; import 'package:game/model/challenge_model.dart'; import 'package:game/model/event_model.dart'; import 'package:game/model/tracker_model.dart'; +import 'package:game/model/feature_flags_model.dart'; import 'package:game/model/user_model.dart'; import 'package:game/achievements/achievement_cell.dart'; import 'package:game/profile/completed_cell.dart'; @@ -293,22 +294,25 @@ class _ProfilePageState extends State { child: Row( mainAxisSize: MainAxisSize.min, children: [ - IconButton( - icon: SvgPicture.asset( - 'assets/icons/clotheshanger.svg', - width: iconSize, - height: iconSize, + if (context + .watch() + .enableBuildABear) + IconButton( + icon: SvgPicture.asset( + 'assets/icons/clotheshanger.svg', + width: iconSize, + height: iconSize, + ), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + const BuildABearPage(), + ), + ); + }, ), - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - const BuildABearPage(), - ), - ); - }, - ), IconButton( icon: Icon(Icons.settings, size: iconSize, color: Colors.black), diff --git a/game/lib/profile/settings_page.dart b/game/lib/profile/settings_page.dart index 58033b7c..ebdfb3fc 100644 --- a/game/lib/profile/settings_page.dart +++ b/game/lib/profile/settings_page.dart @@ -8,6 +8,7 @@ import 'package:game/main.dart'; import 'package:game/utils/utility_functions.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:game/feedback/feedback_page.dart'; import 'package:game/model/onboarding_model.dart'; import 'package:game/model/user_model.dart'; import 'package:game/model/event_model.dart'; @@ -196,7 +197,12 @@ class SettingsPage extends StatelessWidget { ), child: TextButton( onPressed: () { - launchUrl(SUPPORT_URL); + Navigator.push( + context, + MaterialPageRoute( + builder: (_) => FeedbackPage(), + ), + ); }, style: TextButton.styleFrom( padding: EdgeInsets.only(left: 20.0), diff --git a/game/lib/quiz/quiz_page.dart b/game/lib/quiz/quiz_page.dart index 40a5dd6f..6e41744a 100644 --- a/game/lib/quiz/quiz_page.dart +++ b/game/lib/quiz/quiz_page.dart @@ -1,17 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:provider/provider.dart'; -import 'package:game/api/game_api.dart'; import 'package:game/api/game_client_dto.dart'; import 'package:game/model/quiz_model.dart'; import 'package:game/model/event_model.dart'; -import 'package:game/model/tracker_model.dart'; import 'package:game/model/group_model.dart'; import 'package:game/model/challenge_model.dart'; import 'package:game/gameplay/challenge_completed.dart'; -import 'package:game/gameplay/gameplay_page.dart'; import 'package:game/utils/utility_functions.dart'; -import 'package:flutter/scheduler.dart'; import 'package:confetti/confetti.dart'; import 'dart:math'; import 'package:game/constants/constants.dart'; @@ -74,42 +70,17 @@ class _QuizScreenState extends State<_QuizScreen> { 'no available questions', ) && !quizModel.isLoading) { - // Check if this is a journey and navigate accordingly - final eventModel = Provider.of(context, listen: false); - final trackerModel = Provider.of( - context, - listen: false, - ); - final groupModel = Provider.of(context, listen: false); - - final eventId = groupModel.curEventId; - final event = eventModel.getEventById(eventId ?? ""); - final tracker = trackerModel.trackerByEventId(eventId ?? ""); - final isJourney = event?.isJourney == true; - final journeyCompleted = isJourney && - tracker != null && - tracker.prevChallenges.length >= (event?.challenges?.length ?? 0); - // Navigate away immediately WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted) { Navigator.pop(context); - if (isJourney && !journeyCompleted) { - // Journey not completed - go to next challenge - Navigator.pushReplacement( - context, - MaterialPageRoute(builder: (context) => GameplayPage()), - ); - } else { - // Journey completed OR single challenge - show point breakdown - Navigator.pushReplacement( - context, - MaterialPageRoute( - builder: (context) => - ChallengeCompletedPage(challengeId: widget.challengeId), - ), - ); - } + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => + ChallengeCompletedPage(challengeId: widget.challengeId), + ), + ); } }); return const SizedBox.shrink(); @@ -439,21 +410,6 @@ class _QuizScreenState extends State<_QuizScreen> { barrierColor: Colors.black.withOpacity(0.5), context: context, builder: (dialogContext) { - // Check if this is a journey (multi-challenge event) and if it's completed - final eventModel = Provider.of(context, listen: false); - final trackerModel = Provider.of(context, listen: false); - final groupModel = Provider.of(context, listen: false); - - final eventId = groupModel.curEventId; - final event = eventModel.getEventById(eventId ?? ""); - final tracker = trackerModel.trackerByEventId(eventId ?? ""); - final isJourney = event?.isJourney == true; - - // Check if journey is completed (all challenges done) - final journeyCompleted = isJourney && - tracker != null && - tracker.prevChallenges.length >= (event?.challenges?.length ?? 0); - final isCorrect = result.isCorrect; // Play confetti if correct @@ -570,28 +526,15 @@ class _QuizScreenState extends State<_QuizScreen> { onPressed: () { confettiController.stop(); Navigator.pop(context); - // For journeys: if completed, show point breakdown; otherwise go to next challenge - // For single challenges: always show point breakdown - if (isJourney && !journeyCompleted) { - // Journey not completed - go to next challenge - Navigator.pushReplacement( - context, - MaterialPageRoute( - builder: (context) => GameplayPage(), + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => + ChallengeCompletedPage( + challengeId: widget.challengeId, ), - ); - } else { - // Journey completed OR single challenge - show point breakdown - Navigator.pushReplacement( - context, - MaterialPageRoute( - builder: (context) => - ChallengeCompletedPage( - challengeId: widget.challengeId, - ), - ), - ); - } + ), + ); }, style: ButtonStyle( padding: MaterialStateProperty.all< @@ -626,9 +569,7 @@ class _QuizScreenState extends State<_QuizScreen> { ), ), child: Text( - (isJourney && !journeyCompleted) - ? 'Next Challenge' - : 'Point Breakdown', + 'Point Breakdown', style: TextStyle( fontSize: MediaQuery.devicePixelRatioOf(context) < 3 diff --git a/game/lib/utils/utility_functions.dart b/game/lib/utils/utility_functions.dart index 98f33bc9..14498f68 100644 --- a/game/lib/utils/utility_functions.dart +++ b/game/lib/utils/utility_functions.dart @@ -241,12 +241,16 @@ final Map abbrevLocation = { }; final Map friendlyCategory = { - EventCategoryDto.CAFE: "Cafe", - EventCategoryDto.DININGHALL: "Dining Hall", - EventCategoryDto.DORM: "Dorm", EventCategoryDto.FOOD: "Food", - EventCategoryDto.HISTORICAL: "Historical", EventCategoryDto.NATURE: "Nature", + EventCategoryDto.HISTORICAL: "Historical", + EventCategoryDto.RESIDENTIAL: "Residential", + EventCategoryDto.LANDMARK: "Landmark", + EventCategoryDto.ARTS: "Arts", + EventCategoryDto.ATHLETICS: "Athletics", + EventCategoryDto.LIBRARY: "Library", + EventCategoryDto.ACADEMIC: "Academic", + EventCategoryDto.RECREATION: "Recreation", }; /** diff --git a/game/pubspec.lock b/game/pubspec.lock index 1142b1aa..74da01e6 100644 --- a/game/pubspec.lock +++ b/game/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f + url: "https://pub.dev" + source: hosted + version: "85.0.0" _flutterfire_internals: dependency: transitive description: @@ -9,6 +17,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.59" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" + url: "https://pub.dev" + source: hosted + version: "7.7.1" archive: dependency: transitive description: @@ -97,6 +113,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" cli_util: dependency: transitive description: @@ -129,6 +153,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.0" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + coverage: + dependency: transitive + description: + name: coverage + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" + url: "https://pub.dev" + source: hosted + version: "1.15.0" crypto: dependency: transitive description: @@ -165,10 +205,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: "77f757b789ff68e4eaf9c56d1752309bd9f7ad557cb105b938a7f8eb89e59110" + sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074 url: "https://pub.dev" source: hosted - version: "9.1.2" + version: "10.1.2" device_info_plus_platform_interface: dependency: transitive description: @@ -197,10 +237,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.3" + version: "1.3.2" ffi: dependency: transitive description: @@ -477,6 +517,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.4" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" geolocator: dependency: "direct main" description: @@ -525,6 +573,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.4" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" google_fonts: dependency: "direct main" description: @@ -645,6 +701,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" http_parser: dependency: transitive description: @@ -669,6 +733,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.19.0" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" js: dependency: transitive description: @@ -697,26 +769,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev" source: hosted - version: "11.0.2" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.10" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.1" linkify: dependency: transitive description: @@ -801,10 +873,10 @@ packages: dependency: transitive description: name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.16.0" mgrs_dart: dependency: transitive description: @@ -813,6 +885,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" nested: dependency: transitive description: @@ -821,6 +901,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" octo_image: dependency: transitive description: @@ -829,6 +917,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" path: dependency: transitive description: @@ -973,6 +1069,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + pool: + dependency: transitive + description: + name: pool + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" + url: "https://pub.dev" + source: hosted + version: "1.5.2" posix: dependency: transitive description: @@ -1005,6 +1109,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.1.2" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" rxdart: dependency: transitive description: @@ -1077,6 +1189,38 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.1" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" shimmer: dependency: "direct main" description: @@ -1154,6 +1298,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + url: "https://pub.dev" + source: hosted + version: "0.10.13" source_span: dependency: transitive description: @@ -1266,14 +1426,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.2" + test: + dependency: "direct dev" + description: + name: test + sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" + url: "https://pub.dev" + source: hosted + version: "1.25.15" test_api: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.4" + test_core: + dependency: transitive + description: + name: test_core + sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" + url: "https://pub.dev" + source: hosted + version: "0.6.8" timezone: dependency: transitive description: @@ -1406,10 +1582,10 @@ packages: dependency: transitive description: name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.1.4" velocity_x: dependency: "direct main" description: @@ -1434,6 +1610,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + url: "https://pub.dev" + source: hosted + version: "1.2.1" web: dependency: transitive description: @@ -1442,6 +1626,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" win32: dependency: "direct main" description: @@ -1491,5 +1699,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.8.0-0 <4.0.0" + dart: ">=3.7.0 <4.0.0" flutter: ">=3.29.0" diff --git a/game/pubspec.yaml b/game/pubspec.yaml index 98a3f86c..c191a8e0 100644 --- a/game/pubspec.yaml +++ b/game/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.3.2+2 +version: 1.3.2+18 environment: sdk: ">=3.0.0 <4.0.0" @@ -54,7 +54,7 @@ dependencies: # platform_device_id: ^1.0.1 flutter_map: ^6.0.1 latlong2: ^0.9.0 - device_info_plus: ^9.1.0 + device_info_plus: ^10.0.0 flutter_svg: ^2.0.8 google_maps_flutter: ^2.5.3 google_maps_flutter_android: ^2.4.2 @@ -74,6 +74,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + test: any flutter_lints: ^3.0.0 flutter_launcher_icons: diff --git a/package.json b/package.json index 32e712ef..550da858 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "setup": "node ./scripts/setup.js", "updateapi": "node ./scripts/updateapi.js", "formatall": "node ./scripts/formatall.js", + "bulk-add": "node ./scripts/bulk-add-challenges.js", "compilescripts": "tsc --project scripts", "prepare": "husky" }, diff --git a/scripts/bulk-add-challenges.js b/scripts/bulk-add-challenges.js new file mode 100644 index 00000000..39810c65 --- /dev/null +++ b/scripts/bulk-add-challenges.js @@ -0,0 +1,384 @@ +/** + * Bulk-add challenges from a CSV file or Google Sheet into an existing journey. + * + * Usage: + * node scripts/bulk-add-challenges.js + * + * You will then be prompted for the : + * + * + * + * Alternatively, run in one step: + * node scripts/bulk-add-challenges.js [--force] + * + * Source can be: + * - A local CSV file path + * - A Google Sheets URL, e.g. https://docs.google.com/spreadsheets/d/SHEET_ID/edit... + * Two auth modes: + * a) Set GOOGLE_API_KEY in server/.env — sheet just needs "Anyone with the link" sharing + * b) No API key — sheet must be fully public ("Anyone on the internet") + * + * CSV columns (header row required): + * Name, Description, Latitude, Longitude, Location Description, + * Image URL, Awarding Distance, Close Distance, Points + * + * If the journey already has challenges with completions, the script will + * abort unless --force is passed. + */ + +const { PrismaClient } = require('../server/node_modules/@prisma/client'); +const path = require('path'); +const fs = require('fs'); +const readline = require('readline'); + +function prompt(question) { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + return new Promise((resolve) => { + rl.question(question, (answer) => { + rl.close(); + resolve(answer.trim()); + }); + }); +} + +require('../server/node_modules/dotenv').config({ + path: path.join(__dirname, '../server/.env'), +}); + +const prisma = new PrismaClient(); + +// CSV parser (no dependencies) + +function parseCsv(text) { + const rows = []; + let current = ''; + let inQuotes = false; + const lines = []; + + // Split into lines respecting quoted newlines + for (let i = 0; i < text.length; i++) { + const ch = text[i]; + if (ch === '"') { + inQuotes = !inQuotes; + current += ch; + } else if (ch === '\n' && !inQuotes) { + lines.push(current); + current = ''; + } else if (ch === '\r' && !inQuotes) { + // skip \r + } else { + current += ch; + } + } + if (current.length > 0) lines.push(current); + + for (const line of lines) { + const cells = []; + let cell = ''; + let q = false; + for (let i = 0; i < line.length; i++) { + const ch = line[i]; + if (ch === '"') { + if (q && line[i + 1] === '"') { + cell += '"'; + i++; + } else { + q = !q; + } + } else if (ch === ',' && !q) { + cells.push(cell.trim()); + cell = ''; + } else { + cell += ch; + } + } + cells.push(cell.trim()); + rows.push(cells); + } + + return rows; +} + +// Location mapping + +const LOCATION_MAP = { + 'eng quad': 'ENG_QUAD', + 'engineering quad': 'ENG_QUAD', + 'arts quad': 'ARTS_QUAD', + 'ag quad': 'AG_QUAD', + 'agriculture quad': 'AG_QUAD', + 'central campus': 'CENTRAL_CAMPUS', + 'north campus': 'NORTH_CAMPUS', + 'west campus': 'WEST_CAMPUS', + 'cornell athletics': 'CORNELL_ATHLETICS', + 'athletics': 'CORNELL_ATHLETICS', + 'vet school': 'VET_SCHOOL', + 'collegetown': 'COLLEGETOWN', + 'college town': 'COLLEGETOWN', + 'ithaca commons': 'ITHACA_COMMONS', + 'commons': 'ITHACA_COMMONS', +}; + +function mapLocation(locationDesc) { + if (!locationDesc) return 'ANY'; + const key = locationDesc.toLowerCase().trim(); + return LOCATION_MAP[key] || 'ANY'; +} + +// Validation + +const REQUIRED_FIELDS = [ + 'name', + 'description', + 'latitude', + 'longitude', + 'imageUrl', + 'awardingRadius', + 'closeRadius', + 'points', +]; + +function parseRow(headers, cells) { + const raw = {}; + headers.forEach((h, i) => { + raw[h] = cells[i] || ''; + }); + + // Clean latitude (some cells have trailing commas/spaces) + const latStr = raw['Latitude'].replace(/,/g, '').trim(); + const lngStr = raw['Longitude'].replace(/,/g, '').trim(); + + const challenge = { + name: raw['Name'] || '', + description: raw['Description'] || '', + latitude: parseFloat(latStr), + longitude: parseFloat(lngStr), + imageUrl: raw['Image URL'] || '', + awardingRadius: parseFloat(raw['Awarding Distance']) || 0, + closeRadius: parseFloat(raw['Close Distance']) || 0, + points: parseInt(raw['Points'], 10) || 0, + location: mapLocation(raw['Location Description']), + }; + + const missing = REQUIRED_FIELDS.filter((f) => { + const val = challenge[f]; + if (typeof val === 'string') return !val; + if (typeof val === 'number') return isNaN(val) || val === 0; + return !val; + }); + + return { challenge, missing, rawName: raw['Name'] || '(unnamed)' }; +} + +// Google Sheets fetcher + +function extractSheetId(url) { + const match = url.match(/\/spreadsheets\/d\/([a-zA-Z0-9_-]+)/); + return match ? match[1] : null; +} + +async function fetchGoogleSheet(url) { + const sheetId = extractSheetId(url); + if (!sheetId) { + throw new Error('Could not extract sheet ID from URL: ' + url); + } + + const apiKey = process.env.GOOGLE_API_KEY; + + if (apiKey) { + // Use Sheets API v4 with API key (works with "Anyone with the link" sharing) + const apiUrl = + `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/A:Z?key=${apiKey}`; + console.log('Fetching Google Sheet via Sheets API...'); + const res = await fetch(apiUrl); + if (!res.ok) { + const body = await res.text(); + throw new Error( + `Sheets API error (${res.status}): ${body.substring(0, 200)}`, + ); + } + const json = await res.json(); + const rows = json.values || []; + // Convert to CSV format + return rows + .map((row) => + row.map((cell) => { + const str = String(cell ?? ''); + return str.includes(',') || str.includes('"') || str.includes('\n') + ? '"' + str.replace(/"/g, '""') + '"' + : str; + }).join(','), + ) + .join('\n'); + } + + // Fallback: public CSV export (requires sheet to be fully public) + const csvUrl = `https://docs.google.com/spreadsheets/d/${sheetId}/export?format=csv`; + console.log('Fetching Google Sheet as CSV (public export)...'); + const res = await fetch(csvUrl, { redirect: 'follow' }); + if (!res.ok) { + throw new Error( + `Failed to fetch sheet (${res.status}). Either:\n` + + ` 1. Set GOOGLE_API_KEY in server/.env and share the sheet as "Anyone with the link"\n` + + ` 2. Or make the sheet fully public (File > Share > Anyone on the internet)`, + ); + } + return res.text(); +} + +function isGoogleSheetsUrl(str) { + return str.startsWith('https://docs.google.com/spreadsheets/'); +} + +// Main + +async function main() { + const args = process.argv.slice(2); + const force = args.includes('--force'); + const positional = args.filter((a) => a !== '--force'); + + let journeyId = positional[0]; + let source = positional[1]; + + if (!journeyId) { + journeyId = await prompt('Journey ID: '); + if (!journeyId) { + console.error('Journey ID is required.'); + process.exit(1); + } + } + if (!source) { + source = await prompt('Source (CSV file path or Google Sheets URL): '); + if (!source) { + console.error('Source is required.'); + process.exit(1); + } + } + + // 1. Verify journey exists + const journey = await prisma.eventBase.findUnique({ + where: { id: journeyId }, + include: { + challenges: { + include: { completions: { select: { id: true }, take: 1 } }, + }, + }, + }); + + if (!journey) { + console.error(`Journey not found: ${journeyId}`); + process.exit(1); + } + + console.log(`Journey: "${journey.name}" (${journey.id})`); + console.log(`Existing challenges: ${journey.challenges.length}`); + + // 2. Check for completions if challenges exist + if (journey.challenges.length > 0) { + const hasCompletions = journey.challenges.some( + (c) => c.completions.length > 0, + ); + + if (hasCompletions && !force) { + console.error( + '\nExisting challenges have user completions. ' + + 'Re-adding will DELETE completion records.', + ); + console.error('Pass --force to proceed anyway.'); + process.exit(1); + } + + if (hasCompletions) { + console.log('\n⚠ --force passed: deleting challenges with completions'); + } + + // Delete existing challenges (cascades to PrevChallenge) + const deleted = await prisma.challenge.deleteMany({ + where: { linkedEventId: journeyId }, + }); + console.log(`Deleted ${deleted.count} existing challenges`); + } + + // 3. Read and parse CSV + let csvText; + if (isGoogleSheetsUrl(source)) { + csvText = await fetchGoogleSheet(source); + } else { + csvText = fs.readFileSync(path.resolve(source), 'utf-8'); + } + const rows = parseCsv(csvText); + + if (rows.length < 2) { + console.error('CSV must have a header row and at least one data row.'); + process.exit(1); + } + + const headers = rows[0]; + const dataRows = rows.slice(1); + + // 4. Parse and validate rows + const valid = []; + const skipped = []; + + for (let i = 0; i < dataRows.length; i++) { + const cells = dataRows[i]; + // Skip fully empty rows + if (cells.every((c) => !c)) continue; + + const { challenge, missing, rawName } = parseRow(headers, cells); + + if (missing.length > 0) { + skipped.push({ row: i + 2, name: rawName, missing }); + } else { + valid.push(challenge); + } + } + + if (valid.length === 0) { + console.error('\nNo valid challenges found in CSV.'); + if (skipped.length > 0) printSkipped(skipped); + process.exit(1); + } + + // 5. Insert challenges + console.log(`\nInserting ${valid.length} challenges...`); + + const data = valid.map((c, idx) => ({ + linkedEventId: journeyId, + eventIndex: idx, + name: c.name, + description: c.description, + location: c.location, + points: c.points, + imageUrl: c.imageUrl, + latitude: c.latitude, + longitude: c.longitude, + awardingRadius: c.awardingRadius, + closeRadius: c.closeRadius, + })); + + const result = await prisma.challenge.createMany({ data }); + console.log(`Created ${result.count} challenges`); + + // 6. Print summary + if (skipped.length > 0) printSkipped(skipped); + + console.log('\nDone!'); +} + +function printSkipped(skipped) { + console.log(`\n--- Skipped ${skipped.length} row(s) ---`); + for (const s of skipped) { + console.log(` Row ${s.row}: "${s.name}" — missing: ${s.missing.join(', ')}`); + } +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(() => prisma.$disconnect()); diff --git a/scripts/updateapi-lib/apiscanner.js b/scripts/updateapi-lib/apiscanner.js index 167e209e..7103b2c7 100644 --- a/scripts/updateapi-lib/apiscanner.js +++ b/scripts/updateapi-lib/apiscanner.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.getApiDefinitions = void 0; +exports.getApiDefinitions = getApiDefinitions; const ts_morph_1 = require("ts-morph"); function getApiDefinitions() { const project = new ts_morph_1.Project({}); @@ -17,6 +17,11 @@ function getApiDefinitions() { for (const prop of clientApiDef.getType().getProperties()) { const ev = prop.getValueDeclarationOrThrow().getChildAtIndex(0).getText(); const dto = prop.getValueDeclarationOrThrow().getChildAtIndex(2).getText(); + // Skip inline object types like { event: CampusEventDto } + if (dto.startsWith("{")) { + console.log(`Client event "${ev}" uses inline object type — skipping. Use a named DTO instead.`); + continue; + } apiDefs.clientEntrypoints.set(ev, dto); } console.log(`Processed ${apiDefs.clientEntrypoints.size} client functions!`); @@ -40,13 +45,23 @@ function getApiDefinitions() { const messageBodyParam = func .getParameters() .find((param) => !!param.getDecorator("MessageBody")); - if (!messageBodyParam) { - console.log(`Function ${ev} has no @MessageBody parameter! Skipping...`); - continue; + let dto = ""; + if (messageBodyParam) { + dto = messageBodyParam.getType().getText(); + } + // Strip intersection types: "FooDto & { id: string; }" → "FooDto" + if (dto.includes("&")) { + const base = dto.split("&")[0].trim(); + console.log(`Function ${ev} uses intersection type, using base type: ${base}`); + dto = base; + } + // Strip utility types: "Omit" → "FooDto" + // ts-morph may resolve to full path like: Omit + const utilityMatch = dto.match(/^(?:Omit|Pick|Partial|Required)<(?:import\([^)]*\)\.)?(\w+)/); + if (utilityMatch) { + console.log(`Function ${ev} uses utility type, using base type: ${utilityMatch[1]}`); + dto = utilityMatch[1]; } - let dto = messageBodyParam - .getType() - .getText(); if (!func.getReturnType().getText().startsWith("Promise")) { console.log(`Function ${ev} does not return a promise/is not async! Skipping...`); continue; @@ -64,10 +79,12 @@ function getApiDefinitions() { : unionTypes[0]; } if (!(ackType.isString() || ackType.isNumber() || ackType.isBoolean())) { - console.log(`Function ${ev} does not return one of number, boolean, or string! Skipping...`); - continue; + // Use "dynamic" for complex return types instead of skipping + apiDefs.serverAcks.set(ev, "dynamic"); + } + else { + apiDefs.serverAcks.set(ev, ackType.getText()); } - apiDefs.serverAcks.set(ev, ackType.getText()); if (dto.includes(".")) { dto = dto.split(".").pop(); } @@ -81,4 +98,3 @@ function getApiDefinitions() { console.log(); return apiDefs; } -exports.getApiDefinitions = getApiDefinitions; diff --git a/scripts/updateapi-lib/apiscanner.ts b/scripts/updateapi-lib/apiscanner.ts index 75d6bdcc..6bed4b14 100644 --- a/scripts/updateapi-lib/apiscanner.ts +++ b/scripts/updateapi-lib/apiscanner.ts @@ -21,6 +21,14 @@ export function getApiDefinitions() { const ev = prop.getValueDeclarationOrThrow().getChildAtIndex(0).getText(); const dto = prop.getValueDeclarationOrThrow().getChildAtIndex(2).getText(); + // Skip inline object types like { event: CampusEventDto } + if (dto.startsWith("{")) { + console.log( + `Client event "${ev}" uses inline object type — skipping. Use a named DTO instead.` + ); + continue; + } + apiDefs.clientEntrypoints.set(ev, dto); } @@ -45,10 +53,35 @@ export function getApiDefinitions() { .asKindOrThrow(SyntaxKind.StringLiteral) .getLiteralValue(); - let dto = func - .getParameterOrThrow((param) => !!param.getDecorator("MessageBody")) - .getType() - .getText(); + const messageBodyParam = func + .getParameters() + .find((param) => !!param.getDecorator("MessageBody")); + + let dto = ""; + if (messageBodyParam) { + dto = messageBodyParam.getType().getText(); + } + + // Strip intersection types: "FooDto & { id: string; }" → "FooDto" + if (dto.includes("&")) { + const base = dto.split("&")[0].trim(); + console.log( + `Function ${ev} uses intersection type, using base type: ${base}` + ); + dto = base; + } + + // Strip utility types: "Omit" → "FooDto" + // ts-morph may resolve to full path like: Omit + const utilityMatch = dto.match( + /^(?:Omit|Pick|Partial|Required)<(?:import\([^)]*\)\.)?(\w+)/ + ); + if (utilityMatch) { + console.log( + `Function ${ev} uses utility type, using base type: ${utilityMatch[1]}` + ); + dto = utilityMatch[1]; + } if (!func.getReturnType().getText().startsWith("Promise")) { console.log( @@ -77,14 +110,12 @@ export function getApiDefinitions() { if ( !(ackType.isString() || ackType.isNumber() || ackType.isBoolean()) ) { - console.log( - `Function ${ev} does not return one of number, boolean, or string! Skipping...` - ); - continue; + // Use "dynamic" for complex return types instead of skipping + apiDefs.serverAcks.set(ev, "dynamic"); + } else { + apiDefs.serverAcks.set(ev, ackType.getText()); } - apiDefs.serverAcks.set(ev, ackType.getText()); - if (dto.includes(".")) { dto = dto.split(".").pop()!; } diff --git a/scripts/updateapi-lib/dartgen.js b/scripts/updateapi-lib/dartgen.js index 8bdebefd..54b92ed8 100644 --- a/scripts/updateapi-lib/dartgen.js +++ b/scripts/updateapi-lib/dartgen.js @@ -1,6 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.getDartServerApiFile = exports.getDartClientApiFile = exports.genDartDtoFile = void 0; +exports.genDartDtoFile = genDartDtoFile; +exports.getDartClientApiFile = getDartClientApiFile; +exports.getDartServerApiFile = getDartServerApiFile; function toDartType(tsType, tsName) { switch (tsType) { case "string": @@ -167,7 +169,6 @@ function genDartDtoFile(dtoDefs) { } return dartCode; } -exports.genDartDtoFile = genDartDtoFile; function getDartClientApiFile(apiDefs) { let dartCode = ` // CODE AUTOGENERATED BY npm run updateapi @@ -227,7 +228,6 @@ function getDartClientApiFile(apiDefs) { `; return dartCode; } -exports.getDartClientApiFile = getDartClientApiFile; function getDartServerApiFile(apiDefs) { let dartCode = ` // CODE AUTOGENERATED BY npm run updateapi @@ -277,8 +277,12 @@ function getDartServerApiFile(apiDefs) { completer.complete(arg); }; - Future.delayed(Duration(seconds: 5)) - .then((value) => completionFunc(null)); + // Set up timeout - only complete if not already completed + Future.delayed(Duration(seconds: 5)).then((value) { + if (!completer.isCompleted) { + completionFunc(null); + } + }); _refreshEv = ev; _refreshDat = data; @@ -292,13 +296,21 @@ function getDartServerApiFile(apiDefs) { `; for (const [ev, dto] of apiDefs.serverEntrypoints.entries()) { const ackType = toDartType(apiDefs.serverAcks.get(ev), "x"); - dartCode += ` + if (dto) { + dartCode += ` Future<${ackType}?> ${ev}(${dto} dto) async => await _invokeWithRefresh( "${ev}", dto.toJson()); `; + } + else { + dartCode += ` + Future<${ackType}?> ${ev}(Map dto) async => await _invokeWithRefresh( + "${ev}", dto); + + `; + } } dartCode += "}"; return dartCode; } -exports.getDartServerApiFile = getDartServerApiFile; diff --git a/scripts/updateapi-lib/dartgen.ts b/scripts/updateapi-lib/dartgen.ts index ae2d4ad6..bc715f48 100644 --- a/scripts/updateapi-lib/dartgen.ts +++ b/scripts/updateapi-lib/dartgen.ts @@ -306,11 +306,19 @@ export function getDartServerApiFile(apiDefs: ApiDefs) { for (const [ev, dto] of apiDefs.serverEntrypoints.entries()) { const ackType = toDartType(apiDefs.serverAcks.get(ev)!, "x"); - dartCode += ` + if (dto) { + dartCode += ` Future<${ackType}?> ${ev}(${dto} dto) async => await _invokeWithRefresh( "${ev}", dto.toJson()); `; + } else { + dartCode += ` + Future<${ackType}?> ${ev}(Map dto) async => await _invokeWithRefresh( + "${ev}", dto); + + `; + } } dartCode += "}"; diff --git a/scripts/updateapi-lib/dtoscanner.js b/scripts/updateapi-lib/dtoscanner.js index f3a9f7d2..f073733f 100644 --- a/scripts/updateapi-lib/dtoscanner.js +++ b/scripts/updateapi-lib/dtoscanner.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.getDtoDefinitions = void 0; +exports.getDtoDefinitions = getDtoDefinitions; const ts_morph_1 = require("ts-morph"); function getDtoDefinitions() { const project = new ts_morph_1.Project({}); @@ -12,11 +12,40 @@ function getDtoDefinitions() { for (const file of project.getSourceFiles()) { const interfs = file.getInterfaces(); const enums = file.getEnums(); + // Count as const objects that qualify as enums + let constEnumCount = 0; console.log(`${file.getBaseName()}: ${enums.length} enums, ${interfs.length} DTOs`); for (const enum_ of enums) { const vals = enum_.getMembers().map((val) => val.getName()); enumDtos.set(enum_.getName(), vals); } + // Support `as const` objects as enums: + // const FooDto = { A: 'A', B: 'B' } as const; + for (const varStmt of file.getVariableStatements()) { + for (const decl of varStmt.getDeclarations()) { + const init = decl.getInitializer(); + if (init?.getKind() === ts_morph_1.SyntaxKind.AsExpression) { + const inner = init.getChildAtIndex(0); + if (inner.getKind() === ts_morph_1.SyntaxKind.ObjectLiteralExpression) { + const name = decl.getName(); + if (name.endsWith("Dto")) { + const props = inner + .asKindOrThrow(ts_morph_1.SyntaxKind.ObjectLiteralExpression) + .getProperties() + .filter((p) => p.getKind() === ts_morph_1.SyntaxKind.PropertyAssignment) + .map((p) => p.asKindOrThrow(ts_morph_1.SyntaxKind.PropertyAssignment).getName()); + if (props.length > 0) { + enumDtos.set(name, props); + constEnumCount++; + } + } + } + } + } + } + if (constEnumCount > 0) { + console.log(` (also found ${constEnumCount} 'as const' enum${constEnumCount > 1 ? "s" : ""})`); + } for (const interf of interfs) { const props = interf.getProperties(); const baseDto = new Map(); @@ -45,7 +74,7 @@ function getDtoDefinitions() { } else if (propType.isBoolean() || propType.getArrayElementType()?.isBoolean()) { - // num + // bool baseDto.set(propName, [ "boolean", propType.isArray() ? "PRIMITIVE[]" : "PRIMITIVE", @@ -74,19 +103,60 @@ function getDtoDefinitions() { } else if (propType.isUnion() || propType.getArrayElementType()?.isUnion()) { - // enum - const enumName = interfName.replace("Dto", "") + - propName[0].toUpperCase() + - propName.substring(1) + - "Dto"; - enumDtos.set(enumName, propType - .getUnionTypes() - .map((t) => t.getLiteralValue()?.toString() ?? "")); - baseDto.set(propName, [ - enumName, - propType.isArray() ? "ENUM_DTO[]" : "ENUM_DTO", - isOptional, - ]); + const unionTypes = propType.isArray() + ? propType.getArrayElementTypeOrThrow().getUnionTypes() + : propType.getUnionTypes(); + // Filter out null/undefined from the union + const nonNullTypes = unionTypes.filter((t) => !t.isNull() && !t.isUndefined()); + // Collect string literal values + const literalValues = nonNullTypes + .map((t) => t.getLiteralValue()?.toString()) + .filter((v) => v !== undefined && v !== ""); + if (literalValues.length > 0) { + // String literal union → generate enum (existing behavior) + const enumName = interfName.replace("Dto", "") + + propName[0].toUpperCase() + + propName.substring(1) + + "Dto"; + enumDtos.set(enumName, literalValues); + baseDto.set(propName, [ + enumName, + propType.isArray() ? "ENUM_DTO[]" : "ENUM_DTO", + isOptional, + ]); + } + else { + // Union of DTOs/objects (e.g. `FooDto | { id: string }`) + // Use the first named interface/enum type in the union + const namedType = nonNullTypes.find((t) => t.isInterface() || t.isEnum()); + if (namedType) { + let name = namedType.getText(); + if (name.includes(".")) + name = name.split(".").pop(); + const isEnum = namedType.isEnum(); + const fieldType = propType.isArray() + ? isEnum + ? "ENUM_DTO[]" + : "DEPENDENT_DTO[]" + : isEnum + ? "ENUM_DTO" + : "DEPENDENT_DTO"; + baseDto.set(propName, [name, fieldType, isOptional]); + } + else if (nonNullTypes.length === 1 && nonNullTypes[0].isNumber()) { + // number | null → treat as optional number + baseDto.set(propName, ["number", "PRIMITIVE", true]); + } + else if (nonNullTypes.length === 1 && nonNullTypes[0].isString()) { + // string | null → treat as optional string + baseDto.set(propName, ["string", "PRIMITIVE", true]); + } + else if (nonNullTypes.length === 1 && nonNullTypes[0].isBoolean()) { + // boolean | null → treat as optional boolean + baseDto.set(propName, ["boolean", "PRIMITIVE", true]); + } + // else: skip field entirely (can't represent it) + } } } } @@ -94,4 +164,3 @@ function getDtoDefinitions() { console.log(); return { enumDtos, baseDtos }; } -exports.getDtoDefinitions = getDtoDefinitions; diff --git a/scripts/updateapi-lib/dtoscanner.ts b/scripts/updateapi-lib/dtoscanner.ts index c4d40e60..c19cea67 100644 --- a/scripts/updateapi-lib/dtoscanner.ts +++ b/scripts/updateapi-lib/dtoscanner.ts @@ -1,4 +1,4 @@ -import { Project } from "ts-morph"; +import { Project, SyntaxKind } from "ts-morph"; import { BaseDto, DtoDefs, EnumDto, FieldType } from "./types"; export function getDtoDefinitions(): DtoDefs { @@ -16,6 +16,9 @@ export function getDtoDefinitions(): DtoDefs { const interfs = file.getInterfaces(); const enums = file.getEnums(); + // Count as const objects that qualify as enums + let constEnumCount = 0; + console.log( `${file.getBaseName()}: ${enums.length} enums, ${interfs.length} DTOs` ); @@ -25,6 +28,41 @@ export function getDtoDefinitions(): DtoDefs { enumDtos.set(enum_.getName(), vals); } + // Support `as const` objects as enums: + // const FooDto = { A: 'A', B: 'B' } as const; + for (const varStmt of file.getVariableStatements()) { + for (const decl of varStmt.getDeclarations()) { + const init = decl.getInitializer(); + if (init?.getKind() === SyntaxKind.AsExpression) { + const inner = init.getChildAtIndex(0); + if (inner.getKind() === SyntaxKind.ObjectLiteralExpression) { + const name = decl.getName(); + if (name.endsWith("Dto")) { + const props = inner + .asKindOrThrow(SyntaxKind.ObjectLiteralExpression) + .getProperties() + .filter( + (p) => p.getKind() === SyntaxKind.PropertyAssignment + ) + .map((p) => + p.asKindOrThrow(SyntaxKind.PropertyAssignment).getName() + ); + if (props.length > 0) { + enumDtos.set(name, props); + constEnumCount++; + } + } + } + } + } + } + + if (constEnumCount > 0) { + console.log( + ` (also found ${constEnumCount} 'as const' enum${constEnumCount > 1 ? "s" : ""})` + ); + } + for (const interf of interfs) { const props = interf.getProperties(); const baseDto = new Map(); @@ -57,7 +95,7 @@ export function getDtoDefinitions(): DtoDefs { propType.isBoolean() || propType.getArrayElementType()?.isBoolean() ) { - // num + // bool baseDto.set(propName, [ "boolean", propType.isArray() ? "PRIMITIVE[]" : "PRIMITIVE", @@ -93,25 +131,66 @@ export function getDtoDefinitions(): DtoDefs { propType.isUnion() || propType.getArrayElementType()?.isUnion() ) { - // enum - const enumName = - interfName.replace("Dto", "") + - propName[0].toUpperCase() + - propName.substring(1) + - "Dto"; - - enumDtos.set( - enumName, - propType - .getUnionTypes() - .map((t) => t.getLiteralValue()?.toString() ?? "") + const unionTypes = propType.isArray() + ? propType.getArrayElementTypeOrThrow().getUnionTypes() + : propType.getUnionTypes(); + + // Filter out null/undefined from the union + const nonNullTypes = unionTypes.filter( + (t) => !t.isNull() && !t.isUndefined() ); - baseDto.set(propName, [ - enumName, - propType.isArray() ? "ENUM_DTO[]" : "ENUM_DTO", - isOptional, - ]); + // Collect string literal values + const literalValues = nonNullTypes + .map((t) => t.getLiteralValue()?.toString()) + .filter((v): v is string => v !== undefined && v !== ""); + + if (literalValues.length > 0) { + // String literal union → generate enum (existing behavior) + const enumName = + interfName.replace("Dto", "") + + propName[0].toUpperCase() + + propName.substring(1) + + "Dto"; + + enumDtos.set(enumName, literalValues); + baseDto.set(propName, [ + enumName, + propType.isArray() ? "ENUM_DTO[]" : "ENUM_DTO", + isOptional, + ]); + } else { + // Union of DTOs/objects (e.g. `FooDto | { id: string }`) + // Use the first named interface/enum type in the union + const namedType = nonNullTypes.find( + (t) => t.isInterface() || t.isEnum() + ); + if (namedType) { + let name = namedType.getText(); + if (name.includes(".")) name = name.split(".").pop()!; + + const isEnum = namedType.isEnum(); + const fieldType = propType.isArray() + ? isEnum + ? "ENUM_DTO[]" + : "DEPENDENT_DTO[]" + : isEnum + ? "ENUM_DTO" + : "DEPENDENT_DTO"; + + baseDto.set(propName, [name, fieldType, isOptional]); + } else if (nonNullTypes.length === 1 && nonNullTypes[0].isNumber()) { + // number | null → treat as optional number + baseDto.set(propName, ["number", "PRIMITIVE", true]); + } else if (nonNullTypes.length === 1 && nonNullTypes[0].isString()) { + // string | null → treat as optional string + baseDto.set(propName, ["string", "PRIMITIVE", true]); + } else if (nonNullTypes.length === 1 && nonNullTypes[0].isBoolean()) { + // boolean | null → treat as optional boolean + baseDto.set(propName, ["boolean", "PRIMITIVE", true]); + } + // else: skip field entirely (can't represent it) + } } } } diff --git a/scripts/updateapi-lib/tsgen.js b/scripts/updateapi-lib/tsgen.js index 01b624bc..4804976c 100644 --- a/scripts/updateapi-lib/tsgen.js +++ b/scripts/updateapi-lib/tsgen.js @@ -1,6 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.getAdminApiFile = exports.genTsDtoFile = void 0; +exports.genTsDtoFile = genTsDtoFile; +exports.getAdminApiFile = getAdminApiFile; function genTsDtoFile(dtoDefs) { let tsCode = ` // CODE AUTOGENERATED BY npm run updateapi @@ -31,7 +32,6 @@ function genTsDtoFile(dtoDefs) { } return tsCode; } -exports.genTsDtoFile = genTsDtoFile; function getAdminApiFile(apiDefs) { let tsCode = ` // CODE AUTOGENERATED BY npm run updateapi @@ -51,13 +51,24 @@ function getAdminApiFile(apiDefs) { `; for (const [ev, dto] of apiDefs.serverEntrypoints.entries()) { - const ackType = apiDefs.serverAcks.get(ev); - tsCode += ` + const rawAckType = apiDefs.serverAcks.get(ev); + const ackType = rawAckType === "dynamic" ? "any" : rawAckType; + if (dto) { + tsCode += ` ${ev}(data: dto.${dto}) { return this.send("${ev}", data) as Promise<${ackType} | undefined>; } `; + } + else { + tsCode += ` + ${ev}() { + return this.send("${ev}", {}) as Promise<${ackType} | undefined>; + } + + `; + } } for (const [ev, dto] of apiDefs.clientEntrypoints.entries()) { const formattedName = ev[0].toUpperCase() + ev.substring(1); @@ -72,4 +83,3 @@ function getAdminApiFile(apiDefs) { tsCode += "}"; return tsCode; } -exports.getAdminApiFile = getAdminApiFile; diff --git a/scripts/updateapi-lib/tsgen.ts b/scripts/updateapi-lib/tsgen.ts index c7abcf23..c7265a33 100644 --- a/scripts/updateapi-lib/tsgen.ts +++ b/scripts/updateapi-lib/tsgen.ts @@ -61,13 +61,23 @@ export function getAdminApiFile(apiDefs: ApiDefs) { `; for (const [ev, dto] of apiDefs.serverEntrypoints.entries()) { - const ackType = apiDefs.serverAcks.get(ev); - tsCode += ` + const rawAckType = apiDefs.serverAcks.get(ev); + const ackType = rawAckType === "dynamic" ? "any" : rawAckType; + if (dto) { + tsCode += ` ${ev}(data: dto.${dto}) { return this.send("${ev}", data) as Promise<${ackType} | undefined>; } `; + } else { + tsCode += ` + ${ev}() { + return this.send("${ev}", {}) as Promise<${ackType} | undefined>; + } + + `; + } } for (const [ev, dto] of apiDefs.clientEntrypoints.entries()) { diff --git a/server/.env.example b/server/.env.example index 9c820335..7aefa19c 100644 --- a/server/.env.example +++ b/server/.env.example @@ -26,3 +26,6 @@ SUPERUSER=admin123@cornell.edu FIREBASE_PROJECT_ID=cornell-go FIREBASE_CLIENT_EMAIL=your-firebase-adminsdk-email@cornell-go.iam.gserviceaccount.com FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nYOUR_PRIVATE_KEY_HERE\n-----END PRIVATE KEY-----\n" + +# Feature Flags +ENABLE_BUILD_A_BEAR=false diff --git a/server/package-lock.json b/server/package-lock.json index 7e024cdc..38650695 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -10,7 +10,7 @@ "license": "UNLICENSED", "dependencies": { "@casl/ability": "^6.7.0", - "@casl/prisma": "^1.4.1", + "@casl/prisma": "1.5.2", "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.2.2", "@nestjs/core": "^10.3.8", @@ -51,6 +51,7 @@ "@types/node": "^20.19.11", "@types/supertest": "^2.0.12", "@types/uuid": "^8.3.4", + "@types/ws": "^8.5.10", "@typescript-eslint/eslint-plugin": "^4.33.0", "@typescript-eslint/parser": "^4.33.0", "eslint": "^7.32.0", @@ -69,9 +70,8 @@ }, "node_modules/@angular-devkit/core": { "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.0.1.tgz", - "integrity": "sha512-2uz98IqkKJlgnHbWQ7VeL4pb+snGAZXIama2KXi+k9GsRntdcw+udX8rL3G9SdUGUF+m6+147Y1oRBMHsO/v4w==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -95,9 +95,8 @@ }, "node_modules/@angular-devkit/core/node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -111,24 +110,21 @@ }, "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@angular-devkit/core/node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@angular-devkit/schematics": { "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.0.1.tgz", - "integrity": "sha512-A9D0LTYmiqiBa90GKcSuWb7hUouGIbm/AHbJbjL85WLLRbQA2PwKl7P5Mpd6nS/ZC0kfG4VQY3VOaDvb3qpI9g==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "16.0.1", "jsonc-parser": "3.2.0", @@ -144,9 +140,8 @@ }, "node_modules/@angular-devkit/schematics-cli": { "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-16.0.1.tgz", - "integrity": "sha512-6KLA125dpgd6oJGtiO2JpZAb92uOG3njQGIt7NFcuQGW/5GO7J41vMXH9cBAfdtbV8SIggSmR/cIEE9ijfj6YQ==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "16.0.1", "@angular-devkit/schematics": "16.0.1", @@ -166,18 +161,16 @@ }, "node_modules/@angular-devkit/schematics-cli/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/@angular-devkit/schematics-cli/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", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -190,9 +183,8 @@ }, "node_modules/@angular-devkit/schematics-cli/node_modules/inquirer": { "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -216,36 +208,33 @@ }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@babel/code-frame": { "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.10.4" } }, "node_modules/@babel/compat-data": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", - "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", - "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -273,9 +262,8 @@ }, "node_modules/@babel/core/node_modules/@babel/code-frame": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -287,18 +275,16 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", @@ -312,9 +298,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", @@ -328,42 +313,37 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@babel/helper-globals": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" @@ -374,9 +354,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", @@ -391,45 +370,40 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" @@ -440,9 +414,8 @@ }, "node_modules/@babel/highlight": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -455,9 +428,8 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -467,9 +439,8 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -481,42 +452,37 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -526,9 +492,8 @@ }, "node_modules/@babel/parser": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.28.4" }, @@ -541,9 +506,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -553,9 +517,8 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -565,9 +528,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -577,9 +539,8 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -592,9 +553,8 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -607,9 +567,8 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -619,9 +578,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -631,9 +589,8 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -646,9 +603,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -658,9 +614,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -670,9 +625,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -682,9 +636,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -694,9 +647,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -706,9 +658,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -718,9 +669,8 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -733,9 +683,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -748,9 +697,8 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -763,9 +711,8 @@ }, "node_modules/@babel/template": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", @@ -777,9 +724,8 @@ }, "node_modules/@babel/template/node_modules/@babel/code-frame": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -791,9 +737,8 @@ }, "node_modules/@babel/traverse": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -809,9 +754,8 @@ }, "node_modules/@babel/traverse/node_modules/@babel/code-frame": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -823,9 +767,8 @@ }, "node_modules/@babel/types": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" @@ -836,14 +779,12 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@borewit/text-codec": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.1.1.tgz", - "integrity": "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/Borewit" @@ -851,8 +792,8 @@ }, "node_modules/@casl/ability": { "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@casl/ability/-/ability-6.7.3.tgz", - "integrity": "sha512-A4L28Ko+phJAsTDhRjzCOZWECQWN2jzZnJPnROWWHjJpyMq1h7h9ZqjwS2WbIUa3Z474X1ZPSgW0f1PboZGC0A==", + "license": "MIT", + "peer": true, "dependencies": { "@ucast/mongo2js": "^1.3.0" }, @@ -862,8 +803,7 @@ }, "node_modules/@casl/prisma": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@casl/prisma/-/prisma-1.5.2.tgz", - "integrity": "sha512-AY9IM3hRG0HBsJXczuk2gkYvLmf+UvZO6107WHjIYvPRqIxU9Wz3f+OsbzqAVGUOWYU2y0aE8xfzcX3nkFwIoQ==", + "license": "MIT", "dependencies": { "@ucast/core": "^1.10.0", "@ucast/js": "^3.0.1" @@ -875,9 +815,8 @@ }, "node_modules/@colors/colors": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" @@ -885,9 +824,8 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -897,9 +835,8 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -907,9 +844,8 @@ }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -927,41 +863,30 @@ }, "node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/@fastify/busboy": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", - "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", "license": "MIT" }, "node_modules/@firebase/app-check-interop-types": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", - "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==", "license": "Apache-2.0" }, "node_modules/@firebase/app-types": { "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", - "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", "license": "Apache-2.0" }, "node_modules/@firebase/auth-interop-types": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", - "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==", "license": "Apache-2.0" }, "node_modules/@firebase/component": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.0.tgz", - "integrity": "sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==", "license": "Apache-2.0", "dependencies": { "@firebase/util": "1.13.0", @@ -973,8 +898,6 @@ }, "node_modules/@firebase/database": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.0.tgz", - "integrity": "sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==", "license": "Apache-2.0", "dependencies": { "@firebase/app-check-interop-types": "0.3.3", @@ -991,8 +914,6 @@ }, "node_modules/@firebase/database-compat": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.0.tgz", - "integrity": "sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.7.0", @@ -1008,8 +929,6 @@ }, "node_modules/@firebase/database-types": { "version": "1.0.16", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.16.tgz", - "integrity": "sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==", "license": "Apache-2.0", "dependencies": { "@firebase/app-types": "0.9.3", @@ -1018,8 +937,6 @@ }, "node_modules/@firebase/logger": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.0.tgz", - "integrity": "sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -1030,8 +947,6 @@ }, "node_modules/@firebase/util": { "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.13.0.tgz", - "integrity": "sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -1043,8 +958,7 @@ }, "node_modules/@gerrit0/mini-shiki": { "version": "1.27.2", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz", - "integrity": "sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==", + "license": "MIT", "dependencies": { "@shikijs/engine-oniguruma": "^1.27.2", "@shikijs/types": "^1.27.2", @@ -1053,8 +967,6 @@ }, "node_modules/@google-cloud/firestore": { "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz", - "integrity": "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1070,8 +982,6 @@ }, "node_modules/@google-cloud/paginator": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", - "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1084,8 +994,6 @@ }, "node_modules/@google-cloud/paginator/node_modules/arrify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "license": "MIT", "optional": true, "engines": { @@ -1094,8 +1002,6 @@ }, "node_modules/@google-cloud/projectify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", "license": "Apache-2.0", "optional": true, "engines": { @@ -1104,8 +1010,6 @@ }, "node_modules/@google-cloud/promisify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", "license": "Apache-2.0", "optional": true, "engines": { @@ -1114,8 +1018,6 @@ }, "node_modules/@google-cloud/storage": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.18.0.tgz", - "integrity": "sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1141,8 +1043,6 @@ }, "node_modules/@google-cloud/storage/node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "optional": true, "engines": { @@ -1151,8 +1051,6 @@ }, "node_modules/@google-cloud/storage/node_modules/gaxios": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1168,8 +1066,6 @@ }, "node_modules/@google-cloud/storage/node_modules/gaxios/node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -1182,8 +1078,6 @@ }, "node_modules/@google-cloud/storage/node_modules/gcp-metadata": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1197,8 +1091,6 @@ }, "node_modules/@google-cloud/storage/node_modules/google-auth-library": { "version": "9.15.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", - "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1215,8 +1107,6 @@ }, "node_modules/@google-cloud/storage/node_modules/gtoken": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", "license": "MIT", "optional": true, "dependencies": { @@ -1229,8 +1119,6 @@ }, "node_modules/@google-cloud/storage/node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "optional": true, "dependencies": { @@ -1243,8 +1131,6 @@ }, "node_modules/@google-cloud/storage/node_modules/mime": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "license": "MIT", "optional": true, "bin": { @@ -1256,8 +1142,6 @@ }, "node_modules/@grpc/grpc-js": { "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.2.tgz", - "integrity": "sha512-QzVUtEFyu05UNx2xr0fCQmStUO17uVQhGNowtxs00IgTZT6/W2PBLfUkj30s0FKJ29VtTa3ArVNIhNP6akQhqA==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1270,8 +1154,6 @@ }, "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", - "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1289,8 +1171,6 @@ }, "node_modules/@grpc/proto-loader": { "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1308,10 +1188,8 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -1323,16 +1201,13 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -1346,27 +1221,24 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/console": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -1381,9 +1253,8 @@ }, "node_modules/@jest/core": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -1428,9 +1299,8 @@ }, "node_modules/@jest/environment": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -1443,9 +1313,8 @@ }, "node_modules/@jest/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -1456,9 +1325,8 @@ }, "node_modules/@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1468,9 +1336,8 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -1485,9 +1352,8 @@ }, "node_modules/@jest/globals": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -1500,9 +1366,8 @@ }, "node_modules/@jest/reporters": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, + "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -1543,9 +1408,8 @@ }, "node_modules/@jest/reporters/node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -1558,9 +1422,8 @@ }, "node_modules/@jest/reporters/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1573,9 +1436,8 @@ }, "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -1585,9 +1447,8 @@ }, "node_modules/@jest/source-map": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -1599,18 +1460,16 @@ }, "node_modules/@jest/source-map/node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@jest/test-result": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -1623,9 +1482,8 @@ }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -1638,9 +1496,8 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -1664,9 +1521,8 @@ }, "node_modules/@jest/transform/node_modules/write-file-atomic": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -1677,9 +1533,8 @@ }, "node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -1694,9 +1549,8 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" @@ -1704,9 +1558,8 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -1714,18 +1567,16 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -1733,15 +1584,13 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1749,8 +1598,6 @@ }, "node_modules/@js-sdsl/ordered-map": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", "license": "MIT", "optional": true, "funding": { @@ -1760,17 +1607,15 @@ }, "node_modules/@lukeed/csprng": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@nestjs/cli": { "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.5.0.tgz", - "integrity": "sha512-Z7q+3vNsQSG2d2r2Hl/OOj5EpfjVx3OfnJ9+KuAsOdw1sKLm7+Zc6KbhMFTd/eIvfx82ww3Nk72xdmfPYCulWA==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "16.0.1", "@angular-devkit/schematics": "16.0.1", @@ -1804,9 +1649,8 @@ }, "node_modules/@nestjs/cli/node_modules/@nestjs/schematics": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-9.2.0.tgz", - "integrity": "sha512-wHpNJDPzM6XtZUOB3gW0J6mkFCSJilzCM3XrHI1o0C8vZmFE1snbmkIXNyoi1eV0Nxh1BMymcgz5vIMJgQtTqw==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "16.0.1", "@angular-devkit/schematics": "16.0.1", @@ -1819,18 +1663,16 @@ }, "node_modules/@nestjs/cli/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@nestjs/cli/node_modules/glob": { "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", @@ -1846,9 +1688,8 @@ }, "node_modules/@nestjs/cli/node_modules/minimatch": { "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1861,9 +1702,8 @@ }, "node_modules/@nestjs/cli/node_modules/rimraf": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^9.2.0" }, @@ -1879,18 +1719,16 @@ }, "node_modules/@nestjs/cli/node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@nestjs/cli/node_modules/tsconfig-paths": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, + "license": "MIT", "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -1902,9 +1740,9 @@ }, "node_modules/@nestjs/cli/node_modules/typescript": { "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, + "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1915,8 +1753,8 @@ }, "node_modules/@nestjs/common": { "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.20.tgz", - "integrity": "sha512-hxJxZF7jcKGuUzM9EYbuES80Z/36piJbiqmPy86mk8qOn5gglFebBTvcx7PWVbRNSb4gngASYnefBj/Y2HAzpQ==", + "license": "MIT", + "peer": true, "dependencies": { "file-type": "20.4.1", "iterare": "1.2.1", @@ -1944,8 +1782,7 @@ }, "node_modules/@nestjs/config": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.3.0.tgz", - "integrity": "sha512-pdGTp8m9d0ZCrjTpjkUbZx6gyf2IKf+7zlkrPNMsJzYZ4bFRRTpXrnj+556/5uiI6AfL5mMrJc2u7dB6bvM+VA==", + "license": "MIT", "dependencies": { "dotenv": "16.4.5", "dotenv-expand": "10.0.0", @@ -1958,8 +1795,7 @@ }, "node_modules/@nestjs/config/node_modules/dotenv": { "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -1969,9 +1805,9 @@ }, "node_modules/@nestjs/core": { "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.4.20.tgz", - "integrity": "sha512-kRdtyKA3+Tu70N3RQ4JgmO1E3LzAMs/eppj7SfjabC7TgqNWoS4RLhWl4BqmsNVmjj6D5jgfPVtHtgYkU3AfpQ==", "hasInstallScript": true, + "license": "MIT", + "peer": true, "dependencies": { "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.1.1", @@ -2006,8 +1842,7 @@ }, "node_modules/@nestjs/jwt": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-10.2.0.tgz", - "integrity": "sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==", + "license": "MIT", "dependencies": { "@types/jsonwebtoken": "9.0.5", "jsonwebtoken": "9.0.2" @@ -2018,8 +1853,8 @@ }, "node_modules/@nestjs/platform-express": { "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.4.20.tgz", - "integrity": "sha512-rh97mX3rimyf4xLMLHuTOBKe6UD8LOJ14VlJ1F/PTd6C6ZK9Ak6EHuJvdaGcSFQhd3ZMBh3I6CuujKGW9pNdIg==", + "license": "MIT", + "peer": true, "dependencies": { "body-parser": "1.20.3", "cors": "2.8.5", @@ -2038,8 +1873,8 @@ }, "node_modules/@nestjs/platform-socket.io": { "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/platform-socket.io/-/platform-socket.io-10.4.20.tgz", - "integrity": "sha512-8wqJ7kJnvRC6T1o1U3NNnuzjaMJU43R4hvzKKba7GSdMN6j2Jfzz/vq5gHDx9xbXOAmfsc9bvaIiZegXxvHoJA==", + "license": "MIT", + "peer": true, "dependencies": { "socket.io": "4.8.1", "tslib": "2.8.1" @@ -2056,8 +1891,6 @@ }, "node_modules/@nestjs/schedule": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-6.1.1.tgz", - "integrity": "sha512-kQl1RRgi02GJ0uaUGCrXHCcwISsCsJDciCKe38ykJZgnAeeoeVWs8luWtBo4AqAAXm4nS5K8RlV0smHUJ4+2FA==", "license": "MIT", "dependencies": { "cron": "4.4.0" @@ -2069,9 +1902,8 @@ }, "node_modules/@nestjs/schematics": { "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.2.3.tgz", - "integrity": "sha512-4e8gxaCk7DhBxVUly2PjYL4xC2ifDFexCqq1/u4TtivLGXotVk0wHdYuPYe1tHTHuR1lsOkRbfOCpkdTnigLVg==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "17.3.11", "@angular-devkit/schematics": "17.3.11", @@ -2085,9 +1917,8 @@ }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { "version": "17.3.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.11.tgz", - "integrity": "sha512-vTNDYNsLIWpYk2I969LMQFH29GTsLzxNk/0cLw5q56ARF0v5sIWfHYwGTS88jdDqIpuuettcSczbxeA7EuAmqQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -2112,15 +1943,13 @@ }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core/node_modules/jsonc-parser": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { "version": "17.3.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.11.tgz", - "integrity": "sha512-I5wviiIqiFwar9Pdk30Lujk8FczEEc18i22A5c6Z9lbmhPQdTroDnEQdsfXjy404wPe8H62s0I15o4pmMGfTYQ==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "17.3.11", "jsonc-parser": "3.2.1", @@ -2136,15 +1965,13 @@ }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics/node_modules/jsonc-parser": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@nestjs/schematics/node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -2158,21 +1985,18 @@ }, "node_modules/@nestjs/schematics/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@nestjs/schematics/node_modules/jsonc-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@nestjs/schematics/node_modules/magic-string": { "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -2182,9 +2006,8 @@ }, "node_modules/@nestjs/schematics/node_modules/picomatch": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", - "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -2194,17 +2017,15 @@ }, "node_modules/@nestjs/schematics/node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@nestjs/serve-static": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-4.0.2.tgz", - "integrity": "sha512-cT0vdWN5ar7jDI2NKbhf4LcwJzU4vS5sVpMkVrHuyLcltbrz6JdGi1TfIMMatP2pNiq5Ie/uUdPSFDVaZX/URQ==", + "license": "MIT", "dependencies": { "path-to-regexp": "0.2.5" }, @@ -2229,14 +2050,12 @@ }, "node_modules/@nestjs/serve-static/node_modules/path-to-regexp": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.2.5.tgz", - "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==" + "license": "MIT" }, "node_modules/@nestjs/testing": { "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.4.20.tgz", - "integrity": "sha512-nMkRDukDKskdPruM6EsgMq7yJua+CPZM6I6FrLP8yXw8BiVSPv9Nm0CtcGGwt3kgZF9hfxKjGqLjsvVBsv6Vfw==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "2.8.1" }, @@ -2261,8 +2080,8 @@ }, "node_modules/@nestjs/websockets": { "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-10.4.20.tgz", - "integrity": "sha512-tafsPPvQfAXc+cfxvuRDzS5V+Ixg8uVJq8xSocU24yVl/Xp6ajmhqiGiaVjYOX8mXY0NV836QwEZxHF7WvKHSw==", + "license": "MIT", + "peer": true, "dependencies": { "iterare": "1.2.1", "object-hash": "3.0.0", @@ -2283,9 +2102,8 @@ }, "node_modules/@noble/hashes": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "dev": true, + "license": "MIT", "engines": { "node": "^14.21.3 || >=16" }, @@ -2295,8 +2113,7 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2307,16 +2124,14 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2327,8 +2142,7 @@ }, "node_modules/@nuxtjs/opencollective": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "consola": "^2.15.0", @@ -2344,8 +2158,6 @@ }, "node_modules/@opentelemetry/api": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", "optional": true, "engines": { @@ -2354,17 +2166,14 @@ }, "node_modules/@paralleldrive/cuid2": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", - "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", "dev": true, + "license": "MIT", "dependencies": { "@noble/hashes": "^1.1.5" } }, "node_modules/@prisma/client": { "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.10.2.tgz", - "integrity": "sha512-ef49hzB2yJZCvM5gFHMxSFL9KYrIP9udpT5rYo0CsHD4P9IKj473MbhU1gjKKftiwWBTIyrt9jukprzZXazyag==", "hasInstallScript": true, "license": "Apache-2.0", "peer": true, @@ -2382,15 +2191,11 @@ }, "node_modules/@prisma/debug": { "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.10.2.tgz", - "integrity": "sha512-bkBOmH9dpEBbMKFJj8V+Zp8IZHIBjy3fSyhLhxj4FmKGb/UBSt9doyfA6k1UeUREsMJft7xgPYBbHSOYBr8XCA==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.10.2.tgz", - "integrity": "sha512-HkSJvix6PW8YqEEt3zHfCYYJY69CXsNdhU+wna+4Y7EZ+AwzeupMnUThmvaDA7uqswiHkgm5/SZ6/4CStjaGmw==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -2403,15 +2208,11 @@ }, "node_modules/@prisma/engines-version": { "version": "5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9.tgz", - "integrity": "sha512-uCy/++3Jx/O3ufM+qv2H1L4tOemTNqcP/gyEVOlZqTpBvYJUe0tWtW0y3o2Ueq04mll4aM5X3f6ugQftOSLdFQ==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.10.2.tgz", - "integrity": "sha512-dSmXcqSt6DpTmMaLQ9K8ZKzVAMH3qwGCmYEZr/uVnzVhxRJ1EbT/w2MMwIdBNq1zT69Rvh0h75WMIi0mrIw7Hg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -2422,8 +2223,6 @@ }, "node_modules/@prisma/get-platform": { "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.10.2.tgz", - "integrity": "sha512-nqXP6vHiY2PIsebBAuDeWiUYg8h8mfjBckHh6Jezuwej0QJNnjDiOq30uesmg+JXxGk99nqyG3B7wpcOODzXvg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -2432,36 +2231,26 @@ }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "license": "BSD-3-Clause", "optional": true }, "node_modules/@protobufjs/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", "license": "BSD-3-Clause", "optional": true }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", "license": "BSD-3-Clause", "optional": true }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", "license": "BSD-3-Clause", "optional": true }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "license": "BSD-3-Clause", "optional": true, "dependencies": { @@ -2471,43 +2260,32 @@ }, "node_modules/@protobufjs/float": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "license": "BSD-3-Clause", "optional": true }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", "license": "BSD-3-Clause", "optional": true }, "node_modules/@protobufjs/path": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", "license": "BSD-3-Clause", "optional": true }, "node_modules/@protobufjs/pool": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", "license": "BSD-3-Clause", "optional": true }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "license": "BSD-3-Clause", "optional": true }, "node_modules/@shikijs/engine-oniguruma": { "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", - "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", + "license": "MIT", "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1" @@ -2515,8 +2293,7 @@ }, "node_modules/@shikijs/types": { "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", - "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" @@ -2524,42 +2301,36 @@ }, "node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==" + "license": "MIT" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + "license": "MIT" }, "node_modules/@tokenizer/inflate": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", - "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==", + "license": "MIT", "dependencies": { "debug": "^4.4.0", "fflate": "^0.8.2", @@ -2575,13 +2346,10 @@ }, "node_modules/@tokenizer/token": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + "license": "MIT" }, "node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "license": "MIT", "optional": true, "engines": { @@ -2590,33 +2358,28 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -2627,18 +2390,16 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -2646,17 +2407,15 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.28.2" } }, "node_modules/@types/body-parser": { "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -2664,38 +2423,32 @@ }, "node_modules/@types/caseless": { "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", "license": "MIT", "optional": true }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/cookiejar": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/cors": { "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/eslint": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -2703,9 +2456,8 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -2713,14 +2465,12 @@ }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -2730,8 +2480,7 @@ }, "node_modules/@types/express-serve-static-core": { "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -2741,60 +2490,52 @@ }, "node_modules/@types/geojson": { "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==" + "license": "MIT" }, "node_modules/@types/graceful-fs": { "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/hast": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/http-errors": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==" + "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -2802,75 +2543,62 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/jsonwebtoken": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", - "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/luxon": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz", - "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==", - "license": "MIT" "node_modules/@types/long": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", "license": "MIT", "optional": true }, + "node_modules/@types/luxon": { + "version": "3.7.1", + "license": "MIT" + }, "node_modules/@types/methods": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + "license": "MIT" }, "node_modules/@types/node": { "version": "20.19.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.11.tgz", - "integrity": "sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==", + "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } }, "node_modules/@types/parse-json": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==" + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + "license": "MIT" }, "node_modules/@types/request": { "version": "2.48.13", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.13.tgz", - "integrity": "sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==", "license": "MIT", "optional": true, "dependencies": { @@ -2882,8 +2610,6 @@ }, "node_modules/@types/request/node_modules/form-data": { "version": "2.5.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", - "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", "license": "MIT", "optional": true, "dependencies": { @@ -2900,8 +2626,7 @@ }, "node_modules/@types/send": { "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -2909,8 +2634,7 @@ }, "node_modules/@types/serve-static": { "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -2919,15 +2643,13 @@ }, "node_modules/@types/stack-utils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/superagent": { "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", - "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/cookiejar": "^2.1.5", "@types/methods": "^1.1.4", @@ -2937,51 +2659,51 @@ }, "node_modules/@types/supertest": { "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.16.tgz", - "integrity": "sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==", "dev": true, + "license": "MIT", "dependencies": { "@types/superagent": "*" } }, "node_modules/@types/tough-cookie": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "license": "MIT", "optional": true }, "node_modules/@types/unist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + "license": "MIT" }, "node_modules/@types/uuid": { "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/yargs": { "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "4.33.0", "@typescript-eslint/scope-manager": "4.33.0", @@ -3011,9 +2733,8 @@ }, "node_modules/@typescript-eslint/experimental-utils": { "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.7", "@typescript-eslint/scope-manager": "4.33.0", @@ -3035,9 +2756,9 @@ }, "node_modules/@typescript-eslint/parser": { "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", "dev": true, + "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "4.33.0", "@typescript-eslint/types": "4.33.0", @@ -3062,9 +2783,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.33.0", "@typescript-eslint/visitor-keys": "4.33.0" @@ -3079,9 +2799,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", "dev": true, + "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -3092,9 +2811,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "4.33.0", "@typescript-eslint/visitor-keys": "4.33.0", @@ -3119,9 +2837,8 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.33.0", "eslint-visitor-keys": "^2.0.0" @@ -3136,29 +2853,25 @@ }, "node_modules/@ucast/core": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@ucast/core/-/core-1.10.2.tgz", - "integrity": "sha512-ons5CwXZ/51wrUPfoduC+cO7AS1/wRb0ybpQJ9RrssossDxVy4t49QxWoWgfBDvVKsz9VXzBk9z0wqTdZ+Cq8g==" + "license": "Apache-2.0" }, "node_modules/@ucast/js": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@ucast/js/-/js-3.0.4.tgz", - "integrity": "sha512-TgG1aIaCMdcaEyckOZKQozn1hazE0w90SVdlpIJ/er8xVumE11gYAtSbw/LBeUnA4fFnFWTcw3t6reqseeH/4Q==", + "license": "Apache-2.0", "dependencies": { "@ucast/core": "^1.0.0" } }, "node_modules/@ucast/mongo": { "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@ucast/mongo/-/mongo-2.4.3.tgz", - "integrity": "sha512-XcI8LclrHWP83H+7H2anGCEeDq0n+12FU2mXCTz6/Tva9/9ddK/iacvvhCyW6cijAAOILmt0tWplRyRhVyZLsA==", + "license": "Apache-2.0", "dependencies": { "@ucast/core": "^1.4.1" } }, "node_modules/@ucast/mongo2js": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@ucast/mongo2js/-/mongo2js-1.4.0.tgz", - "integrity": "sha512-vR9RJ3BHlkI3RfKJIZFdVktxWvBCQRiSTeJSWN9NPxP5YJkpfXvcBWAMLwvyJx4HbB+qib5/AlSDEmQiuQyx2w==", + "license": "Apache-2.0", "dependencies": { "@ucast/core": "^1.6.1", "@ucast/js": "^3.0.0", @@ -3167,9 +2880,8 @@ }, "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" @@ -3177,27 +2889,23 @@ }, "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 + "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 + "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 + "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", @@ -3206,15 +2914,13 @@ }, "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 + "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", @@ -3224,33 +2930,29 @@ }, "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 + "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", @@ -3264,9 +2966,8 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -3277,9 +2978,8 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -3289,9 +2989,8 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -3303,9 +3002,8 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -3313,20 +3011,17 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, + "dev": true, + "license": "Apache-2.0" + }, "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -3336,8 +3031,7 @@ }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -3348,8 +3042,8 @@ }, "node_modules/acorn": { "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3359,27 +3053,23 @@ }, "node_modules/acorn-import-assertions": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "deprecated": "package has been renamed to acorn-import-attributes", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^8" } }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -3389,8 +3079,7 @@ }, "node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", "dependencies": { "debug": "4" }, @@ -3400,8 +3089,7 @@ }, "node_modules/aggregate-error": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "license": "MIT", "dependencies": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" @@ -3415,9 +3103,9 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3431,9 +3119,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -3448,9 +3135,8 @@ }, "node_modules/ajv-formats/node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -3464,33 +3150,29 @@ }, "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/ansi-colors": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-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", "dependencies": { "type-fest": "^0.21.3" }, @@ -3503,9 +3185,8 @@ }, "node_modules/ansi-escapes/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" }, @@ -3515,16 +3196,14 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -3537,8 +3216,7 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3549,13 +3227,11 @@ }, "node_modules/append-field": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + "license": "MIT" }, "node_modules/apple-signin-auth": { "version": "1.7.9", - "resolved": "https://registry.npmjs.org/apple-signin-auth/-/apple-signin-auth-1.7.9.tgz", - "integrity": "sha512-p/ggSSeM4CGr+9FI+D6OxMVkbKpt4p4wJQgBgABlgs/zJ/EXgqn1EQTMp9GCWVJHBB04PShp5c7Gh7ceZwEIDg==", + "license": "MIT", "dependencies": { "jsonwebtoken": "^9.0.0", "node-fetch": "^2.6.7", @@ -3564,22 +3240,19 @@ }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" @@ -3593,36 +3266,31 @@ }, "node_modules/array-find-index": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "license": "MIT" }, "node_modules/array-timsort": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", @@ -3641,16 +3309,14 @@ }, "node_modules/arrgv": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", - "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/arrify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", - "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -3660,39 +3326,33 @@ }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/asn1": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/astral-regex": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/async-function": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/async-retry": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", "license": "MIT", "optional": true, "dependencies": { @@ -3701,14 +3361,11 @@ }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "devOptional": true + "license": "MIT" }, "node_modules/ava": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ava/-/ava-5.3.1.tgz", - "integrity": "sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==", + "license": "MIT", "dependencies": { "acorn": "^8.8.2", "acorn-walk": "^8.2.0", @@ -3771,8 +3428,7 @@ }, "node_modules/ava/node_modules/ansi-regex": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -3782,8 +3438,7 @@ }, "node_modules/ava/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -3793,8 +3448,7 @@ }, "node_modules/ava/node_modules/chalk": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", - "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -3804,8 +3458,7 @@ }, "node_modules/ava/node_modules/globby": { "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", @@ -3822,8 +3475,7 @@ }, "node_modules/ava/node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -3833,8 +3485,7 @@ }, "node_modules/ava/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3847,8 +3498,7 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -3861,8 +3511,6 @@ }, "node_modules/axios": { "version": "1.13.6", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", - "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -3872,9 +3520,8 @@ }, "node_modules/babel-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -3893,9 +3540,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -3909,9 +3555,8 @@ }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -3925,18 +3570,16 @@ }, "node_modules/babel-plugin-istanbul/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -3949,9 +3592,8 @@ }, "node_modules/babel-preset-current-node-syntax": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -3975,9 +3617,8 @@ }, "node_modules/babel-preset-jest": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -3991,13 +3632,10 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -4011,28 +3649,26 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/base64id": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } }, "node_modules/bignumber.js": { "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -4042,9 +3678,8 @@ }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -4053,13 +3688,11 @@ }, "node_modules/blueimp-md5": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", - "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==" + "license": "MIT" }, "node_modules/body-parser": { "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -4081,21 +3714,18 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4103,8 +3733,7 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -4114,8 +3743,6 @@ }, "node_modules/browserslist": { "version": "4.25.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz", - "integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==", "dev": true, "funding": [ { @@ -4131,6 +3758,8 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001733", "electron-to-chromium": "^1.5.199", @@ -4146,9 +3775,8 @@ }, "node_modules/bs-logger": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, + "license": "MIT", "dependencies": { "fast-json-stable-stringify": "2.x" }, @@ -4158,17 +3786,14 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -4184,6 +3809,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -4191,18 +3817,14 @@ }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + "license": "BSD-3-Clause" }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "license": "MIT" }, "node_modules/busboy": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, @@ -4212,16 +3834,14 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/call-bind": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", @@ -4237,8 +3857,7 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -4249,8 +3868,7 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -4264,8 +3882,7 @@ }, "node_modules/callsites": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", - "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -4275,17 +3892,14 @@ }, "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/caniuse-lite": { "version": "1.0.30001735", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz", - "integrity": "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==", "dev": true, "funding": [ { @@ -4300,12 +3914,12 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/cbor": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "license": "MIT", "dependencies": { "nofilter": "^3.1.0" }, @@ -4315,13 +3929,11 @@ }, "node_modules/censor-sensor": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/censor-sensor/-/censor-sensor-1.0.6.tgz", - "integrity": "sha512-+2p0pCVWIkcp9JWVmDgnfQlzpDQsefXIra8KSqVSNrnEkSOcYT/tkDu/umDmTZ39c1JH9+ItijasUJIkRlb8dQ==" + "license": "MIT" }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4335,29 +3947,26 @@ }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "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 + "dev": true, + "license": "MIT" }, "node_modules/chokidar": { "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4376,47 +3985,41 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } }, "node_modules/chunkd": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", - "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==" + "license": "MIT" }, "node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ci-parallel-vars": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", - "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==" + "license": "MIT" }, "node_modules/cjs-module-lexer": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/clean-stack": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "license": "MIT", "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -4429,8 +4032,7 @@ }, "node_modules/clean-stack/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -4440,17 +4042,15 @@ }, "node_modules/clean-yaml-object": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", + "license": "MIT", "engines": { "node": ">=0.10.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" }, @@ -4460,9 +4060,8 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -4472,9 +4071,8 @@ }, "node_modules/cli-table3": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, + "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, @@ -4487,8 +4085,7 @@ }, "node_modules/cli-truncate": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" @@ -4502,8 +4099,7 @@ }, "node_modules/cli-truncate/node_modules/ansi-regex": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -4513,13 +4109,11 @@ }, "node_modules/cli-truncate/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "license": "MIT" }, "node_modules/cli-truncate/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -4534,8 +4128,7 @@ }, "node_modules/cli-truncate/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -4548,17 +4141,15 @@ }, "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/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -4570,18 +4161,16 @@ }, "node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -4589,8 +4178,7 @@ }, "node_modules/code-excerpt": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", - "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "license": "MIT", "dependencies": { "convert-to-spaces": "^2.0.1" }, @@ -4600,14 +4188,12 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4617,14 +4203,11 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "devOptional": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -4634,18 +4217,16 @@ }, "node_modules/commander": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/comment-json": { "version": "4.2.5", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.5.tgz", - "integrity": "sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==", "dev": true, + "license": "MIT", "dependencies": { "array-timsort": "^1.0.3", "core-util-is": "^1.0.3", @@ -4659,30 +4240,26 @@ }, "node_modules/common-path-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + "license": "ISC" }, "node_modules/component-emitter": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "license": "MIT" }, "node_modules/concat-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "engines": [ "node >= 6.0" ], + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -4692,8 +4269,7 @@ }, "node_modules/concordance": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", - "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", + "license": "ISC", "dependencies": { "date-time": "^3.1.0", "esutils": "^2.0.3", @@ -4710,13 +4286,11 @@ }, "node_modules/consola": { "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "license": "MIT" }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -4726,55 +4300,47 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/convert-to-spaces": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", - "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/cookie": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "license": "MIT" }, "node_modules/cookiejar": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -4785,9 +4351,8 @@ }, "node_modules/cosmiconfig": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -4801,9 +4366,8 @@ }, "node_modules/create-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -4822,14 +4386,11 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cron": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cron/-/cron-4.4.0.tgz", - "integrity": "sha512-fkdfq+b+AHI4cKdhZlppHveI/mgz2qpiYxcm+t5E5TsxX7QrLS1VE0+7GENEk9z0EeGPcpSciGv6ez24duWhwQ==", "license": "MIT", "dependencies": { "@types/luxon": "~3.7.0", @@ -4845,9 +4406,8 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4859,8 +4419,7 @@ }, "node_modules/currently-unhandled": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "license": "MIT", "dependencies": { "array-find-index": "^1.0.1" }, @@ -4870,8 +4429,7 @@ }, "node_modules/data-view-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -4886,8 +4444,7 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -4902,8 +4459,7 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -4918,8 +4474,7 @@ }, "node_modules/date-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", - "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", + "license": "MIT", "dependencies": { "time-zone": "^1.0.0" }, @@ -4929,8 +4484,7 @@ }, "node_modules/debug": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -4945,9 +4499,8 @@ }, "node_modules/dedent": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", - "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", "dev": true, + "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -4959,24 +4512,21 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/defaults": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -4986,8 +4536,7 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -5002,8 +4551,7 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -5018,25 +4566,21 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -5044,18 +4588,16 @@ }, "node_modules/detect-newline": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/dezalgo": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, + "license": "ISC", "dependencies": { "asap": "^2.0.0", "wrappy": "1" @@ -5063,26 +4605,23 @@ }, "node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/diff-sequences": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -5092,9 +4631,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -5104,24 +4642,21 @@ }, "node_modules/dotenv": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "license": "BSD-2-Clause", "engines": { "node": ">=10" } }, "node_modules/dotenv-expand": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" } }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -5133,8 +4668,6 @@ }, "node_modules/duplexify": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", "license": "MIT", "optional": true, "dependencies": { @@ -5146,32 +4679,27 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "license": "MIT" }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.5.203", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.203.tgz", - "integrity": "sha512-uz4i0vLhfm6dLZWbz/iH88KNDV+ivj5+2SA+utpgjKaj9Q0iDLuwk6Idhe9BTxciHudyx6IvTvijhkPvFGUQ0g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/emittery": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.2.0.tgz", - "integrity": "sha512-KxdRyyFcS85pH3dnU8Y5yFUm2YJdaHwcBZWrfG8o89ZY9a13/f9itbN+YG3ELbBo9Pg5zvIozstmuV8bX13q6g==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -5181,30 +4709,26 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/end-of-stream": { "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "devOptional": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/engine.io": { "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", - "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "license": "MIT", "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", @@ -5222,24 +4746,21 @@ }, "node_modules/engine.io-parser": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/engine.io/node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/engine.io/node_modules/debug": { "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -5254,8 +4775,7 @@ }, "node_modules/engine.io/node_modules/ws": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -5274,9 +4794,8 @@ }, "node_modules/enhanced-resolve": { "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -5287,9 +4806,8 @@ }, "node_modules/enquirer": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -5300,8 +4818,7 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -5311,17 +4828,15 @@ }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", @@ -5387,30 +4902,26 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -5420,8 +4931,7 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -5434,8 +4944,7 @@ }, "node_modules/es-to-primitive": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", @@ -5450,22 +4959,19 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "license": "MIT" }, "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" }, @@ -5475,10 +4981,9 @@ }, "node_modules/eslint": { "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -5533,9 +5038,8 @@ }, "node_modules/eslint-config-prettier": { "version": "8.10.2", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.2.tgz", - "integrity": "sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -5545,9 +5049,8 @@ }, "node_modules/eslint-plugin-prettier": { "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", - "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0" }, @@ -5566,9 +5069,8 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -5579,9 +5081,8 @@ }, "node_modules/eslint-utils": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -5597,18 +5098,16 @@ }, "node_modules/eslint-visitor-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10" } }, "node_modules/eslint/node_modules/eslint-utils": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -5621,27 +5120,24 @@ }, "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } }, "node_modules/eslint/node_modules/ignore": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/espree": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -5653,9 +5149,8 @@ }, "node_modules/espree/node_modules/acorn": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5665,17 +5160,15 @@ }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -5686,9 +5179,8 @@ }, "node_modules/esquery": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -5698,18 +5190,16 @@ }, "node_modules/esquery/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -5719,60 +5209,53 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "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", @@ -5793,8 +5276,6 @@ }, "node_modules/exit": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -5802,9 +5283,8 @@ }, "node_modules/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -5818,9 +5298,8 @@ }, "node_modules/expect/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -5830,9 +5309,8 @@ }, "node_modules/expect/node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -5845,9 +5323,8 @@ }, "node_modules/expect/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -5859,14 +5336,13 @@ }, "node_modules/expect/node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/express": { "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "peer": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -5910,32 +5386,27 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" + "license": "MIT" }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "license": "MIT" }, "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", @@ -5947,8 +5418,6 @@ }, "node_modules/farmhash-modern": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/farmhash-modern/-/farmhash-modern-1.1.0.tgz", - "integrity": "sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -5956,18 +5425,15 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" + "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5981,30 +5447,24 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "license": "MIT" }, "node_modules/fast-text-encoding": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", - "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + "license": "Apache-2.0" }, "node_modules/fast-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, "funding": [ { @@ -6015,12 +5475,11 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/fast-xml-parser": { "version": "4.5.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", - "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", "funding": [ { "type": "github", @@ -6038,16 +5497,13 @@ }, "node_modules/fastq": { "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/faye-websocket": { "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" @@ -6058,22 +5514,19 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } }, "node_modules/fflate": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + "license": "MIT" }, "node_modules/figures": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "license": "MIT", "dependencies": { "escape-string-regexp": "^5.0.0", "is-unicode-supported": "^1.2.0" @@ -6087,8 +5540,7 @@ }, "node_modules/figures/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -6098,9 +5550,8 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -6110,8 +5561,7 @@ }, "node_modules/file-type": { "version": "20.4.1", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.4.1.tgz", - "integrity": "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==", + "license": "MIT", "dependencies": { "@tokenizer/inflate": "^0.2.6", "strtok3": "^10.2.0", @@ -6127,8 +5577,7 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6138,8 +5587,7 @@ }, "node_modules/finalhandler": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -6155,22 +5603,19 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -6181,8 +5626,6 @@ }, "node_modules/firebase-admin": { "version": "13.6.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-13.6.0.tgz", - "integrity": "sha512-GdPA/t0+Cq8p1JnjFRBmxRxAGvF/kl2yfdhALl38PrRp325YxyQ5aNaHui0XmaKcKiGRFIJ/EgBNWFoDP0onjw==", "license": "Apache-2.0", "dependencies": { "@fastify/busboy": "^3.0.0", @@ -6207,8 +5650,6 @@ }, "node_modules/firebase-admin/node_modules/@types/node": { "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -6216,8 +5657,6 @@ }, "node_modules/firebase-admin/node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "engines": { "node": ">= 14" @@ -6225,8 +5664,6 @@ }, "node_modules/firebase-admin/node_modules/gaxios": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -6241,8 +5678,6 @@ }, "node_modules/firebase-admin/node_modules/gaxios/node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -6254,8 +5689,6 @@ }, "node_modules/firebase-admin/node_modules/gcp-metadata": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", "license": "Apache-2.0", "dependencies": { "gaxios": "^6.1.1", @@ -6268,8 +5701,6 @@ }, "node_modules/firebase-admin/node_modules/google-auth-library": { "version": "9.15.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", - "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", "license": "Apache-2.0", "dependencies": { "base64-js": "^1.3.0", @@ -6285,8 +5716,6 @@ }, "node_modules/firebase-admin/node_modules/gtoken": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", "license": "MIT", "dependencies": { "gaxios": "^6.0.0", @@ -6298,8 +5727,6 @@ }, "node_modules/firebase-admin/node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -6311,8 +5738,6 @@ }, "node_modules/firebase-admin/node_modules/uuid": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -6324,9 +5749,8 @@ }, "node_modules/flat-cache": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -6338,14 +5762,11 @@ }, "node_modules/flatted": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -6364,8 +5785,7 @@ }, "node_modules/for-each": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", "dependencies": { "is-callable": "^1.2.7" }, @@ -6378,9 +5798,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", - "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", @@ -6406,9 +5825,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -6420,8 +5838,6 @@ }, "node_modules/form-data": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -6436,9 +5852,8 @@ }, "node_modules/formidable": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz", - "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==", "dev": true, + "license": "MIT", "dependencies": { "@paralleldrive/cuid2": "^2.2.2", "dezalgo": "^1.0.4", @@ -6451,24 +5866,21 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/friendly-words": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/friendly-words/-/friendly-words-1.3.1.tgz", - "integrity": "sha512-gLlK15jM/U/oFtYkw4At0cVS0kWst41BRPG4EnhP/L7ZGn8rnOSlLuffIvO/JIK06TYx7abRpNMTzkwpHL+kEA==", + "license": "MIT", "dependencies": { "ava": "^5.3.1", "express": "^4.18.2", @@ -6477,9 +5889,8 @@ }, "node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -6491,20 +5902,16 @@ }, "node_modules/fs-monkey": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", - "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", - "dev": true + "dev": true, + "license": "Unlicense" }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -6515,16 +5922,14 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -6542,22 +5947,19 @@ }, "node_modules/functional-red-black-tree": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gaxios": { "version": "4.3.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.3.tgz", - "integrity": "sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==", + "license": "Apache-2.0", "dependencies": { "abort-controller": "^3.0.0", "extend": "^3.0.2", @@ -6571,8 +5973,7 @@ }, "node_modules/gcp-metadata": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", - "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "license": "Apache-2.0", "dependencies": { "gaxios": "^4.0.0", "json-bigint": "^1.0.0" @@ -6583,25 +5984,22 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -6623,17 +6021,15 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -6644,9 +6040,8 @@ }, "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" }, @@ -6656,8 +6051,7 @@ }, "node_modules/get-symbol-description": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -6672,9 +6066,7 @@ }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6692,8 +6084,7 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -6703,15 +6094,13 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/globals": { "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -6724,8 +6113,7 @@ }, "node_modules/globalthis": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -6739,9 +6127,8 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -6759,8 +6146,7 @@ }, "node_modules/google-auth-library": { "version": "7.14.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.14.1.tgz", - "integrity": "sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==", + "license": "Apache-2.0", "dependencies": { "arrify": "^2.0.0", "base64-js": "^1.3.0", @@ -6778,16 +6164,13 @@ }, "node_modules/google-auth-library/node_modules/arrify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/google-gax": { "version": "4.6.1", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.6.1.tgz", - "integrity": "sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -6810,8 +6193,6 @@ }, "node_modules/google-gax/node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "optional": true, "engines": { @@ -6820,8 +6201,6 @@ }, "node_modules/google-gax/node_modules/gaxios": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -6837,8 +6216,6 @@ }, "node_modules/google-gax/node_modules/gcp-metadata": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -6852,8 +6229,6 @@ }, "node_modules/google-gax/node_modules/google-auth-library": { "version": "9.15.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", - "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -6870,8 +6245,6 @@ }, "node_modules/google-gax/node_modules/gtoken": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", "license": "MIT", "optional": true, "dependencies": { @@ -6884,8 +6257,6 @@ }, "node_modules/google-gax/node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "optional": true, "dependencies": { @@ -6898,8 +6269,6 @@ }, "node_modules/google-gax/node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -6912,8 +6281,6 @@ }, "node_modules/google-logging-utils": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -6921,9 +6288,7 @@ }, "node_modules/google-p12-pem": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.4.tgz", - "integrity": "sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==", - "deprecated": "Package is no longer maintained", + "license": "MIT", "dependencies": { "node-forge": "^1.3.1" }, @@ -6936,8 +6301,7 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6947,22 +6311,12 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", "dev": true, - "license": "MIT", - "peer": true + "license": "ISC" }, "node_modules/gtoken": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.2.tgz", - "integrity": "sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==", + "license": "MIT", "dependencies": { "gaxios": "^4.0.0", "google-p12-pem": "^3.1.3", @@ -6974,9 +6328,8 @@ }, "node_modules/handlebars": { "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -6995,17 +6348,15 @@ }, "node_modules/handlebars/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/has-bigints": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7015,25 +6366,22 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-own-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", - "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -7043,8 +6391,7 @@ }, "node_modules/has-proto": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.0" }, @@ -7057,8 +6404,7 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7068,8 +6414,7 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -7082,8 +6427,7 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -7093,8 +6437,6 @@ }, "node_modules/html-entities": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "funding": [ { "type": "github", @@ -7110,14 +6452,12 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -7131,14 +6471,10 @@ }, "node_modules/http-parser-js": { "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "license": "MIT" }, "node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "license": "MIT", "optional": true, "dependencies": { @@ -7152,8 +6488,7 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -7164,17 +6499,15 @@ }, "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==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -7184,8 +6517,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -7199,29 +6530,27 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/ignore-by-default": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", - "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", + "license": "ISC", "engines": { "node": ">=10 <11 || >=12 <13 || >=14" } }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7235,9 +6564,8 @@ }, "node_modules/import-local": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -7254,16 +6582,14 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -7273,9 +6599,7 @@ }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -7283,14 +6607,12 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/inquirer": { "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -7314,18 +6636,16 @@ }, "node_modules/inquirer/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/inquirer/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", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -7338,8 +6658,7 @@ }, "node_modules/internal-slot": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", @@ -7351,33 +6670,29 @@ }, "node_modules/interpret": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/irregular-plurals": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", - "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-array-buffer": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -7392,14 +6707,12 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", @@ -7416,8 +6729,7 @@ }, "node_modules/is-bigint": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", "dependencies": { "has-bigints": "^1.0.2" }, @@ -7430,8 +6742,7 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -7441,8 +6752,7 @@ }, "node_modules/is-boolean-object": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -7456,8 +6766,7 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7467,9 +6776,8 @@ }, "node_modules/is-core-module": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -7482,8 +6790,7 @@ }, "node_modules/is-data-view": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", @@ -7498,8 +6805,7 @@ }, "node_modules/is-date-object": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" @@ -7511,40 +6817,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-error": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", - "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==" + "license": "MIT" }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-finalizationregistry": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -7557,8 +6843,7 @@ }, "node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -7568,17 +6853,15 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-generator-function": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", @@ -7594,8 +6877,7 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -7605,17 +6887,15 @@ }, "node_modules/is-interactive": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-map": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7625,8 +6905,7 @@ }, "node_modules/is-negative-zero": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7636,16 +6915,14 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -7659,21 +6936,18 @@ }, "node_modules/is-plain-object": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -7689,8 +6963,7 @@ }, "node_modules/is-set": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7700,8 +6973,7 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -7714,8 +6986,7 @@ }, "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==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -7725,8 +6996,7 @@ }, "node_modules/is-string": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -7740,8 +7010,7 @@ }, "node_modules/is-symbol": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", @@ -7756,8 +7025,7 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, @@ -7770,8 +7038,7 @@ }, "node_modules/is-unicode-supported": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -7781,8 +7048,7 @@ }, "node_modules/is-weakmap": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7792,8 +7058,7 @@ }, "node_modules/is-weakref": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -7806,8 +7071,7 @@ }, "node_modules/is-weakset": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" @@ -7819,45 +7083,27 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -7871,9 +7117,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -7885,9 +7130,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -7899,18 +7143,16 @@ }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-reports": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -7921,17 +7163,16 @@ }, "node_modules/iterare": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "license": "ISC", "engines": { "node": ">=6" } }, "node_modules/jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -7955,9 +7196,8 @@ }, "node_modules/jest-changed-files": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -7969,9 +7209,8 @@ }, "node_modules/jest-circus": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -8000,9 +7239,8 @@ }, "node_modules/jest-cli": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -8022,18 +7260,19 @@ "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, "node_modules/jest-config": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -8076,9 +7315,8 @@ }, "node_modules/jest-config/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8088,18 +7326,16 @@ }, "node_modules/jest-config/node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -8111,15 +7347,13 @@ }, "node_modules/jest-config/node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -8132,9 +7366,8 @@ }, "node_modules/jest-docblock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, + "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -8144,9 +7377,8 @@ }, "node_modules/jest-each": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -8160,9 +7392,8 @@ }, "node_modules/jest-environment-node": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -8177,18 +7408,16 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -8211,9 +7440,8 @@ }, "node_modules/jest-haste-map/node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -8226,9 +7454,8 @@ }, "node_modules/jest-haste-map/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8241,9 +7468,8 @@ }, "node_modules/jest-leak-detector": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -8254,9 +7480,8 @@ }, "node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -8269,9 +7494,8 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -8289,9 +7513,8 @@ }, "node_modules/jest-message-util/node_modules/@babel/code-frame": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -8303,9 +7526,8 @@ }, "node_modules/jest-message-util/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8315,9 +7537,8 @@ }, "node_modules/jest-message-util/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -8329,15 +7550,13 @@ }, "node_modules/jest-message-util/node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-mock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -8349,9 +7568,8 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -8366,18 +7584,16 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -8395,9 +7611,8 @@ }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, + "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -8408,9 +7623,8 @@ }, "node_modules/jest-runner": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -8440,9 +7654,8 @@ }, "node_modules/jest-runner/node_modules/emittery": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8452,9 +7665,8 @@ }, "node_modules/jest-runner/node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -8467,18 +7679,16 @@ }, "node_modules/jest-runner/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -8486,9 +7696,8 @@ }, "node_modules/jest-runner/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8501,9 +7710,8 @@ }, "node_modules/jest-runtime": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -8534,9 +7742,8 @@ }, "node_modules/jest-snapshot": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -8565,9 +7772,8 @@ }, "node_modules/jest-snapshot/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8577,18 +7783,16 @@ }, "node_modules/jest-snapshot/node_modules/diff-sequences": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -8601,18 +7805,16 @@ }, "node_modules/jest-snapshot/node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -8625,9 +7827,8 @@ }, "node_modules/jest-snapshot/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -8639,15 +7840,13 @@ }, "node_modules/jest-snapshot/node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -8662,9 +7861,8 @@ }, "node_modules/jest-validate": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -8679,9 +7877,8 @@ }, "node_modules/jest-validate/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8691,9 +7888,8 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8703,18 +7899,16 @@ }, "node_modules/jest-validate/node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -8726,15 +7920,13 @@ }, "node_modules/jest-validate/node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-watcher": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -8751,9 +7943,8 @@ }, "node_modules/jest-watcher/node_modules/emittery": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8763,9 +7954,8 @@ }, "node_modules/jest-worker": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -8777,9 +7967,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8792,8 +7981,6 @@ }, "node_modules/jose": { "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -8801,22 +7988,19 @@ }, "node_modules/js-string-escape": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -8827,9 +8011,8 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -8839,41 +8022,35 @@ }, "node_modules/json-bigint": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", "dependencies": { "bignumber.js": "^9.0.0" } }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/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" }, @@ -8883,15 +8060,13 @@ }, "node_modules/jsonc-parser": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -8901,8 +8076,7 @@ }, "node_modules/jsonwebtoken": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", @@ -8922,8 +8096,7 @@ }, "node_modules/jsonwebtoken/node_modules/jwa": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -8932,8 +8105,7 @@ }, "node_modules/jsonwebtoken/node_modules/jws": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" @@ -8941,8 +8113,7 @@ }, "node_modules/jwa": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -8951,8 +8122,6 @@ }, "node_modules/jwks-rsa": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.2.0.tgz", - "integrity": "sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==", "license": "MIT", "dependencies": { "@types/express": "^4.17.20", @@ -8968,8 +8137,7 @@ }, "node_modules/jws": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "license": "MIT", "dependencies": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" @@ -8977,36 +8145,32 @@ }, "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/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -9016,28 +8180,23 @@ } }, "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + "version": "1.1.5" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/linkify-it": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" } }, "node_modules/load-json-file": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", - "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -9047,18 +8206,16 @@ }, "node_modules/loader-runner": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" } }, "node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -9068,85 +8225,68 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "license": "MIT", "optional": true }, "node_modules/lodash.clonedeep": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "license": "MIT" }, "node_modules/lodash.includes": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + "license": "MIT" }, "node_modules/lodash.isboolean": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + "license": "MIT" }, "node_modules/lodash.isinteger": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + "license": "MIT" }, "node_modules/lodash.isnumber": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + "license": "MIT" }, "node_modules/lodash.samplesize": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.samplesize/-/lodash.samplesize-4.2.0.tgz", - "integrity": "sha512-1ZhKV7/nuISuaQdxfCqrs4HHxXIYN+0Z4f7NMQn2PHkxFZJGavJQ1j/paxyJnLJmN2ZamNN6SMepneV+dCgQTA==" + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -9160,9 +8300,8 @@ }, "node_modules/log-symbols/node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -9172,15 +8311,12 @@ }, "node_modules/long": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0", "optional": true }, "node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9190,8 +8326,6 @@ }, "node_modules/lru-memoizer": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", - "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", "license": "MIT", "dependencies": { "lodash.clonedeep": "^4.5.0", @@ -9200,13 +8334,10 @@ }, "node_modules/lunr": { "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + "license": "MIT" }, "node_modules/luxon": { "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", "license": "MIT", "engines": { "node": ">=12" @@ -9214,9 +8345,8 @@ }, "node_modules/macos-release": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", - "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -9226,9 +8356,8 @@ }, "node_modules/magic-string": { "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" }, @@ -9238,9 +8367,8 @@ }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -9253,23 +8381,20 @@ }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/makeerror": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } }, "node_modules/map-age-cleaner": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "license": "MIT", "dependencies": { "p-defer": "^1.0.0" }, @@ -9279,8 +8404,7 @@ }, "node_modules/markdown-it": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", @@ -9295,13 +8419,11 @@ }, "node_modules/markdown-it/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "license": "Python-2.0" }, "node_modules/matcher": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", - "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", + "license": "MIT", "dependencies": { "escape-string-regexp": "^5.0.0" }, @@ -9314,8 +8436,7 @@ }, "node_modules/matcher/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -9325,16 +8446,14 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/md5-hex": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", - "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "license": "MIT", "dependencies": { "blueimp-md5": "^2.10.0" }, @@ -9344,21 +8463,18 @@ }, "node_modules/mdurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + "license": "MIT" }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mem": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", - "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", + "license": "MIT", "dependencies": { "map-age-cleaner": "^0.1.3", "mimic-fn": "^4.0.0" @@ -9372,9 +8488,8 @@ }, "node_modules/memfs": { "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, + "license": "Unlicense", "dependencies": { "fs-monkey": "^1.0.4" }, @@ -9384,38 +8499,33 @@ }, "node_modules/merge-descriptors": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -9426,8 +8536,7 @@ }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -9437,16 +8546,14 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -9456,8 +8563,7 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -9467,8 +8573,7 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9478,25 +8583,22 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -9506,13 +8608,11 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/multer": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "license": "MIT", "dependencies": { "append-field": "^1.0.0", "busboy": "^1.6.0", @@ -9528,49 +8628,42 @@ }, "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 + "dev": true, + "license": "ISC" }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-abort-controller": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-emoji": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.21" } }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -9588,18 +8681,15 @@ }, "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -9607,69 +8697,46 @@ }, "node_modules/node-forge": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-notifier": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.1.tgz", - "integrity": "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.5", - "shellwords": "^0.1.1", - "uuid": "^8.3.2", - "which": "^2.0.2" - } + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-rsa": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.1.1.tgz", - "integrity": "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==", + "license": "MIT", "dependencies": { "asn1": "^0.2.4" } }, "node_modules/nofilter": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "license": "MIT", "engines": { "node": ">=12.19" } }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "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" }, @@ -9679,24 +8746,21 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9706,16 +8770,14 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -9733,8 +8795,7 @@ }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -9744,17 +8805,15 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/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" }, @@ -9767,18 +8826,16 @@ }, "node_modules/onetime/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/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -9793,9 +8850,8 @@ }, "node_modules/ora": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -9816,9 +8872,8 @@ }, "node_modules/ora/node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -9828,9 +8883,8 @@ }, "node_modules/os-name": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", "dev": true, + "license": "MIT", "dependencies": { "macos-release": "^2.5.0", "windows-release": "^4.0.0" @@ -9844,17 +8898,15 @@ }, "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/own-keys": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", @@ -9869,16 +8921,14 @@ }, "node_modules/p-defer": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/p-event": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", - "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", + "license": "MIT", "dependencies": { "p-timeout": "^5.0.2" }, @@ -9891,9 +8941,8 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "devOptional": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -9906,9 +8955,8 @@ }, "node_modules/p-limit/node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -9918,9 +8966,8 @@ }, "node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -9930,9 +8977,8 @@ }, "node_modules/p-locate/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -9945,8 +8991,7 @@ }, "node_modules/p-map": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "license": "MIT", "dependencies": { "aggregate-error": "^4.0.0" }, @@ -9959,8 +9004,7 @@ }, "node_modules/p-timeout": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -9970,18 +9014,16 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -9991,18 +9033,16 @@ }, "node_modules/parent-module/node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/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", @@ -10018,8 +9058,7 @@ }, "node_modules/parse-ms": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", - "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -10029,16 +9068,14 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/passport": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", - "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "license": "MIT", "dependencies": { "passport-strategy": "1.x.x", "pause": "0.0.1", @@ -10054,8 +9091,7 @@ }, "node_modules/passport-jwt": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", - "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", + "license": "MIT", "dependencies": { "jsonwebtoken": "^9.0.0", "passport-strategy": "^1.0.0" @@ -10063,8 +9099,6 @@ }, "node_modules/passport-local": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", - "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", "dependencies": { "passport-strategy": "1.x.x" }, @@ -10074,49 +9108,42 @@ }, "node_modules/passport-strategy": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", "engines": { "node": ">= 0.4.0" } }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -10130,41 +9157,35 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/path-scurry/node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/path-to-regexp": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==" + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + "version": "0.0.1" }, "node_modules/pg": { "version": "8.16.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", - "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", + "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -10189,40 +9210,34 @@ }, "node_modules/pg-cloudflare": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", - "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", + "license": "MIT", "optional": true }, "node_modules/pg-connection-string": { "version": "2.9.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", - "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==" + "license": "MIT" }, "node_modules/pg-int8": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", "engines": { "node": ">=4.0.0" } }, "node_modules/pg-pool": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", - "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", + "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { "version": "1.10.3", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", - "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==" + "license": "MIT" }, "node_modules/pg-types": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", @@ -10236,22 +9251,19 @@ }, "node_modules/pgpass": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", "dependencies": { "split2": "^4.1.0" } }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -10261,17 +9273,15 @@ }, "node_modules/pirates": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/pkg-conf": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", - "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", + "license": "MIT", "dependencies": { "find-up": "^6.0.0", "load-json-file": "^7.0.0" @@ -10285,8 +9295,7 @@ }, "node_modules/pkg-conf/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -10300,8 +9309,7 @@ }, "node_modules/pkg-conf/node_modules/locate-path": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -10314,8 +9322,7 @@ }, "node_modules/pkg-conf/node_modules/p-limit": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -10328,8 +9335,7 @@ }, "node_modules/pkg-conf/node_modules/p-locate": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -10342,17 +9348,15 @@ }, "node_modules/pkg-conf/node_modules/path-exists": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -10362,8 +9366,7 @@ }, "node_modules/plur": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", - "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", + "license": "MIT", "dependencies": { "irregular-plurals": "^3.3.0" }, @@ -10376,49 +9379,43 @@ }, "node_modules/pluralize": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/possible-typed-array-names": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postgres-array": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/postgres-bytea": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/postgres-date": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/postgres-interval": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", "dependencies": { "xtend": "^4.0.0" }, @@ -10428,18 +9425,17 @@ }, "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.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, + "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -10452,9 +9448,8 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -10464,9 +9459,8 @@ }, "node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -10478,9 +9472,8 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -10490,8 +9483,7 @@ }, "node_modules/pretty-ms": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", - "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", + "license": "MIT", "dependencies": { "parse-ms": "^3.0.0" }, @@ -10504,11 +9496,10 @@ }, "node_modules/prisma": { "version": "5.10.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.10.2.tgz", - "integrity": "sha512-hqb/JMz9/kymRE25pMWCxkdyhbnIWrq+h7S6WysJpdnCvhstbJSNP/S6mScEcqiB8Qv2F+0R3yG+osRaWqZacQ==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/engines": "5.10.2" }, @@ -10521,18 +9512,16 @@ }, "node_modules/progress": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -10543,8 +9532,6 @@ }, "node_modules/proto3-json-serializer": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", - "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -10556,8 +9543,6 @@ }, "node_modules/protobufjs": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", "hasInstallScript": true, "license": "BSD-3-Clause", "optional": true, @@ -10581,8 +9566,7 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -10593,15 +9577,12 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, "node_modules/pump": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -10609,25 +9590,21 @@ }, "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/punycode.js": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pure-rand": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -10638,12 +9615,12 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "license": "MIT" }, "node_modules/qs": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -10656,8 +9633,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -10671,29 +9646,27 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -10706,14 +9679,12 @@ }, "node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10725,8 +9696,7 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -10736,8 +9706,6 @@ }, "node_modules/rechoir": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "dependencies": { "resolve": "^1.1.6" @@ -10748,13 +9716,12 @@ }, "node_modules/reflect-metadata": { "version": "0.1.14", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", - "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + "license": "Apache-2.0", + "peer": true }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -10774,8 +9741,7 @@ }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -10793,9 +9759,8 @@ }, "node_modules/regexpp": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -10805,35 +9770,31 @@ }, "node_modules/repeat-string": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -10851,8 +9812,7 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -10862,35 +9822,31 @@ }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve.exports": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "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" @@ -10901,8 +9857,6 @@ }, "node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "license": "MIT", "optional": true, "engines": { @@ -10911,8 +9865,6 @@ }, "node_modules/retry-request": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", "license": "MIT", "optional": true, "dependencies": { @@ -10926,8 +9878,7 @@ }, "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -10935,9 +9886,7 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -10950,17 +9899,14 @@ }, "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/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -10975,22 +9921,22 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-array-concat": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -11007,8 +9953,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -11022,12 +9966,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-push-apply": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" @@ -11041,8 +9985,7 @@ }, "node_modules/safe-regex-test": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -11057,14 +10000,12 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "license": "MIT" }, "node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -11080,8 +10021,7 @@ }, "node_modules/semver": { "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -11091,8 +10031,7 @@ }, "node_modules/send": { "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -11114,29 +10053,25 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/send/node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/serialize-error": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "license": "MIT", "dependencies": { "type-fest": "^0.13.1" }, @@ -11149,8 +10084,7 @@ }, "node_modules/serialize-error/node_modules/type-fest": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -11160,17 +10094,15 @@ }, "node_modules/serialize-javascript": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-static": { "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -11183,8 +10115,7 @@ }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -11199,8 +10130,7 @@ }, "node_modules/set-function-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -11213,8 +10143,7 @@ }, "node_modules/set-proto": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", @@ -11226,14 +10155,12 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -11243,18 +10170,16 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shelljs": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -11267,18 +10192,9 @@ "node": ">=4" } }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -11295,8 +10211,7 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -11310,8 +10225,7 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -11327,8 +10241,7 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -11345,29 +10258,25 @@ }, "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 + "dev": true, + "license": "ISC" }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/slice-ansi": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -11381,8 +10290,7 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -11392,8 +10300,7 @@ }, "node_modules/socket.io": { "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -11409,8 +10316,7 @@ }, "node_modules/socket.io-adapter": { "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "license": "MIT", "dependencies": { "debug": "~4.3.4", "ws": "~8.17.1" @@ -11418,8 +10324,7 @@ }, "node_modules/socket.io-adapter/node_modules/debug": { "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -11434,8 +10339,7 @@ }, "node_modules/socket.io-adapter/node_modules/ws": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -11454,8 +10358,7 @@ }, "node_modules/socket.io-parser": { "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -11466,8 +10369,7 @@ }, "node_modules/socket.io-parser/node_modules/debug": { "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -11482,8 +10384,7 @@ }, "node_modules/socket.io/node_modules/debug": { "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -11498,18 +10399,16 @@ }, "node_modules/source-map": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -11517,30 +10416,26 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/split2": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", "engines": { "node": ">= 10.x" } }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "license": "BSD-3-Clause" }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -11550,24 +10445,21 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" @@ -11578,8 +10470,6 @@ }, "node_modules/stream-events": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", "license": "MIT", "optional": true, "dependencies": { @@ -11588,32 +10478,26 @@ }, "node_modules/stream-shift": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", "license": "MIT", "optional": true }, "node_modules/streamsearch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { "node": ">=10.0.0" } }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-length": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -11624,8 +10508,7 @@ }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11637,16 +10520,14 @@ }, "node_modules/string-width/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/string.prototype.replaceall": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.replaceall/-/string.prototype.replaceall-1.0.10.tgz", - "integrity": "sha512-PKLapcZUZmXUdfIM6rTTTMYOxaj4JiQrgl0SKEeCFug1CdMAuJq8hVZd4eek9yMXAW4ldGUq+TiZRtjLJRU96g==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11666,8 +10547,7 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -11686,8 +10566,7 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -11703,8 +10582,7 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11719,8 +10597,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11730,27 +10607,24 @@ }, "node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "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-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -11760,8 +10634,6 @@ }, "node_modules/strnum": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", "funding": [ { "type": "github", @@ -11773,8 +10645,7 @@ }, "node_modules/strtok3": { "version": "10.3.4", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", - "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", + "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0" }, @@ -11788,17 +10659,13 @@ }, "node_modules/stubs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", "license": "MIT", "optional": true }, "node_modules/superagent": { "version": "8.1.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", - "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", - "deprecated": "Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net", "dev": true, + "license": "MIT", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.4", @@ -11817,9 +10684,8 @@ }, "node_modules/superagent/node_modules/mime": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -11829,8 +10695,7 @@ }, "node_modules/supertap": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", - "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", + "license": "MIT", "dependencies": { "indent-string": "^5.0.0", "js-yaml": "^3.14.1", @@ -11843,8 +10708,7 @@ }, "node_modules/supertap/node_modules/ansi-regex": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -11854,8 +10718,7 @@ }, "node_modules/supertap/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -11868,10 +10731,8 @@ }, "node_modules/supertest": { "version": "6.3.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", - "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", - "deprecated": "Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net", "dev": true, + "license": "MIT", "dependencies": { "methods": "^1.1.2", "superagent": "^8.1.2" @@ -11882,8 +10743,7 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11893,9 +10753,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -11905,18 +10764,16 @@ }, "node_modules/symbol-observable": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/table": { "version": "6.9.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", - "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -11930,9 +10787,8 @@ }, "node_modules/table/node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -11946,24 +10802,21 @@ }, "node_modules/table/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/table/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/table/node_modules/slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -11978,17 +10831,14 @@ }, "node_modules/tapable": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/teeny-request": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -12004,8 +10854,6 @@ }, "node_modules/teeny-request/node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -12018,17 +10866,15 @@ }, "node_modules/temp-dir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "license": "MIT", "engines": { "node": ">=14.16" } }, "node_modules/terser": { "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.14.0", @@ -12044,9 +10890,8 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -12078,9 +10923,9 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -12094,9 +10939,8 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -12106,15 +10950,13 @@ }, "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -12131,15 +10973,13 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -12151,29 +10991,25 @@ }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/time-zone": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "license": "MIT", "engines": { "node": ">=4" } }, "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" }, @@ -12183,14 +11019,12 @@ }, "node_modules/tmpl": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -12200,16 +11034,14 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/token-types": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.1.tgz", - "integrity": "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==", + "license": "MIT", "dependencies": { "@borewit/text-codec": "^0.1.0", "@tokenizer/token": "^0.3.0", @@ -12225,18 +11057,16 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, + "license": "MIT", "bin": { "tree-kill": "cli.js" } }, "node_modules/ts-jest": { "version": "29.4.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.4.tgz", - "integrity": "sha512-ccVcRABct5ZELCT5U0+DZwkXMCcOCLi2doHRrKy1nK/s7J7bch6TzJMsrY09WxgUUIP/ITfmcDS8D2yl63rnXw==", "dev": true, + "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", @@ -12286,9 +11116,8 @@ }, "node_modules/ts-jest/node_modules/type-fest": { "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -12298,9 +11127,8 @@ }, "node_modules/ts-loader": { "version": "9.5.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", - "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", @@ -12318,9 +11146,9 @@ }, "node_modules/ts-node": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -12361,9 +11189,8 @@ }, "node_modules/tsconfig-paths": { "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -12373,9 +11200,8 @@ }, "node_modules/tsconfig-paths-webpack-plugin": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.1.tgz", - "integrity": "sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", @@ -12387,18 +11213,16 @@ }, "node_modules/tsconfig-paths-webpack-plugin/node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, + "license": "MIT", "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -12410,9 +11234,8 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -12422,23 +11245,20 @@ }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -12451,15 +11271,13 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "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", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -12469,18 +11287,16 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -12490,8 +11306,7 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -12502,8 +11317,7 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -12515,8 +11329,7 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", @@ -12533,8 +11346,7 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -12553,8 +11365,7 @@ }, "node_modules/typed-array-length": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -12572,13 +11383,11 @@ }, "node_modules/typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + "license": "MIT" }, "node_modules/typedoc": { "version": "0.27.9", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.9.tgz", - "integrity": "sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==", + "license": "Apache-2.0", "dependencies": { "@gerrit0/mini-shiki": "^1.24.0", "lunr": "^2.3.9", @@ -12598,16 +11407,14 @@ }, "node_modules/typedoc/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/typedoc/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12620,8 +11427,7 @@ }, "node_modules/typedoc/node_modules/yaml": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -12631,8 +11437,8 @@ }, "node_modules/typescript": { "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12643,14 +11449,12 @@ }, "node_modules/uc.micro": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + "license": "MIT" }, "node_modules/uglify-js": { "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, + "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -12661,8 +11465,7 @@ }, "node_modules/uid": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", - "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "license": "MIT", "dependencies": { "@lukeed/csprng": "^1.0.0" }, @@ -12672,8 +11475,7 @@ }, "node_modules/uint8array-extras": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.1.tgz", - "integrity": "sha512-+NWHrac9dvilNgme+gP4YrBSumsaMZP0fNBtXXFIf33RLLKEcBUKaQZ7ULUbS0sBfcjxIZ4V96OTRkCbM7hxpw==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -12683,8 +11485,7 @@ }, "node_modules/unbox-primitive": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", @@ -12700,30 +11501,25 @@ }, "node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + "license": "MIT" }, "node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -12739,6 +11535,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -12752,51 +11549,44 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, + "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -12808,26 +11598,23 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } }, "node_modules/watchpack": { "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12838,18 +11625,17 @@ }, "node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, "node_modules/webpack": { "version": "5.82.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", - "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -12894,26 +11680,22 @@ }, "node_modules/webpack-node-externals": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", - "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/webpack-sources": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/websocket-driver": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", @@ -12926,8 +11708,6 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "license": "Apache-2.0", "engines": { "node": ">=0.8.0" @@ -12935,17 +11715,15 @@ }, "node_modules/well-known-symbols": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", - "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", + "license": "ISC", "engines": { "node": ">=6" } }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -12958,8 +11736,7 @@ }, "node_modules/which-boxed-primitive": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", @@ -12976,8 +11753,7 @@ }, "node_modules/which-builtin-type": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", @@ -13002,8 +11778,7 @@ }, "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -13019,8 +11794,7 @@ }, "node_modules/which-typed-array": { "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -13039,9 +11813,8 @@ }, "node_modules/windows-release": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^4.0.2" }, @@ -13054,9 +11827,8 @@ }, "node_modules/windows-release/node_modules/execa": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", @@ -13077,9 +11849,8 @@ }, "node_modules/windows-release/node_modules/get-stream": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -13092,32 +11863,28 @@ }, "node_modules/windows-release/node_modules/human-signals": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=8.12.0" } }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -13132,13 +11899,11 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" @@ -13149,8 +11914,7 @@ }, "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==", + "license": "ISC", "engines": { "node": ">=14" }, @@ -13160,38 +11924,33 @@ }, "node_modules/xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", "engines": { "node": ">=0.4" } }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -13207,25 +11966,22 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "license": "MIT", "engines": { "node": ">=12.20" }, diff --git a/server/prisma/migrations/20260316174619_add_feedback_model/migration.sql b/server/prisma/migrations/20260316174619_add_feedback_model/migration.sql new file mode 100644 index 00000000..71ddacb8 --- /dev/null +++ b/server/prisma/migrations/20260316174619_add_feedback_model/migration.sql @@ -0,0 +1,21 @@ +-- CreateEnum +CREATE TYPE "FeedbackCategory" AS ENUM ('BUG_REPORT', 'SUGGESTION', 'GENERAL'); + +-- AlterTable +ALTER TABLE "User" ALTER COLUMN "hasCompletedOnboarding" SET DEFAULT false; + +-- CreateTable +CREATE TABLE "Feedback" ( + "id" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "category" "FeedbackCategory" NOT NULL, + "text" TEXT NOT NULL, + "rating" BOOLEAN, + "challengeId" TEXT, + "userId" TEXT NOT NULL, + + CONSTRAINT "Feedback_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "Feedback" ADD CONSTRAINT "Feedback_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/server/prisma/migrations/20260324180000_feedback_unique_per_challenge/migration.sql b/server/prisma/migrations/20260324180000_feedback_unique_per_challenge/migration.sql new file mode 100644 index 00000000..b2bbd126 --- /dev/null +++ b/server/prisma/migrations/20260324180000_feedback_unique_per_challenge/migration.sql @@ -0,0 +1,2 @@ +-- CreateIndex +CREATE UNIQUE INDEX "Feedback_userId_challengeId_key" ON "Feedback"("userId", "challengeId"); diff --git a/server/prisma/migrations/20260414000000_expand_event_categories/migration.sql b/server/prisma/migrations/20260414000000_expand_event_categories/migration.sql new file mode 100644 index 00000000..c31956ff --- /dev/null +++ b/server/prisma/migrations/20260414000000_expand_event_categories/migration.sql @@ -0,0 +1,21 @@ +-- Remap existing categories before altering the enum +UPDATE "EventBase" SET "category" = 'FOOD' WHERE "category" = 'CAFE'; +UPDATE "EventBase" SET "category" = 'FOOD' WHERE "category" = 'DININGHALL'; +UPDATE "EventBase" SET "category" = 'DORM' WHERE "category" = 'DORM'; + +-- Create new enum type with updated values +CREATE TYPE "EventCategoryType_new" AS ENUM ('FOOD', 'NATURE', 'HISTORICAL', 'RESIDENTIAL', 'LANDMARK', 'ARTS', 'ATHLETICS', 'LIBRARY', 'ACADEMIC', 'RECREATION'); + +-- Remap DORM to RESIDENTIAL during the column type change +ALTER TABLE "EventBase" + ALTER COLUMN "category" TYPE "EventCategoryType_new" + USING ( + CASE "category"::text + WHEN 'DORM' THEN 'RESIDENTIAL'::"EventCategoryType_new" + ELSE "category"::text::"EventCategoryType_new" + END + ); + +-- Drop old enum and rename new one +DROP TYPE "EventCategoryType"; +ALTER TYPE "EventCategoryType_new" RENAME TO "EventCategoryType"; diff --git a/server/prisma/migrations/20260414212655_add_scheduled_time_to_challenge/migration.sql b/server/prisma/migrations/20260414212655_add_scheduled_time_to_challenge/migration.sql new file mode 100644 index 00000000..deb3e8e7 --- /dev/null +++ b/server/prisma/migrations/20260414212655_add_scheduled_time_to_challenge/migration.sql @@ -0,0 +1,6 @@ +-- AlterTable +ALTER TABLE "Challenge" ADD COLUMN "scheduledEndTime" TIMESTAMP(3), +ADD COLUMN "scheduledStartTime" TIMESTAMP(3); + +-- AlterTable +ALTER TABLE "PrevChallenge" ADD COLUMN "dateExpired" BOOLEAN NOT NULL DEFAULT false; diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index e8d549c6..63647436 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -115,6 +115,7 @@ model User { hasCompletedOnboarding Boolean @default(false) eventAttendances EventAttendance[] eventRSVPs EventRSVP[] + feedbacks Feedback[] } model Group { @@ -147,7 +148,9 @@ model Challenge { longitude Float awardingRadius Float closeRadius Float - timerLength Int? + timerLength Int? + scheduledStartTime DateTime? + scheduledEndTime DateTime? completions PrevChallenge[] activeTrackers EventTracker[] QuizQuestion QuizQuestion[] @@ -183,9 +186,13 @@ enum EventCategoryType { FOOD NATURE HISTORICAL - CAFE - DININGHALL - DORM + RESIDENTIAL + LANDMARK + ARTS + ATHLETICS + LIBRARY + ACADEMIC + RECREATION } model EventTracker { @@ -219,6 +226,7 @@ model PrevChallenge { extensionsUsed Int @default(0) timestamp DateTime @default(now()) failed Boolean @default(false) // True if challenge was failed due to timer expiration + dateExpired Boolean @default(false) // True if auto-completed because time window passed } model Organization { @@ -512,6 +520,25 @@ model EventAttendance { @@unique([userId, campusEventId]) } +enum FeedbackCategory { + BUG_REPORT + SUGGESTION + GENERAL +} + +model Feedback { + id String @id @default(uuid()) + createdAt DateTime @default(now()) + category FeedbackCategory + text String + rating Boolean? + challengeId String? + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + userId String + + @@unique([userId, challengeId]) +} + model EventRSVP { id String @id @default(uuid()) userId String diff --git a/server/prisma/seed.ts b/server/prisma/seed.ts index 65205360..0f6b2b3b 100644 --- a/server/prisma/seed.ts +++ b/server/prisma/seed.ts @@ -1899,7 +1899,7 @@ async function main() { name: 'Angled Eyes', slot: 'EYES', cost: 25, - assetKey: 'buildabear/eyes/><', + assetKey: 'buildabear/eyes/squinty_eyes', mimeType: 'image/png', }, ], diff --git a/server/src/app.module.ts b/server/src/app.module.ts index 9b2ed505..86d9d02d 100644 --- a/server/src/app.module.ts +++ b/server/src/app.module.ts @@ -23,6 +23,9 @@ import { CampusEventModule } from './campus-event/campus-event.module'; import { CheckInModule } from './check-in/check-in.module'; import { EventSyncModule } from './event-sync/event-sync.module'; import { ClubSubmissionModule } from './club-submission/club-submission.module'; +import { FeedbackModule } from './feedback/feedback.module'; +import { FeatureFlagsController } from './feature-flags/feature-flags.controller'; +import { FrontendConfigController } from './frontend-config/frontend-config.controller'; @Module({ imports: [ @@ -50,8 +53,9 @@ import { ClubSubmissionModule } from './club-submission/club-submission.module'; CheckInModule, EventSyncModule, ClubSubmissionModule, + FeedbackModule, ], - controllers: [], + controllers: [FeatureFlagsController, FrontendConfigController], providers: [], }) export class AppModule {} diff --git a/server/src/auth/auth.service.ts b/server/src/auth/auth.service.ts index d74c0177..cd9985d6 100644 --- a/server/src/auth/auth.service.ts +++ b/server/src/auth/auth.service.ts @@ -193,6 +193,9 @@ export class AuthService { if (user.isBanned) return null; + // Ensure existing users have default bear items equipped + await this.userService.ensureDefaultBearItems(user.id); + const accessToken = await this.jwtService.signAsync( { userId: user.id, diff --git a/server/src/avatar/avatar.dto.ts b/server/src/avatar/avatar.dto.ts index f9ad2cd0..d26f9621 100644 --- a/server/src/avatar/avatar.dto.ts +++ b/server/src/avatar/avatar.dto.ts @@ -77,3 +77,23 @@ export interface UpdatePurchaseResultDto { newBalance: number; itemId: string; } + +/** Admin DTOs for managing BearItems */ + +export interface AdminBearItemDto { + id: string; + name?: string; + slot?: BearSlotDto; + cost?: number; + assetKey?: string; + mimeType?: string; + zIndex?: number | null; + isDefault?: boolean; +} + +export interface UpdateBearItemDataDto { + bearItem: AdminBearItemDto; + deleted: boolean; +} + +export interface RequestAllBearItemsDto {} diff --git a/server/src/avatar/avatar.gateway.spec.ts b/server/src/avatar/avatar.gateway.spec.ts new file mode 100644 index 00000000..47c10d4b --- /dev/null +++ b/server/src/avatar/avatar.gateway.spec.ts @@ -0,0 +1,255 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AvatarGateway } from './avatar.gateway'; +import { AvatarService } from './avatar.service'; +import { ClientService } from '../client/client.service'; +import { AuthService } from '../auth/auth.service'; +import { CaslAbilityFactory } from '../casl/casl-ability.factory'; +import { Reflector } from '@nestjs/core'; +import { BearSlotDto } from './avatar.dto'; + +const adminUser = { + id: 'admin-1', + administrator: true, + isBanned: false, +} as any; + +const regularUser = { + id: 'user-1', + administrator: false, + isBanned: false, +} as any; + +const mockBearItem = { + id: 'item-1', + createdAt: new Date(), + updatedAt: new Date(), + name: 'Red Eyes', + slot: 'EYES' as const, + cost: 100, + assetKey: 'eyes_red', + mimeType: 'image/png', + zIndex: 1, + isDefault: false, +}; + +const mockAvatarService = { + listItems: jest.fn(), + getBearItemById: jest.fn(), + createBearItem: jest.fn(), + updateBearItem: jest.fn(), + deleteBearItem: jest.fn(), + emitUpdateBearItemData: jest.fn(), + getInventory: jest.fn(), + getLoadout: jest.fn(), + purchaseItem: jest.fn(), + equipItem: jest.fn(), + toAdminBearItemDto: jest.fn(), +}; + +const mockClientService = { + sendProtected: jest.fn(), + emitErrorData: jest.fn(), +}; + +describe('AvatarGateway', () => { + let gateway: AvatarGateway; + + beforeEach(async () => { + jest.clearAllMocks(); + + const module: TestingModule = await Test.createTestingModule({ + providers: [ + AvatarGateway, + { provide: AvatarService, useValue: mockAvatarService }, + { provide: ClientService, useValue: mockClientService }, + { provide: AuthService, useValue: null }, + { provide: CaslAbilityFactory, useValue: null }, + { provide: Reflector, useValue: null }, + ], + }).compile(); + + gateway = module.get(AvatarGateway); + }); + + it('should be defined', () => { + expect(gateway).toBeDefined(); + }); + + describe('requestAllBearItems', () => { + it('should return items for admin users', async () => { + const bearItemDto = { + id: 'item-1', + name: 'Red Eyes', + slot: BearSlotDto.EYES, + cost: 100, + assetKey: 'eyes_red', + mimeType: 'image/png', + zIndex: 1, + }; + mockAvatarService.listItems.mockResolvedValue([bearItemDto]); + mockAvatarService.getBearItemById.mockResolvedValue(mockBearItem); + + const result = await gateway.requestAllBearItems(adminUser, {}); + + expect(result).toBe(1); + expect(mockAvatarService.listItems).toHaveBeenCalledWith(); + expect(mockAvatarService.emitUpdateBearItemData).toHaveBeenCalledWith( + mockBearItem, + false, + 'user/admin-1', + ); + }); + + it('should reject non-admin users', async () => { + const result = await gateway.requestAllBearItems(regularUser, {}); + + expect(result).toBeUndefined(); + expect(mockClientService.emitErrorData).toHaveBeenCalledWith( + regularUser, + 'Unauthorized', + ); + expect(mockAvatarService.listItems).not.toHaveBeenCalled(); + }); + }); + + describe('updateBearItemData - create', () => { + it('should create a new bear item when id is empty', async () => { + const newItem = { ...mockBearItem, id: 'new-id' }; + mockAvatarService.createBearItem.mockResolvedValue(newItem); + + const result = await gateway.updateBearItemData(adminUser, { + bearItem: { + id: '', + name: 'New Item', + slot: BearSlotDto.MOUTH, + cost: 50, + assetKey: 'mouth_smile', + }, + deleted: false, + }); + + expect(result).toBe('new-id'); + expect(mockAvatarService.createBearItem).toHaveBeenCalled(); + expect(mockAvatarService.emitUpdateBearItemData).toHaveBeenCalledWith( + newItem, + false, + ); + }); + + it('should reject non-admin create requests', async () => { + const result = await gateway.updateBearItemData(regularUser, { + bearItem: { id: '', name: 'Hack' }, + deleted: false, + }); + + expect(result).toBeUndefined(); + expect(mockClientService.emitErrorData).toHaveBeenCalledWith( + regularUser, + 'Unauthorized', + ); + expect(mockAvatarService.createBearItem).not.toHaveBeenCalled(); + }); + }); + + describe('updateBearItemData - update', () => { + it('should update an existing bear item', async () => { + const updatedItem = { ...mockBearItem, name: 'Updated' }; + mockAvatarService.updateBearItem.mockResolvedValue(updatedItem); + + const result = await gateway.updateBearItemData(adminUser, { + bearItem: { id: 'item-1', name: 'Updated' }, + deleted: false, + }); + + expect(result).toBe('item-1'); + expect(mockAvatarService.updateBearItem).toHaveBeenCalledWith('item-1', { + id: 'item-1', + name: 'Updated', + }); + expect(mockAvatarService.emitUpdateBearItemData).toHaveBeenCalledWith( + updatedItem, + false, + ); + }); + + it('should emit error when update target not found', async () => { + mockAvatarService.updateBearItem.mockResolvedValue(null); + + const result = await gateway.updateBearItemData(adminUser, { + bearItem: { id: 'nonexistent', name: 'Test' }, + deleted: false, + }); + + expect(result).toBeUndefined(); + expect(mockClientService.emitErrorData).toHaveBeenCalledWith( + adminUser, + 'Failed to update bear item!', + ); + }); + }); + + describe('updateBearItemData - delete', () => { + it('should delete an existing bear item', async () => { + mockAvatarService.getBearItemById.mockResolvedValue(mockBearItem); + mockAvatarService.deleteBearItem.mockResolvedValue(true); + + const result = await gateway.updateBearItemData(adminUser, { + bearItem: { id: 'item-1' }, + deleted: true, + }); + + expect(result).toBe('item-1'); + expect(mockAvatarService.deleteBearItem).toHaveBeenCalledWith('item-1'); + expect(mockAvatarService.emitUpdateBearItemData).toHaveBeenCalledWith( + mockBearItem, + true, + ); + }); + + it('should emit error when delete target not found', async () => { + mockAvatarService.getBearItemById.mockResolvedValue(null); + + const result = await gateway.updateBearItemData(adminUser, { + bearItem: { id: 'nonexistent' }, + deleted: true, + }); + + expect(result).toBeUndefined(); + expect(mockClientService.emitErrorData).toHaveBeenCalledWith( + adminUser, + 'Bear item not found!', + ); + expect(mockAvatarService.deleteBearItem).not.toHaveBeenCalled(); + }); + + it('should emit error when delete fails', async () => { + mockAvatarService.getBearItemById.mockResolvedValue(mockBearItem); + mockAvatarService.deleteBearItem.mockResolvedValue(false); + + const result = await gateway.updateBearItemData(adminUser, { + bearItem: { id: 'item-1' }, + deleted: true, + }); + + expect(result).toBeUndefined(); + expect(mockClientService.emitErrorData).toHaveBeenCalledWith( + adminUser, + 'Failed to delete bear item!', + ); + }); + + it('should reject non-admin delete requests', async () => { + const result = await gateway.updateBearItemData(regularUser, { + bearItem: { id: 'item-1' }, + deleted: true, + }); + + expect(result).toBeUndefined(); + expect(mockClientService.emitErrorData).toHaveBeenCalledWith( + regularUser, + 'Unauthorized', + ); + expect(mockAvatarService.deleteBearItem).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/server/src/avatar/avatar.gateway.ts b/server/src/avatar/avatar.gateway.ts index 2695b344..7f70f511 100644 --- a/server/src/avatar/avatar.gateway.ts +++ b/server/src/avatar/avatar.gateway.ts @@ -11,9 +11,11 @@ import { ClientService } from '../client/client.service'; import { EquipBearItemDto, PurchaseBearItemDto, + RequestAllBearItemsDto, RequestBearItemsDto, RequestUserBearLoadoutDto, RequestUserInventoryDto, + UpdateBearItemDataDto, } from './avatar.dto'; import { AvatarService } from './avatar.service'; import { PoliciesGuard } from '../casl/policy.guard'; @@ -102,4 +104,111 @@ export class AvatarGateway { ); return true; } + + // ── Admin endpoints ── + + @SubscribeMessage('requestAllBearItems') + async requestAllBearItems( + @CallingUser() user: User, + @MessageBody() _data: RequestAllBearItemsDto, + ) { + if (!user.administrator) { + await this.clientService.emitErrorData(user, 'Unauthorized'); + return; + } + + const items = await this.avatarService.listItems(); + for (const item of items) { + const fullItem = await this.avatarService.getBearItemById(item.id); + if (fullItem) { + await this.avatarService.emitUpdateBearItemData( + fullItem, + false, + 'user/' + user.id, + ); + } + } + return items.length; + } + + @SubscribeMessage('updateBearItemData') + async updateBearItemData( + @CallingUser() user: User, + @MessageBody() data: UpdateBearItemDataDto, + ) { + if (!user.administrator) { + await this.clientService.emitErrorData(user, 'Unauthorized'); + return; + } + + if (data.deleted) { + const existing = await this.avatarService.getBearItemById( + data.bearItem.id, + ); + if (!existing) { + await this.clientService.emitErrorData(user, 'Bear item not found!'); + return; + } + + const [affectedUserIds, equippedEntries] = await Promise.all([ + this.avatarService.getAffectedUserIds(data.bearItem.id), + this.avatarService.getEquippedEntries(data.bearItem.id), + ]); + + const deleted = await this.avatarService.deleteBearItem(data.bearItem.id); + if (!deleted) { + await this.clientService.emitErrorData( + user, + 'Failed to delete bear item!', + ); + return; + } + + await this.avatarService.reEquipDefaults(equippedEntries); + await this.avatarService.emitUpdateBearItemData(existing, true); + + for (const userId of affectedUserIds) { + const [inv, loadout] = await Promise.all([ + this.avatarService.getInventory(userId), + this.avatarService.getLoadout(userId), + ]); + await Promise.all([ + this.clientService.sendProtected( + 'updateUserInventoryData', + 'user/' + userId, + inv, + ), + this.clientService.sendProtected( + 'updateUserBearLoadoutData', + 'user/' + userId, + loadout, + ), + ]); + } + + return existing.id; + } + + if (data.bearItem.id) { + const updated = await this.avatarService.updateBearItem( + data.bearItem.id, + data.bearItem, + ); + + if (!updated) { + await this.clientService.emitErrorData( + user, + 'Failed to update bear item!', + ); + return; + } + + await this.avatarService.emitUpdateBearItemData(updated, false); + return updated.id; + } + + const created = await this.avatarService.createBearItem(data.bearItem); + await this.avatarService.emitUpdateBearItemData(created, false); + return created.id; + } } diff --git a/server/src/avatar/avatar.service.spec.ts b/server/src/avatar/avatar.service.spec.ts new file mode 100644 index 00000000..133b21d0 --- /dev/null +++ b/server/src/avatar/avatar.service.spec.ts @@ -0,0 +1,336 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AvatarService } from './avatar.service'; +import { PrismaService } from '../prisma/prisma.service'; +import { ClientService } from '../client/client.service'; +import { BearSlotDto } from './avatar.dto'; + +const mockBearItem = { + id: 'item-1', + createdAt: new Date(), + updatedAt: new Date(), + name: 'Red Eyes', + slot: 'EYES' as const, + cost: 100, + assetKey: 'eyes_red', + mimeType: 'image/png', + zIndex: 1, + isDefault: false, +}; + +const mockPrisma = { + bearItem: { + findMany: jest.fn(), + findUnique: jest.fn(), + create: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + }, + userBearInventory: { + findMany: jest.fn(), + count: jest.fn(), + create: jest.fn(), + }, + userBearEquipped: { + findMany: jest.fn(), + upsert: jest.fn(), + deleteMany: jest.fn(), + }, + user: { + findUnique: jest.fn(), + update: jest.fn(), + }, + $transaction: jest.fn(), + $queryRaw: jest.fn(), +}; + +const mockClientService = { + sendProtected: jest.fn(), + emitErrorData: jest.fn(), +}; + +describe('AvatarService', () => { + let service: AvatarService; + + beforeEach(async () => { + jest.clearAllMocks(); + + const module: TestingModule = await Test.createTestingModule({ + providers: [ + AvatarService, + { provide: PrismaService, useValue: mockPrisma }, + { provide: ClientService, useValue: mockClientService }, + ], + }).compile(); + + service = module.get(AvatarService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + describe('getBearItemById', () => { + it('should return an item when found', async () => { + mockPrisma.bearItem.findUnique.mockResolvedValue(mockBearItem); + + const result = await service.getBearItemById('item-1'); + + expect(result).toEqual(mockBearItem); + expect(mockPrisma.bearItem.findUnique).toHaveBeenCalledWith({ + where: { id: 'item-1' }, + }); + }); + + it('should return null when not found', async () => { + mockPrisma.bearItem.findUnique.mockResolvedValue(null); + + const result = await service.getBearItemById('nonexistent'); + + expect(result).toBeNull(); + }); + }); + + describe('createBearItem', () => { + it('should create a bear item with provided fields', async () => { + const dto = { + id: '', + name: 'Blue Eyes', + slot: BearSlotDto.EYES, + cost: 50, + assetKey: 'eyes_blue', + mimeType: 'image/png', + zIndex: 2, + isDefault: false, + }; + + mockPrisma.bearItem.create.mockResolvedValue({ + ...mockBearItem, + ...dto, + id: 'new-id', + slot: 'EYES', + }); + + const result = await service.createBearItem(dto); + + expect(mockPrisma.bearItem.create).toHaveBeenCalledWith({ + data: { + name: 'Blue Eyes', + slot: 'EYES', + cost: 50, + assetKey: 'eyes_blue', + mimeType: 'image/png', + zIndex: 2, + isDefault: false, + }, + }); + expect(result.id).toBe('new-id'); + }); + + it('should use defaults when fields are omitted', async () => { + const dto = { id: '' }; + + mockPrisma.bearItem.create.mockResolvedValue({ + ...mockBearItem, + id: 'new-id', + name: 'New Item', + slot: 'ACCESSORY', + cost: 0, + assetKey: '', + mimeType: null, + zIndex: null, + isDefault: false, + }); + + await service.createBearItem(dto); + + expect(mockPrisma.bearItem.create).toHaveBeenCalledWith({ + data: { + name: 'New Item', + slot: 'ACCESSORY', + cost: 0, + assetKey: '', + mimeType: null, + zIndex: null, + isDefault: false, + }, + }); + }); + + it('should truncate name to 256 characters', async () => { + const longName = 'A'.repeat(300); + const dto = { id: '', name: longName }; + + mockPrisma.bearItem.create.mockResolvedValue(mockBearItem); + + await service.createBearItem(dto); + + const createCall = mockPrisma.bearItem.create.mock.calls[0][0]; + expect(createCall.data.name.length).toBe(256); + }); + }); + + describe('updateBearItem', () => { + it('should update an existing bear item', async () => { + mockPrisma.bearItem.findUnique.mockResolvedValue(mockBearItem); + const updatedItem = { ...mockBearItem, name: 'Updated Name', cost: 200 }; + mockPrisma.bearItem.update.mockResolvedValue(updatedItem); + + const result = await service.updateBearItem('item-1', { + id: 'item-1', + name: 'Updated Name', + cost: 200, + }); + + expect(result).toEqual(updatedItem); + expect(mockPrisma.bearItem.update).toHaveBeenCalledWith({ + where: { id: 'item-1' }, + data: { + name: 'Updated Name', + slot: undefined, + cost: 200, + assetKey: undefined, + mimeType: undefined, + zIndex: undefined, + isDefault: undefined, + }, + }); + }); + + it('should return null when item does not exist', async () => { + mockPrisma.bearItem.findUnique.mockResolvedValue(null); + + const result = await service.updateBearItem('nonexistent', { + id: 'nonexistent', + name: 'Test', + }); + + expect(result).toBeNull(); + expect(mockPrisma.bearItem.update).not.toHaveBeenCalled(); + }); + }); + + describe('deleteBearItem', () => { + it('should delete an existing bear item and return true', async () => { + mockPrisma.bearItem.findUnique.mockResolvedValue(mockBearItem); + mockPrisma.bearItem.delete.mockResolvedValue(mockBearItem); + + const result = await service.deleteBearItem('item-1'); + + expect(result).toBe(true); + expect(mockPrisma.bearItem.delete).toHaveBeenCalledWith({ + where: { id: 'item-1' }, + }); + }); + + it('should return false when item does not exist', async () => { + mockPrisma.bearItem.findUnique.mockResolvedValue(null); + + const result = await service.deleteBearItem('nonexistent'); + + expect(result).toBe(false); + expect(mockPrisma.bearItem.delete).not.toHaveBeenCalled(); + }); + }); + + describe('toAdminBearItemDto', () => { + it('should convert a BearItem to AdminBearItemDto', () => { + const dto = service.toAdminBearItemDto(mockBearItem as any); + + expect(dto).toEqual({ + id: 'item-1', + name: 'Red Eyes', + slot: BearSlotDto.EYES, + cost: 100, + assetKey: 'eyes_red', + mimeType: 'image/png', + zIndex: 1, + isDefault: false, + }); + }); + + it('should handle null mimeType and zIndex', () => { + const item = { ...mockBearItem, mimeType: null, zIndex: null }; + const dto = service.toAdminBearItemDto(item as any); + + expect(dto.mimeType).toBeUndefined(); + expect(dto.zIndex).toBeUndefined(); + }); + }); + + describe('emitUpdateBearItemData', () => { + it('should emit full item data when not deleted', async () => { + await service.emitUpdateBearItemData(mockBearItem as any, false); + + expect(mockClientService.sendProtected).toHaveBeenCalledWith( + 'updateBearItemData', + null, + { + bearItem: { + id: 'item-1', + name: 'Red Eyes', + slot: BearSlotDto.EYES, + cost: 100, + assetKey: 'eyes_red', + mimeType: 'image/png', + zIndex: 1, + isDefault: false, + }, + deleted: false, + }, + ); + }); + + it('should emit only id when deleted', async () => { + await service.emitUpdateBearItemData(mockBearItem as any, true); + + expect(mockClientService.sendProtected).toHaveBeenCalledWith( + 'updateBearItemData', + null, + { + bearItem: { id: 'item-1' }, + deleted: true, + }, + ); + }); + + it('should send to a specific target when provided', async () => { + await service.emitUpdateBearItemData( + mockBearItem as any, + false, + 'user/admin-1', + ); + + expect(mockClientService.sendProtected).toHaveBeenCalledWith( + 'updateBearItemData', + 'user/admin-1', + expect.any(Object), + ); + }); + }); + + describe('listItems', () => { + it('should return all items when no slot filter', async () => { + mockPrisma.bearItem.findMany.mockResolvedValue([mockBearItem]); + + const result = await service.listItems(); + + expect(result).toHaveLength(1); + expect(result[0].id).toBe('item-1'); + expect(mockPrisma.bearItem.findMany).toHaveBeenCalledWith({ + where: undefined, + orderBy: [{ slot: 'asc' }, { zIndex: 'asc' }, { name: 'asc' }], + }); + }); + + it('should filter by slot when provided', async () => { + mockPrisma.bearItem.findMany.mockResolvedValue([]); + + await service.listItems(BearSlotDto.MOUTH); + + expect(mockPrisma.bearItem.findMany).toHaveBeenCalledWith({ + where: { slot: 'MOUTH' }, + orderBy: [{ slot: 'asc' }, { zIndex: 'asc' }, { name: 'asc' }], + }); + }); + }); +}); diff --git a/server/src/avatar/avatar.service.ts b/server/src/avatar/avatar.service.ts index 05843402..50d45664 100644 --- a/server/src/avatar/avatar.service.ts +++ b/server/src/avatar/avatar.service.ts @@ -5,19 +5,25 @@ import { UserBearEquipped, } from '@prisma/client'; import { PrismaService } from '../prisma/prisma.service'; +import { ClientService } from '../client/client.service'; import { + AdminBearItemDto, BearItemDto, BearSlotDto, EquipBearItemDto, PurchaseBearItemDto, PurchaseResultDto, + UpdateBearItemDataDto, UserBearLoadoutDto, UserInventoryDto, } from './avatar.dto'; @Injectable() export class AvatarService { - constructor(private readonly prisma: PrismaService) {} + constructor( + private readonly prisma: PrismaService, + private readonly clientService: ClientService, + ) {} /** Map Prisma enum to DTO enum */ private toDtoSlot(slot: PrismaBearSlot): BearSlotDto { @@ -182,4 +188,138 @@ export class AvatarService { return this.getLoadout(userId); } + + // ── Admin CRUD ── + + async getBearItemById(id: string): Promise { + return this.prisma.bearItem.findUnique({ where: { id } }); + } + + async createBearItem(dto: AdminBearItemDto): Promise { + return this.prisma.bearItem.create({ + data: { + name: dto.name?.substring(0, 256) ?? 'New Item', + slot: this.toPrismaSlot(dto.slot ?? BearSlotDto.ACCESSORY), + cost: dto.cost ?? 0, + assetKey: dto.assetKey ?? '', + mimeType: dto.mimeType ?? null, + zIndex: dto.zIndex ?? null, + isDefault: dto.isDefault ?? false, + }, + }); + } + + async updateBearItem( + id: string, + dto: AdminBearItemDto, + ): Promise { + const existing = await this.prisma.bearItem.findUnique({ where: { id } }); + if (!existing) return null; + + return this.prisma.bearItem.update({ + where: { id }, + data: { + name: dto.name?.substring(0, 256), + cost: dto.cost, + assetKey: dto.assetKey, + mimeType: dto.mimeType, + zIndex: dto.zIndex, + isDefault: dto.isDefault, + }, + }); + } + + async getAffectedUserIds(bearItemId: string): Promise { + const [invUsers, equipUsers] = await Promise.all([ + this.prisma.userBearInventory.findMany({ + where: { bearItemId }, + select: { userId: true }, + }), + this.prisma.userBearEquipped.findMany({ + where: { bearItemId }, + select: { userId: true }, + }), + ]); + + return [ + ...new Set([ + ...invUsers.map(r => r.userId), + ...equipUsers.map(r => r.userId), + ]), + ]; + } + + async getEquippedEntries( + bearItemId: string, + ): Promise<{ userId: string; slot: PrismaBearSlot }[]> { + return this.prisma.userBearEquipped.findMany({ + where: { bearItemId }, + select: { userId: true, slot: true }, + }); + } + + /** + * For each (userId, slot) pair, equip the default item for that slot. + * If no default exists for a slot, the slot stays empty. + */ + async reEquipDefaults( + entries: { userId: string; slot: PrismaBearSlot }[], + ): Promise { + if (entries.length === 0) return; + + const slots = [...new Set(entries.map(e => e.slot))]; + const defaultItems = await this.prisma.bearItem.findMany({ + where: { isDefault: true, slot: { in: slots } }, + }); + const defaultBySlot = new Map(defaultItems.map(i => [i.slot, i])); + + for (const { userId, slot } of entries) { + const defaultItem = defaultBySlot.get(slot); + if (!defaultItem) continue; + + await this.prisma.userBearEquipped.upsert({ + where: { userId_slot: { userId, slot } }, + create: { userId, slot, bearItemId: defaultItem.id }, + update: { bearItemId: defaultItem.id }, + }); + } + } + + async deleteBearItem(id: string): Promise { + const existing = await this.prisma.bearItem.findUnique({ where: { id } }); + if (!existing) return false; + + await this.prisma.bearItem.delete({ where: { id } }); + return true; + } + + toAdminBearItemDto(item: BearItem): AdminBearItemDto { + return { + id: item.id, + name: item.name, + slot: this.toDtoSlot(item.slot), + cost: item.cost, + assetKey: item.assetKey, + mimeType: item.mimeType ?? undefined, + zIndex: item.zIndex ?? undefined, + isDefault: item.isDefault, + }; + } + + async emitUpdateBearItemData( + item: BearItem, + deleted: boolean, + target?: string, + ) { + const dto: UpdateBearItemDataDto = { + bearItem: deleted ? { id: item.id } : this.toAdminBearItemDto(item), + deleted, + }; + + await this.clientService.sendProtected( + 'updateBearItemData', + target ?? null, + dto, + ); + } } diff --git a/server/src/challenge/challenge.dto.ts b/server/src/challenge/challenge.dto.ts index 036d6864..f829e09e 100644 --- a/server/src/challenge/challenge.dto.ts +++ b/server/src/challenge/challenge.dto.ts @@ -28,6 +28,8 @@ export interface ChallengeDto { closeRadiusF?: number; linkedEventId?: string; timerLength?: number; + scheduledStartTime?: string; + scheduledEndTime?: string; } /** DTO for requestChallengeData */ diff --git a/server/src/challenge/challenge.service.ts b/server/src/challenge/challenge.service.ts index dfc3c7dc..3fdbbb85 100644 --- a/server/src/challenge/challenge.service.ts +++ b/server/src/challenge/challenge.service.ts @@ -135,6 +135,69 @@ export class ChallengeService { return nextChal; } + /** + * Auto-complete challenges whose scheduled end time has passed. + * Creates PrevChallenge records with failed=true, dateExpired=true, 0 points. + * Advances curChallengeId if it was pointing to an expired challenge. + */ + private async autoCompleteExpiredScheduledChallenges( + user: User, + evTracker: EventTracker, + ) { + const now = new Date(); + + const expiredChallenges = await this.prisma.challenge.findMany({ + where: { + linkedEventId: evTracker.eventId, + scheduledEndTime: { lt: now }, + completions: { none: { userId: user.id } }, + }, + }); + + if (expiredChallenges.length === 0) return; + + for (const challenge of expiredChallenges) { + await this.prisma.prevChallenge.create({ + data: { + userId: user.id, + challengeId: challenge.id, + trackerId: evTracker.id, + hintsUsed: 0, + failed: true, + dateExpired: true, + }, + }); + } + + // If the current challenge was expired, advance to next available + if ( + evTracker.curChallengeId && + expiredChallenges.some(c => c.id === evTracker.curChallengeId) + ) { + const nextAvailable = await this.prisma.challenge.findFirst({ + where: { + linkedEventId: evTracker.eventId, + completions: { none: { userId: user.id } }, + }, + orderBy: { eventIndex: 'asc' }, + }); + + await this.prisma.eventTracker.update({ + where: { id: evTracker.id }, + data: { + curChallengeId: nextAvailable?.id ?? null, + hintsUsed: 0, + }, + }); + } + + // Emit tracker update so the client sees the new PrevChallenge records + const updatedTracker = await this.prisma.eventTracker.findUniqueOrThrow({ + where: { id: evTracker.id }, + }); + await this.eventService.emitUpdateEventTracker(updatedTracker, user); + } + /** * Get all available (uncompleted) challenges in the user's current journey. * Returns challenges sorted by eventIndex for consistent ordering. @@ -143,6 +206,9 @@ export class ChallengeService { const evTracker = await this.eventService.getCurrentEventTrackerForUser(user); + // Auto-complete any challenges whose scheduled window has passed + await this.autoCompleteExpiredScheduledChallenges(user, evTracker); + return await this.prisma.challenge.findMany({ where: { linkedEventId: evTracker.eventId, @@ -178,6 +244,15 @@ export class ChallengeService { return null; // Challenge not found or belongs to different event } + // Reject if challenge is outside its scheduled time window + const now = new Date(); + if ( + (challenge.scheduledStartTime && now < challenge.scheduledStartTime) || + (challenge.scheduledEndTime && now > challenge.scheduledEndTime) + ) { + return null; + } + const isCompleted = (await this.prisma.prevChallenge.count({ where: { @@ -249,6 +324,20 @@ export class ChallengeService { if (!eventTracker.curChallengeId) return null; + // Reject if current challenge is outside its scheduled time window + const curChal = await this.prisma.challenge.findFirst({ + where: { id: eventTracker.curChallengeId }, + }); + if (curChal) { + const now = new Date(); + if ( + (curChal.scheduledStartTime && now < curChal.scheduledStartTime) || + (curChal.scheduledEndTime && now > curChal.scheduledEndTime) + ) { + return null; + } + } + const alreadyDone = (await this.prisma.prevChallenge.count({ where: { @@ -568,6 +657,8 @@ export class ChallengeService { closeRadiusF: ch.closeRadius, linkedEventId: ch.linkedEventId!, timerLength: ch.timerLength ?? undefined, + scheduledStartTime: ch.scheduledStartTime?.toISOString() ?? undefined, + scheduledEndTime: ch.scheduledEndTime?.toISOString() ?? undefined, }; } @@ -608,6 +699,12 @@ export class ChallengeService { awardingRadius: challenge.awardingRadiusF, closeRadius: challenge.closeRadiusF, timerLength: challenge.timerLength ?? null, + scheduledStartTime: challenge.scheduledStartTime + ? new Date(challenge.scheduledStartTime) + : null, + scheduledEndTime: challenge.scheduledEndTime + ? new Date(challenge.scheduledEndTime) + : null, }; const data = await this.abilityFactory.filterInaccessible( @@ -647,6 +744,12 @@ export class ChallengeService { eventIndex: (maxIndexChallenge._max.eventIndex ?? -1) + 1, linkedEventId: challenge.linkedEventId, timerLength: challenge.timerLength ?? null, + scheduledStartTime: challenge.scheduledStartTime + ? new Date(challenge.scheduledStartTime) + : null, + scheduledEndTime: challenge.scheduledEndTime + ? new Date(challenge.scheduledEndTime) + : null, }; chal = await this.prisma.challenge.create({ diff --git a/server/src/client/client.service.ts b/server/src/client/client.service.ts index 9f3b99f9..e8bdc625 100644 --- a/server/src/client/client.service.ts +++ b/server/src/client/client.service.ts @@ -26,6 +26,7 @@ import { UpdateAchievementDataDto, } from '../achievement/achievement.dto'; import { + UpdateBearItemDataDto, UpdateBearItemsDataDto, UpdatePurchaseResultDto, UpdateUserBearLoadoutDataDto, @@ -45,6 +46,7 @@ import { QuizErrorDto, QuizProgressDto, } from '../quiz/quiz.dto'; +import { UpdateFeedbackDataDto } from '../feedback/feedback.dto'; import { UpdateCampusEventDataDto, CampusEventListResponseDto, @@ -66,6 +68,7 @@ export type ClientApiDef = { updateOrganizationData: UpdateOrganizationDataDto; updateLeaderPosition: UpdateLeaderPositionDto; updateBearItemsData: UpdateBearItemsDataDto; + updateBearItemData: UpdateBearItemDataDto; updateUserInventoryData: UpdateUserInventoryDataDto; updateUserBearLoadoutData: UpdateUserBearLoadoutDataDto; updatePurchaseResult: UpdatePurchaseResultDto; @@ -79,6 +82,7 @@ export type ClientApiDef = { quizResult: QuizResultDto; quizError: QuizErrorDto; quizProgress: QuizProgressDto; + updateFeedbackData: UpdateFeedbackDataDto; updateCampusEventData: UpdateCampusEventDataDto; campusEventList: CampusEventListResponseDto; campusEventDetails: { event: CampusEventDto }; diff --git a/server/src/event/event.dto.ts b/server/src/event/event.dto.ts index d3ced511..de928c47 100644 --- a/server/src/event/event.dto.ts +++ b/server/src/event/event.dto.ts @@ -71,9 +71,13 @@ export enum EventCategoryDto { FOOD = 'FOOD', NATURE = 'NATURE', HISTORICAL = 'HISTORICAL', - CAFE = 'CAFE', - DININGHALL = 'DININGHALL', - DORM = 'DORM', + RESIDENTIAL = 'RESIDENTIAL', + LANDMARK = 'LANDMARK', + ARTS = 'ARTS', + ATHLETICS = 'ATHLETICS', + LIBRARY = 'LIBRARY', + ACADEMIC = 'ACADEMIC', + RECREATION = 'RECREATION', } /** @@ -107,6 +111,7 @@ export interface PrevChallengeDto { extensionsUsed?: number; dateCompleted: string; failed?: boolean; // True if challenge was failed due to timer expiration + dateExpired?: boolean; } /** DTO for event tracker in updateEventTrackerData */ diff --git a/server/src/event/event.service.ts b/server/src/event/event.service.ts index 1925fc24..7616f866 100644 --- a/server/src/event/event.service.ts +++ b/server/src/event/event.service.ts @@ -420,6 +420,7 @@ export class EventService { extensionsUsed: pc.extensionsUsed ?? 0, // Default to 0 for backwards compatibility dateCompleted: pc.timestamp.toUTCString(), failed: pc.failed, // True if challenge was failed due to timer expiration + dateExpired: pc.dateExpired, })), }; } diff --git a/server/src/feature-flags/feature-flags.controller.ts b/server/src/feature-flags/feature-flags.controller.ts new file mode 100644 index 00000000..a276440b --- /dev/null +++ b/server/src/feature-flags/feature-flags.controller.ts @@ -0,0 +1,11 @@ +import { Controller, Get } from '@nestjs/common'; + +@Controller('feature-flags') +export class FeatureFlagsController { + @Get() + getFlags() { + return { + enableBuildABear: process.env.ENABLE_BUILD_A_BEAR === 'true', + }; + } +} diff --git a/server/src/feedback/feedback.dto.ts b/server/src/feedback/feedback.dto.ts new file mode 100644 index 00000000..8768b992 --- /dev/null +++ b/server/src/feedback/feedback.dto.ts @@ -0,0 +1,28 @@ +export enum FeedbackCategoryDto { + BUG_REPORT = 'BUG_REPORT', + SUGGESTION = 'SUGGESTION', + GENERAL = 'GENERAL', +} + +export interface SubmitFeedbackDto { + category: FeedbackCategoryDto; + text: string; + rating?: boolean; + challengeId?: string; +} + +export interface FeedbackDto { + id: string; + createdAt: string; + category: FeedbackCategoryDto; + text: string; + rating?: boolean; + challengeId?: string; + userId: string; + username?: string; + challengeName?: string; +} + +export interface UpdateFeedbackDataDto { + feedbacks: FeedbackDto[]; +} diff --git a/server/src/feedback/feedback.gateway.ts b/server/src/feedback/feedback.gateway.ts new file mode 100644 index 00000000..f316fe80 --- /dev/null +++ b/server/src/feedback/feedback.gateway.ts @@ -0,0 +1,48 @@ +import { + ConnectedSocket, + MessageBody, + SubscribeMessage, + WebSocketGateway, +} from '@nestjs/websockets'; +import { Socket } from 'socket.io'; +import { UseGuards } from '@nestjs/common'; +import { User } from '@prisma/client'; +import { UserGuard } from '../auth/jwt-auth.guard'; +import { CallingUser } from '../auth/calling-user.decorator'; +import { FeedbackService } from './feedback.service'; +import { SubmitFeedbackDto } from './feedback.dto'; + +@WebSocketGateway({ cors: true }) +@UseGuards(UserGuard) +export class FeedbackGateway { + constructor(private readonly feedbackService: FeedbackService) {} + + @SubscribeMessage('submitFeedback') + async handleSubmitFeedback( + @CallingUser() user: User, + @MessageBody() data: SubmitFeedbackDto, + @ConnectedSocket() client: Socket, + ): Promise { + try { + await this.feedbackService.createFeedback(user.id, data); + return true; + } catch (error) { + console.error('Failed to submit feedback:', error); + return false; + } + } + + @SubscribeMessage('requestFeedbackData') + async handleRequestFeedbackData( + @CallingUser() user: User, + @ConnectedSocket() client: Socket, + ): Promise { + if (!user.administrator) { + return false; + } + + const feedbacks = await this.feedbackService.getAllFeedback(); + client.emit('updateFeedbackData', { feedbacks }); + return true; + } +} diff --git a/server/src/feedback/feedback.module.ts b/server/src/feedback/feedback.module.ts new file mode 100644 index 00000000..95e05d29 --- /dev/null +++ b/server/src/feedback/feedback.module.ts @@ -0,0 +1,12 @@ +import { Module, forwardRef } from '@nestjs/common'; +import { FeedbackService } from './feedback.service'; +import { FeedbackGateway } from './feedback.gateway'; +import { PrismaModule } from '../prisma/prisma.module'; +import { AuthModule } from '../auth/auth.module'; + +@Module({ + imports: [PrismaModule, forwardRef(() => AuthModule)], + providers: [FeedbackService, FeedbackGateway], + exports: [FeedbackService], +}) +export class FeedbackModule {} diff --git a/server/src/feedback/feedback.service.ts b/server/src/feedback/feedback.service.ts new file mode 100644 index 00000000..30e5a62d --- /dev/null +++ b/server/src/feedback/feedback.service.ts @@ -0,0 +1,78 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; +import { + FeedbackCategoryDto, + FeedbackDto, + SubmitFeedbackDto, +} from './feedback.dto'; + +@Injectable() +export class FeedbackService { + constructor(private readonly prisma: PrismaService) {} + + async createFeedback(userId: string, dto: SubmitFeedbackDto) { + if (dto.challengeId) { + return this.prisma.feedback.upsert({ + where: { + userId_challengeId: { userId, challengeId: dto.challengeId }, + }, + update: { + category: dto.category, + text: dto.text, + rating: dto.rating, + }, + create: { + userId, + category: dto.category, + text: dto.text, + rating: dto.rating, + challengeId: dto.challengeId, + }, + }); + } + + return this.prisma.feedback.create({ + data: { + userId, + category: dto.category, + text: dto.text, + rating: dto.rating, + }, + }); + } + + async getAllFeedback(): Promise { + const feedbacks = await this.prisma.feedback.findMany({ + include: { user: { select: { username: true } } }, + orderBy: { createdAt: 'desc' }, + }); + + const challengeIds = feedbacks + .map(f => f.challengeId) + .filter((id): id is string => id != null); + + const challenges = + challengeIds.length > 0 + ? await this.prisma.challenge.findMany({ + where: { id: { in: challengeIds } }, + select: { id: true, name: true }, + }) + : []; + + const challengeMap = new Map(challenges.map(c => [c.id, c.name])); + + return feedbacks.map(f => ({ + id: f.id, + createdAt: f.createdAt.toISOString(), + category: f.category as unknown as FeedbackCategoryDto, + text: f.text, + rating: f.rating != null ? f.rating : undefined, + challengeId: f.challengeId ?? undefined, + userId: f.userId, + username: f.user.username, + challengeName: f.challengeId + ? challengeMap.get(f.challengeId) + : undefined, + })); + } +} diff --git a/server/src/frontend-config/frontend-config.controller.ts b/server/src/frontend-config/frontend-config.controller.ts new file mode 100644 index 00000000..295f1c76 --- /dev/null +++ b/server/src/frontend-config/frontend-config.controller.ts @@ -0,0 +1,11 @@ +import { Controller, Get } from '@nestjs/common'; + +@Controller('frontend-config') +export class FrontendConfigController { + @Get() + getConfig() { + return { + googleMapsApiKey: process.env.REACT_APP_GOOGLE_MAPS_API_KEY ?? '', + }; + } +} diff --git a/server/src/user/user.service.ts b/server/src/user/user.service.ts index 863c1ec3..bcf91c9f 100644 --- a/server/src/user/user.service.ts +++ b/server/src/user/user.service.ts @@ -134,6 +134,38 @@ export class UserService { return user; } + /** + * Ensure all default bear items are in the user's inventory and equipped. + * No-ops for slots that already have an equipped item. + */ + async ensureDefaultBearItems(userId: string) { + const defaultItems = await this.prisma.bearItem.findMany({ + where: { isDefault: true }, + }); + + for (const item of defaultItems) { + // Add to inventory if not already owned + const owned = await this.prisma.userBearInventory.count({ + where: { userId, bearItemId: item.id }, + }); + if (owned === 0) { + await this.prisma.userBearInventory.create({ + data: { userId, bearItemId: item.id }, + }); + } + + // Equip if nothing is equipped in this slot + const equipped = await this.prisma.userBearEquipped.findUnique({ + where: { userId_slot: { userId, slot: item.slot } }, + }); + if (!equipped) { + await this.prisma.userBearEquipped.create({ + data: { userId, bearItemId: item.id, slot: item.slot }, + }); + } + } + } + /** * * @param id Get user by id