From f76248c997c1153a9f859511a6678ada18dd0af9 Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Fri, 26 Jul 2024 13:30:16 +0530 Subject: [PATCH 001/121] Fixes last active filter badge showing up when filters other than the last active filter is applied (#8215) --- src/Components/Users/ManageUsers.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Components/Users/ManageUsers.tsx b/src/Components/Users/ManageUsers.tsx index 9660f13c269..19bafebd115 100644 --- a/src/Components/Users/ManageUsers.tsx +++ b/src/Components/Users/ManageUsers.tsx @@ -561,9 +561,11 @@ export default function ManageUsers() { value( "Last Active", "last_active_days", - qParams.last_active_days === "never" - ? "Never" - : `in the last ${qParams.last_active_days} day${qParams.last_active_days > 1 ? "s" : ""}`, + (() => { + if (!qParams.last_active_days) return ""; + if (qParams.last_active_days === "never") return "Never"; + return `in the last ${qParams.last_active_days} day${qParams.last_active_days > 1 ? "s" : ""}`; + })(), ), ]} /> From 5a47aedc76639b7b837beaabe3e686ac3135a450 Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Mon, 29 Jul 2024 12:41:58 +0530 Subject: [PATCH 002/121] Run formatter on entire project (#8224) --- src/CAREUI/interactive/LegendInput.tsx | 2 +- src/CAREUI/interactive/Switch.tsx | 2 +- src/Common/static/countryPhoneAndFlags.json | 6 ++- src/Components/ABDM/ABDMRecordsTab.tsx | 4 +- src/Components/Assets/AssetManage.tsx | 4 +- .../Common/ExcelFIleDragAndDrop.tsx | 4 +- .../Consultations/NeurologicalTables.tsx | 6 +-- src/Components/Facility/FacilityCard.tsx | 2 +- src/Components/Facility/FacilityUsers.tsx | 2 +- .../Investigations/Reports/ReportTable.tsx | 2 +- .../AdministrationEventSeperator.tsx | 2 +- .../AdministrationTable.tsx | 4 +- .../Medicine/ResponsiveMedicineTables.tsx | 4 +- src/Components/Users/UserAdd.tsx | 2 +- src/Locale/en/Auth.json | 2 +- src/Locale/en/Bed.json | 2 +- src/Locale/en/Common.json | 2 +- src/Locale/en/Consultation.json | 2 +- src/Locale/en/Diagnosis.json | 40 +++++++++---------- src/Locale/en/Facility.json | 2 +- src/Locale/en/Medicine.json | 2 +- src/Locale/en/Users.json | 2 +- src/Locale/kn/Auth.json | 2 +- src/Locale/ml/Auth.json | 2 +- src/Locale/mr/Auth.json | 2 +- src/Locale/ta/Auth.json | 2 +- 26 files changed, 56 insertions(+), 52 deletions(-) diff --git a/src/CAREUI/interactive/LegendInput.tsx b/src/CAREUI/interactive/LegendInput.tsx index e4b16eb19fc..e164e4d1b4e 100644 --- a/src/CAREUI/interactive/LegendInput.tsx +++ b/src/CAREUI/interactive/LegendInput.tsx @@ -127,7 +127,7 @@ export default function LegendInput(props: InputProps) { required={props.required} autoComplete={props.autoComplete} className={classNames( - "cui-input bg-secondary-50 w-full rounded-md border-secondary-300 shadow-sm focus:border-2 focus:border-primary-500 focus:bg-secondary-100 focus:outline-none focus:ring-0", + "cui-input w-full rounded-md border-secondary-300 bg-secondary-50 shadow-sm focus:border-2 focus:border-primary-500 focus:bg-secondary-100 focus:outline-none focus:ring-0", props.size === "small" && "px-3 py-2 text-xs", (!props.size || !["small", "large"].includes(props.size)) && "px-4 py-3", diff --git a/src/CAREUI/interactive/Switch.tsx b/src/CAREUI/interactive/Switch.tsx index 0bdf39716c5..495722a0f39 100644 --- a/src/CAREUI/interactive/Switch.tsx +++ b/src/CAREUI/interactive/Switch.tsx @@ -26,7 +26,7 @@ export default function Switch({ size === "lg" && "px-4 py-3 text-base", props.selected === tab ? "border-primary-500 bg-primary-500 font-semibold text-white hover:bg-primary-600 focus:border-primary-500 focus:ring-primary-500" - : "bg-secondary-50 border-secondary-400 hover:bg-secondary-200 focus:border-primary-500 focus:ring-primary-500", + : "border-secondary-400 bg-secondary-50 hover:bg-secondary-200 focus:border-primary-500 focus:ring-primary-500", )} onClick={() => props.onChange(tab as T)} > diff --git a/src/Common/static/countryPhoneAndFlags.json b/src/Common/static/countryPhoneAndFlags.json index 98a43e4e043..ecc024647eb 100644 --- a/src/Common/static/countryPhoneAndFlags.json +++ b/src/Common/static/countryPhoneAndFlags.json @@ -101,7 +101,11 @@ "IL": { "flag": "🇮🇱", "name": "Israel", "code": "972" }, "IM": { "flag": "🇮🇲", "name": "Isle of Man", "code": "44-1624" }, "IN": { "flag": "🇮🇳", "name": "India", "code": "91" }, - "IO": { "flag": "🇮🇴", "name": "British Indian Ocean Territory", "code": "246" }, + "IO": { + "flag": "🇮🇴", + "name": "British Indian Ocean Territory", + "code": "246" + }, "IQ": { "flag": "🇮🇶", "name": "Iraq", "code": "964" }, "IR": { "flag": "🇮🇷", "name": "Iran", "code": "98" }, "IS": { "flag": "🇮🇸", "name": "Iceland", "code": "354" }, diff --git a/src/Components/ABDM/ABDMRecordsTab.tsx b/src/Components/ABDM/ABDMRecordsTab.tsx index f101b3ae45c..d828335cd0d 100644 --- a/src/Components/ABDM/ABDMRecordsTab.tsx +++ b/src/Components/ABDM/ABDMRecordsTab.tsx @@ -121,13 +121,13 @@ function ConsentRequestCard({ consent }: IConsentRequestCardProps) { {consent.consent_artefacts?.length ? ( -
+
{consent.consent_artefacts?.map((artefact) => ( ))}
) : ( -
+

{consent.status === "REQUESTED" ? "Waiting for the Patient to approve the consent request" diff --git a/src/Components/Assets/AssetManage.tsx b/src/Components/Assets/AssetManage.tsx index 934a4cf0d16..a9bb6eb78ea 100644 --- a/src/Components/Assets/AssetManage.tsx +++ b/src/Components/Assets/AssetManage.tsx @@ -537,7 +537,7 @@ const AssetManage = (props: AssetManageProps) => { Last Updated - + Edit @@ -564,7 +564,7 @@ const AssetManage = (props: AssetManageProps) => { Moved By - + Moved On diff --git a/src/Components/Common/ExcelFIleDragAndDrop.tsx b/src/Components/Common/ExcelFIleDragAndDrop.tsx index e7e3f0e71d2..5a6719f03df 100644 --- a/src/Components/Common/ExcelFIleDragAndDrop.tsx +++ b/src/Components/Common/ExcelFIleDragAndDrop.tsx @@ -207,7 +207,7 @@ export default function ExcelFileDragAndDrop({ {selectedFile ? ( <> setPreview(true)} > ) : ( { key={`${title}_${i}`} className="flex flex-col divide-x divide-secondary-200" > -

+
{x.date}
@@ -296,7 +296,7 @@ export const NeurologicalTable = (props: any) => { key={`loc_${i}`} className="min-w-max-content flex flex-col divide-x divide-secondary-200" > -
+
{x.date}
@@ -373,7 +373,7 @@ export const NeurologicalTable = (props: any) => { key={`glascow_${i}`} className="flex flex-col divide-x divide-secondary-200" > -
+
{x.date}
diff --git a/src/Components/Facility/FacilityCard.tsx b/src/Components/Facility/FacilityCard.tsx index 12a7d9d31c6..d6c2dce2b6c 100644 --- a/src/Components/Facility/FacilityCard.tsx +++ b/src/Components/Facility/FacilityCard.tsx @@ -168,7 +168,7 @@ export const FacilityCard = (props: { facility: any; userType: any }) => {
-
+
{/*
*/}
diff --git a/src/Components/Facility/FacilityUsers.tsx b/src/Components/Facility/FacilityUsers.tsx index cefa3630f33..77ca88618a6 100644 --- a/src/Components/Facility/FacilityUsers.tsx +++ b/src/Components/Facility/FacilityUsers.tsx @@ -185,7 +185,7 @@ export default function FacilityUsers(props: any) {
{user.phone_number && ( -
+
diff --git a/src/Components/Facility/Investigations/Reports/ReportTable.tsx b/src/Components/Facility/Investigations/Reports/ReportTable.tsx index 3a56db28e36..4d8779ca3ea 100644 --- a/src/Components/Facility/Investigations/Reports/ReportTable.tsx +++ b/src/Components/Facility/Investigations/Reports/ReportTable.tsx @@ -7,7 +7,7 @@ import { FC } from "react"; const ReportRow = ({ data, name, min, max }: any) => { return ( - + {name} diff --git a/src/Components/Medicine/MedicineAdministrationSheet/AdministrationEventSeperator.tsx b/src/Components/Medicine/MedicineAdministrationSheet/AdministrationEventSeperator.tsx index fdaa48cfea2..b52f1ed85f5 100644 --- a/src/Components/Medicine/MedicineAdministrationSheet/AdministrationEventSeperator.tsx +++ b/src/Components/Medicine/MedicineAdministrationSheet/AdministrationEventSeperator.tsx @@ -4,7 +4,7 @@ export default function AdministrationEventSeperator({ date }: { date: Date }) { // Show date if it's 00:00 if (date.getHours() === 0) { return ( -
+

{formatDateTime(date, "DD/MM")}

diff --git a/src/Components/Medicine/MedicineAdministrationSheet/AdministrationTable.tsx b/src/Components/Medicine/MedicineAdministrationSheet/AdministrationTable.tsx index f7dbacd5780..4bfc59c47c0 100644 --- a/src/Components/Medicine/MedicineAdministrationSheet/AdministrationTable.tsx +++ b/src/Components/Medicine/MedicineAdministrationSheet/AdministrationTable.tsx @@ -24,9 +24,9 @@ export default function MedicineAdministrationTable({ return (
- + - {props.theads.map((item) => { return ( - ); })} {props.actions && ( - )} diff --git a/src/Components/Users/UserAdd.tsx b/src/Components/Users/UserAdd.tsx index 182174f0304..ba218226490 100644 --- a/src/Components/Users/UserAdd.tsx +++ b/src/Components/Users/UserAdd.tsx @@ -605,7 +605,7 @@ export const UserAdd = (props: UserProps) => { options={  Need diff --git a/src/Locale/en/Auth.json b/src/Locale/en/Auth.json index e99cae72f7f..8075ca839cd 100644 --- a/src/Locale/en/Auth.json +++ b/src/Locale/en/Auth.json @@ -29,7 +29,7 @@ "password_reset_success": "Password Reset successfully", "password_reset_failure": "Password Reset Failed", "reset_password": "Reset Password", - "available_in":"Available in", + "available_in": "Available in", "sign_out": "Sign Out", "back_to_login": "Back to login", "min_password_len_8": "Minimum password length 8", diff --git a/src/Locale/en/Bed.json b/src/Locale/en/Bed.json index b410293959b..269658be774 100644 --- a/src/Locale/en/Bed.json +++ b/src/Locale/en/Bed.json @@ -10,4 +10,4 @@ "make_multiple_beds_label": "Do you want to make multiple beds?", "number_of_beds": "Number of beds", "number_of_beds_out_of_range_error": "Number of beds cannot be greater than 100" -} \ No newline at end of file +} diff --git a/src/Locale/en/Common.json b/src/Locale/en/Common.json index 1c1e3b49ecb..89faf842586 100644 --- a/src/Locale/en/Common.json +++ b/src/Locale/en/Common.json @@ -177,4 +177,4 @@ "feed_optimal_experience_for_phones": "For optimal viewing experience, consider rotating your device.", "feed_optimal_experience_for_apple_phones": "For optimal viewing experience, consider rotating your device. Ensure auto-rotate is enabled in your device settings.", "action_irreversible": "This action is irreversible" -} \ No newline at end of file +} diff --git a/src/Locale/en/Consultation.json b/src/Locale/en/Consultation.json index d811680d0fd..150c8012e38 100644 --- a/src/Locale/en/Consultation.json +++ b/src/Locale/en/Consultation.json @@ -45,4 +45,4 @@ "encounter_date_field_label__R": "Date & Time of Consultation", "back_dated_encounter_date_caution": "You are creating an encounter for", "encounter_duration_confirmation": "The duration of this encounter would be" -} \ No newline at end of file +} diff --git a/src/Locale/en/Diagnosis.json b/src/Locale/en/Diagnosis.json index 6cb301c058e..c049e9bba6f 100644 --- a/src/Locale/en/Diagnosis.json +++ b/src/Locale/en/Diagnosis.json @@ -1,21 +1,21 @@ { - "diagnosis": "Diagnosis", - "diagnoses": "Diagnoses", - "diagnosis_already_added": "This diagnosis was already added", - "principal": "Principal", - "principal_diagnosis": "Principal diagnosis", - "unconfirmed": "Unconfirmed", - "provisional": "Provisional", - "differential": "Differential", - "confirmed": "Confirmed", - "refuted": "Refuted", - "entered-in-error": "Entered in error", - "help_unconfirmed": "There is not sufficient diagnostic and/or clinical evidence to treat this as a confirmed condition.", - "help_provisional": "This is a tentative diagnosis - still a candidate that is under consideration.", - "help_differential": "One of a set of potential (and typically mutually exclusive) diagnoses asserted to further guide the diagnostic process and preliminary treatment.", - "help_confirmed": "There is sufficient diagnostic and/or clinical evidence to treat this as a confirmed condition.", - "help_refuted": "This condition has been ruled out by subsequent diagnostic and clinical evidence.", - "help_entered-in-error": "The statement was entered in error and is not valid.", - "search_icd11_placeholder": "Search for ICD-11 Diagnoses", - "icd11_as_recommended": "As per ICD-11 recommended by WHO" -} \ No newline at end of file + "diagnosis": "Diagnosis", + "diagnoses": "Diagnoses", + "diagnosis_already_added": "This diagnosis was already added", + "principal": "Principal", + "principal_diagnosis": "Principal diagnosis", + "unconfirmed": "Unconfirmed", + "provisional": "Provisional", + "differential": "Differential", + "confirmed": "Confirmed", + "refuted": "Refuted", + "entered-in-error": "Entered in error", + "help_unconfirmed": "There is not sufficient diagnostic and/or clinical evidence to treat this as a confirmed condition.", + "help_provisional": "This is a tentative diagnosis - still a candidate that is under consideration.", + "help_differential": "One of a set of potential (and typically mutually exclusive) diagnoses asserted to further guide the diagnostic process and preliminary treatment.", + "help_confirmed": "There is sufficient diagnostic and/or clinical evidence to treat this as a confirmed condition.", + "help_refuted": "This condition has been ruled out by subsequent diagnostic and clinical evidence.", + "help_entered-in-error": "The statement was entered in error and is not valid.", + "search_icd11_placeholder": "Search for ICD-11 Diagnoses", + "icd11_as_recommended": "As per ICD-11 recommended by WHO" +} diff --git a/src/Locale/en/Facility.json b/src/Locale/en/Facility.json index 19715e7e91f..5bb0a269e87 100644 --- a/src/Locale/en/Facility.json +++ b/src/Locale/en/Facility.json @@ -55,4 +55,4 @@ "discharged_patients": "Discharged Patients", "discharged_patients_empty": "No discharged patients present in this facility", "update_facility_middleware_success": "Facility middleware updated successfully" -} \ No newline at end of file +} diff --git a/src/Locale/en/Medicine.json b/src/Locale/en/Medicine.json index c21f5fa236f..d559ef2fdbf 100644 --- a/src/Locale/en/Medicine.json +++ b/src/Locale/en/Medicine.json @@ -61,4 +61,4 @@ "PRESCRIPTION_FREQUENCY_Q4H": "4th hourly", "PRESCRIPTION_FREQUENCY_QOD": "Alternate day", "PRESCRIPTION_FREQUENCY_QWK": "Once a week" -} \ No newline at end of file +} diff --git a/src/Locale/en/Users.json b/src/Locale/en/Users.json index 515c77848b4..32c6ee209c3 100644 --- a/src/Locale/en/Users.json +++ b/src/Locale/en/Users.json @@ -10,4 +10,4 @@ "average_weekly_working_hours": "Average weekly working hours", "set_average_weekly_working_hours_for": "Set Average weekly working hours for", "search_by_username": "Search by username" -} \ No newline at end of file +} diff --git a/src/Locale/kn/Auth.json b/src/Locale/kn/Auth.json index fb36b254b38..ff81099c794 100644 --- a/src/Locale/kn/Auth.json +++ b/src/Locale/kn/Auth.json @@ -23,7 +23,7 @@ "auth_login_title": "ಅಧಿಕೃತ ಲಾಗಿನ್", "forget_password": "ಪಾಸ್ವರ್ಡ್ ಮರೆತಿರಾ?", "back_to_login": "ಲಾಗಿನ್ ಪುಟಕ್ಕೆ ಹಿಂತಿರುಗಿ", - "available_in":"ಲಭ್ಯವಿರುವ ಭಾಷೆಗಳು", + "available_in": "ಲಭ್ಯವಿರುವ ಭಾಷೆಗಳು", "forget_password_instruction": "ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರನ್ನು ನಮೂದಿಸಿ ಮತ್ತು ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಮರುಹೊಂದಿಸಲು ನಾವು ನಿಮಗೆ ಲಿಂಕ್ ಅನ್ನು ಕಳುಹಿಸುತ್ತೇವೆ.", "send_reset_link": "ಮರುಹೊಂದಿಸುವ ಲಿಂಕ್ ಕಳುಹಿಸಿ", "already_a_member": "ಈಗಾಗಲೇ ಸದಸ್ಯರೇ?", diff --git a/src/Locale/ml/Auth.json b/src/Locale/ml/Auth.json index 199bce684ec..605f013b49a 100644 --- a/src/Locale/ml/Auth.json +++ b/src/Locale/ml/Auth.json @@ -22,7 +22,7 @@ "register_page_title": "ആശുപത്രി അഡ്മിനിസ്ട്രേറ്ററായി രജിസ്റ്റർ ചെയ്യുക", "auth_login_title": "അംഗീകൃത ലോഗിൻ", "back_to_login": "ലോഗിൻ പേജിലേക്ക് മടങ്ങുക", - "available_in":"ലഭ്യമായ ഭാഷകൾ", + "available_in": "ലഭ്യമായ ഭാഷകൾ", "forget_password": "പാസ്‌വേഡ് മറന്നോ?", "forget_password_instruction": "നിങ്ങളുടെ യൂസർനെയിം/ഉപയോക്തൃനാമം നൽകുക. പാസ്‌വേഡ് പുന: സജ്ജമാക്കാൻ ഞങ്ങൾ ഒരു ലിങ്ക് അയയ്‌ക്കുന്നതായിരിക്കും.", "send_reset_link": "പുന: സജ്ജീകരണ ലിങ്ക് അയയ്‌ക്കുക", diff --git a/src/Locale/mr/Auth.json b/src/Locale/mr/Auth.json index 2154366c4f6..74d41e469c4 100644 --- a/src/Locale/mr/Auth.json +++ b/src/Locale/mr/Auth.json @@ -22,7 +22,7 @@ "register_page_title": "हॉस्पिटल व्यवस्थापक म्हणून नोंदणी करा", "auth_login_title": "अधिकृत लॉगिन", "back_to_login": "लॉगिन पृष्ठावर परत या", - "available_in":"उपलब्ध भाषा", + "available_in": "उपलब्ध भाषा", "forget_password": "पासवर्ड विसरलात?", "forget_password_instruction": "युजरनेम प्रविष्ट करा आणि आम्ही तुम्हाला पासवर्ड रीसेट करण्यासाठी एक लिंक पाठवू.", "send_reset_link": "रीसेट लिंक पाठवा", diff --git a/src/Locale/ta/Auth.json b/src/Locale/ta/Auth.json index 1d5e15f241a..d5d26caa0fc 100644 --- a/src/Locale/ta/Auth.json +++ b/src/Locale/ta/Auth.json @@ -22,7 +22,7 @@ "register_page_title": "மருத்துவமனை நிர்வாகியாக பதிவு செய்யுங்கள்", "auth_login_title": "அங்கீகரிக்கப்பட்ட உள்நுழைவு", "back_to_login": "உள்நுழைவு பக்கத்திற்குத் திரும்பு", - "available_in":"கிடைக்கும் மொழிகள்", + "available_in": "கிடைக்கும் மொழிகள்", "forget_password": "கடவுச்சொல்லை மறந்துவிட்டீர்களா?", "forget_password_instruction": "உங்கள் பயனர்பெயரை உள்ளிடவும், உங்கள் கடவுச்சொல்லை மீட்டமைக்க ஒரு இணைப்பை நாங்கள் உங்களுக்கு அனுப்புவோம்.", "send_reset_link": "மீட்டமை இணைப்பை அனுப்பவும்", From 2ba84714509c4e93bf25e9ed63ab70473285edf3 Mon Sep 17 00:00:00 2001 From: ahmedobaid23 <111188459+ahmedobaid23@users.noreply.github.com> Date: Wed, 31 Jul 2024 09:22:27 +0500 Subject: [PATCH 003/121] Changes 'CONSULTATION NOTES' to 'GENERAL INSTRUCTIONS (ADVICE)' (#8216) * Changes 'CONSULTATION NOTES' to 'GENERAL INSTRUCTIONS (ADVICE)' * Minor Changes * Minor changes * Apply suggestions from Code Review --------- Co-authored-by: rithviknishad --- src/CAREUI/display/Timeline.tsx | 9 ++++++--- .../ConsultationDetails/Events/EventsList.tsx | 11 ++++------- .../ConsultationDetails/Events/GenericEvent.tsx | 7 +++++-- src/Locale/en/Consultation.json | 5 +++-- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/CAREUI/display/Timeline.tsx b/src/CAREUI/display/Timeline.tsx index bbbf5e24859..7fcb57f56ea 100644 --- a/src/CAREUI/display/Timeline.tsx +++ b/src/CAREUI/display/Timeline.tsx @@ -92,9 +92,12 @@ export const TimelineNode = (props: TimelineNodeProps) => { }`}{" "} )} - {props.titleSuffix - ? props.titleSuffix - : `${props.event.type} the ${props.name || name}.`} + {props.titleSuffix || ( + <> + {`${props.event.type} the `} + {props.name || name} + + )}

{props.actions && ( diff --git a/src/Components/Facility/ConsultationDetails/Events/EventsList.tsx b/src/Components/Facility/ConsultationDetails/Events/EventsList.tsx index cf997dca4b3..f759559c1a1 100644 --- a/src/Components/Facility/ConsultationDetails/Events/EventsList.tsx +++ b/src/Components/Facility/ConsultationDetails/Events/EventsList.tsx @@ -30,13 +30,10 @@ export default function EventsList() { {(item, items) => ( - text[0].toUpperCase() + text.toLowerCase().slice(1), - ) - .join(" ") + " Event" + t(item.event_type.name.toLowerCase()).replaceAll( + /_/g, + " ", + ) + " Event" } event={{ type: item.change_type.replace(/_/g, " ").toLowerCase(), diff --git a/src/Components/Facility/ConsultationDetails/Events/GenericEvent.tsx b/src/Components/Facility/ConsultationDetails/Events/GenericEvent.tsx index 414b86fecbe..ca9c13c599b 100644 --- a/src/Components/Facility/ConsultationDetails/Events/GenericEvent.tsx +++ b/src/Components/Facility/ConsultationDetails/Events/GenericEvent.tsx @@ -1,4 +1,6 @@ import type { ReactNode } from "react"; +import { useTranslation } from "react-i18next"; + interface IProps { values: Record; } @@ -80,12 +82,13 @@ const formatValue = (value: unknown, key?: string): ReactNode => { }; export default function GenericEvent(props: IProps) { + const { t } = useTranslation(); return (
{Object.entries(props.values).map(([key, value]) => (
- - {key.replaceAll(/_/g, " ")} + + {t(key).replaceAll(/_/g, " ")} {formatValue(value, key)} diff --git a/src/Locale/en/Consultation.json b/src/Locale/en/Consultation.json index 150c8012e38..2fdb2406d28 100644 --- a/src/Locale/en/Consultation.json +++ b/src/Locale/en/Consultation.json @@ -44,5 +44,6 @@ "encounter_date_field_label__HI": "Date & Time of Consultation", "encounter_date_field_label__R": "Date & Time of Consultation", "back_dated_encounter_date_caution": "You are creating an encounter for", - "encounter_duration_confirmation": "The duration of this encounter would be" -} + "encounter_duration_confirmation": "The duration of this encounter would be", + "consultation_notes": "General Instructions (Advice)" +} \ No newline at end of file From 1cf0733ee742a7b34700f8923031730b7eebea35 Mon Sep 17 00:00:00 2001 From: NitinPSingh <71833171+NitinPSingh@users.noreply.github.com> Date: Wed, 31 Jul 2024 09:53:21 +0530 Subject: [PATCH 004/121] fix #8220 made date component responsive (#8223) * fix #8220 made date component responsive * fixes #8228 changes done as per feedback --- src/Components/Common/DateInputV2.tsx | 2 +- src/Components/Facility/ConsultationForm.tsx | 4 ++-- src/Components/Patient/DailyRounds.tsx | 2 +- src/Components/Symptoms/SymptomsBuilder.tsx | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Components/Common/DateInputV2.tsx b/src/Components/Common/DateInputV2.tsx index 2e9f99de9bc..9bb10b1951b 100644 --- a/src/Components/Common/DateInputV2.tsx +++ b/src/Components/Common/DateInputV2.tsx @@ -256,7 +256,7 @@ const DateInputV2: React.FC = ({ type="text" readOnly disabled={disabled} - className={`cui-input-base cursor-pointer disabled:cursor-not-allowed ${className}`} + className={`cui-input-base cursor-pointer !px-2 disabled:cursor-not-allowed ${className}`} placeholder={placeholder ?? t("select_date")} value={value && dayjs(value).format("DD/MM/YYYY")} /> diff --git a/src/Components/Facility/ConsultationForm.tsx b/src/Components/Facility/ConsultationForm.tsx index a94f496cfca..bfcc80d88fd 100644 --- a/src/Components/Facility/ConsultationForm.tsx +++ b/src/Components/Facility/ConsultationForm.tsx @@ -932,11 +932,11 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => { ); })}
-
+
{ diff --git a/src/Components/Patient/DailyRounds.tsx b/src/Components/Patient/DailyRounds.tsx index 89367c6eb37..321536e80f5 100644 --- a/src/Components/Patient/DailyRounds.tsx +++ b/src/Components/Patient/DailyRounds.tsx @@ -487,7 +487,7 @@ export const DailyRounds = (props: any) => { }} />
- + { dispatch({ type: "set_state", state: newState }); diff --git a/src/Components/Symptoms/SymptomsBuilder.tsx b/src/Components/Symptoms/SymptomsBuilder.tsx index 8a904f6b441..f9c966d47bd 100644 --- a/src/Components/Symptoms/SymptomsBuilder.tsx +++ b/src/Components/Symptoms/SymptomsBuilder.tsx @@ -176,9 +176,9 @@ const SymptomEntry = (props: { const disabled = props.disabled || symptom.clinical_impression_status === "entered-in-error"; return ( -
+
-
+
Date: Wed, 31 Jul 2024 09:24:32 +0500 Subject: [PATCH 005/121] Adds prompt for ICD11 search field #8232 (#8233) * Adds prompt for ICD11 search field * Minor changes --- .../AddICD11Diagnosis.tsx | 1 + .../Form/FormFields/Autocomplete.tsx | 76 +++++++++++-------- 2 files changed, 44 insertions(+), 33 deletions(-) diff --git a/src/Components/Diagnosis/ConsultationDiagnosisBuilder/AddICD11Diagnosis.tsx b/src/Components/Diagnosis/ConsultationDiagnosisBuilder/AddICD11Diagnosis.tsx index 2476fa57ab0..39f35a4fcf4 100644 --- a/src/Components/Diagnosis/ConsultationDiagnosisBuilder/AddICD11Diagnosis.tsx +++ b/src/Components/Diagnosis/ConsultationDiagnosisBuilder/AddICD11Diagnosis.tsx @@ -71,6 +71,7 @@ export default function AddICD11Diagnosis(props: AddICD11DiagnosisProps) { )} optionLabel={(option) => option.label} optionValue={(option) => option} + minQueryLength={2} onQuery={(query) => refetch({ query: { query } })} isLoading={loading} error={hasError ? t("diagnosis_already_added") : undefined} diff --git a/src/Components/Form/FormFields/Autocomplete.tsx b/src/Components/Form/FormFields/Autocomplete.tsx index 2fbfeacfda4..a891fc75d9a 100644 --- a/src/Components/Form/FormFields/Autocomplete.tsx +++ b/src/Components/Form/FormFields/Autocomplete.tsx @@ -18,6 +18,7 @@ type AutocompleteFormFieldProps = FormFieldBaseProps & { optionDescription?: OptionCallback; optionIcon?: OptionCallback; optionDisabled?: OptionCallback; + minQueryLength?: number; onQuery?: (query: string) => void; dropdownIcon?: React.ReactNode | undefined; isLoading?: boolean; @@ -45,6 +46,7 @@ const AutocompleteFormField = ( optionValue={props.optionValue} optionDescription={props.optionDescription} optionDisabled={props.optionDisabled} + minQueryLength={props.minQueryLength} onQuery={props.onQuery} isLoading={props.isLoading} allowRawInput={props.allowRawInput} @@ -69,6 +71,7 @@ type AutocompleteProps = { optionDescription?: OptionCallback; optionDisabled?: OptionCallback; className?: string; + minQueryLength?: number; onQuery?: (query: string) => void; requiredError?: boolean; isLoading?: boolean; @@ -95,6 +98,7 @@ type AutocompleteProps = { export const Autocomplete = (props: AutocompleteProps) => { const { t } = useTranslation(); const [query, setQuery] = useState(""); // Ensure lower case + useEffect(() => { props.onQuery?.(query); }, [query]); @@ -136,6 +140,7 @@ export const Autocomplete = (props: AutocompleteProps) => { const options = props.allowRawInput ? getOptions() : mappedOptions; const value = options.find((o) => props.value == o.value); + const filteredOptions = props.onQuery === undefined ? options.filter((o) => o.search.includes(query)) @@ -198,43 +203,48 @@ export const Autocomplete = (props: AutocompleteProps) => { - {filteredOptions.length === 0 && ( + {props.minQueryLength && query.length < props.minQueryLength ? ( +
+ {`Please enter at least ${props.minQueryLength} characters to search`} +
+ ) : filteredOptions.length === 0 ? (
No options found
- )} - {filteredOptions.map((option, index) => ( - - {({ active }) => ( -
-
- {option.label} - {option.icon} -
- {option.description && ( -
- {option.description} + ) : ( + filteredOptions.map((option, index) => ( + + {({ active }) => ( +
+
+ {option.label} + {option.icon}
- )} -
- )} -
- ))} + {option.description && ( +
+ {option.description} +
+ )} +
+ )} + + )) + )}
From 24ab250c8aa3edd8d452c232c24e2ac123b9d350 Mon Sep 17 00:00:00 2001 From: Jacob John Jeevan <40040905+Jacobjeevan@users.noreply.github.com> Date: Thu, 1 Aug 2024 11:16:49 +0530 Subject: [PATCH 006/121] Consultation Form Enhancement: No home facility docs (#7914) * Added custom no results label for AutocompleteFormField - Added "no home facility doctors" as text for no results in User autocomplete field in Consultation Form. * Added notification for autocomplete - Display extra notification when there are no results for Assigned docs field (Consultation Form) - Only applicable to ConsultationForm * improve how no user error notification is dispatched * use translations * Show error and disable field instead of notification * Skip showing error instead validate on submit * add translations for field_required * remove duplicate i18n key from auth.json * update cypress --------- Co-authored-by: rithviknishad --- .../e2e/facility_spec/facility_creation.cy.ts | 11 ++++++---- cypress/e2e/users_spec/user_creation.cy.ts | 4 ++-- cypress/pageobject/Asset/AssetCreation.ts | 2 +- src/Common/hooks/useAsyncOptions.ts | 2 +- .../Common/UserAutocompleteFormField.tsx | 20 ++++++++++++++++--- .../ExternalResult/ResultUpdate.tsx | 4 +++- src/Components/Facility/AssetCreate.tsx | 7 ++++--- src/Components/Facility/BedCapacity.tsx | 4 +++- src/Components/Facility/ConsultationForm.tsx | 13 ++++++------ src/Components/Facility/DischargeModal.tsx | 2 +- src/Components/Facility/StaffCapacity.tsx | 4 +++- .../Facility/TransferPatientDialog.tsx | 4 +++- src/Components/Facility/TriageForm.tsx | 4 +++- src/Components/Form/FieldValidators.tsx | 4 +++- src/Components/Medicine/validators.ts | 3 ++- src/Components/Users/UserAdd.tsx | 6 ++++-- src/Components/Users/UserProfile.tsx | 10 ++++++---- src/Locale/en/Auth.json | 3 +-- src/Locale/en/Common.json | 3 ++- src/Locale/en/Consultation.json | 1 + 20 files changed, 74 insertions(+), 37 deletions(-) diff --git a/cypress/e2e/facility_spec/facility_creation.cy.ts b/cypress/e2e/facility_spec/facility_creation.cy.ts index 83f666995ff..6401ba7bbbe 100644 --- a/cypress/e2e/facility_spec/facility_creation.cy.ts +++ b/cypress/e2e/facility_spec/facility_creation.cy.ts @@ -58,12 +58,15 @@ describe("Facility Creation", () => { "Invalid Phone Number", ]; const bedErrorMessage = [ - "Field is required", + "This field is required", "Total capacity cannot be 0", - "Field is required", + "This field is required", ]; - const doctorErrorMessage = ["Field is required", "Field is required"]; - const triageErrorMessage = ["Field is required"]; + const doctorErrorMessage = [ + "This field is required", + "This field is required", + ]; + const triageErrorMessage = ["This field is required"]; before(() => { loginPage.loginAsDisctrictAdmin(); diff --git a/cypress/e2e/users_spec/user_creation.cy.ts b/cypress/e2e/users_spec/user_creation.cy.ts index 572b0cb95c4..91efb3aee31 100644 --- a/cypress/e2e/users_spec/user_creation.cy.ts +++ b/cypress/e2e/users_spec/user_creation.cy.ts @@ -50,8 +50,8 @@ describe("User Creation", () => { ]; const EXPECTED_PROFILE_ERROR_MESSAGES = [ - "Field is required", - "Field is required", + "This field is required", + "This field is required", "Please enter valid phone number", ]; diff --git a/cypress/pageobject/Asset/AssetCreation.ts b/cypress/pageobject/Asset/AssetCreation.ts index 9232c5966c1..331a4588c6f 100644 --- a/cypress/pageobject/Asset/AssetCreation.ts +++ b/cypress/pageobject/Asset/AssetCreation.ts @@ -200,7 +200,7 @@ export class AssetPage { verifyEmptyStatusError() { cy.get("[data-testid=asset-working-status-input] span").should( "contain", - "Field is required", + "This field is required", ); } diff --git a/src/Common/hooks/useAsyncOptions.ts b/src/Common/hooks/useAsyncOptions.ts index 1a632dc366e..a81209f34f0 100644 --- a/src/Common/hooks/useAsyncOptions.ts +++ b/src/Common/hooks/useAsyncOptions.ts @@ -38,7 +38,7 @@ export function useAsyncOptions>( ) { const dispatch = useDispatch(); const [queryOptions, setQueryOptions] = useState([]); - const [isLoading, setIsLoading] = useState(false); + const [isLoading, setIsLoading] = useState(true); const fetchOptions = useMemo( () => diff --git a/src/Components/Common/UserAutocompleteFormField.tsx b/src/Components/Common/UserAutocompleteFormField.tsx index c7694b74e4e..442eb0ae4fe 100644 --- a/src/Components/Common/UserAutocompleteFormField.tsx +++ b/src/Components/Common/UserAutocompleteFormField.tsx @@ -9,6 +9,7 @@ import { import { UserModel } from "../Users/models"; import { isUserOnline } from "../../Utils/utils"; import { UserRole } from "../../Common/constants"; +import { useEffect } from "react"; type Props = FormFieldBaseProps & { placeholder?: string; @@ -16,6 +17,7 @@ type Props = FormFieldBaseProps & { homeFacility?: string; userType?: UserRole; showActiveStatus?: boolean; + noResultsError?: string; }; export default function UserAutocompleteFormField(props: Props) { @@ -59,18 +61,30 @@ export default function UserAutocompleteFormField(props: Props) { ); }; + const items = options(field.value && [field.value]); + + useEffect(() => { + if (props.required && !isLoading && !items.length && props.noResultsError) { + field.handleChange(undefined as unknown as UserModel); + } + }, [isLoading, items, props.required]); + + const noResultError = + (props.required && !isLoading && !items.length && props.noResultsError) || + undefined; + return (
`${option.user_type}`} diff --git a/src/Components/ExternalResult/ResultUpdate.tsx b/src/Components/ExternalResult/ResultUpdate.tsx index 09dc41aaca7..482c320457e 100644 --- a/src/Components/ExternalResult/ResultUpdate.tsx +++ b/src/Components/ExternalResult/ResultUpdate.tsx @@ -12,6 +12,7 @@ import useQuery from "../../Utils/request/useQuery.js"; import routes from "../../Redux/api.js"; import request from "../../Utils/request/request.js"; import { compareBy } from "../../Utils/utils.js"; +import { useTranslation } from "react-i18next"; const Loading = lazy(() => import("../Common/Loading")); @@ -57,6 +58,7 @@ const initialWard = [{ id: 0, name: "Choose Ward", number: 0 }]; export default function UpdateResult(props: any) { const { id } = props; const { goBack } = useAppHistory(); + const { t } = useTranslation(); const [state, dispatch] = useReducer(FormReducer, initialState); const [isLoading, setIsLoading] = useState(true); @@ -132,7 +134,7 @@ export default function UpdateResult(props: any) { switch (field) { case "address": if (!state.form[field]) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } return; diff --git a/src/Components/Facility/AssetCreate.tsx b/src/Components/Facility/AssetCreate.tsx index 6867857c5c6..5b1493de242 100644 --- a/src/Components/Facility/AssetCreate.tsx +++ b/src/Components/Facility/AssetCreate.tsx @@ -32,10 +32,10 @@ import { validateEmailAddress } from "../../Common/validation"; import { dateQueryString, parsePhoneNumber } from "../../Utils/utils.js"; import dayjs from "../../Utils/dayjs"; import DateFormField from "../Form/FormFields/DateFormField.js"; -import { t } from "i18next"; import useQuery from "../../Utils/request/useQuery.js"; import routes from "../../Redux/api.js"; import request from "../../Utils/request/request.js"; +import { useTranslation } from "react-i18next"; const Loading = lazy(() => import("../Common/Loading")); @@ -101,6 +101,7 @@ type AssetFormSection = const AssetCreate = (props: AssetProps) => { const { goBack } = useAppHistory(); + const { t } = useTranslation(); const { facilityId, assetId } = props; let assetClassInitial: AssetClass; @@ -212,7 +213,7 @@ const AssetCreate = (props: AssetProps) => { return; case "is_working": if (is_working === undefined) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } return; @@ -224,7 +225,7 @@ const AssetCreate = (props: AssetProps) => { return; case "support_phone": { if (!support_phone) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } // eslint-disable-next-line no-case-declarations diff --git a/src/Components/Facility/BedCapacity.tsx b/src/Components/Facility/BedCapacity.tsx index ff0ec111496..c0f239203d5 100644 --- a/src/Components/Facility/BedCapacity.tsx +++ b/src/Components/Facility/BedCapacity.tsx @@ -9,6 +9,7 @@ import useConfig from "../../Common/hooks/useConfig"; import { getBedTypes } from "../../Common/constants"; import routes from "../../Redux/api"; import request from "../../Utils/request/request"; +import { useTranslation } from "react-i18next"; interface BedCapacityProps extends CapacityModal { facilityId: string; @@ -49,6 +50,7 @@ const bedCountReducer = (state = initialState, action: any) => { }; export const BedCapacity = (props: BedCapacityProps) => { + const { t } = useTranslation(); const config = useConfig(); const { facilityId, handleClose, handleUpdate, className, id } = props; const [state, dispatch] = useReducer(bedCountReducer, initialState); @@ -127,7 +129,7 @@ export const BedCapacity = (props: BedCapacityProps) => { let invalidForm = false; Object.keys(state.form).forEach((field) => { if (!state.form[field]) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } else if ( field === "currentOccupancy" && diff --git a/src/Components/Facility/ConsultationForm.tsx b/src/Components/Facility/ConsultationForm.tsx index bfcc80d88fd..dc496d599f7 100644 --- a/src/Components/Facility/ConsultationForm.tsx +++ b/src/Components/Facility/ConsultationForm.tsx @@ -386,8 +386,8 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => { admitted: data.admitted ? String(data.admitted) : "false", admitted_to: data.admitted_to ? data.admitted_to : "", category: data.category - ? PATIENT_CATEGORIES.find((i) => i.text === data.category)?.id ?? - "" + ? (PATIENT_CATEGORIES.find((i) => i.text === data.category)?.id ?? + "") : "", patient_no: data.patient_no ?? "", OPconsultation: data.consultation_notes, @@ -453,7 +453,7 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => { return; case "route_to_facility": if (!state.form[field]) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } return; @@ -469,7 +469,7 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => { return; case "encounter_date": if (!state.form[field]) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } if ( @@ -540,7 +540,7 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => { return; case "consultation_notes": if (!state.form[field]) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } else if (!state.form[field].replace(/\s/g, "").length) { errors[field] = "Consultation notes can not be empty"; @@ -608,7 +608,7 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => { case "treating_physician": { if (state.form.suggestion !== "DD" && !state.form[field]) { - errors[field] = "Please fill treating physician"; + errors[field] = t("field_required"); invalidForm = true; break; } @@ -1437,6 +1437,7 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => { userType={"Doctor"} homeFacility={facilityId} error={state.errors.treating_physician} + noResultsError={t("no_treating_physicians_available")} />
diff --git a/src/Components/Facility/DischargeModal.tsx b/src/Components/Facility/DischargeModal.tsx index 567c21dfbb6..fe99b4ddd53 100644 --- a/src/Components/Facility/DischargeModal.tsx +++ b/src/Components/Facility/DischargeModal.tsx @@ -151,7 +151,7 @@ const DischargeModal = ({ newErrors["discharge_notes"] = "Please enter the cause of death"; } if (!preDischargeForm.death_confirmed_doctor?.trim()) { - newErrors["death_confirmed_doctor"] = "Field is required"; + newErrors["death_confirmed_doctor"] = t("field_required"); } if (Object.entries(newErrors).length) { diff --git a/src/Components/Facility/StaffCapacity.tsx b/src/Components/Facility/StaffCapacity.tsx index fc54dfcbb2d..8326ed6a323 100644 --- a/src/Components/Facility/StaffCapacity.tsx +++ b/src/Components/Facility/StaffCapacity.tsx @@ -10,6 +10,7 @@ import { DoctorModal } from "./models.js"; import useQuery from "../../Utils/request/useQuery.js"; import routes from "../../Redux/api.js"; import request from "../../Utils/request/request.js"; +import { useTranslation } from "react-i18next"; interface DoctorCapacityProps extends DoctorModal { facilityId: string; @@ -58,6 +59,7 @@ const getAllowedDoctorTypes = (existing?: DoctorModal[]) => { }; export const StaffCapacity = (props: DoctorCapacityProps) => { + const { t } = useTranslation(); const { facilityId, handleClose, handleUpdate, className, id } = props; const [state, dispatch] = useReducer(doctorCapacityReducer, initialState); const [isLoading, setIsLoading] = useState(false); @@ -94,7 +96,7 @@ export const StaffCapacity = (props: DoctorCapacityProps) => { let invalidForm = false; Object.keys(state.form).forEach((field) => { if (!state.form[field]) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } if (field === "count" && state.form[field] < 0) { diff --git a/src/Components/Facility/TransferPatientDialog.tsx b/src/Components/Facility/TransferPatientDialog.tsx index 3ead082c610..0c4af6c5d0c 100644 --- a/src/Components/Facility/TransferPatientDialog.tsx +++ b/src/Components/Facility/TransferPatientDialog.tsx @@ -9,6 +9,7 @@ import request from "../../Utils/request/request.js"; import routes from "../../Redux/api.js"; import TextFormField from "../Form/FormFields/TextFormField.js"; import { FieldChangeEvent } from "../Form/FormFields/Utils.js"; +import { useTranslation } from "react-i18next"; interface Props { patientList: Array; @@ -53,6 +54,7 @@ const patientFormReducer = (state = initialState, action: any) => { const TransferPatientDialog = (props: Props) => { const { patientList, handleOk, handleCancel, facilityId } = props; + const { t } = useTranslation(); const [isLoading, setIsLoading] = useState(false); const [state, dispatch] = useReducer(patientFormReducer, initialState); const patientOptions: Array = patientList.map((patient) => { @@ -102,7 +104,7 @@ const TransferPatientDialog = (props: Props) => { return; case "year_of_birth": if (!state.form[field]) { - errors[field] = "This field is required"; + errors[field] = t("field_required"); invalidForm = true; } diff --git a/src/Components/Facility/TriageForm.tsx b/src/Components/Facility/TriageForm.tsx index 6ad9fdd0e08..1aa0537b53c 100644 --- a/src/Components/Facility/TriageForm.tsx +++ b/src/Components/Facility/TriageForm.tsx @@ -17,6 +17,7 @@ import { dateQueryString, scrollTo } from "../../Utils/utils"; import useQuery from "../../Utils/request/useQuery"; import routes from "../../Redux/api"; import request from "../../Utils/request/request"; +import { useTranslation } from "react-i18next"; interface Props extends PatientStatsModel { facilityId: string; @@ -57,6 +58,7 @@ const triageFormReducer = (state = initialState, action: any) => { }; export const TriageForm = ({ facilityId, id }: Props) => { + const { t } = useTranslation(); const { goBack } = useAppHistory(); const [state, dispatch] = useReducer(triageFormReducer, initialState); const [isLoading, setIsLoading] = useState(false); @@ -98,7 +100,7 @@ export const TriageForm = ({ facilityId, id }: Props) => { switch (field) { case "entry_date": if (!state.form[field]) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } return; diff --git a/src/Components/Form/FieldValidators.tsx b/src/Components/Form/FieldValidators.tsx index 4933b685171..3159c6814f1 100644 --- a/src/Components/Form/FieldValidators.tsx +++ b/src/Components/Form/FieldValidators.tsx @@ -1,3 +1,5 @@ +import { t } from "i18next"; + export type FieldError = string | undefined; export type FieldValidator = (value: T, ...args: any) => FieldError; @@ -42,7 +44,7 @@ export const AnyValidator = ( return validator; }; -export const RequiredFieldValidator = (message = "Field is required") => { +export const RequiredFieldValidator = (message = t("field_required")) => { return (value: T): FieldError => { if (!value) return message; if (Array.isArray(value) && value.length === 0) return message; diff --git a/src/Components/Medicine/validators.ts b/src/Components/Medicine/validators.ts index 13460230737..a0103d11241 100644 --- a/src/Components/Medicine/validators.ts +++ b/src/Components/Medicine/validators.ts @@ -1,3 +1,4 @@ +import { t } from "i18next"; import { FieldError, RequiredFieldValidator } from "../Form/FieldValidators"; import { FormErrors } from "../Form/Utils"; import { Prescription } from "./models"; @@ -73,7 +74,7 @@ export const AdministrationDosageValidator = ( const baseDosage = getDosageValue(base_dosage); const targetDosage = getDosageValue(target_dosage); - if (!valueDosage) return "This field is required"; + if (!valueDosage) return t("field_required"); if (value?.split(" ")[1] !== base_dosage?.split(" ")[1]) return "Unit must be the same as start and target dosage's unit"; diff --git a/src/Components/Users/UserAdd.tsx b/src/Components/Users/UserAdd.tsx index ba218226490..8d33533f67a 100644 --- a/src/Components/Users/UserAdd.tsx +++ b/src/Components/Users/UserAdd.tsx @@ -41,6 +41,7 @@ import routes from "../../Redux/api"; import request from "../../Utils/request/request"; import useQuery from "../../Utils/request/useQuery"; import CareIcon from "../../CAREUI/icons/CareIcon"; +import { useTranslation } from "react-i18next"; const Loading = lazy(() => import("../Common/Loading")); @@ -163,6 +164,7 @@ export const validateRule = ( }; export const UserAdd = (props: UserProps) => { + const { t } = useTranslation(); const { goBack } = useAppHistory(); const { userId } = props; @@ -355,7 +357,7 @@ export const UserAdd = (props: UserProps) => { return; case "doctor_experience_commenced_on": if (state.form.user_type === "Doctor" && !state.form[field]) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } else if ( state.form.user_type === "Doctor" && @@ -368,7 +370,7 @@ export const UserAdd = (props: UserProps) => { case "doctor_qualification": case "doctor_medical_council_registration": if (state.form.user_type === "Doctor" && !state.form[field]) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } return; diff --git a/src/Components/Users/UserProfile.tsx b/src/Components/Users/UserProfile.tsx index 8a456be9bcd..dd8dadf2fb7 100644 --- a/src/Components/Users/UserProfile.tsx +++ b/src/Components/Users/UserProfile.tsx @@ -26,6 +26,7 @@ import routes from "../../Redux/api"; import request from "../../Utils/request/request"; import DateFormField from "../Form/FormFields/DateFormField"; import { validateRule } from "./UserAdd"; +import { useTranslation } from "react-i18next"; const Loading = lazy(() => import("../Common/Loading")); type EditForm = { @@ -110,6 +111,7 @@ const editFormReducer = (state: State, action: Action) => { }; export default function UserProfile() { + const { t } = useTranslation(); const { signOut } = useAuthContext(); const [states, dispatch] = useReducer(editFormReducer, initialState); const [updateStatus, setUpdateStatus] = useState({ @@ -201,7 +203,7 @@ export default function UserProfile() { case "lastName": case "gender": if (!states.form[field]) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } return; @@ -254,7 +256,7 @@ export default function UserProfile() { return; case "email": if (!states.form[field]) { - errors[field] = "This field is required"; + errors[field] = t("field_required"); invalidForm = true; } else if (!validateEmailAddress(states.form[field])) { errors[field] = "Enter a valid email address"; @@ -263,7 +265,7 @@ export default function UserProfile() { return; case "doctor_experience_commenced_on": if (states.form.user_type === "Doctor" && !states.form[field]) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } else if ( (states.form.user_type === "Doctor" && @@ -278,7 +280,7 @@ export default function UserProfile() { case "doctor_qualification": case "doctor_medical_council_registration": if (states.form.user_type === "Doctor" && !states.form[field]) { - errors[field] = "Field is required"; + errors[field] = t("field_required"); invalidForm = true; } return; diff --git a/src/Locale/en/Auth.json b/src/Locale/en/Auth.json index 8075ca839cd..58fdef42612 100644 --- a/src/Locale/en/Auth.json +++ b/src/Locale/en/Auth.json @@ -11,7 +11,6 @@ "gender": "Gender", "age": "Age", "login": "Login", - "field_required": "This field is required", "password_mismatch": "Password and confirm password must be same.", "enter_valid_age": "Please Enter Valid Age", "invalid_username": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", @@ -37,4 +36,4 @@ "req_atleast_one_uppercase": "Require at least one upper case", "req_atleast_one_lowercase": "Require at least one lower case letter", "req_atleast_one_symbol": "Require at least one symbol" -} +} \ No newline at end of file diff --git a/src/Locale/en/Common.json b/src/Locale/en/Common.json index 89faf842586..0bd26305b86 100644 --- a/src/Locale/en/Common.json +++ b/src/Locale/en/Common.json @@ -110,6 +110,7 @@ "features": "Features", "pincode": "Pincode", "required": "Required", + "field_required": "This field is required", "litres": "Litres", "litres_per_day": "Litres/day", "invalid_pincode": "Invalid Pincode", @@ -177,4 +178,4 @@ "feed_optimal_experience_for_phones": "For optimal viewing experience, consider rotating your device.", "feed_optimal_experience_for_apple_phones": "For optimal viewing experience, consider rotating your device. Ensure auto-rotate is enabled in your device settings.", "action_irreversible": "This action is irreversible" -} +} \ No newline at end of file diff --git a/src/Locale/en/Consultation.json b/src/Locale/en/Consultation.json index 2fdb2406d28..6e3846fb983 100644 --- a/src/Locale/en/Consultation.json +++ b/src/Locale/en/Consultation.json @@ -36,6 +36,7 @@ "prev_sessions": "Prev Sessions", "next_sessions": "Next Sessions", "no_changes": "No changes", + "no_treating_physicians_available": "This facility does not have any home facility doctors. Please contact your admin.", "encounter_suggestion_edit_disallowed": "Not allowed to switch to this option in edit consultation", "encounter_date_field_label__A": "Date & Time of Admission to the Facility", "encounter_date_field_label__DC": "Date & Time of Domiciliary Care commencement", From f4e2e390e117cc4b21d68237ef1643d5a24d8930 Mon Sep 17 00:00:00 2001 From: Aakash Singh Date: Thu, 1 Aug 2024 11:17:26 +0530 Subject: [PATCH 007/121] Handle exceptions raised by the addSourceBuffer method (#8199) * Handle exceptions raised by the addSourceBuffer method * Update src/Common/hooks/useMSEplayer.ts --------- Co-authored-by: Rithvik Nishad --- src/Common/hooks/useMSEplayer.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Common/hooks/useMSEplayer.ts b/src/Common/hooks/useMSEplayer.ts index 127fe94b9a0..5271c08fd56 100644 --- a/src/Common/hooks/useMSEplayer.ts +++ b/src/Common/hooks/useMSEplayer.ts @@ -171,9 +171,14 @@ export const useMSEMediaPlayer = ({ } else { mimeCodec = Utf8ArrayToStr(decoded_arr); } - mseSourceBuffer = mse.addSourceBuffer( - `video/mp4; codecs="${mimeCodec}"`, - ); + try { + mseSourceBuffer = mse.addSourceBuffer( + `video/mp4; codecs="${mimeCodec}"`, + ); + } catch (error) { + onError?.(error); + return; + } mseSourceBuffer.mode = "segments"; if (mseQueue.length > 0 && !mseSourceBuffer.updating) { mseSourceBuffer.addEventListener("updateend", pushPacket); From d70b99ad36f74f791eae25236a3fc6488d0dbb88 Mon Sep 17 00:00:00 2001 From: Ankur Prabhu <85862184+AnkurPrabhu@users.noreply.github.com> Date: Thu, 1 Aug 2024 14:28:33 +0530 Subject: [PATCH 008/121] Fix Incorrect error message for invalid QR code (#7588) --- src/Components/Assets/AssetsList.tsx | 13 +++++++++---- src/Locale/en/Notifications.json | 4 +++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Components/Assets/AssetsList.tsx b/src/Components/Assets/AssetsList.tsx index adf8dd61a8e..fa609e0e3b8 100644 --- a/src/Components/Assets/AssetsList.tsx +++ b/src/Components/Assets/AssetsList.tsx @@ -121,7 +121,7 @@ const AssetsList = () => { if (!isValidURL(assetURL)) { setIsLoading(false); Notification.Error({ - msg: "Invalid QR code scanned !!!", + msg: t("invalid_asset_id_msg"), }); return; } @@ -137,7 +137,7 @@ const AssetsList = () => { if (!data) { setIsLoading(false); Notification.Error({ - msg: "Invalid QR code scanned !!!", + msg: t("invalid_asset_id_msg"), }); return; } @@ -151,17 +151,22 @@ const AssetsList = () => { } else { setIsLoading(false); Notification.Error({ - msg: "Asset not found !!!", + msg: t("asset_not_found_msg"), }); } } else { setIsLoading(false); Notification.Error({ - msg: "Invalid QR code scanned !!!", + msg: t("invalid_asset_id_msg"), }); } } catch (err) { console.log(err); + Notification.Error({ + msg: t("invalid_asset_id_msg"), + }); + } finally { + setIsLoading(false); } }; diff --git a/src/Locale/en/Notifications.json b/src/Locale/en/Notifications.json index ad8dc0e20f1..dac9c29730f 100644 --- a/src/Locale/en/Notifications.json +++ b/src/Locale/en/Notifications.json @@ -16,5 +16,7 @@ "unsubscribe_failed": "Unsubscribe failed.", "unsubscribe": "Unsubscribe", "escape": "Escape", - "loading": "Loading..." + "loading": "Loading...", + "invalid_asset_id_msg": "Oops! The asset ID you entered does not appear to be valid.", + "asset_not_found_msg": "Oops! The asset you are looking for does not exist. Please check the asset id." } From dabf8cce27e7b21b24dea0aea9bdcbe04314c20b Mon Sep 17 00:00:00 2001 From: Gigin George Date: Mon, 5 Aug 2024 07:16:27 +0530 Subject: [PATCH 009/121] Update stale, to ignore backlog Issues & PRs (#8249) --- .github/workflows/stale.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 8964b0c8e57..736ce33d87d 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -16,8 +16,8 @@ jobs: stale-issue-message: "Hi, @coronasafe/care-frontend-maintainers, This issue has been automatically marked as stale because it has not had any recent activity." stale-pr-message: "Hi, This pr has been automatically marked as stale because it has not had any recent activity. It will be automatically closed if no further activity occurs for 7 more days. Thank you for your contributions." close-pr-message: "Hi, @coronasafe/care-frontend-maintainers, This PR has been automatically closed due to inactivity. Thank you for your contributions. Feel free to re-open the PR." - exempt-issue-labels: "blocked,waiting for related PR,waiting for back end,help wanted,work-in-progress,In Progress,wishlist,EPIC" - exempt-pr-labels: "tested,needs testing,need Review,waiting for related PR,waiting for back end,help wanted,blocked,work-in-progress,In Progress" + exempt-issue-labels: "blocked,waiting for related PR,waiting for back end,help wanted,work-in-progress,In Progress,wishlist,EPIC,backlog" + exempt-pr-labels: "tested,needs testing,need Review,waiting for related PR,waiting for back end,help wanted,blocked,work-in-progress,In Progress,backlog" days-before-issue-stale: 14 days-before-pr-stale: 7 days-before-issue-close: -1 From 8096a3c14f5955517f2dea956638baf811abe327 Mon Sep 17 00:00:00 2001 From: Kushal Bhana <68599557+kushalbhana@users.noreply.github.com> Date: Wed, 7 Aug 2024 12:02:09 +0530 Subject: [PATCH 010/121] scroll to mandatory empty fields (#8263) * scroll to mandatory empty fields * fixing the issue of auto scroll --- src/Components/Patient/DailyRounds.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Components/Patient/DailyRounds.tsx b/src/Components/Patient/DailyRounds.tsx index 321536e80f5..d451513c9bc 100644 --- a/src/Components/Patient/DailyRounds.tsx +++ b/src/Components/Patient/DailyRounds.tsx @@ -45,6 +45,7 @@ import { EncounterSymptomsBuilder } from "../Symptoms/SymptomsBuilder"; import { FieldLabel } from "../Form/FormFields/FormField"; import useAuthUser from "../../Common/hooks/useAuthUser"; import CheckBoxFormField from "../Form/FormFields/CheckBoxFormField"; +import { scrollTo } from "../../Utils/utils"; const Loading = lazy(() => import("../Common/Loading")); @@ -231,6 +232,7 @@ export const DailyRounds = (props: any) => { if (!state.form[field]) { errors[field] = "Please select a category"; invalidForm = true; + scrollTo("patientCategory"); } return; case "bp": { @@ -238,6 +240,7 @@ export const DailyRounds = (props: any) => { if (error) { errors.bp = error; invalidForm = true; + scrollTo("bloodPressure"); } return; } @@ -524,6 +527,7 @@ export const DailyRounds = (props: any) => { {...field("patient_category")} required label="Category" + id="patientCategory" />
@@ -589,7 +593,7 @@ export const DailyRounds = (props: any) => { <>

Vitals

- + Date: Wed, 7 Aug 2024 12:02:32 +0530 Subject: [PATCH 011/121] Fix: Added online status to Doctor Connect (#8261) * Added online status * Added utility fn --- src/Components/Facility/DoctorVideoSlideover.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Components/Facility/DoctorVideoSlideover.tsx b/src/Components/Facility/DoctorVideoSlideover.tsx index aacf441be6f..53a197734dc 100644 --- a/src/Components/Facility/DoctorVideoSlideover.tsx +++ b/src/Components/Facility/DoctorVideoSlideover.tsx @@ -3,7 +3,7 @@ import SlideOver from "../../CAREUI/interactive/SlideOver"; import { UserAssignedModel } from "../Users/models"; import { SkillObjectModel } from "../Users/models"; import CareIcon, { IconName } from "../../CAREUI/icons/CareIcon"; -import { classNames, relativeTime } from "../../Utils/utils"; +import { classNames, isUserOnline, relativeTime } from "../../Utils/utils"; import useAuthUser from "../../Common/hooks/useAuthUser"; import { triggerGoal } from "../../Integrations/Plausible"; import { Warn } from "../../Utils/Notifications"; @@ -241,9 +241,14 @@ function UserListItem({ user }: { user: UserAnnotatedWithGroup }) {
{ // Show online icon based on last_login - user.last_login && - Number(new Date()) - Number(new Date(user.last_login)) < 60000 ? ( - + user.last_login && isUserOnline(user) ? ( + <> + + + ) : ( ) From a169f02e8e2bccfea9f70167aacb01f8d3242afa Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Wed, 7 Aug 2024 12:55:35 +0530 Subject: [PATCH 012/121] Camera Feed: Ensure camera moves everytime the preset is clicked (#8254) --- .../Facility/ConsultationDetails/ConsultationFeedTab.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Components/Facility/ConsultationDetails/ConsultationFeedTab.tsx b/src/Components/Facility/ConsultationDetails/ConsultationFeedTab.tsx index 34931b303f8..7b266e91639 100644 --- a/src/Components/Facility/ConsultationDetails/ConsultationFeedTab.tsx +++ b/src/Components/Facility/ConsultationDetails/ConsultationFeedTab.tsx @@ -167,7 +167,14 @@ export const ConsultationFeedTab = (props: ConsultationTabProps) => { result: "success", }); setHasMoved(false); - setPreset(value); + // Voluntarily copying to trigger change of reference of the position attribute, so that the useEffect of CameraFeed that handles the moves gets triggered. + setPreset({ + ...value, + meta: { + ...value.meta, + position: { ...value.meta.position }, + }, + }); }} /> {isUpdatingPreset ? ( From 4c882b41b1073b8c629eafae44b5db302d167bf9 Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Wed, 7 Aug 2024 12:55:58 +0530 Subject: [PATCH 013/121] Live Feed: Move to last accessed preset instead of last created (#8255) --- .../ConsultationFeedTab.tsx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Components/Facility/ConsultationDetails/ConsultationFeedTab.tsx b/src/Components/Facility/ConsultationDetails/ConsultationFeedTab.tsx index 7b266e91639..d8d4f8b3d28 100644 --- a/src/Components/Facility/ConsultationDetails/ConsultationFeedTab.tsx +++ b/src/Components/Facility/ConsultationDetails/ConsultationFeedTab.tsx @@ -59,12 +59,18 @@ export const ConsultationFeedTab = (props: ConsultationTabProps) => { return; } - const preset = data.results.find( + const presets = data.results.filter( (obj) => obj.asset_object.meta?.asset_type === "CAMERA" && obj.meta.type !== "boundary", ); + const lastPresetId = sessionStorage.getItem( + getFeedPresetKey(props.consultationId), + ); + const preset = + presets.find((obj) => obj.id === lastPresetId) ?? presets[0]; + if (preset) { setPreset(preset); setAsset(preset.asset_object); @@ -105,6 +111,13 @@ export const ConsultationFeedTab = (props: ConsultationTabProps) => { } }, [!!bed, loading, !!asset, divRef.current]); + useEffect(() => { + const feedPresetKey = getFeedPresetKey(props.consultationId); + if (preset) { + sessionStorage.setItem(feedPresetKey, preset.id); + } + }, [preset, props.consultationId]); + if (loading) { return ; } @@ -212,3 +225,7 @@ export const ConsultationFeedTab = (props: ConsultationTabProps) => { ); }; + +const getFeedPresetKey = (consultationId: string) => { + return `encounterFeedPreset[${consultationId}]`; +}; From eb5e6ebfe32887e04d42f1ac1fef2293bbc3694a Mon Sep 17 00:00:00 2001 From: Harsh Renose <70405311+renoseHarsh@users.noreply.github.com> Date: Wed, 7 Aug 2024 12:57:08 +0530 Subject: [PATCH 014/121] Increased Form Size & Updated Indicator Field (#8244) --- src/Components/Medicine/ManagePrescriptions.tsx | 2 +- src/Components/Medicine/PrescriptionDetailCard.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Components/Medicine/ManagePrescriptions.tsx b/src/Components/Medicine/ManagePrescriptions.tsx index fd335ce19fb..a5ae50813a2 100644 --- a/src/Components/Medicine/ManagePrescriptions.tsx +++ b/src/Components/Medicine/ManagePrescriptions.tsx @@ -12,7 +12,7 @@ export default function ManagePrescriptions() { return (
diff --git a/src/Components/Medicine/PrescriptionDetailCard.tsx b/src/Components/Medicine/PrescriptionDetailCard.tsx index 0bc75d66a72..83e320730a4 100644 --- a/src/Components/Medicine/PrescriptionDetailCard.tsx +++ b/src/Components/Medicine/PrescriptionDetailCard.tsx @@ -178,19 +178,19 @@ export default function PrescriptionDetailCard({ {prescription.dosage_type === "PRN" ? ( <> {prescription.indicator} {prescription.max_dosage} {prescription.min_hours_between_doses && From 91ef1cf112aba379fb4eb86f09ef8f9919a0d799 Mon Sep 17 00:00:00 2001 From: Vishvam Moliya <96417040+thevishvammoliya@users.noreply.github.com> Date: Wed, 7 Aug 2024 12:57:34 +0530 Subject: [PATCH 015/121] =?UTF-8?q?Fixed:=20Misalignment=20of=20placeholde?= =?UTF-8?q?r=20text=20inside=20date=20component=20in=20the=20=E2=80=A6=20(?= =?UTF-8?q?#8240)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixed: Misalignment of placeholder text inside date component in the add user page #8239 * Update src/Components/Common/DateInputV2.tsx Co-authored-by: Rithvik Nishad --------- Co-authored-by: Rithvik Nishad --- src/Components/Common/DateInputV2.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/Common/DateInputV2.tsx b/src/Components/Common/DateInputV2.tsx index 9bb10b1951b..2e9f99de9bc 100644 --- a/src/Components/Common/DateInputV2.tsx +++ b/src/Components/Common/DateInputV2.tsx @@ -256,7 +256,7 @@ const DateInputV2: React.FC = ({ type="text" readOnly disabled={disabled} - className={`cui-input-base cursor-pointer !px-2 disabled:cursor-not-allowed ${className}`} + className={`cui-input-base cursor-pointer disabled:cursor-not-allowed ${className}`} placeholder={placeholder ?? t("select_date")} value={value && dayjs(value).format("DD/MM/YYYY")} /> From 203afd204a473c389c6b4d2d26b8e88600abc5e2 Mon Sep 17 00:00:00 2001 From: Harsh Renose <70405311+renoseHarsh@users.noreply.github.com> Date: Wed, 7 Aug 2024 12:57:57 +0530 Subject: [PATCH 016/121] Fixed: Transfer patient pop-up behavior (#8245) * Updated Pop Close * Updaed Pop-up Close for Transfer --- .../Facility/DuplicatePatientDialog.tsx | 5 ++-- src/Components/Patient/PatientRegister.tsx | 24 +++++++++++++++---- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/Components/Facility/DuplicatePatientDialog.tsx b/src/Components/Facility/DuplicatePatientDialog.tsx index 7450d9fd8f1..b948ad91fa3 100644 --- a/src/Components/Facility/DuplicatePatientDialog.tsx +++ b/src/Components/Facility/DuplicatePatientDialog.tsx @@ -7,13 +7,12 @@ interface Props { patientList: Array; handleOk: (action: string) => void; handleCancel: () => void; - isNew: boolean; } const tdClass = "border border-secondary-400 p-2 text-left"; const DuplicatePatientDialog = (props: Props) => { - const { patientList, handleOk, handleCancel, isNew } = props; + const { patientList, handleOk, handleCancel } = props; const [action, setAction] = useState(""); return ( @@ -118,7 +117,7 @@ const DuplicatePatientDialog = (props: Props) => { { }); const [careExtId, setCareExtId] = useState(""); const [formField, setFormField] = useState(); + const [resetNum, setResetNum] = useState(false); const [isDistrictLoading, setIsDistrictLoading] = useState(false); const [isLocalbodyLoading, setIsLocalbodyLoading] = useState(false); const [isWardLoading, setIsWardLoading] = useState(false); @@ -1003,21 +1004,29 @@ export const PatientRegister = (props: PatientRegisterProps) => { { + handleDialogClose("close"); + setResetNum(true); + }} /> )} {statusDialog.transfer && ( handleDialogClose("back")} + onClose={() => { + setResetNum(true); + handleDialogClose("close"); + }} title="Patient Transfer Form" className="max-w-md md:min-w-[600px]" > handleDialogClose("close")} - handleCancel={() => handleDialogClose("back")} + handleCancel={() => { + setResetNum(true); + handleDialogClose("close"); + }} facilityId={facilityId} /> @@ -1134,6 +1143,13 @@ export const PatientRegister = (props: PatientRegisterProps) => { > {(field) => { if (!formField) setFormField(field); + if (resetNum) { + field("phone_number").onChange({ + name: "phone_number", + value: "+91", + }); + setResetNum(false); + } return ( <>
From f3dd93dab3a65765c3cd1868f3cc900af5ab3874 Mon Sep 17 00:00:00 2001 From: Shivank Kacker Date: Wed, 7 Aug 2024 12:58:09 +0530 Subject: [PATCH 017/121] Show weight and height as unspecified rather than 0 (#8248) --- .../ConsultationUpdatesTab.tsx | 29 +++++++++++++------ src/Components/Facility/ConsultationForm.tsx | 22 +++++++++----- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx b/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx index 22194b410b7..d00b77d9bca 100644 --- a/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx +++ b/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx @@ -555,24 +555,35 @@ export const ConsultationUpdatesTab = (props: ConsultationTabProps) => {
Weight {" - "} - {props.consultationData.weight ?? "-"} Kg + {props.consultationData.weight + ? `${props.consultationData.weight} kg` + : "Unspecified"}
Height {" - "} - {props.consultationData.height ?? "-"} cm + {props.consultationData.height + ? `${props.consultationData.height} cm` + : "Unspecified"}
Body Surface Area {" - "} - - {Math.sqrt( - (Number(props.consultationData.weight) * - Number(props.consultationData.height)) / - 3600, - ).toFixed(2)}{" "} - m2 + + {props.consultationData.weight && + props.consultationData.height ? ( + <> + {Math.sqrt( + (Number(props.consultationData.weight) * + Number(props.consultationData.height)) / + 3600, + ).toFixed(2)} + m2 + + ) : ( + "Unspecified" + )}
diff --git a/src/Components/Facility/ConsultationForm.tsx b/src/Components/Facility/ConsultationForm.tsx index dc496d599f7..40d9741d712 100644 --- a/src/Components/Facility/ConsultationForm.tsx +++ b/src/Components/Facility/ConsultationForm.tsx @@ -386,8 +386,8 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => { admitted: data.admitted ? String(data.admitted) : "false", admitted_to: data.admitted_to ? data.admitted_to : "", category: data.category - ? (PATIENT_CATEGORIES.find((i) => i.text === data.category)?.id ?? - "") + ? PATIENT_CATEGORIES.find((i) => i.text === data.category)?.id ?? + "" : "", patient_no: data.patient_no ?? "", OPconsultation: data.consultation_notes, @@ -1084,12 +1084,18 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => {
Body Surface Area - {Math.sqrt( - (Number(state.form.weight) * - Number(state.form.height)) / - 3600, - ).toFixed(2)} - m2 + {state.form.weight && state.form.height ? ( + <> + {Math.sqrt( + (Number(state.form.weight) * + Number(state.form.height)) / + 3600, + ).toFixed(2)} + m2 + + ) : ( + "Not specified" + )}
From caa411dcf93ee1ceb419ff7aa5b00183b07809e8 Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Wed, 7 Aug 2024 20:13:12 +0530 Subject: [PATCH 018/121] Cypress: fix incorrect patient category select's id (#8267) --- cypress/pageobject/Patient/PatientLogupdate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/pageobject/Patient/PatientLogupdate.ts b/cypress/pageobject/Patient/PatientLogupdate.ts index bc141c04984..ac1bd6a4991 100644 --- a/cypress/pageobject/Patient/PatientLogupdate.ts +++ b/cypress/pageobject/Patient/PatientLogupdate.ts @@ -16,7 +16,7 @@ class PatientLogupdate { } selectPatientCategory(category: string) { - cy.clickAndSelectOption("#patient_category", category); + cy.clickAndSelectOption("#patientCategory", category); } typePhysicalExamination(examination: string) { From b552047d64a1b8fac950eb4ba5d5a39bc08b0bef Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Thu, 8 Aug 2024 16:20:26 +0530 Subject: [PATCH 019/121] =?UTF-8?q?Adds=20support=20for=20printing=20?= =?UTF-8?q?=F0=9F=96=A8=EF=B8=8F=20prescriptions=20=F0=9F=92=8A=20(#8259)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adds support for printing prescriptions * Improve print preview layout * add links to reach the print page * update title of print output * Updated prescription print preview as per requirements * disable print if empty; add titration instructions; improve layout * remove todo comments :) * update disable logic --------- Co-authored-by: Mohammed Nihal <57055998+nihal467@users.noreply.github.com> --- src/CAREUI/misc/PrintPreview.tsx | 36 +++ .../Medicine/ManagePrescriptions.tsx | 10 +- .../MedicineAdministrationSheet/index.tsx | 44 ++- src/Components/Medicine/PrintPreview.tsx | 271 ++++++++++++++++++ src/Locale/en/Common.json | 5 +- src/Locale/en/Consultation.json | 6 + src/Locale/en/Medicine.json | 4 +- src/Routers/routes/ConsultationRoutes.tsx | 3 + 8 files changed, 360 insertions(+), 19 deletions(-) create mode 100644 src/CAREUI/misc/PrintPreview.tsx create mode 100644 src/Components/Medicine/PrintPreview.tsx diff --git a/src/CAREUI/misc/PrintPreview.tsx b/src/CAREUI/misc/PrintPreview.tsx new file mode 100644 index 00000000000..243826c7337 --- /dev/null +++ b/src/CAREUI/misc/PrintPreview.tsx @@ -0,0 +1,36 @@ +import { ReactNode } from "react"; +import ButtonV2 from "../../Components/Common/components/ButtonV2"; +import CareIcon from "../icons/CareIcon"; +import { classNames } from "../../Utils/utils"; +import Page from "../../Components/Common/components/Page"; + +type Props = { + children: ReactNode; + disabled?: boolean; + className?: string; + title: string; +}; + +export default function PrintPreview(props: Props) { + return ( + +
+
+ window.print()}> + + Print + +
+ +
+
+ {props.children} +
+
+
+
+ ); +} diff --git a/src/Components/Medicine/ManagePrescriptions.tsx b/src/Components/Medicine/ManagePrescriptions.tsx index a5ae50813a2..8409e721779 100644 --- a/src/Components/Medicine/ManagePrescriptions.tsx +++ b/src/Components/Medicine/ManagePrescriptions.tsx @@ -10,7 +10,15 @@ export default function ManagePrescriptions() { const { goBack } = useAppHistory(); return ( - + + + Print + + } + >
{ const prescriptionList = [ ...(data?.results ?? []), - ...(showDiscontinued ? discontinuedPrescriptions.data?.results ?? [] : []), + ...(showDiscontinued + ? (discontinuedPrescriptions.data?.results ?? []) + : []), ]; const { activityTimelineBounds, prescriptions } = useMemo( @@ -90,25 +92,37 @@ const MedicineAdministrationSheet = ({ readonly, is_prn }: Props) => { options={ !readonly && !!data?.results && ( - + <> + + + + + {t("edit_prescriptions")} + + {t("edit")} + + refetch()} + /> + - - - {t("edit_prescriptions")} - - {t("edit")} + + Print - refetch()} - /> - + ) } /> diff --git a/src/Components/Medicine/PrintPreview.tsx b/src/Components/Medicine/PrintPreview.tsx new file mode 100644 index 00000000000..09bad44d630 --- /dev/null +++ b/src/Components/Medicine/PrintPreview.tsx @@ -0,0 +1,271 @@ +import { useTranslation } from "react-i18next"; +import PrintPreview from "../../CAREUI/misc/PrintPreview"; +import { useSlugs } from "../../Common/hooks/useSlug"; +import routes from "../../Redux/api"; +import useQuery from "../../Utils/request/useQuery"; +import { + classNames, + formatDate, + formatDateTime, + formatName, + patientAgeInYears, +} from "../../Utils/utils"; +import MedicineRoutes from "./routes"; +import { Prescription } from "./models"; +import useConfig from "../../Common/hooks/useConfig"; +import { ReactNode } from "react"; + +export default function PrescriptionsPrintPreview() { + const { main_logo } = useConfig(); + const { t } = useTranslation(); + const [patientId, consultationId] = useSlugs("patient", "consultation"); + + const patientQuery = useQuery(routes.getPatient, { + pathParams: { id: patientId }, + }); + + const encounterQuery = useQuery(routes.getConsultation, { + pathParams: { id: consultationId }, + }); + + const prescriptionsQuery = useQuery(MedicineRoutes.listPrescriptions, { + pathParams: { consultation: consultationId }, + query: { discontinued: false, limit: 100 }, + }); + + const patient = patientQuery.data; + const encounter = encounterQuery.data; + + const items = prescriptionsQuery.data?.results; + const normalPrescriptions = items?.filter((p) => p.dosage_type !== "PRN"); + const prnPrescriptions = items?.filter((p) => p.dosage_type === "PRN"); + + return ( + +
+

{encounter?.facility_name}

+ care logo +
+
+ + {patient && ( + <> + {patient.name} -{" "} + {t(`GENDER__${patient.gender}`)},{" "} + {patientAgeInYears(patient).toString()}yrs + + )} + + + {encounter?.patient_no} + + + + {formatDate(encounter?.encounter_date)} + + + {encounter?.current_bed?.bed_object.location_object?.name} + {" - "} + {encounter?.current_bed?.bed_object.name} + + + + {patient?.allergies ?? "None"} + +
+ + + + +
+

+ Sign of the Consulting Doctor +

+ + {encounter?.treating_physician_object && + formatName(encounter?.treating_physician_object)} + +

+ Generated on: {formatDateTime(new Date())} +

+

+ This is a computer generated prescription. It shall be issued to the + patient only after the concerned doctor has verified the content and + authorized the same by affixing signature. +

+
+
+ ); +} + +const PatientDetail = ({ + name, + children, + className, +}: { + name: string; + children?: ReactNode; + className?: string; +}) => { + return ( +
+
{name}:
+ {children != null ? ( + {children} + ) : ( +
+ )} +
+ ); +}; + +const PrescriptionsTable = ({ + items, + prn, +}: { + items?: Prescription[]; + prn?: boolean; +}) => { + if (!items) { + return ( +
+ ); + } + + if (!items.length) { + return; + } + + return ( +
+
{t("medicine")} diff --git a/src/Components/Medicine/ResponsiveMedicineTables.tsx b/src/Components/Medicine/ResponsiveMedicineTables.tsx index 073511618f1..c3b311a68e4 100644 --- a/src/Components/Medicine/ResponsiveMedicineTables.tsx +++ b/src/Components/Medicine/ResponsiveMedicineTables.tsx @@ -37,13 +37,13 @@ export default function ResponsiveMedicineTable(props: {
+ {item} + {props.actionLabel || ""}
+ + + + + + + {/* */} + + + + + {items.map((item) => ( + + ))} + +
+ {prn && "PRN"} Prescriptions +
MedicineDosageDirections{prn ? "Indicator" : "Freq."}Notes / Instructions
+ ); +}; + +const PrescriptionEntry = ({ obj }: { obj: Prescription }) => { + const { t } = useTranslation(); + const medicine = obj.medicine_object; + + return ( + + +

+ + {medicine?.name ?? obj.medicine_old} + {" "} +

+ {medicine?.type === "brand" && ( + +

+ Generic:{" "} + + {medicine.generic ?? "--"} + +

+

+ Brand:{" "} + + {medicine.company ?? "--"} + +

+
+ )} + + + {obj.dosage_type === "TITRATED" &&

Titrated

} +

+ {obj.base_dosage}{" "} + {obj.target_dosage != null && `→ ${obj.target_dosage}`}{" "} +

+ {obj.max_dosage && ( +

+ Max. {obj.max_dosage} in + 24hrs +

+ )} + {obj.min_hours_between_doses && ( +

+ Min.{" "} + + {obj.min_hours_between_doses}hrs + {" "} + b/w doses +

+ )} + + + {obj.route && ( +

+ Route: + + {t(`PRESCRIPTION_ROUTE_${obj.route}`)} + +

+ )} + {obj.frequency && ( +

+ Freq: + + {t(`PRESCRIPTION_FREQUENCY_${obj.frequency}`)} + +

+ )} + {obj.days && ( +

+ Days: + {obj.days} day(s) +

+ )} + {obj.indicator && ( +

+ Indicator: + {obj.indicator} +

+ )} + + + {obj.notes} + {obj.instruction_on_titration && ( +

+ Titration instructions:{" "} + {obj.instruction_on_titration} +

+ )} + + + ); +}; diff --git a/src/Locale/en/Common.json b/src/Locale/en/Common.json index 0bd26305b86..707f8f74a0b 100644 --- a/src/Locale/en/Common.json +++ b/src/Locale/en/Common.json @@ -177,5 +177,8 @@ "caution": "Caution", "feed_optimal_experience_for_phones": "For optimal viewing experience, consider rotating your device.", "feed_optimal_experience_for_apple_phones": "For optimal viewing experience, consider rotating your device. Ensure auto-rotate is enabled in your device settings.", - "action_irreversible": "This action is irreversible" + "action_irreversible": "This action is irreversible", + "GENDER__1": "Male", + "GENDER__2": "Female", + "GENDER__3": "Non-binary" } \ No newline at end of file diff --git a/src/Locale/en/Consultation.json b/src/Locale/en/Consultation.json index 6e3846fb983..a76afe72410 100644 --- a/src/Locale/en/Consultation.json +++ b/src/Locale/en/Consultation.json @@ -38,6 +38,12 @@ "no_changes": "No changes", "no_treating_physicians_available": "This facility does not have any home facility doctors. Please contact your admin.", "encounter_suggestion_edit_disallowed": "Not allowed to switch to this option in edit consultation", + "encounter_suggestion__A": "Admission", + "encounter_suggestion__DC": "Domiciliary Care", + "encounter_suggestion__OP": "Out-patient visit", + "encounter_suggestion__DD": "Consultation", + "encounter_suggestion__HI": "Consultation", + "encounter_suggestion__R": "Consultation", "encounter_date_field_label__A": "Date & Time of Admission to the Facility", "encounter_date_field_label__DC": "Date & Time of Domiciliary Care commencement", "encounter_date_field_label__OP": "Date & Time of Out-patient visit", diff --git a/src/Locale/en/Medicine.json b/src/Locale/en/Medicine.json index d559ef2fdbf..80726d83fb2 100644 --- a/src/Locale/en/Medicine.json +++ b/src/Locale/en/Medicine.json @@ -47,7 +47,7 @@ "PRESCRIPTION_ROUTE_IM": "IM", "PRESCRIPTION_ROUTE_SC": "S/C", "PRESCRIPTION_ROUTE_INHALATION": "Inhalation", - "PRESCRIPTION_ROUTE_NASOGASTRIC": "Nasogastric/Gastrostomy tube", + "PRESCRIPTION_ROUTE_NASOGASTRIC": "Nasogastric / Gastrostomy tube", "PRESCRIPTION_ROUTE_INTRATHECAL": "intrathecal injection", "PRESCRIPTION_ROUTE_TRANSDERMAL": "Transdermal", "PRESCRIPTION_ROUTE_RECTAL": "Rectal", @@ -61,4 +61,4 @@ "PRESCRIPTION_FREQUENCY_Q4H": "4th hourly", "PRESCRIPTION_FREQUENCY_QOD": "Alternate day", "PRESCRIPTION_FREQUENCY_QWK": "Once a week" -} +} \ No newline at end of file diff --git a/src/Routers/routes/ConsultationRoutes.tsx b/src/Routers/routes/ConsultationRoutes.tsx index 8b75e3f147f..2484acca0fd 100644 --- a/src/Routers/routes/ConsultationRoutes.tsx +++ b/src/Routers/routes/ConsultationRoutes.tsx @@ -10,6 +10,7 @@ import { ConsultationDetails } from "../../Components/Facility/ConsultationDetai import TreatmentSummary from "../../Components/Facility/TreatmentSummary"; import ConsultationDoctorNotes from "../../Components/Facility/ConsultationDoctorNotes"; import PatientConsentRecords from "../../Components/Patient/PatientConsentRecords"; +import PrescriptionsPrintPreview from "../../Components/Medicine/PrintPreview"; export default { "/facility/:facilityId/patient/:patientId/consultation": ({ @@ -48,6 +49,8 @@ export default { ), "/facility/:facilityId/patient/:patientId/consultation/:consultationId/prescriptions": (path: any) => , + "/facility/:facilityId/patient/:patientId/consultation/:consultationId/prescriptions/print": + () => , "/facility/:facilityId/patient/:patientId/consultation/:id/investigation": ({ facilityId, patientId, From 12b57b9e7e6d0c00f8d069f4ef2e42b5bdf198cd Mon Sep 17 00:00:00 2001 From: Shivank Kacker Date: Thu, 8 Aug 2024 18:08:55 +0530 Subject: [PATCH 020/121] Made Scribe work with Symptoms, Investigations, Diagnosis and Prescriptions (#8183) * Fixed Symptoms and Diagnosis * fixes * fixed bugs * fixed times, measured at, and rounds type * fix translation issue * minor enhancement * fixed rounds type * disable scribe * init * Added support for Investigations, and Prescriptions * undo config * Update src/Components/Scribe/formDetails.ts * Fix bug related to diagnosis update * cleanup * more cleanup --------- Co-authored-by: Mohammed Nihal <57055998+nihal467@users.noreply.github.com> --- .../InvestigationBuilder.tsx | 89 +++---- .../ConsultationDiagnosisBuilder.tsx | 7 +- src/Components/Patient/DailyRounds.tsx | 140 +++++++++- src/Components/Scribe/Scribe.tsx | 140 +++++++--- src/Components/Scribe/formDetails.ts | 239 ++++++++++++++++-- 5 files changed, 510 insertions(+), 105 deletions(-) diff --git a/src/Components/Common/prescription-builder/InvestigationBuilder.tsx b/src/Components/Common/prescription-builder/InvestigationBuilder.tsx index ef99a7f1acc..ce7c579ee22 100644 --- a/src/Components/Common/prescription-builder/InvestigationBuilder.tsx +++ b/src/Components/Common/prescription-builder/InvestigationBuilder.tsx @@ -29,12 +29,28 @@ export interface InvestigationBuilderProps { setInvestigations: React.Dispatch>; } -export default function InvestigationBuilder( - props: InvestigationBuilderProps, -) { - const { investigations, setInvestigations } = props; - const [investigationsList, setInvestigationsList] = useState([]); - const [activeIdx, setActiveIdx] = useState(null); +export const loadInvestigations = async () => { + const fetchInvestigations = async () => { + const { data } = await request(routes.listInvestigations); + return ( + data?.results.map( + (investigation) => + `${investigation.name} -- ${humanizeStrings( + investigation.groups.map((group) => ` ( ${group.name} ) `), + )}`, + ) ?? [] + ); + }; + + const fetchInvestigationGroups = async () => { + const { data } = await request(routes.listInvestigationGroups); + return data?.results.map((group) => `${group.name} (GROUP)`) ?? []; + }; + + const invs = await fetchInvestigations(); + const groups = await fetchInvestigationGroups(); + + let additionalStrings: string[] = []; const additionalInvestigations = [ ["Vitals", ["Temp", "Blood Pressure", "Respiratory Rate", "Pulse Rate"]], [ @@ -51,57 +67,42 @@ export default function InvestigationBuilder( ], ], ]; + additionalInvestigations.forEach((investigation) => { + additionalStrings.push((investigation[0] as string) + " (GROUP)"); + additionalStrings = [ + ...additionalStrings, + ...(investigation[1] as string[]).map( + (i: any) => i + " -- ( " + investigation[0] + " )", + ), + ]; + }); + + return [...groups, ...invs, ...additionalStrings]; +}; + +export default function InvestigationBuilder( + props: InvestigationBuilderProps, +) { + const { investigations, setInvestigations } = props; + const [investigationsList, setInvestigationsList] = useState([]); + const [activeIdx, setActiveIdx] = useState(null); const setItem = (object: InvestigationType, i: number) => { setInvestigations( - investigations.map((investigation, index) => + investigations?.map((investigation, index) => index === i ? object : investigation, ), ); }; useEffect(() => { - loadInvestigations(); + const load = async () => setInvestigationsList(await loadInvestigations()); + load(); }, []); - const loadInvestigations = async () => { - const invs = await fetchInvestigations(); - const groups = await fetchInvestigationGroups(); - - let additionalStrings: string[] = []; - additionalInvestigations.forEach((investigation) => { - additionalStrings.push((investigation[0] as string) + " (GROUP)"); - additionalStrings = [ - ...additionalStrings, - ...(investigation[1] as string[]).map( - (i: any) => i + " -- ( " + investigation[0] + " )", - ), - ]; - }); - - setInvestigationsList([...groups, ...invs, ...additionalStrings]); - }; - - const fetchInvestigations = async () => { - const { data } = await request(routes.listInvestigations); - return ( - data?.results.map( - (investigation) => - `${investigation.name} -- ${humanizeStrings( - investigation.groups.map((group) => ` ( ${group.name} ) `), - )}`, - ) ?? [] - ); - }; - - const fetchInvestigationGroups = async () => { - const { data } = await request(routes.listInvestigationGroups); - return data?.results.map((group) => `${group.name} (GROUP)`) ?? []; - }; - return (
- {investigations.map((investigation, i) => { + {investigations?.map((investigation, i) => { const setFrequency = (frequency: string) => { setItem( { diff --git a/src/Components/Diagnosis/ConsultationDiagnosisBuilder/ConsultationDiagnosisBuilder.tsx b/src/Components/Diagnosis/ConsultationDiagnosisBuilder/ConsultationDiagnosisBuilder.tsx index 0391748c929..b6495143f5d 100644 --- a/src/Components/Diagnosis/ConsultationDiagnosisBuilder/ConsultationDiagnosisBuilder.tsx +++ b/src/Components/Diagnosis/ConsultationDiagnosisBuilder/ConsultationDiagnosisBuilder.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import useSlug from "../../../Common/hooks/useSlug"; import { ConsultationDiagnosis, @@ -83,6 +83,11 @@ interface EditDiagnosesProps { export const EditDiagnosesBuilder = (props: EditDiagnosesProps) => { const consultation = useSlug("consultation"); const [diagnoses, setDiagnoses] = useState(props.value); + + useEffect(() => { + setDiagnoses(props.value); + }, [props.value]); + return (
diff --git a/src/Components/Patient/DailyRounds.tsx b/src/Components/Patient/DailyRounds.tsx index d451513c9bc..d960636d522 100644 --- a/src/Components/Patient/DailyRounds.tsx +++ b/src/Components/Patient/DailyRounds.tsx @@ -29,7 +29,7 @@ import RadioFormField from "../Form/FormFields/RadioFormField"; import request from "../../Utils/request/request"; import routes from "../../Redux/api"; import { Scribe } from "../Scribe/Scribe"; -import { DAILY_ROUND_FORM_SCRIBE_DATA } from "../Scribe/formDetails"; +import { SCRIBE_FORMS } from "../Scribe/formDetails"; import { DailyRoundsModel } from "./models"; import InvestigationBuilder from "../Common/prescription-builder/InvestigationBuilder"; import { FieldErrorText } from "../Form/FormFields/FormField"; @@ -45,6 +45,9 @@ import { EncounterSymptomsBuilder } from "../Symptoms/SymptomsBuilder"; import { FieldLabel } from "../Form/FormFields/FormField"; import useAuthUser from "../../Common/hooks/useAuthUser"; import CheckBoxFormField from "../Form/FormFields/CheckBoxFormField"; +import SymptomsApi from "../Symptoms/api"; +import DiagnosesRoutes from "../Diagnosis/routes"; +import MedicineRoutes from "../Medicine/routes"; import { scrollTo } from "../../Utils/utils"; const Loading = lazy(() => import("../Common/Loading")); @@ -54,6 +57,8 @@ export const DailyRounds = (props: any) => { const authUser = useAuthUser(); const { goBack } = useAppHistory(); const { facilityId, patientId, consultationId, id } = props; + const [symptomsSeed, setSymptomsSeed] = useState(1); + const [prescriptionSeed, setPrescriptionSeed] = useState(1); const initForm: any = { physical_examination_info: "", @@ -478,11 +483,129 @@ export const DailyRounds = (props: any) => { >
{ + form={SCRIBE_FORMS.daily_round} + onFormUpdate={async (fields) => { + // Symptoms + let rounds_type = fields.rounds_type || state.form.rounds_type; + if (fields.additional_symptoms) { + for (const symptom of fields.additional_symptoms) { + const { res } = await request(SymptomsApi.add, { + pathParams: { consultationId }, + body: { + ...symptom, + }, + }); + if (res?.ok) setSymptomsSeed((s) => s + 1); + } + } + + // ICD11 Diagnosis + if (fields.icd11_diagnosis) { + for (const diagnosis of fields.icd11_diagnosis) { + // Fetch available diagnoses + + const { res: icdRes, data: icdData } = await request( + routes.listICD11Diagnosis, + { + query: { query: diagnosis.diagnosis }, + }, + ); + + if (!icdRes?.ok) { + error({ + text: "Failed to fetch ICD11 Diagnosis", + }); + continue; + } + + const availableDiagnosis = icdData?.[0]?.id; + + if (!availableDiagnosis) { + error({ + text: "Could not find the requested diagnosis. Please enter manually.", + }); + continue; + } + + const { res, data } = await request( + DiagnosesRoutes.createConsultationDiagnosis, + { + pathParams: { consultation: consultationId }, + body: { + ...diagnosis, + diagnosis: availableDiagnosis, + }, + }, + ); + + if (res?.ok && data) + setDiagnoses((diagnoses) => [...(diagnoses || []), data]); + } + } + + // Prescriptions + if (fields.prescriptions || fields.prn_prescriptions) { + const combined_prescriptions = [ + ...(fields.prescriptions || []), + ...(fields.prn_prescriptions || []), + ]; + for (const prescription of combined_prescriptions) { + // fetch medicine + const { res: medicineRes, data: medicineData } = await request( + routes.listMedibaseMedicines, + { + query: { query: prescription.medicine }, + }, + ); + + if (!medicineRes?.ok) { + error({ + text: "Failed to fetch medicine", + }); + continue; + } + + const availableMedicine = medicineData?.[0]?.id; + + if (!availableMedicine) { + error({ + text: "Could not find the requested medicine. Please enter manually.", + }); + continue; + } + + const { res } = await request( + MedicineRoutes.createPrescription, + { + pathParams: { consultation: consultationId }, + body: { + ...prescription, + medicine: availableMedicine, + }, + }, + ); + + if (res?.ok) setPrescriptionSeed((s) => s + 1); + } + } + + if ( + Object.keys(fields).some((f) => + [ + "investigations", + "icd11_diagnosis", + "additional_symptoms", + "prescriptions", + "prn_prescriptions", + ].includes(f), + ) + ) { + rounds_type = "DOCTORS_LOG"; + } + dispatch({ type: "set_form", - form: { ...state.form, ...fields }, + form: { ...state.form, ...fields, rounds_type }, }); fields.action !== undefined && setPreviousAction(fields.action); fields.review_interval !== undefined && @@ -536,6 +659,7 @@ export const DailyRounds = (props: any) => {
Symptoms { handleFormFieldChange({ name: "symptoms_dirty", @@ -593,7 +717,11 @@ export const DailyRounds = (props: any) => { <>

Vitals

- + { discontinued={ showDiscontinuedPrescriptions ? undefined : false } + key={prescriptionSeed} actions={["discontinue"]} />
@@ -783,6 +912,7 @@ export const DailyRounds = (props: any) => { showDiscontinuedPrescriptions ? undefined : false } actions={["discontinue"]} + key={prescriptionSeed} />
diff --git a/src/Components/Scribe/Scribe.tsx b/src/Components/Scribe/Scribe.tsx index 16b9056a795..0b05f55ebdf 100644 --- a/src/Components/Scribe/Scribe.tsx +++ b/src/Components/Scribe/Scribe.tsx @@ -21,8 +21,15 @@ export interface Field { description: string; type: string; example: string; - default: string; + default: any; options?: readonly FieldOption[]; + validator: (value: any) => boolean; +} + +export interface ScribeForm { + id: string; + name: string; + fields: () => Promise | Field[]; } export type ScribeModel = { @@ -45,7 +52,8 @@ export type ScribeModel = { }; interface ScribeProps { - fields: Field[]; + form: ScribeForm; + existingData?: { [key: string]: any }; onFormUpdate: (fields: any) => void; } @@ -54,7 +62,7 @@ const SCRIBE_FILE_TYPES = { SCRIBE: 1, }; -export const Scribe: React.FC = ({ fields, onFormUpdate }) => { +export const Scribe: React.FC = ({ form, onFormUpdate }) => { const { enable_scribe } = useConfig(); const [open, setOpen] = useState(false); const [_progress, setProgress] = useState(0); @@ -71,6 +79,21 @@ export const Scribe: React.FC = ({ fields, onFormUpdate }) => { const [updatedTranscript, setUpdatedTranscript] = useState(""); const [scribeID, setScribeID] = useState(""); const stageRef = useRef(stage); + const [fields, setFields] = useState([]); + + useEffect(() => { + const loadFields = async () => { + const fields = await form.fields(); + setFields( + fields.map((f) => ({ + ...f, + validate: undefined, + default: JSON.stringify(f.default), + })), + ); + }; + loadFields(); + }, [form]); useEffect(() => { if (stageRef.current === "cancelled") { @@ -312,8 +335,20 @@ export const Scribe: React.FC = ({ fields, onFormUpdate }) => { setProgress(100); const parsedFormData = JSON.parse(updatedFieldsResponse ?? "{}"); if (stageRef.current === "cancelled") return; - setFormFields(parsedFormData); - onFormUpdate(parsedFormData); + + // run type validations + const validated = Object.entries(parsedFormData) + .filter(([k, v]) => { + const f = fields.find((f) => f.id === k); + if (!f) return false; + if (v === f.default) return false; + //if (f.validator) return f.validator(f.type === "number" ? Number(v) : v); + return true; + }) + .map(([k, v]) => ({ [k]: v })) + .reduce((acc, curr) => ({ ...acc, ...curr }), {}); + setFormFields(validated as any); + onFormUpdate(validated); setStage("final-review"); } catch (error) { setErrors(["Error retrieving form data"]); @@ -373,35 +408,76 @@ export const Scribe: React.FC = ({ fields, onFormUpdate }) => { stageRef.current = "cancelled"; }; - const processFormField = ( + function processFormField( fieldDetails: Field | undefined, - formFields: { [key: string]: string | string[] | number }, + formFields: { [key: string]: any }, field: string, - ) => { - if (fieldDetails?.options) { - // Check if the form field is an array (multiple selections allowed) - if (Array.isArray(formFields[field])) { - // Map each selected option ID to its corresponding text - return (formFields[field] as string[]) - .map((option) => { - const optionDetails = fieldDetails.options?.find( - (o) => o.id === option, - ); - return optionDetails?.text ?? option; // Use option text if found, otherwise fallback to option ID - }) - .join(", "); - } else { - // Single selection scenario, find the option that matches the field value - return ( - fieldDetails.options?.find((o) => o.id === formFields[field])?.text ?? - JSON.stringify(formFields[field]) - ); + ): React.ReactNode { + const value = formFields[field]; + if (!fieldDetails || !value) return value; + + const { options } = fieldDetails; + + const getHumanizedKey = (key: string): string => { + return key + .split("_") + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(" "); + }; + + const getOptionText = (value: string | number): string => { + if (!options) return value.toString(); + const option = options.find((opt) => opt.id === value); + return option ? option.text : value.toString(); + }; + + const renderPrimitive = (value: any): any => { + return options ? getOptionText(value) : value; + }; + + const renderArray = (values: any[]): React.ReactNode => { + return values.map((value) => renderPrimitive(value)).join(", "); + }; + + const renderObject = (obj: { [key: string]: any }): React.ReactNode => { + return ( +
+ {Object.keys(obj).map((key, keyIndex) => ( +
+ {getHumanizedKey(key)}: {renderPrimitive(obj[key])} +
+ ))} +
+ ); + }; + + const renderObjectArray = (objects: any[]): React.ReactNode => { + return ( +
+ {objects.map((obj, objIndex) => ( +
{renderObject(obj)}
+ ))} +
+ ); + }; + + if (Array.isArray(value)) { + if ( + value.length > 0 && + typeof value[0] === "object" && + !Array.isArray(value[0]) + ) { + return renderObjectArray(value); } - } else { - // If no options are available, return the field value in JSON string format - return JSON.stringify(formFields[field]); + return renderArray(value); } - }; + + if (typeof value === "object") { + return renderObject(value); + } + + return renderPrimitive(value); + } const renderContentBasedOnStage = () => { switch (stage) { @@ -599,13 +675,13 @@ export const Scribe: React.FC = ({ fields, onFormUpdate }) => {

{fieldDetails?.friendlyName}

-

+

{processFormField( fieldDetails, formFields, field, )} -

+
); })} diff --git a/src/Components/Scribe/formDetails.ts b/src/Components/Scribe/formDetails.ts index 74673adea70..1c5b0cf3b9c 100644 --- a/src/Components/Scribe/formDetails.ts +++ b/src/Components/Scribe/formDetails.ts @@ -5,19 +5,27 @@ import { RHYTHM_CHOICES, TELEMEDICINE_ACTIONS, } from "../../Common/constants"; +import { loadInvestigations } from "../Common/prescription-builder/InvestigationBuilder"; import { SYMPTOM_CHOICES } from "../Symptoms/types"; -import { Field } from "./Scribe"; +import { Field, ScribeForm } from "./Scribe"; -export const DAILY_ROUND_FORM_SCRIBE_DATA: Field[] = [ +const DAILY_ROUND_FORM_SCRIBE_DATA: Field[] = [ { friendlyName: "Additional Symptoms", id: "additional_symptoms", - type: "number[]", - example: "[1,2,3]", - default: "[]", - description: - "A numeric array of option IDs to store symptoms of the patient.", + type: "{symptom: number, other_symptom?: string, onset_date: string, cure_date?: string}[]", + example: + "[{symptom: 1, onset_date: '2024-12-03'}, {symptom: 2, onset_date: '2024-12-03', cure_date: '2024-12-05'}, {symptom: 9, other_symptom: 'Other symptom', onset_date: '2024-12-03'}]", + default: [], + description: `An array of objects to store the patient's symptoms along with their date of onset and date of cure (if any). The symptom field should be an integer corresponding to the symptom's ID. The onset_date and cure_date fields should be date strings (e.g., '2022-01-01'). If no onset_date has been specified, use todays date which is '${new Date().toISOString().slice(0, 10)}'. If the symptom is ongoing, the cure_date field should not be included. If the user has 'Other Symptom', only then the other_symptom field should be included with a string value describing the symptom.`, options: SYMPTOM_CHOICES, + validator: (value) => { + if (!Array.isArray(value)) return false; + value.forEach((s) => { + if (!s.symptom || !s.onset_date) return false; + }); + return true; + }, }, { friendlyName: "Other Symptoms", @@ -26,6 +34,9 @@ export const DAILY_ROUND_FORM_SCRIBE_DATA: Field[] = [ example: "", default: "", description: "Just leave it blank", + validator: () => { + return true; + }, }, { friendlyName: "Physical Examination Info", @@ -36,6 +47,9 @@ export const DAILY_ROUND_FORM_SCRIBE_DATA: Field[] = [ default: "", description: "This field is designated for storing detailed findings from the physical examination of the patient. It should include all observable physical attributes, conditions, or symptoms noted during the examination. When processing a doctor's transcript, identify and extract descriptions that pertain directly to the patient's physical state, such as visible conditions, physical symptoms, or any abnormalities noted by touch, sight, or measurement. This can include, but is not limited to, descriptions of skin conditions, swellings, lacerations, posture, mobility issues, and any other physically observable traits.", + validator: (value) => { + return typeof value === "string"; + }, }, { friendlyName: "Other Details", @@ -46,6 +60,9 @@ export const DAILY_ROUND_FORM_SCRIBE_DATA: Field[] = [ "Patient reports trouble sleeping and a decreased appetite. Additionally, the patient is allergic to penicillin and has a history of asthma.", description: "This field is for capturing any supplementary details about the patient that are mentioned in the doctor's transcript but do not directly pertain to the physical examination findings. This includes, but is not limited to, behavioral observations, medical history, patient complaints, lifestyle factors, allergies, or any other non-physical observations that are relevant to the patient's overall health and well-being. When processing a transcript, extract information that describes the patient's health, habits, or conditions in a broader sense than what is observed through physical examination alone.", + validator: (value) => { + return typeof value === "string"; + }, }, { friendlyName: "Patient Category", @@ -58,14 +75,20 @@ export const DAILY_ROUND_FORM_SCRIBE_DATA: Field[] = [ id: category.id, text: category.text, })), + validator: (value) => { + return typeof value === "string"; + }, }, { friendlyName: "Actions", id: "actions", type: "null", example: "null", - default: "null", + default: null, description: "Leave blank.", + validator: (value) => { + return value === null; + }, }, { friendlyName: "Action", @@ -78,16 +101,18 @@ export const DAILY_ROUND_FORM_SCRIBE_DATA: Field[] = [ id: action.text, text: action.desc, })), + validator: (value) => typeof value === "string", }, { friendlyName: "Review Interval", id: "review_interval", type: "number", - default: "0", + default: 0, example: "15", description: "An integer to represent the interval at which the patient's condition is reviewed.", options: REVIEW_AT_CHOICES, + validator: (value) => typeof value === "number", }, { friendlyName: "Admitted To", @@ -97,63 +122,75 @@ export const DAILY_ROUND_FORM_SCRIBE_DATA: Field[] = [ example: "General Ward", description: "A string to store the department or ward where the patient is admitted.", + validator: (value) => typeof value === "string", }, { friendlyName: "bp", id: "bp", - default: "{ systolic: undefined, diastolic: undefined, mean: undefined }", - type: "{ systolic: number, diastolic: number, mean: number }", - example: "{ systolic: 120, diastolic: 80, mean: 100 }", + default: { systolic: null, diastolic: null, mean: null }, + type: "{ systolic?: number, diastolic?: number }", + example: "{ systolic: 120 }", description: - "An object to store the blood pressure of the patient. It contains two integers, systolic and diastolic. Output mean is calculated from these two.", + "An object to store the blood pressure of the patient. It may contain two integers, systolic and diastolic.", + validator: (value) => { + if (typeof value !== "object") return false; + if (value.systolic && typeof value.systolic !== "number") return false; + if (value.diastolic && typeof value.diastolic !== "number") return false; + return true; + }, }, { friendlyName: "Pulse", id: "pulse", type: "number", - default: "null", + default: null, example: "72", description: "An integer to store the pulse rate of the patient. It can be null if the pulse rate is not taken.", + validator: (value) => typeof value === "number", }, { friendlyName: "Respiratory Rate", id: "resp", type: "number", - default: "null", + default: null, example: "16", description: "An integer to store the respiratory rate of the patient. It can be null if the respiratory rate is not taken.", + validator: (value) => typeof value === "number", }, { friendlyName: "Temperature", id: "temperature", type: "number", - default: "null", + default: null, example: "98.6", description: "A float to store the temperature of the patient. It can be null if the temperature is not taken.", + validator: (value) => typeof value === "number", }, { friendlyName: "SPO2", id: "ventilator_spo2", type: "number", - default: "null", + default: null, example: "98", description: "An integer to store the SPO2 level of the patient. It can be null if the SPO2 level is not taken.", + validator: (value) => typeof value === "number", }, { friendlyName: "Rhythm", id: "rhythm", - type: "string", + type: "number", example: "5", - default: "0", + default: 0, description: "An option to store the rhythm of the patient.", options: RHYTHM_CHOICES.map((rhythm) => ({ id: rhythm.id, text: rhythm.desc ?? "", })), + validator: (value) => typeof value === "number", }, { friendlyName: "Rhythm Detail", @@ -163,6 +200,7 @@ export const DAILY_ROUND_FORM_SCRIBE_DATA: Field[] = [ example: "Just minor irregularities.", description: "A string to store the details about the rhythm of the patient.", + validator: (value) => typeof value === "string", }, { friendlyName: "Level Of Consciousness", @@ -173,13 +211,168 @@ export const DAILY_ROUND_FORM_SCRIBE_DATA: Field[] = [ description: "An option to store the level of consciousness of the patient.", options: CONSCIOUSNESS_LEVEL, + validator: (value) => typeof value === "string", + }, + { + friendlyName: "Diagnosis", + id: "icd11_diagnosis", + type: "{diagnosis: string, verification_status: \"unconfirmed\" | \"provisional\" | \"differential\" | \"confirmed\", is_principal: boolean}[]", + default: [], + example: + "[{diagnosis: '4A42.0 Paediatric onset systemic sclerosis', verification_status: 'confirmed', is_principal: true}, {diagnosis: 2, verification_status: 'provisional', is_principal: false}]", + description: + "A list of objects to store the patient's diagnosis along with their verification status and whether it is the principal diagnosis. If not specifically said, set is_principal to false. NOTE: only one principal diagnosis can exist. The diagnosis field should be a string that may contain a corresponding diagnosis ID. The verification_status field should be a string with one of the following values: 'unconfirmed', 'provisional', 'differential', or 'confirmed'.", + validator: (value) => { + if (!Array.isArray(value)) return false; + value.forEach((d) => { + if (!d.diagnosis || !d.verification_status) return false; + }); + return true; + }, + }, + { + friendlyName: "Investigations", + id: "investigations", + type: `{ + type: string[], + repetitive: boolean, + time?: string, + frequency?: '15 min' | '30 min' | '1 hr' | '6 hrs' | '12 hrs' | '24 hrs' | '48 hrs', + notes?: string + }[]`, + default: [], + example: `[ + { + type: ["Haemotology (GROUP)"], + repetitive: false, + time: "2024-07-31T18:10", + notes: "Patient is allergic to penicillin." + }, + { + type: ["ECG", "X-Ray"], + repetitive: true, + frequency: "24 hrs", + notes: "Patient is going nuts" + } + ]`, + description: + "A list of objects to store the patient's investigations. The type field should be an array of strings corresponding to the names of the investigations provided in the options. The repetitive field should be a boolean value. The time field should be a string and only be filled if repetitive field is false. The frequency field should be a string with one of the following values: '15 min', '30 min', '1 hr', '6 hrs', '12 hrs', '24 hrs', or '48 hrs' and should be only filled if this is a repititive investigation. The time field should be of the example format if present - (2024-07-31T18:10). The notes field should be a string. If the type is not available in options, DO NOT MAKE IT.", + validator: (value) => { + if (!Array.isArray(value)) return false; + value.forEach((i) => { + if (!i.type || !i.repetitive) return false; + if (i.repetitive && !i.frequency) return false; + }); + return true; + }, + }, + { + friendlyName: "Prescriptions", + id: "prescriptions", + type: `{ + base_dosage: number + " " + ("mg" | "g" | "ml" | "drop(s)" | "ampule(s)" | "tsp" | "mcg" | "unit(s)"), + days: number, + dosage_type: "REGULAR" | "TITRATED", + frequency: "STAT" | "OD" | "HS" | "BD" | "TID" | "QID" | "Q4H" | "QOD" | "QWK", + medicine: string, + notes: string, + route: "ORAL" | "IV" | "IM" | "SC" | "INHALATION" | "NASOGASTRIC" | "INTRATHECAL" | "TRANSDERMAL" | "RECTAL" | "SUBLINGUAL", + instruction_on_titration: string, + target_dosage: number + " " + ("mg" | "g" | "ml" | "drop(s)" | "ampule(s)" | "tsp" | "mcg" | "unit(s)"), + }[]`, + default: [], + example: `[ + {base_dosage: "5 ampule(s)", days: 7, dosage_type: "REGULAR", frequency: "STAT", medicine: "DOLO", notes: "Give with water", route: "ORAL"}, + {base_dosage: "7 ml", days: 3, dosage_type: "TITRATED", frequency: "Q4H", medicine: "Albumin", route: "INHALATION", instruction_on_titration: "Example", target_dosage: "40 ml"}, + ]`, + description: `A list of objects to store the patient's prescriptions. The prescription can be regular or titrated. If titrated, the prescription should also include instruction_on_titration, and a target_dosage. NOTE: target_dosage should have the same unit as base_dosage. + The frequency should be any of the mentioned ones. They are short for: + STAT: Imediately, + OD: Once daily, + HS: Night Only, + BD: Twice Daily, + TID: 8th Hourly, + QID: 6th Hourly, + Q4H: 4th Hourly, + QOD: Alternate Day, + QWK: Once a Week + `, + validator: (value) => { + if (!Array.isArray(value)) return false; + return true; + }, + }, + { + friendlyName: "PRN Prescriptions", + id: "prn_prescriptions", + type: `{ + base_dosage: number + " " + ("mg" | "g" | "ml" | "drop(s)" | "ampule(s)" | "tsp" | "mcg" | "unit(s)"), + dosage_type: "PRN", + medicine: string, + notes: string, + route: "ORAL" | "IV" | "IM" | "SC" | "INHALATION" | "NASOGASTRIC" | "INTRATHECAL" | "TRANSDERMAL" | "RECTAL" | "SUBLINGUAL", + indicator: string, + min_hours_between_doses: number, + max_dosage: number + " " + ("mg" | "g" | "ml" | "drop(s)" | "ampule(s)" | "tsp" | "mcg" | "unit(s)"), + }[]`, + default: [], + example: `[ + {base_dosage: "3 drop(s)", dosage_type:"PRN", indicator: "If patient gets fever", max_dosage: "5 drops(s)", min_hours_between_doses: 12, route: "IV", medicine: "Glentona", notes: "Example"} + ]`, + description: "A list of objects to store the patient's PRN prescriptions.", + validator: (value) => { + if (!Array.isArray(value)) return false; + return true; + }, }, + /*{ + friendlyName: "Round Type", + id: "rounds_type", + type: "string", + default: "NORMAL", + example: "TELEMEDICINE", + description: "A string to store the type of round.", + options: [ + { id: "NORMAL", text: "Brief Update" }, + { id: "VENTILATOR", text: "Detailed Update" }, + { id: "DOCTORS_LOG", text: "Progress Note" }, + { id: "TELEMEDICINE", text: "Telemedicine" }, + ], + validator: (value) => typeof value === "string", + }, + { + friendlyName: "Measured At", + id: "taken_at", + type: "string", + default: "", + example: "2024-07-31T18:10", + description: + "A string to store the date and time at which the round was taken or measured. 'The round was taken yesterday/today' would amount to yesterday/today's date.", + validator: (value) => typeof value === "string", + }, +*/ ]; -export const SCRIBE_FORMS = [ - { +export const SCRIBE_FORMS: { [key: string]: ScribeForm } = { + daily_round: { id: "daily_round", name: "Daily Round", - fields: DAILY_ROUND_FORM_SCRIBE_DATA, + fields: async () => { + const investigations = await loadInvestigations(); + + return DAILY_ROUND_FORM_SCRIBE_DATA.map((field) => { + if (field.id === "investigations") { + return { + ...field, + options: investigations.map((investigation, i) => ({ + id: i, + text: investigation, + currentData: undefined, + })), + }; + } + return field; + }); + }, }, -]; +}; From 56dd9222a6e1ad65600be077c96acf5330dcff22 Mon Sep 17 00:00:00 2001 From: Ankur Prabhu <85862184+AnkurPrabhu@users.noreply.github.com> Date: Fri, 9 Aug 2024 10:48:52 +0530 Subject: [PATCH 021/121] Fix Notifications for Facility Cover Image Deletion (#7609) --- .../Facility/CoverImageEditModal.tsx | 69 +++++++++++-------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/src/Components/Facility/CoverImageEditModal.tsx b/src/Components/Facility/CoverImageEditModal.tsx index 319ae60fd1b..dc8e0fcd6d7 100644 --- a/src/Components/Facility/CoverImageEditModal.tsx +++ b/src/Components/Facility/CoverImageEditModal.tsx @@ -28,6 +28,22 @@ interface Props { facility: FacilityModel; } +const VideoConstraints = { + user: { + width: 1280, + height: 720, + facingMode: "user", + }, + environment: { + width: 1280, + height: 720, + facingMode: { exact: "environment" }, + }, +} as const; + +type IVideoConstraint = + (typeof VideoConstraints)[keyof typeof VideoConstraints]; + const CoverImageEditModal = ({ open, onClose, @@ -35,31 +51,26 @@ const CoverImageEditModal = ({ onDelete, facility, }: Props) => { - const [isUploading, setIsUploading] = useState(false); - const [selectedFile, setSelectedFile] = useState(); + const [isProcessing, setIsProcessing] = useState(false); + const [selectedFile, setSelectedFile] = useState(); const [preview, setPreview] = useState(); const [isCameraOpen, setIsCameraOpen] = useState(false); const webRef = useRef(null); const [previewImage, setPreviewImage] = useState(null); const [isCaptureImgBeingUploaded, setIsCaptureImgBeingUploaded] = useState(false); - const FACING_MODE_USER = "user"; - const FACING_MODE_ENVIRONMENT = { exact: "environment" }; - const [facingMode, setFacingMode] = useState(FACING_MODE_USER); - const videoConstraints = { - width: 1280, - height: 720, - facingMode: "user", - }; + const [constraint, setConstraint] = useState( + VideoConstraints.user, + ); const { width } = useWindowDimensions(); const LaptopScreenBreakpoint = 640; const isLaptopScreen = width >= LaptopScreenBreakpoint; const { t } = useTranslation(); const handleSwitchCamera = useCallback(() => { - setFacingMode((prevState: any) => - prevState === FACING_MODE_USER - ? FACING_MODE_ENVIRONMENT - : FACING_MODE_USER, + setConstraint((prev) => + prev.facingMode === "user" + ? VideoConstraints.environment + : VideoConstraints.user, ); }, []); @@ -106,7 +117,7 @@ const CoverImageEditModal = ({ const formData = new FormData(); formData.append("cover_image", selectedFile); const url = `/api/v1/facility/${facility.id}/cover_image/`; - setIsUploading(true); + setIsProcessing(true); uploadFile( url, @@ -123,7 +134,7 @@ const CoverImageEditModal = ({ Notification.Error({ msg: "Something went wrong!", }); - setIsUploading(false); + setIsProcessing(false); } }, null, @@ -131,26 +142,28 @@ const CoverImageEditModal = ({ Notification.Error({ msg: "Network Failure. Please check your internet connectivity.", }); - setIsUploading(false); + setIsProcessing(false); }, ); await sleep(1000); - setIsUploading(false); + setIsProcessing(false); setIsCaptureImgBeingUploaded(false); onSave && onSave(); closeModal(); }; const handleDelete = async () => { + setIsProcessing(true); const { res } = await request(routes.deleteFacilityCoverImage, { pathParams: { id: facility.id! }, }); if (res?.ok) { Success({ msg: "Cover image deleted" }); - onDelete?.(); - closeModal(); } + setIsProcessing(false); + onDelete?.(); + closeModal(); }; const hasImage = !!(preview || facility.read_cover_image_url); @@ -277,13 +290,13 @@ const CoverImageEditModal = ({ closeModal(); dragProps.setFileDropError(""); }} - disabled={isUploading} + disabled={isProcessing} /> {facility.read_cover_image_url && ( {t("delete")} @@ -291,15 +304,15 @@ const CoverImageEditModal = ({ - {isUploading ? ( + {isProcessing ? ( ) : ( )} - {isUploading ? `${t("uploading")}...` : `${t("save")}`} + {isProcessing ? `${t("uploading")}...` : `${t("save")}`}
@@ -320,7 +333,7 @@ const CoverImageEditModal = ({ screenshotFormat="image/jpeg" width={1280} ref={webRef} - videoConstraints={{ ...videoConstraints, facingMode }} + videoConstraints={constraint} /> ) : ( @@ -365,7 +378,7 @@ const CoverImageEditModal = ({ setPreviewImage(null); }} className="my-2 w-full" - disabled={isUploading} + disabled={isProcessing} > {t("retake")} @@ -430,7 +443,7 @@ const CoverImageEditModal = ({ > {t("retake")} - + {isCaptureImgBeingUploaded ? ( <> Date: Fri, 9 Aug 2024 10:49:08 +0530 Subject: [PATCH 022/121] Added sorting for events (#8270) --- src/Common/constants.tsx | 7 +++++++ .../ConsultationDetails/Events/EventsList.tsx | 19 ++++++++++++++++++- src/Locale/en/SortOptions.json | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Common/constants.tsx b/src/Common/constants.tsx index 4a490f34e78..2bfecf94395 100644 --- a/src/Common/constants.tsx +++ b/src/Common/constants.tsx @@ -201,6 +201,13 @@ export const PATIENT_SORT_OPTIONS: SortOption[] = [ { isAscending: false, value: "-name" }, ]; +export const EVENTS_SORT_OPTIONS: SortOption[] = [ + { isAscending: false, value: "-created_date" }, + { isAscending: true, value: "created_date" }, + { isAscending: false, value: "-taken_at" }, + { isAscending: true, value: "taken_at" }, +]; + export const DISCHARGED_PATIENT_SORT_OPTIONS: SortOption[] = [ { isAscending: false, value: "-created_date" }, { isAscending: true, value: "created_date" }, diff --git a/src/Components/Facility/ConsultationDetails/Events/EventsList.tsx b/src/Components/Facility/ConsultationDetails/Events/EventsList.tsx index f759559c1a1..d77b3d9a8c2 100644 --- a/src/Components/Facility/ConsultationDetails/Events/EventsList.tsx +++ b/src/Components/Facility/ConsultationDetails/Events/EventsList.tsx @@ -7,15 +7,32 @@ import LoadingLogUpdateCard from "../../Consultations/DailyRounds/LoadingCard"; import GenericEvent from "./GenericEvent"; import { getEventIcon } from "./iconMap"; import { EventGeneric } from "./types"; +import SortDropdownMenu from "../../../Common/SortDropdown"; +import { EVENTS_SORT_OPTIONS } from "../../../../Common/constants"; +import { QueryParams } from "../../../../Utils/request/types"; +import { useState } from "react"; export default function EventsList() { const [consultationId] = useSlugs("consultation"); const { t } = useTranslation(); + const [query, setQuery] = useState(); return ( - + {() => ( <> +
+ +
+
diff --git a/src/Locale/en/SortOptions.json b/src/Locale/en/SortOptions.json index 11986b97663..29a8d1e8f4d 100644 --- a/src/Locale/en/SortOptions.json +++ b/src/Locale/en/SortOptions.json @@ -9,6 +9,8 @@ "facility__name,-last_consultation__current_bed__bed__name": "Bed No. N-1", "-review_time": "Latest review date first", "review_time": "Oldest review date first", + "taken_at": "Oldest taken date first", + "-taken_at": "Latest taken date first", "name": "Patient name A-Z", "-name": "Patient name Z-A", "bed__name": "Bed No. 1-N", From 18e988866eeac6e968ff4a8ba5e2814f5c8b3b17 Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Fri, 9 Aug 2024 15:53:56 +0530 Subject: [PATCH 023/121] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20Fixes=20issue?= =?UTF-8?q?=20with=20treating=20physician=20field=20being=20disabled=20whe?= =?UTF-8?q?n=20a=20search=20text=20entered=20yields=20no=20results;=20?= =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20Migrate=20`UserAutocompleteFormField`?= =?UTF-8?q?=20to=20use=20`useQuery`=20(#8274)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add tests to replicate the issue * refactor name formatting to use utility fn * Upgrade UserAutocompleteFormField to use useQuery and have dedicated subcomponents based on linked facility or users api query * remove unused import * fix types * update cypress * fix issue with mergeQuery options and cleanup * fix cypress syntax error * add id for autocomplete input * update test * fix cypress * skip explicit clearing * remove test --- src/Components/ABDM/ABDMFacilityRecords.tsx | 11 +- src/Components/ABDM/ABDMRecordsTab.tsx | 4 +- src/Components/Assets/AssetManage.tsx | 5 +- .../Common/RelativeDateUserMention.tsx | 4 +- .../Common/UserAutocompleteFormField.tsx | 210 +++++++++++------- src/Components/Facility/ConsultationForm.tsx | 22 +- .../Facility/DoctorVideoSlideover.tsx | 13 +- src/Components/Facility/FacilityUsers.tsx | 4 +- src/Components/Facility/PatientNoteCard.tsx | 10 +- src/Components/Notifications/NoticeBoard.tsx | 4 +- src/Components/Patient/PatientHome.tsx | 20 +- src/Components/Patient/PatientInfoCard.tsx | 3 +- src/Components/Resource/CommentSection.tsx | 5 +- src/Components/Resource/ResourceBoard.tsx | 5 +- src/Components/Resource/ResourceDetails.tsx | 11 +- .../Resource/ResourceDetailsUpdate.tsx | 4 +- src/Components/Shifting/BadgesList.tsx | 9 +- src/Components/Shifting/CommentsSection.tsx | 5 +- src/Components/Shifting/ListFilter.tsx | 6 +- src/Components/Shifting/ShiftDetails.tsx | 11 +- .../Shifting/ShiftDetailsUpdate.tsx | 12 +- src/Components/Shifting/ShiftingBoard.tsx | 5 +- src/Components/Users/ManageUsers.tsx | 11 +- src/Redux/actions.tsx | 14 -- 24 files changed, 217 insertions(+), 191 deletions(-) diff --git a/src/Components/ABDM/ABDMFacilityRecords.tsx b/src/Components/ABDM/ABDMFacilityRecords.tsx index eadf39b8db7..cd21d269536 100644 --- a/src/Components/ABDM/ABDMFacilityRecords.tsx +++ b/src/Components/ABDM/ABDMFacilityRecords.tsx @@ -86,8 +86,8 @@ export default function ABDMFacilityRecords({ facilityId }: IProps) { consent.expiry, ) < new Date() ? "EXPIRED" - : consent.consent_artefacts?.[0]?.status ?? - consent.status} + : (consent.consent_artefacts?.[0]?.status ?? + consent.status)} @@ -102,13 +102,6 @@ export default function ABDMFacilityRecords({ facilityId }: IProps) { : "-"} - {/* - {`${consent.requester?.first_name} ${consent.requester?.last_name}`.trim()} -

- ({consent.requester.username}) -

- */} - {formatDateTime( consent.consent_artefacts?.[0]?.from_time ?? diff --git a/src/Components/ABDM/ABDMRecordsTab.tsx b/src/Components/ABDM/ABDMRecordsTab.tsx index d828335cd0d..37ae1a629db 100644 --- a/src/Components/ABDM/ABDMRecordsTab.tsx +++ b/src/Components/ABDM/ABDMRecordsTab.tsx @@ -5,7 +5,7 @@ import CareIcon from "../../CAREUI/icons/CareIcon"; import ButtonV2 from "../Common/components/ButtonV2"; import * as Notification from "../../Utils/Notifications.js"; import Loading from "../Common/Loading"; -import { classNames } from "../../Utils/utils"; +import { classNames, formatName } from "../../Utils/utils"; import { Link } from "raviger"; import routes from "../../Redux/api"; import request from "../../Utils/request/request"; @@ -75,7 +75,7 @@ function ConsentRequestCard({ consent }: IConsentRequestCardProps) { }
- {consent.requester.first_name} {consent.requester.last_name} + {formatName(consent.requester)}
diff --git a/src/Components/Assets/AssetManage.tsx b/src/Components/Assets/AssetManage.tsx index a9bb6eb78ea..469d1556fb5 100644 --- a/src/Components/Assets/AssetManage.tsx +++ b/src/Components/Assets/AssetManage.tsx @@ -10,7 +10,7 @@ import Pagination from "../Common/Pagination"; import { navigate } from "raviger"; import QRCode from "qrcode.react"; import AssetWarrantyCard from "./AssetWarrantyCard"; -import { formatDate, formatDateTime } from "../../Utils/utils"; +import { formatDate, formatDateTime, formatName } from "../../Utils/utils"; import Chip from "../../CAREUI/display/Chip"; import CareIcon from "../../CAREUI/icons/CareIcon"; import ButtonV2 from "../Common/components/ButtonV2"; @@ -148,8 +148,7 @@ const AssetManage = (props: AssetManageProps) => { - {transaction.performed_by.first_name}{" "} - {transaction.performed_by.last_name} + {formatName(transaction.performed_by)} diff --git a/src/Components/Common/RelativeDateUserMention.tsx b/src/Components/Common/RelativeDateUserMention.tsx index 70eadc5b7ed..541c38c3537 100644 --- a/src/Components/Common/RelativeDateUserMention.tsx +++ b/src/Components/Common/RelativeDateUserMention.tsx @@ -1,5 +1,5 @@ import CareIcon from "../../CAREUI/icons/CareIcon"; -import { formatDateTime, relativeDate } from "../../Utils/utils"; +import { formatDateTime, formatName, relativeDate } from "../../Utils/utils"; import { PerformedByModel } from "../HCX/misc"; function RelativeDateUserMention(props: { @@ -28,7 +28,7 @@ function RelativeDateUserMention(props: { }`} >
-

{`${props.user.first_name} ${props.user.last_name}`}

+

{formatName(props.user)}

{`@${props.user.username}`}

{props.user.user_type}

diff --git a/src/Components/Common/UserAutocompleteFormField.tsx b/src/Components/Common/UserAutocompleteFormField.tsx index 442eb0ae4fe..3ff6a3ae7c2 100644 --- a/src/Components/Common/UserAutocompleteFormField.tsx +++ b/src/Components/Common/UserAutocompleteFormField.tsx @@ -1,112 +1,158 @@ -import { useAsyncOptions } from "../../Common/hooks/useAsyncOptions"; -import { getFacilityUsers, getUserList } from "../../Redux/actions"; import { Autocomplete } from "../Form/FormFields/Autocomplete"; import FormField from "../Form/FormFields/FormField"; import { FormFieldBaseProps, useFormFieldPropsResolver, } from "../Form/FormFields/Utils"; -import { UserModel } from "../Users/models"; -import { isUserOnline } from "../../Utils/utils"; +import { + classNames, + formatName, + isUserOnline, + mergeQueryOptions, +} from "../../Utils/utils"; import { UserRole } from "../../Common/constants"; -import { useEffect } from "react"; +import { useEffect, useState } from "react"; +import useQuery from "../../Utils/request/useQuery"; +import routes from "../../Redux/api"; +import { UserBareMinimum } from "../Users/models"; -type Props = FormFieldBaseProps & { +type BaseProps = FormFieldBaseProps & { placeholder?: string; - facilityId?: string; - homeFacility?: string; userType?: UserRole; - showActiveStatus?: boolean; noResultsError?: string; }; -export default function UserAutocompleteFormField(props: Props) { +type LinkedFacilitySearchProps = BaseProps & { + facilityId: string; + homeFacility?: undefined; +}; + +type UserSearchProps = BaseProps & { + facilityId?: undefined; + homeFacility?: string; +}; + +export default function UserAutocomplete(props: UserSearchProps) { const field = useFormFieldPropsResolver(props); - const { fetchOptions, isLoading, options } = useAsyncOptions( - "id", - { queryResponseExtractor: (data) => data.results }, - ); + const [query, setQuery] = useState(""); + const [disabled, setDisabled] = useState(false); - let search_filter: { - limit: number; - offset: number; - home_facility?: string; - user_type?: string; - search_text?: string; - } = { limit: 50, offset: 0 }; + const { data, loading } = useQuery(routes.userList, { + query: { + home_facility: props.homeFacility, + user_type: props.userType, + search_text: query, + limit: 50, + offset: 0, + }, + }); - if (props.showActiveStatus && props.userType) { - search_filter = { ...search_filter, user_type: props.userType }; - } + useEffect(() => { + if ( + loading || + query || + !field.required || + !props.noResultsError || + !data?.results + ) { + return; + } - if (props.homeFacility) { - search_filter = { ...search_filter, home_facility: props.homeFacility }; - } + if (data.results.length === 0) { + setDisabled(true); + field.handleChange(undefined as unknown as UserBareMinimum); + } + }, [loading, query, field.required, data?.results, props.noResultsError]); - const getStatusIcon = (option: UserModel) => { - if (!props.showActiveStatus) return null; + return ( + + obj.username, + )} + optionLabel={formatName} + optionIcon={userOnlineDot} + optionDescription={(option) => + `${option.user_type} - ${option.username}` + } + optionValue={(option) => option} + onQuery={setQuery} + isLoading={loading} + /> + + ); +} - return ( -
- - - -
- ); - }; +export const LinkedFacilityUsers = (props: LinkedFacilitySearchProps) => { + const field = useFormFieldPropsResolver(props); - const items = options(field.value && [field.value]); + const [query, setQuery] = useState(""); - useEffect(() => { - if (props.required && !isLoading && !items.length && props.noResultsError) { - field.handleChange(undefined as unknown as UserModel); - } - }, [isLoading, items, props.required]); + const { data, loading } = useQuery(routes.getFacilityUsers, { + pathParams: { facility_id: props.facilityId }, + query: { + user_type: props.userType, + search_text: query, + limit: 50, + offset: 0, + }, + }); const noResultError = - (props.required && !isLoading && !items.length && props.noResultsError) || + (!query && + !loading && + field.required && + !data?.results?.length && + props.noResultsError) || undefined; + useEffect(() => { + if (noResultError) { + field.handleChange(undefined as unknown as UserBareMinimum); + } + }, [noResultError]); + return ( -
- `${option.user_type}`} - optionValue={(option) => option} - onQuery={(query) => - fetchOptions( - props.facilityId - ? getFacilityUsers(props.facilityId, { - ...search_filter, - search_text: query, - }) - : getUserList({ ...search_filter, search_text: query }), - ) - } - isLoading={isLoading} - /> -
+ obj.username, + )} + optionLabel={formatName} + optionIcon={userOnlineDot} + optionDescription={(option) => + `${option.user_type} - ${option.username}` + } + optionValue={(option) => option} + onQuery={setQuery} + isLoading={loading} + />
); -} - -const getUserFullName = (user: UserModel) => { - const personName = user.first_name + " " + user.last_name; - return personName.trim().length > 0 ? personName : user.username || ""; }; + +const userOnlineDot = (user: UserBareMinimum) => ( +
+); diff --git a/src/Components/Facility/ConsultationForm.tsx b/src/Components/Facility/ConsultationForm.tsx index 40d9741d712..c9339ce685b 100644 --- a/src/Components/Facility/ConsultationForm.tsx +++ b/src/Components/Facility/ConsultationForm.tsx @@ -33,8 +33,8 @@ import PatientCategorySelect from "../Patient/PatientCategorySelect"; import { SelectFormField } from "../Form/FormFields/SelectFormField"; import TextAreaFormField from "../Form/FormFields/TextAreaFormField"; import TextFormField from "../Form/FormFields/TextFormField"; -import UserAutocompleteFormField from "../Common/UserAutocompleteFormField"; -import { UserModel } from "../Users/models"; +import UserAutocomplete from "../Common/UserAutocompleteFormField"; +import { UserBareMinimum } from "../Users/models"; import { navigate } from "raviger"; import useAppHistory from "../../Common/hooks/useAppHistory"; @@ -90,7 +90,7 @@ type FormDetails = { referred_by_external?: string; transferred_from_location?: string; treating_physician: string; - treating_physician_object: UserModel | null; + treating_physician_object: UserBareMinimum | null; create_diagnoses: CreateDiagnosis[]; diagnoses: ConsultationDiagnosis[]; symptoms: EncounterSymptom[]; @@ -107,7 +107,7 @@ type FormDetails = { is_telemedicine: BooleanStrings; action?: number; assigned_to: string; - assigned_to_object: UserModel | null; + assigned_to_object: UserBareMinimum | null; special_instruction: string; review_interval: number; weight: string; @@ -386,8 +386,8 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => { admitted: data.admitted ? String(data.admitted) : "false", admitted_to: data.admitted_to ? data.admitted_to : "", category: data.category - ? PATIENT_CATEGORIES.find((i) => i.text === data.category)?.id ?? - "" + ? (PATIENT_CATEGORIES.find((i) => i.text === data.category)?.id ?? + "") : "", patient_no: data.patient_no ?? "", OPconsultation: data.consultation_notes, @@ -782,7 +782,9 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => { } }; - const handleDoctorSelect = (event: FieldChangeEvent) => { + const handleDoctorSelect = ( + event: FieldChangeEvent, + ) => { if (event.value?.id) { dispatch({ type: "set_form", @@ -1430,7 +1432,7 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => { className="col-span-6" ref={fieldRef["treating_physician"]} > - { state.form.treating_physician_object ?? undefined } onChange={handleDoctorSelect} - showActiveStatus userType={"Doctor"} homeFacility={facilityId} error={state.errors.treating_physician} @@ -1483,8 +1484,7 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => { className="col-span-6 flex-[2]" ref={fieldRef["assigned_to"]} > -
- - {user.first_name} {user.last_name} - + {formatName(user)} - {`${user.first_name} ${user.last_name}`} + {formatName(user)}
diff --git a/src/Components/Facility/PatientNoteCard.tsx b/src/Components/Facility/PatientNoteCard.tsx index 7f00700ff47..7d2a8c6eb70 100644 --- a/src/Components/Facility/PatientNoteCard.tsx +++ b/src/Components/Facility/PatientNoteCard.tsx @@ -1,4 +1,9 @@ -import { relativeDate, formatDateTime, classNames } from "../../Utils/utils"; +import { + relativeDate, + formatDateTime, + classNames, + formatName, +} from "../../Utils/utils"; import { USER_TYPES_MAP } from "../../Common/constants"; import { PatientNotesEditModel, PatientNotesModel } from "./models"; import ButtonV2 from "../Common/components/ButtonV2"; @@ -78,8 +83,7 @@ const PatientNoteCard = ({
- {note.created_by_object?.first_name || "Unknown"}{" "} - {note.created_by_object?.last_name} + {formatName(note.created_by_object)} {note.user_type && ( diff --git a/src/Components/Notifications/NoticeBoard.tsx b/src/Components/Notifications/NoticeBoard.tsx index db285eb9d6a..98c4daba2c4 100644 --- a/src/Components/Notifications/NoticeBoard.tsx +++ b/src/Components/Notifications/NoticeBoard.tsx @@ -1,6 +1,6 @@ import Page from "../Common/components/Page"; import Loading from "../Common/Loading"; -import { formatDateTime } from "../../Utils/utils"; +import { formatDateTime, formatName } from "../../Utils/utils"; import { useTranslation } from "react-i18next"; import CareIcon from "../../CAREUI/icons/CareIcon"; import useQuery from "../../Utils/request/useQuery"; @@ -25,7 +25,7 @@ export const NoticeBoard = () => {
{item.message}
- {`${item.caused_by.first_name} ${item.caused_by.last_name}`} -{" "} + {formatName(item.caused_by)} -{" "} {item.caused_by.user_type} diff --git a/src/Components/Patient/PatientHome.tsx b/src/Components/Patient/PatientHome.tsx index 1bee5a3b245..9482dc103dd 100644 --- a/src/Components/Patient/PatientHome.tsx +++ b/src/Components/Patient/PatientHome.tsx @@ -18,6 +18,7 @@ import { classNames, formatDate, formatDateTime, + formatName, formatPatientAge, isAntenatal, isPostPartum, @@ -30,7 +31,7 @@ import { useTranslation } from "react-i18next"; import CircularProgress from "../Common/components/CircularProgress"; import Page from "../Common/components/Page"; import ConfirmDialog from "../Common/ConfirmDialog"; -import UserAutocompleteFormField from "../Common/UserAutocompleteFormField"; +import UserAutocomplete from "../Common/UserAutocompleteFormField"; import dayjs from "../../Utils/dayjs"; import { triggerGoal } from "../../Integrations/Plausible"; import useAuthUser from "../../Common/hooks/useAuthUser"; @@ -275,14 +276,9 @@ export const PatientHome = (props: any) => {

Assigned Doctor: - { - patientData?.last_consultation?.assigned_to_object - .first_name - } - { - patientData?.last_consultation?.assigned_to_object - .last_name - } + {formatName( + patientData.last_consultation.assigned_to_object, + )} {patientData?.last_consultation?.assigned_to_object .alt_phone_number && ( @@ -300,8 +296,7 @@ export const PatientHome = (props: any) => {

Assigned Volunteer: - {patientData.assigned_to_object.first_name} - {patientData.assigned_to_object.last_name} + {formatName(patientData.assigned_to_object)}

)} @@ -1395,8 +1390,7 @@ export const PatientHome = (props: any) => { onClose={() => setOpenAssignVolunteerDialog(false)} description={
- {consultation?.treating_physician_object - ? `${consultation?.treating_physician_object.first_name} ${consultation?.treating_physician_object.last_name}` + ? formatName(consultation.treating_physician_object) : consultation?.deprecated_verified_by} - {created_by_object?.first_name || "Unknown"}{" "} - {created_by_object?.last_name} + {formatName(created_by_object)}
diff --git a/src/Components/Resource/ResourceBoard.tsx b/src/Components/Resource/ResourceBoard.tsx index 352942aff83..c80d11bf361 100644 --- a/src/Components/Resource/ResourceBoard.tsx +++ b/src/Components/Resource/ResourceBoard.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from "react"; import { downloadResourceRequests } from "../../Redux/actions"; import { navigate } from "raviger"; -import { classNames } from "../../Utils/utils"; +import { classNames, formatName } from "../../Utils/utils"; import { useDrag, useDrop } from "react-dnd"; import { formatDateTime } from "../../Utils/utils"; import { ExportButton } from "../Common/Export"; @@ -126,8 +126,7 @@ const ResourceCard = ({ resource }: any) => { >
- {resource.assigned_to_object.first_name}{" "} - {resource.assigned_to_object.last_name} -{" "} + {formatName(resource.assigned_to_object)} -{" "} {resource.assigned_to_object.user_type}
diff --git a/src/Components/Resource/ResourceDetails.tsx b/src/Components/Resource/ResourceDetails.tsx index c719556d561..4c01bdc4b9c 100644 --- a/src/Components/Resource/ResourceDetails.tsx +++ b/src/Components/Resource/ResourceDetails.tsx @@ -1,5 +1,5 @@ import { useState, lazy } from "react"; -import { classNames, formatDateTime } from "../../Utils/utils"; +import { classNames, formatDateTime, formatName } from "../../Utils/utils"; import { navigate } from "raviger"; import * as Notification from "../../Utils/Notifications.js"; import CommentSection from "./CommentSection"; @@ -241,8 +241,7 @@ export default function ResourceDetails(props: { id: string }) {

- Assigned to: {data.assigned_to_object.first_name}{" "} - {data.assigned_to_object.last_name} -{" "} + Assigned to: {formatName(data.assigned_to_object)} -{" "} {data.assigned_to_object.user_type}

@@ -359,8 +358,7 @@ export default function ResourceDetails(props: { id: string }) {
- {data?.created_by_object?.first_name}{" "} - {data?.created_by_object?.last_name} + {formatName(data.created_by_object)}
{data.created_date && formatDateTime(data.created_date)} @@ -373,8 +371,7 @@ export default function ResourceDetails(props: { id: string }) {
- {data?.last_edited_by_object?.first_name}{" "} - {data?.last_edited_by_object?.last_name} + {formatName(data.last_edited_by_object)}
{data.modified_date && formatDateTime(data.modified_date)} diff --git a/src/Components/Resource/ResourceDetailsUpdate.tsx b/src/Components/Resource/ResourceDetailsUpdate.tsx index 89d4d5a15ea..178ab596148 100644 --- a/src/Components/Resource/ResourceDetailsUpdate.tsx +++ b/src/Components/Resource/ResourceDetailsUpdate.tsx @@ -13,7 +13,7 @@ import RadioFormField from "../Form/FormFields/RadioFormField"; import { SelectFormField } from "../Form/FormFields/SelectFormField"; import TextAreaFormField from "../Form/FormFields/TextAreaFormField"; import TextFormField from "../Form/FormFields/TextFormField"; -import UserAutocompleteFormField from "../Common/UserAutocompleteFormField"; +import UserAutocomplete from "../Common/UserAutocompleteFormField"; import useAppHistory from "../../Common/hooks/useAppHistory"; import useQuery from "../../Utils/request/useQuery.js"; import routes from "../../Redux/api.js"; @@ -209,7 +209,7 @@ export const ResourceDetailsUpdate = (props: resourceProps) => { {assignedUserLoading ? ( ) : ( - - {created_by_object?.first_name || t("unknown")}{" "} - {created_by_object?.last_name} + {formatName(created_by_object)}
diff --git a/src/Components/Shifting/ListFilter.tsx b/src/Components/Shifting/ListFilter.tsx index af98f524ed2..12bb17db09c 100644 --- a/src/Components/Shifting/ListFilter.tsx +++ b/src/Components/Shifting/ListFilter.tsx @@ -21,7 +21,7 @@ import useConfig from "../../Common/hooks/useConfig"; import useMergeState from "../../Common/hooks/useMergeState"; import { useTranslation } from "react-i18next"; -import UserAutocompleteFormField from "../Common/UserAutocompleteFormField"; +import UserAutocomplete from "../Common/UserAutocompleteFormField"; import { dateQueryString, parsePhoneNumber } from "../../Utils/utils"; import dayjs from "dayjs"; import useQuery from "../../Utils/request/useQuery"; @@ -165,7 +165,7 @@ export default function ListFilter(props: any) { patient_phone_number: patient_phone_number === "+91" ? "" - : parsePhoneNumber(patient_phone_number) ?? "", + : (parsePhoneNumber(patient_phone_number) ?? ""), created_date_before: dateQueryString(created_date_before), created_date_after: dateQueryString(created_date_after), modified_date_before: dateQueryString(modified_date_before), @@ -268,7 +268,7 @@ export default function ListFilter(props: any) { {isAssignedLoading ? ( ) : ( -

- {t("assigned_to")}: {data?.assigned_to_object.first_name}{" "} - {data.assigned_to_object.last_name} -{" "} - {data.assigned_to_object.user_type} + {t("assigned_to")}: {formatName(data.assigned_to_object)}{" "} + - {data.assigned_to_object.user_type}

diff --git a/src/Components/Shifting/ShiftDetailsUpdate.tsx b/src/Components/Shifting/ShiftDetailsUpdate.tsx index 35e77066ef4..37adecaedcd 100644 --- a/src/Components/Shifting/ShiftDetailsUpdate.tsx +++ b/src/Components/Shifting/ShiftDetailsUpdate.tsx @@ -33,8 +33,8 @@ import CircularProgress from "../Common/components/CircularProgress.js"; import Card from "../../CAREUI/display/Card"; import RadioFormField from "../Form/FormFields/RadioFormField.js"; import Page from "../Common/components/Page.js"; -import UserAutocompleteFormField from "../Common/UserAutocompleteFormField.js"; -import { UserModel } from "../Users/models.js"; +import { LinkedFacilityUsers } from "../Common/UserAutocompleteFormField.js"; +import { UserBareMinimum } from "../Users/models.js"; import useQuery from "../../Utils/request/useQuery.js"; import routes from "../../Redux/api.js"; import { IShift } from "./models.js"; @@ -57,7 +57,7 @@ export const ShiftDetailsUpdate = (props: patientShiftProps) => { const [qParams, _] = useQueryParams(); const [isLoading, setIsLoading] = useState(true); - const [assignedUser, SetAssignedUser] = useState(); + const [assignedUser, SetAssignedUser] = useState(); const [consultationData, setConsultationData] = useState( {} as ConsultationModel, @@ -184,7 +184,9 @@ export const ShiftDetailsUpdate = (props: patientShiftProps) => { return !isInvalidForm; }; - const handleAssignedUserSelect = (event: FieldChangeEvent) => { + const handleAssignedUserSelect = ( + event: FieldChangeEvent, + ) => { const user = event.value; const form = { ...state.form }; form["assigned_to"] = user?.id; @@ -357,7 +359,7 @@ export const ShiftDetailsUpdate = (props: patientShiftProps) => { (assignedUserLoading ? ( ) : ( - { >
- {shift.assigned_to_object.first_name}{" "} - {shift.assigned_to_object.last_name} -{" "} + {formatName(shift.assigned_to_object)} + {" - "} {shift.assigned_to_object.user_type}
diff --git a/src/Components/Users/ManageUsers.tsx b/src/Components/Users/ManageUsers.tsx index 19bafebd115..1acd9ac2a3c 100644 --- a/src/Components/Users/ManageUsers.tsx +++ b/src/Components/Users/ManageUsers.tsx @@ -14,7 +14,12 @@ import routes from "../../Redux/api.js"; import * as Notification from "../../Utils/Notifications.js"; import request from "../../Utils/request/request.js"; import useQuery from "../../Utils/request/useQuery.js"; -import { classNames, isUserOnline, relativeTime } from "../../Utils/utils"; +import { + classNames, + formatName, + isUserOnline, + relativeTime, +} from "../../Utils/utils"; import { FacilitySelect } from "../Common/FacilitySelect"; import Pagination from "../Common/Pagination"; import UserDetails from "../Common/UserDetails"; @@ -178,7 +183,7 @@ export default function ManageUsers() { setUserData({ show: true, username: user.username, - name: `${user.first_name} ${user.last_name}`, + name: formatName(user), }); }; @@ -238,7 +243,7 @@ export default function ManageUsers() { id="name" className="mt-2 flex items-center gap-3 text-2xl font-bold capitalize" > - {`${user.first_name} ${user.last_name}`} + {formatName(user)} {user.last_login && cur_online ? (
{ - return fireRequest("userList", [], params, null, key); -}; - -export const getFacilityUsers = (id: string, params?: object) => { - return fireRequest( - "getFacilityUsers", - [], - { ...params }, - { facility_id: id }, - ); -}; - // asset bed export const listAssetBeds = (params: object, altKey?: string) => fireRequest("listAssetBeds", [], params, {}, altKey); From 57304aa7bc51d98562a478be3e4027881eea92da Mon Sep 17 00:00:00 2001 From: Shivank Kacker Date: Fri, 9 Aug 2024 15:54:12 +0530 Subject: [PATCH 024/121] Fixed date time format for edge cases (#8280) --- .../Facility/ConsultationDetails/Events/GenericEvent.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Components/Facility/ConsultationDetails/Events/GenericEvent.tsx b/src/Components/Facility/ConsultationDetails/Events/GenericEvent.tsx index ca9c13c599b..04ab5657149 100644 --- a/src/Components/Facility/ConsultationDetails/Events/GenericEvent.tsx +++ b/src/Components/Facility/ConsultationDetails/Events/GenericEvent.tsx @@ -32,7 +32,10 @@ const formatValue = (value: unknown, key?: string): ReactNode => { return trimmed; } - if (new Date(trimmed).toString() !== "Invalid Date") { + const dateTimeRegex = + /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?$/; + + if (trimmed.match(dateTimeRegex)) { return new Date(trimmed).toLocaleString(); } From e1184537c86f650f20cf42ed61c20fcd464f57af Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Mon, 12 Aug 2024 13:24:35 +0530 Subject: [PATCH 025/121] Replace old LOC options in Neuro table (#8291) --- .../Consultations/NeurologicalTables.tsx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Components/Facility/Consultations/NeurologicalTables.tsx b/src/Components/Facility/Consultations/NeurologicalTables.tsx index aac558ca8b0..993f0e6cb9c 100644 --- a/src/Components/Facility/Consultations/NeurologicalTables.tsx +++ b/src/Components/Facility/Consultations/NeurologicalTables.tsx @@ -93,13 +93,17 @@ export const NeurologicalTable = (props: any) => { const [currentPage, setCurrentPage] = useState(1); const [totalCount, setTotalCount] = useState(0); + // To be removed in favour of proper fix upcoming in https://github.com/coronasafe/care_fe/pull/8119/files#diff-3f2dc697ea8b52c1b3b887c76623edb0a4e6ace175573dfbd3a7476ffee979a9L96-L103 const LOC_OPTIONS = [ - { id: 0, value: "Unknown" }, + { id: 20, value: "Unresponsive" }, + { id: 15, value: "Responds to Pain" }, + { id: 10, value: "Responds to Voice" }, { id: 5, value: "Alert" }, - { id: 10, value: "Drowsy" }, - { id: 15, value: "Stuporous" }, - { id: 20, value: "Comatose" }, - { id: 25, value: "Cannot Be Assessed" }, + { id: 25, value: "Agitated or Confused" }, + { + id: 30, + value: "Onset of Agitation and Confusion", + }, ]; const REACTION_OPTIONS = [ @@ -294,7 +298,7 @@ export const NeurologicalTable = (props: any) => { {locData.map((x: any, i: any) => (
{x.date} From 7ed9d4733bffbd424e7b4f8e4d1d19d3f3f771af Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Wed, 14 Aug 2024 13:45:22 +0530 Subject: [PATCH 026/121] Migrate rescript components to typescript; uninstall ReScript (#8316) * upgrade eslint and prettier packages * run project wide format * use prettier for tailwind lint rules * Rewrite component to typescript (Authored-by: Shivank @skks1212) * fix unused classname * unplug rescript * add critical care index page * fix issue with dropdown clipping in popup modal * adds icons for daily round sections * fix nested `p` tag error * fix pain chart not working for updates * fix range form field's text input being able to go beyond range * fix checbox not working * fix range form field unable to parse strings as floats * fix neurological monitoring sending incorrect values for some options * fix nursing care layout * add translations to editor index * fix pressure sore not working * replace gray shade with secondary * fix cypress * fix log update sections not compliant with vite hmr update rules * fix bunch of issues with range form field * Fix issues with "Nursing Care" section * Fix issues with "Dialysis" section * Fix issues with "Bloog Sugar" section * Fix issues with "Dialysis" section * Fix issues with "ABG Analaysis" section * Fix issues with "IO Balance" section * Fix issues with "Pupil Size" component * Fix issues with "Neurological Monitoring" section and RadioFormFIeld * fix uncontrolled input error in range form field * Added support for IV and NIV Respiratory Support and fix issues with Resp. support section * improve type definitions for Human Body component and Pressure Sore * Fix issues with "Pressure Sore" section * Visual improvements to Human Chart component * Fix issues with "Pain Chart" in Vitals section * Update preview componets in Consultation Dashboard to use newer components * Check for linked ventilators when filing resp. support section * update cypress tests * fix prine position padding and LOC layout * update LOC choices * update vertical spacing of radio form field * Nursing Care: reduced vertical spacing * Fix I/O Balance select menu not functional * ABG Analaysis: Correct pH value slider range to max 10 instead of 14 * Respiratory Support: Adds missing range value description for tidal volume * remove unused field `consciousness_level_detail` * Fix showig constricted when cannot be assessed selected * Fixes issue when right pupil's checkbox label causes to toggle left pupil's checbox value to change due to same id * Reduce spacing in Glasgow Coma Scale * Fix whitespace breaks in neurological monitoring preview: LOC * Adds missing support for progress note round type sections * Fix spacing between title of pressure sore and pain scale preview tabs * Fix size and spacing of Range Form Field's numeric input and unit selector * Fix pain scale and pressure sore popup not closing on clicking save button * Show Dialog Modal for mobile screens for Pressure sore and Pain scale region editors * ensure consistent colors for pressure sore and painscale buttons and body regions based on score * fix lint issues * prettify files that are not pretty * improve i18n support and code quality refactor * Critical Care details page part 1 (5 of 11 sections) * Resp. support section preview * Pressure Sore section preview * Nursing Care section preview * I/O balance section preview * Vitals section preview * submit BP mean to backend * add success notifications for completing * fix pressure sore colors * remove unused dependencies * Revert "remove unused dependencies" This reverts commit c0e6d5c5b758e33d97e493f417eac82c56881ed7. --- .eslintrc.json | 14 +- bsconfig.json | 32 - .../e2e/patient_spec/patient_logupdate.cy.ts | 8 +- cypress/pageobject/Patient/PatientCreation.ts | 6 +- package-lock.json | 3729 ++++++----------- package.json | 40 +- src/CAREUI/display/PopupModal.tsx | 124 + src/CAREUI/interactive/HumanChart.tsx | 90 + src/Common/constants.tsx | 341 +- src/Components/ABDM/ABDMFacilityRecords.tsx | 5 +- src/Components/Assets/AssetFilter.tsx | 2 +- src/Components/Assets/AssetManage.tsx | 2 +- src/Components/Assets/AssetWarrantyCard.tsx | 2 +- src/Components/CameraFeed/AssetBedSelect.tsx | 2 +- .../LiveMonitoringFilters.tsx | 2 +- src/Components/CameraFeed/FeedControls.tsx | 2 +- src/Components/Common/CareIcon.res | 19 - src/Components/Common/DialogModal.res | 20 - src/Components/Common/ExcelViewer.tsx | 13 +- .../Common/RelativeDateUserMention.tsx | 2 +- src/Components/Common/Sidebar/Sidebar.tsx | 4 +- src/Components/Common/Sidebar/SidebarItem.tsx | 3 +- src/Components/Common/SlideOver.res | 33 - .../Common/TemperatureFormField.tsx | 9 +- src/Components/Common/Transition.res | 26 - src/Components/Common/Uptime.tsx | 2 +- .../Common/UserAutocompleteFormField.tsx | 2 +- src/Components/Common/components/ButtonV2.tsx | 2 +- src/Components/Common/components/CheckBox.tsx | 28 - src/Components/Common/components/Checkbox.res | 15 - .../Common/components/ContactLink.tsx | 2 +- src/Components/Common/components/Link.res | 43 - src/Components/Common/components/Menu.tsx | 2 +- src/Components/Common/components/Radio.res | 15 - .../Common/components/SkeletonLoading.res | 144 - .../types/Prescription__Prescription.res | 75 - src/Components/Common/utils/ArrayUtils.res | 44 - src/Components/Common/utils/DateFns.res | 129 - src/Components/Common/utils/DictUtils.res | 26 - src/Components/Common/utils/ReactUtils.res | 3 - .../Common/utils/ValidationUtils.res | 22 - src/Components/Common/utils/WindowUtils.res | 9 - .../CriticalCare__ABGAnalysisEditor.res | 216 - .../ABGAnalysisEditor/DailyRound__ABG.res | 68 - .../CriticalCare_BloodSugarEditor.res | 144 - .../DailyRound__BloodSugar.res | 18 - .../CriticalCareRecording.res | 4 - .../CriticalCare__API.tsx | 43 - .../CriticalCare__Index.res | 210 - .../CriticalCare__Root.res | 47 - .../DailyRound__Medicines.res | 50 - .../CriticalCare_DialysisEditor.res | 116 - .../DialysisEditor/DailyRound__Dialysis.res | 10 - ...ticalCare__HemodynamicParametersEditor.res | 358 -- .../DailyRound__HemodynamicParameters.res | 71 - .../CriticalCare__IOBalanceEditor.res | 159 - .../IOBalance/DailyRound__IOBalance.res | 88 - .../IOBalance/IOBalance__Summary.res | 12 - .../IOBalance/IOBalance__UnitPicker.res | 98 - .../IOBalance/IOBalance__UnitSection.res | 91 - .../CriticalCare__Description.res | 20 - ...icalCare__NeurologicalMonitoringEditor.res | 580 --- .../CriticalCare__Switch.res | 28 - .../DailyRound__NeurologicalMonitoring.res | 117 - .../CriticalCare__NursingCareEditor.res | 157 - .../NursingCare/DailyRound__NursingCare.res | 12 - .../Others/CriticalCare__OthersEditor.res | 139 - .../Others/DailyRound__General.res | 57 - .../Others/DailyRound__Others.res | 19 - .../Pain/CriticalCare__PainEditor.res | 398 -- .../Pain/CriticalCare__PainInputModal.res | 200 - .../Pain/CriticalCare__PainViewer.res | 11 - .../Pain/DailyRound__Pain.res | 21 - .../CriticalCare__PressureSoreEditor.res | 421 -- .../CriticalCare__PressureSoreInputModal.res | 263 -- .../CriticalCare__PressureSoreViewer.res | 11 - .../PressureSore/DailyRound__PressureSore.res | 23 - .../Recording/CriticalCare__Recording.res | 258 -- .../Recording/Icons/ic-blood_sugar.svg | 3 - .../Recording/Icons/ic-dialysis.svg | 3 - .../Recording/Icons/ic-hemodynamic.svg | 3 - .../Recording/Icons/ic-io_balance.svg | 3 - .../Recording/Icons/ic-neurology.svg | 11 - .../Recording/Icons/ic-nursing_care.svg | 3 - .../Recording/Icons/ic-pressure_sore.svg | 3 - .../Recording/Icons/ic-ventilator.svg | 3 - .../Recording/styles.css | 3 - ...iticalCare__VentilatorParametersEditor.res | 335 -- ...__VentilatorParametersEditor__Invasive.res | 234 -- ...entilatorParametersEditor__NonInvasive.res | 216 - ...Care__VentilatorParametersEditor__None.res | 4 - ...tilatorParametersEditor__OxygenSupport.res | 149 - .../DailyRound__VentilatorParameters.res | 128 - .../CriticalCare__DoubleRangeSlider.res | 30 - .../components/CriticalCare__Dropdown.res | 100 - .../components/CriticalCare__Home.res | 327 -- .../CriticalCare__InputGroupError.res | 13 - .../components/CriticalCare__Loader.res | 6 - .../components/CriticalCare__NumberInput.res | 22 - .../components/CriticalCare__PageTitle.res | 9 - .../CriticalCare__PupilRangeSlider.res | 59 - .../components/CriticalCare__RadioButton.res | 41 - .../components/Notifications.res | 5 - .../components/PressureSore.js | 216 - .../components/ShowOnChecked.res | 25 - .../components/Slider.res | 147 - .../components/styles.css | 387 -- .../types/CriticalCare_BloodSugar.res | 56 - .../types/CriticalCare_Dialysis.res | 20 - .../types/CriticalCare__ABGAnalysis.res | 43 - .../types/CriticalCare__DailyRound.res | 95 - .../CriticalCare__HemodynamicParameters.res | 92 - ...ticalCare__HemodynamicParametersRhythm.res | 4 - .../types/CriticalCare__IOBalance.res | 72 - .../CriticalCare__NeurologicalMonitoring.res | 321 -- .../types/CriticalCare__NursingCare.res | 139 - .../types/CriticalCare__Others.res | 41 - .../types/CriticalCare__Pain.res | 521 --- .../types/CriticalCare__PressureSore.res | 535 --- .../types/CriticalCare__Types.res | 13 - .../CriticalCare__VentilatorParameters.res | 295 -- .../CriticalCareRecording/types/Options.res | 13 - .../types/VentilatorParametersType.res | 32 - src/Components/DeathReport/DeathReport.tsx | 2 +- .../ConditionVerificationStatusMenu.tsx | 2 +- src/Components/ExternalResult/ResultList.tsx | 4 +- src/Components/Facility/BedTypeCard.tsx | 2 +- .../Facility/CentralNursingStation.tsx | 2 +- src/Components/Facility/ConsultationCard.tsx | 9 +- .../ConsultationUpdatesTab.tsx | 2 +- .../ConsultationDetails/Events/EventsList.tsx | 2 +- .../Facility/ConsultationDetails/index.tsx | 9 +- src/Components/Facility/ConsultationForm.tsx | 5 +- .../Facility/Consultations/Beds.res | 18 - .../Facility/Consultations/Beds.tsx | 3 +- .../DailyRounds/LogUpdateCardAttribute.tsx | 4 +- .../Consultations/DailyRoundsList.tsx | 2 +- .../Facility/Consultations/Feed.tsx | 12 +- .../Facility/Consultations/LiveFeed.tsx | 24 +- .../Facility/Consultations/Mews.tsx | 4 +- .../Consultations/NeurologicalTables.tsx | 81 +- .../Facility/Consultations/NursingPlot.tsx | 31 +- .../Facility/Consultations/NutritionPlots.tsx | 8 +- .../Facility/Consultations/PainDiagrams.tsx | 14 +- .../Consultations/PressureSoreDiagrams.tsx | 16 +- .../Consultations/PrimaryParametersPlot.tsx | 8 +- .../components/BinaryChronologicalChart.tsx | 4 +- .../Facility/CoverImageEditModal.tsx | 6 +- .../Facility/DischargedPatientsList.tsx | 2 +- src/Components/Facility/FacilityCreate.tsx | 2 +- src/Components/Facility/FacilityHome.tsx | 4 +- src/Components/Facility/FacilityUsers.tsx | 2 +- src/Components/Facility/HospitalList.tsx | 2 +- src/Components/Facility/InventoryLog.tsx | 8 +- .../Investigations/InvestigationTable.tsx | 2 +- .../Investigations/Reports/ReportTable.tsx | 10 +- .../Investigations/ViewInvestigations.tsx | 2 +- .../Facility/PatientNotesSlideover.tsx | 4 +- src/Components/Facility/TreatmentSummary.tsx | 2 +- src/Components/Facility/models.tsx | 2 - .../Form/FormFields/Autocomplete.tsx | 4 +- .../FormFields/AutocompleteMultiselect.tsx | 2 +- src/Components/Form/FormFields/FormField.tsx | 14 +- src/Components/Form/FormFields/Month.tsx | 2 +- .../Form/FormFields/PhoneNumberFormField.tsx | 2 +- .../Form/FormFields/RadioFormField.tsx | 71 +- .../Form/FormFields/RangeFormField.tsx | 217 + .../Form/FormFields/SelectFormField.tsx | 2 + .../Form/FormFields/TextAreaFormField.tsx | 2 +- .../Form/FormFields/TextFormField.tsx | 4 +- src/Components/Form/SelectMenuV2.tsx | 17 +- .../LogUpdate/CriticalCareEditor.tsx | 209 + .../LogUpdate/CriticalCarePreview.tsx | 543 +++ .../LogUpdate/Sections/ABGAnalysis.tsx | 125 + .../LogUpdate/Sections/BloodSugar.tsx | 59 + .../LogUpdate/Sections/Dialysis.tsx | 35 + .../LogUpdate/Sections/IOBalance.tsx | 196 + .../Sections/NeurologicalMonitoring.tsx | 184 + .../LogUpdate/Sections/NursingCare.tsx | 76 + .../Sections/PressureSore/PressureSore.tsx | 235 ++ .../LogUpdate/Sections/PressureSore/utils.ts | 25 + .../RespiratorySupport/OxygenSupport.tsx | 96 + .../RespiratorySupport/Ventilator.tsx | 125 + .../VentilatorModeSelector.tsx | 46 + .../Sections/RespiratorySupport/index.tsx | 138 + src/Components/LogUpdate/Sections/Vitals.tsx | 168 + src/Components/LogUpdate/Sections/index.tsx | 50 + .../LogUpdate/components/PainChart.tsx | 176 + .../LogUpdate/components/PupilSizeSelect.tsx | 122 + src/Components/LogUpdate/utils.ts | 14 + .../Medicine/PrescriptionDetailCard.tsx | 2 +- src/Components/Medicine/PrintPreview.tsx | 1 - .../Medicine/ResponsiveMedicineTables.tsx | 2 +- src/Components/Notifications/NoticeBoard.tsx | 4 +- .../Patient/DailyRoundListDetails.tsx | 12 +- src/Components/Patient/DailyRounds.tsx | 14 +- src/Components/Patient/FileUpload.tsx | 12 +- .../Patient/InsuranceDetailsCard.tsx | 4 +- src/Components/Patient/ManagePatients.tsx | 4 +- .../Patient/PatientConsentRecordBlock.tsx | 4 +- src/Components/Patient/PatientHome.tsx | 32 +- src/Components/Patient/PatientInfoCard.tsx | 9 +- src/Components/Patient/PatientRegister.tsx | 12 +- src/Components/Patient/SampleTestCard.tsx | 4 +- src/Components/Patient/SampleViewAdmin.tsx | 2 +- src/Components/Patient/models.tsx | 100 +- src/Components/Resource/CommentSection.tsx | 4 +- src/Components/Resource/ResourceBoard.tsx | 4 +- src/Components/Resource/ResourceDetails.tsx | 2 +- src/Components/Scribe/Scribe.tsx | 2 +- src/Components/Scribe/formDetails.ts | 8 +- src/Components/Shifting/CommentsSection.tsx | 4 +- src/Components/Shifting/ShiftDetails.tsx | 2 +- src/Components/Shifting/ShiftingBoard.tsx | 2 +- src/Components/Symptoms/SymptomsBuilder.tsx | 2 +- src/Components/Users/ManageUsers.tsx | 15 +- src/Components/Users/UserAdd.tsx | 14 +- src/Components/Users/UserProfile.tsx | 28 +- .../VitalsMonitor/HL7PatientVitalsMonitor.tsx | 12 +- .../VitalsMonitor/VitalsMonitorFooter.tsx | 2 +- src/Locale/en/Auth.json | 2 +- src/Locale/en/Common.json | 5 +- src/Locale/en/Consultation.json | 4 +- src/Locale/en/LogUpdate.json | 56 + src/Locale/en/Medicine.json | 2 +- src/Locale/en/index.js | 2 + src/Redux/api.tsx | 2 + src/Routers/routes/ConsultationRoutes.tsx | 33 +- src/Utils/request/README.md | 37 +- src/Utils/request/useQuery.ts | 2 +- src/Utils/useFileManager.tsx | 2 +- src/Utils/useFileUpload.tsx | 8 +- src/Utils/utils.ts | 52 + src/style/CAREUI.css | 13 + src/style/index.css | 2 +- 235 files changed, 5194 insertions(+), 13033 deletions(-) delete mode 100644 bsconfig.json create mode 100644 src/CAREUI/display/PopupModal.tsx create mode 100644 src/CAREUI/interactive/HumanChart.tsx delete mode 100644 src/Components/Common/CareIcon.res delete mode 100644 src/Components/Common/DialogModal.res delete mode 100644 src/Components/Common/SlideOver.res delete mode 100644 src/Components/Common/Transition.res delete mode 100644 src/Components/Common/components/CheckBox.tsx delete mode 100644 src/Components/Common/components/Checkbox.res delete mode 100644 src/Components/Common/components/Link.res delete mode 100644 src/Components/Common/components/Radio.res delete mode 100644 src/Components/Common/components/SkeletonLoading.res delete mode 100644 src/Components/Common/prescription-builder/types/Prescription__Prescription.res delete mode 100644 src/Components/Common/utils/ArrayUtils.res delete mode 100644 src/Components/Common/utils/DateFns.res delete mode 100644 src/Components/Common/utils/DictUtils.res delete mode 100644 src/Components/Common/utils/ReactUtils.res delete mode 100644 src/Components/Common/utils/ValidationUtils.res delete mode 100644 src/Components/Common/utils/WindowUtils.res delete mode 100644 src/Components/CriticalCareRecording/ABGAnalysisEditor/CriticalCare__ABGAnalysisEditor.res delete mode 100644 src/Components/CriticalCareRecording/ABGAnalysisEditor/DailyRound__ABG.res delete mode 100644 src/Components/CriticalCareRecording/BloodSugarEditor/CriticalCare_BloodSugarEditor.res delete mode 100644 src/Components/CriticalCareRecording/BloodSugarEditor/DailyRound__BloodSugar.res delete mode 100644 src/Components/CriticalCareRecording/CriticalCareRecording.res delete mode 100644 src/Components/CriticalCareRecording/CriticalCare__API.tsx delete mode 100644 src/Components/CriticalCareRecording/CriticalCare__Index.res delete mode 100644 src/Components/CriticalCareRecording/CriticalCare__Root.res delete mode 100644 src/Components/CriticalCareRecording/DailyRound__Medicines.res delete mode 100644 src/Components/CriticalCareRecording/DialysisEditor/CriticalCare_DialysisEditor.res delete mode 100644 src/Components/CriticalCareRecording/DialysisEditor/DailyRound__Dialysis.res delete mode 100644 src/Components/CriticalCareRecording/HemodynamicParameters/CriticalCare__HemodynamicParametersEditor.res delete mode 100644 src/Components/CriticalCareRecording/HemodynamicParameters/DailyRound__HemodynamicParameters.res delete mode 100644 src/Components/CriticalCareRecording/IOBalance/CriticalCare__IOBalanceEditor.res delete mode 100644 src/Components/CriticalCareRecording/IOBalance/DailyRound__IOBalance.res delete mode 100644 src/Components/CriticalCareRecording/IOBalance/IOBalance__Summary.res delete mode 100644 src/Components/CriticalCareRecording/IOBalance/IOBalance__UnitPicker.res delete mode 100644 src/Components/CriticalCareRecording/IOBalance/IOBalance__UnitSection.res delete mode 100644 src/Components/CriticalCareRecording/NeurologicalMonitoring/CriticalCare__Description.res delete mode 100644 src/Components/CriticalCareRecording/NeurologicalMonitoring/CriticalCare__NeurologicalMonitoringEditor.res delete mode 100644 src/Components/CriticalCareRecording/NeurologicalMonitoring/CriticalCare__Switch.res delete mode 100644 src/Components/CriticalCareRecording/NeurologicalMonitoring/DailyRound__NeurologicalMonitoring.res delete mode 100644 src/Components/CriticalCareRecording/NursingCare/CriticalCare__NursingCareEditor.res delete mode 100644 src/Components/CriticalCareRecording/NursingCare/DailyRound__NursingCare.res delete mode 100644 src/Components/CriticalCareRecording/Others/CriticalCare__OthersEditor.res delete mode 100644 src/Components/CriticalCareRecording/Others/DailyRound__General.res delete mode 100644 src/Components/CriticalCareRecording/Others/DailyRound__Others.res delete mode 100644 src/Components/CriticalCareRecording/Pain/CriticalCare__PainEditor.res delete mode 100644 src/Components/CriticalCareRecording/Pain/CriticalCare__PainInputModal.res delete mode 100644 src/Components/CriticalCareRecording/Pain/CriticalCare__PainViewer.res delete mode 100644 src/Components/CriticalCareRecording/Pain/DailyRound__Pain.res delete mode 100644 src/Components/CriticalCareRecording/PressureSore/CriticalCare__PressureSoreEditor.res delete mode 100644 src/Components/CriticalCareRecording/PressureSore/CriticalCare__PressureSoreInputModal.res delete mode 100644 src/Components/CriticalCareRecording/PressureSore/CriticalCare__PressureSoreViewer.res delete mode 100644 src/Components/CriticalCareRecording/PressureSore/DailyRound__PressureSore.res delete mode 100644 src/Components/CriticalCareRecording/Recording/CriticalCare__Recording.res delete mode 100644 src/Components/CriticalCareRecording/Recording/Icons/ic-blood_sugar.svg delete mode 100644 src/Components/CriticalCareRecording/Recording/Icons/ic-dialysis.svg delete mode 100644 src/Components/CriticalCareRecording/Recording/Icons/ic-hemodynamic.svg delete mode 100644 src/Components/CriticalCareRecording/Recording/Icons/ic-io_balance.svg delete mode 100644 src/Components/CriticalCareRecording/Recording/Icons/ic-neurology.svg delete mode 100644 src/Components/CriticalCareRecording/Recording/Icons/ic-nursing_care.svg delete mode 100644 src/Components/CriticalCareRecording/Recording/Icons/ic-pressure_sore.svg delete mode 100644 src/Components/CriticalCareRecording/Recording/Icons/ic-ventilator.svg delete mode 100644 src/Components/CriticalCareRecording/Recording/styles.css delete mode 100644 src/Components/CriticalCareRecording/VentilatorParametersEditor/CriticalCare__VentilatorParametersEditor.res delete mode 100644 src/Components/CriticalCareRecording/VentilatorParametersEditor/CriticalCare__VentilatorParametersEditor__Invasive.res delete mode 100644 src/Components/CriticalCareRecording/VentilatorParametersEditor/CriticalCare__VentilatorParametersEditor__NonInvasive.res delete mode 100644 src/Components/CriticalCareRecording/VentilatorParametersEditor/CriticalCare__VentilatorParametersEditor__None.res delete mode 100644 src/Components/CriticalCareRecording/VentilatorParametersEditor/CriticalCare__VentilatorParametersEditor__OxygenSupport.res delete mode 100644 src/Components/CriticalCareRecording/VentilatorParametersEditor/DailyRound__VentilatorParameters.res delete mode 100644 src/Components/CriticalCareRecording/components/CriticalCare__DoubleRangeSlider.res delete mode 100644 src/Components/CriticalCareRecording/components/CriticalCare__Dropdown.res delete mode 100644 src/Components/CriticalCareRecording/components/CriticalCare__Home.res delete mode 100644 src/Components/CriticalCareRecording/components/CriticalCare__InputGroupError.res delete mode 100644 src/Components/CriticalCareRecording/components/CriticalCare__Loader.res delete mode 100644 src/Components/CriticalCareRecording/components/CriticalCare__NumberInput.res delete mode 100644 src/Components/CriticalCareRecording/components/CriticalCare__PageTitle.res delete mode 100644 src/Components/CriticalCareRecording/components/CriticalCare__PupilRangeSlider.res delete mode 100644 src/Components/CriticalCareRecording/components/CriticalCare__RadioButton.res delete mode 100644 src/Components/CriticalCareRecording/components/Notifications.res delete mode 100644 src/Components/CriticalCareRecording/components/PressureSore.js delete mode 100644 src/Components/CriticalCareRecording/components/ShowOnChecked.res delete mode 100644 src/Components/CriticalCareRecording/components/Slider.res delete mode 100644 src/Components/CriticalCareRecording/components/styles.css delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare_BloodSugar.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare_Dialysis.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare__ABGAnalysis.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare__DailyRound.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare__HemodynamicParameters.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare__HemodynamicParametersRhythm.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare__IOBalance.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare__NeurologicalMonitoring.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare__NursingCare.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare__Others.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare__Pain.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare__PressureSore.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare__Types.res delete mode 100644 src/Components/CriticalCareRecording/types/CriticalCare__VentilatorParameters.res delete mode 100644 src/Components/CriticalCareRecording/types/Options.res delete mode 100644 src/Components/CriticalCareRecording/types/VentilatorParametersType.res delete mode 100644 src/Components/Facility/Consultations/Beds.res create mode 100644 src/Components/Form/FormFields/RangeFormField.tsx create mode 100644 src/Components/LogUpdate/CriticalCareEditor.tsx create mode 100644 src/Components/LogUpdate/CriticalCarePreview.tsx create mode 100644 src/Components/LogUpdate/Sections/ABGAnalysis.tsx create mode 100644 src/Components/LogUpdate/Sections/BloodSugar.tsx create mode 100644 src/Components/LogUpdate/Sections/Dialysis.tsx create mode 100644 src/Components/LogUpdate/Sections/IOBalance.tsx create mode 100644 src/Components/LogUpdate/Sections/NeurologicalMonitoring.tsx create mode 100644 src/Components/LogUpdate/Sections/NursingCare.tsx create mode 100644 src/Components/LogUpdate/Sections/PressureSore/PressureSore.tsx create mode 100644 src/Components/LogUpdate/Sections/PressureSore/utils.ts create mode 100644 src/Components/LogUpdate/Sections/RespiratorySupport/OxygenSupport.tsx create mode 100644 src/Components/LogUpdate/Sections/RespiratorySupport/Ventilator.tsx create mode 100644 src/Components/LogUpdate/Sections/RespiratorySupport/VentilatorModeSelector.tsx create mode 100644 src/Components/LogUpdate/Sections/RespiratorySupport/index.tsx create mode 100644 src/Components/LogUpdate/Sections/Vitals.tsx create mode 100644 src/Components/LogUpdate/Sections/index.tsx create mode 100644 src/Components/LogUpdate/components/PainChart.tsx create mode 100644 src/Components/LogUpdate/components/PupilSizeSelect.tsx create mode 100644 src/Components/LogUpdate/utils.ts create mode 100644 src/Locale/en/LogUpdate.json diff --git a/.eslintrc.json b/.eslintrc.json index 0fc2f64ddaf..37bfeb77bb9 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -15,7 +15,7 @@ "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended", "plugin:i18next/recommended", - "plugin:tailwindcss/recommended", + "plugin:prettier/recommended", "plugin:storybook/recommended" ], "overrides": [ @@ -46,10 +46,6 @@ "i18next" ], "rules": { - "quotes": [ - "error", - "double" - ], "no-unused-vars": "off", "@typescript-eslint/no-unused-vars": [ "error", @@ -59,6 +55,7 @@ "caughtErrorsIgnorePattern": "^_" } ], + "@typescript-eslint/no-explicit-any": "warn", "react/react-in-jsx-scope": "off", "i18next/no-literal-string": [ "warn", @@ -81,12 +78,7 @@ ] } } - ], - "tailwindcss/no-custom-classname": "off", - "tailwindcss/migration-from-tailwind-2": "error", - "tailwindcss/classnames-order": "off", - "tailwindcss/enforces-shorthand": "off", - "tailwindcss/no-contradicting-classname": "error" + ] }, "ignorePatterns": [ "dist", diff --git a/bsconfig.json b/bsconfig.json deleted file mode 100644 index 140429fcd62..00000000000 --- a/bsconfig.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "care_fe", - "reason": { - "react-jsx": 3 - }, - "bsc-flags": [ - "-bs-super-errors" - ], - "sources": [ - { - "dir": "src", - "subdirs": true - } - ], - "package-specs": [ - { - "module": "es6", - "in-source": true - } - ], - "suffix": ".bs.js", - "bs-dependencies": [ - "@rescript/react", - "@glennsl/bs-json", - "rescript-webapi" - ], - "ppx-flags": [], - "refmt": 3, - "gentypeconfig": { - "language": "typescript" - } -} \ No newline at end of file diff --git a/cypress/e2e/patient_spec/patient_logupdate.cy.ts b/cypress/e2e/patient_spec/patient_logupdate.cy.ts index cd7e30e1575..162ebd7e620 100644 --- a/cypress/e2e/patient_spec/patient_logupdate.cy.ts +++ b/cypress/e2e/patient_spec/patient_logupdate.cy.ts @@ -57,7 +57,7 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => { patientLogupdate.typeSpo2(patientSpo2); patientLogupdate.selectRhythm(patientRhythmType); patientLogupdate.typeRhythm(patientRhythm); - cy.get("#consciousness_level-2").click(); + cy.get("#consciousness_level-option-RESPONDS_TO_PAIN").click(); cy.submitButton("Save"); cy.verifyNotification("Telemedicine log created successfully"); }); @@ -82,7 +82,7 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => { patientLogupdate.typeSpo2(patientSpo2); patientLogupdate.selectRhythm(patientRhythmType); patientLogupdate.typeRhythm(patientRhythm); - cy.get("#consciousness_level-2").click(); + cy.get("#consciousness_level-option-RESPONDS_TO_PAIN").click(); cy.submitButton("Save"); cy.verifyNotification("Brief Update log created successfully"); cy.closeNotification(); @@ -137,7 +137,7 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => { patientLogupdate.typeSpo2(patientSpo2); patientLogupdate.selectRhythm(patientRhythmType); patientLogupdate.typeRhythm(patientRhythm); - cy.get("#consciousness_level-2").click(); + cy.get("#consciousness_level-option-RESPONDS_TO_PAIN").click(); cy.submitButton("Save"); cy.wait(2000); cy.verifyNotification("Brief Update log created successfully"); @@ -161,7 +161,7 @@ describe("Patient Log Update in Normal, Critical and TeleIcu", () => { patientLogupdate.typePulse(patientPulse); patientLogupdate.typeTemperature(patientTemperature); patientLogupdate.typeRespiratory(patientRespiratory); - cy.get("#consciousness_level-2").click(); + cy.get("#consciousness_level-option-RESPONDS_TO_PAIN").click(); cy.submitButton("Save"); cy.verifyNotification("Brief Update log created successfully"); cy.closeNotification(); diff --git a/cypress/pageobject/Patient/PatientCreation.ts b/cypress/pageobject/Patient/PatientCreation.ts index 482c281c63a..739601d5b56 100644 --- a/cypress/pageobject/Patient/PatientCreation.ts +++ b/cypress/pageobject/Patient/PatientCreation.ts @@ -46,7 +46,7 @@ export class PatientPage { } checkPhoneNumberIsEmergencyNumber() { - cy.get("#emergency_contact_checkbox > div > input").click(); + cy.get("#emergency_contact_checkbox").click(); } typePatientDateOfBirth(dateOfBirth: string) { @@ -93,11 +93,11 @@ export class PatientPage { } clickPatientAntenatalStatusYes() { - cy.get("#is_antenatal-0").click(); + cy.get("#is_antenatal-option-true").click(); } clickPatientPostPartumStatusYes() { - cy.get("#is_postpartum-0").click(); + cy.get("#is_postpartum-option-true").click(); } clickCancelButton() { diff --git a/package-lock.json b/package-lock.json index 2458c891d41..d3837e25bcf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,6 @@ "@pnotify/core": "^5.2.0", "@pnotify/mobile": "^5.2.0", "@react-spring/web": "^9.7.3", - "@rescript/react": "^0.11.0", "@sentry/browser": "^8.12.0", "@yaireo/ui-range": "^2.1.15", "@yudiel/react-qr-scanner": "^2.0.0-beta.3", @@ -29,7 +28,6 @@ "dayjs": "^1.11.11", "echarts": "^5.5.0", "echarts-for-react": "^3.0.2", - "eslint-mdx": "^3.1.5", "events": "^3.3.0", "glob": "^10.4.2", "hi-profiles": "^1.0.6", @@ -57,7 +55,6 @@ "redux": "^4.2.1", "redux-thunk": "^2.4.2", "rehype-raw": "^6.1.1", - "rescript-webapi": "^0.8.0", "use-keyboard-shortcut": "^1.1.6", "uuid": "^9.0.1", "xlsx": "^0.18.5" @@ -84,37 +81,28 @@ "@types/react-google-recaptcha": "^2.1.9", "@types/react-qr-reader": "^2.1.7", "@types/react-transition-group": "^4.4.10", - "@typescript-eslint/eslint-plugin": "^5.61.0", - "@typescript-eslint/parser": "^5.61.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", "@vitejs/plugin-react-swc": "^3.6.0", "autoprefixer": "^10.4.19", "cypress": "^13.13.1", "cypress-localstorage-commands": "^2.2.5", "cypress-split": "^1.23.2", - "eslint": "^8.44.0", - "eslint-config-prettier": "^8.8.0", - "eslint-config-standard": "^17.1.0", - "eslint-plugin-i18next": "^6.0.3", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-plugin-mdx": "^2.2.0", - "eslint-plugin-only-warn": "^1.1.0", - "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.34.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-i18next": "^6.0.9", + "eslint-plugin-mdx": "^3.1.5", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.35.0", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-storybook": "^0.8.0", - "eslint-plugin-tailwindcss": "^3.15.1", "gentype": "^4.5.0", "husky": "^8.0.3", "lint-staged": "^13.2.3", "local-cypress": "^1.2.6", "postcss": "^8.4.38", - "prettier": "^3.2.5", - "prettier-plugin-tailwindcss": "^0.5.14", + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.5", "prop-types": "^15.8.1", "redux-devtools-extension": "^2.13.9", - "rescript": "^10.1.4", "snyk": "^1.1291.0", "storybook": "^8.1.0", "tailwindcss": "^3.4.3", @@ -131,6 +119,8 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -2696,6 +2686,7 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -2707,9 +2698,10 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -2718,6 +2710,8 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2740,6 +2734,8 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2751,15 +2747,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@eslint/eslintrc/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==" - }, "node_modules/@eslint/eslintrc/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, + "peer": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -2770,26 +2763,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@eslint/eslintrc/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==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true }, "node_modules/@eslint/eslintrc/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, + "peer": true, "engines": { "node": ">=10" }, @@ -2801,6 +2787,8 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2874,6 +2862,9 @@ "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "peer": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -2887,6 +2878,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "peer": true, "engines": { "node": ">=12.22" }, @@ -2896,9 +2889,12 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "peer": true }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -3157,6 +3153,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3169,6 +3166,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { "node": ">= 8" } @@ -3177,6 +3175,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3186,16 +3185,17 @@ } }, "node_modules/@npmcli/config": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.2.0.tgz", - "integrity": "sha512-YoEYZFg0hRSRP/Chmq+J4FvULFvji6SORUYWQc10FiJ+ReAnViXcDCENg6kM6dID04bAoKNUygrby798+gYBbQ==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.3.4.tgz", + "integrity": "sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==", + "dev": true, "dependencies": { "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/package-json": "^5.1.1", "ci-info": "^4.0.0", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", + "ini": "^4.1.2", + "nopt": "^7.2.1", + "proc-log": "^4.2.0", "semver": "^7.3.5", "walk-up-path": "^3.0.1" }, @@ -3207,6 +3207,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -3215,6 +3216,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "dev": true, "funding": [ { "type": "github", @@ -3226,28 +3228,19 @@ } }, "node_modules/@npmcli/config/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/config/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@npmcli/config/node_modules/nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, "dependencies": { "abbrev": "^2.0.0" }, @@ -3259,12 +3252,66 @@ } }, "node_modules/@npmcli/config/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", + "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/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 + }, + "node_modules/@npmcli/git/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -3272,15 +3319,26 @@ "node": ">=10" } }, - "node_modules/@npmcli/config/node_modules/yallist": { + "node_modules/@npmcli/git/node_modules/which": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } }, "node_modules/@npmcli/map-workspaces": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz", - "integrity": "sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", + "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", + "dev": true, "dependencies": { "@npmcli/name-from-folder": "^2.0.0", "glob": "^10.2.2", @@ -3295,14 +3353,16 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3317,10 +3377,118 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", + "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@npmcli/package-json/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 + }, + "node_modules/@npmcli/package-json/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "dev": true, + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -3334,6 +3502,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -3768,15 +3937,6 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@rescript/react": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@rescript/react/-/react-0.11.0.tgz", - "integrity": "sha512-RzoAO+3cJwXE2D7yodMo4tBO2EkeDYCN/I/Sj/yRweI3S1CY1ZBOF/GMcVtjeIurJJt7KMveqQXTaRrqoGZBBg==", - "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -6136,6 +6296,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dev": true, "dependencies": { "@types/estree": "*" } @@ -6201,6 +6362,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-2.0.3.tgz", "integrity": "sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -6315,6 +6477,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dev": true, "dependencies": { "@types/estree": "*" } @@ -6396,19 +6559,14 @@ "node_modules/@types/is-empty": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@types/is-empty/-/is-empty-1.2.3.tgz", - "integrity": "sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==" + "integrity": "sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==", + "dev": true }, "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==" }, - "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 - }, "node_modules/@types/lodash": { "version": "4.17.0", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", @@ -6622,7 +6780,8 @@ "node_modules/@types/supports-color": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.3.tgz", - "integrity": "sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==" + "integrity": "sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==", + "dev": true }, "node_modules/@types/trusted-types": { "version": "2.0.7", @@ -6633,7 +6792,8 @@ "node_modules/@types/unist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", @@ -6663,32 +6823,31 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -6696,59 +6855,26 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -6756,43 +6882,144 @@ } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -6800,35 +7027,38 @@ } } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, + "peer": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -6840,26 +7070,56 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/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==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, + "peer": true, "dependencies": { - "yallist": "^4.0.0" + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "peer": true, "dependencies": { - "lru-cache": "^6.0.0" + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -6867,26 +7127,79 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "node_modules/@typescript-eslint/utils": { + "node_modules/@typescript-eslint/types": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6895,11 +7208,13 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "node_modules/@typescript-eslint/typescript-estree/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==", @@ -6911,7 +7226,7 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", @@ -6926,7 +7241,7 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", @@ -6952,7 +7267,8 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true }, "node_modules/@vitejs/plugin-react-swc": { "version": "3.6.0", @@ -7399,6 +7715,7 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -7410,6 +7727,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -7616,6 +7934,11 @@ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true }, + "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==" + }, "node_modules/aria-hidden": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", @@ -7708,26 +8031,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", @@ -7764,29 +8067,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { @@ -7872,12 +8166,6 @@ "node": ">=4" } }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -7974,15 +8262,6 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/axios": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", @@ -7993,15 +8272,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, "node_modules/babel-core": { "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", @@ -8225,6 +8495,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8346,29 +8617,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/builtins": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", - "dev": true, - "peer": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/builtins/node_modules/semver": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", - "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -8467,6 +8715,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8506,6 +8755,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8531,6 +8781,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8913,12 +9164,14 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "devOptional": true }, "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==", + "dev": true, "engines": [ "node >= 6.0" ], @@ -9050,22 +9303,6 @@ } } }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", @@ -9297,12 +9534,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -9490,7 +9721,9 @@ "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==" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "peer": true }, "node_modules/deepmerge": { "version": "4.3.1", @@ -9881,6 +10114,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, "dependencies": { "dequal": "^2.0.0" }, @@ -9944,6 +10178,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -10172,6 +10407,12 @@ "node": ">=4" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -10282,14 +10523,14 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", - "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", + "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", @@ -10459,6 +10700,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "engines": { "node": ">=10" }, @@ -10491,6 +10733,8 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -10541,39 +10785,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-compat-utils": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz", - "integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==", - "dev": true, - "peer": true, - "dependencies": { - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-compat-utils/node_modules/semver": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", - "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -10582,59 +10797,11 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/eslint-mdx": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-3.1.5.tgz", "integrity": "sha512-ynztX0k7CQ3iDL7fDEIeg3g0O/d6QPv7IBI9fdYLhXp5fAp0fi8X22xF/D3+Pk0f90R27uwqa1clHpay6t0l8Q==", + "dev": true, "dependencies": { "acorn": "^8.11.3", "acorn-jsx": "^5.3.2", @@ -10663,9 +10830,10 @@ } }, "node_modules/eslint-mdx/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -10673,107 +10841,135 @@ "node": ">=0.4.0" } }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "node_modules/eslint-plugin-i18next": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/eslint-plugin-i18next/-/eslint-plugin-i18next-6.0.9.tgz", + "integrity": "sha512-tAof/p58sN4Az+P6kqu+RijqddalHhz0X6fe+exyBJAUvN9Yk1plOKl8XMySCIQS+vnRWbzzThgHXeDe++uEXQ==", "dev": true, "dependencies": { - "debug": "^3.2.7" + "lodash": "^4.17.21", + "requireindex": "~1.1.0" }, "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint-plugin-mdx": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-3.1.5.tgz", + "integrity": "sha512-lUE7tP7IrIRHU3gTtASDe5u4YM2SvQveYVJfuo82yn3MLh/B/v05FNySURCK4aIxIYF1QYo3IRemQG/lyQzpAg==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "eslint-mdx": "^3.1.5", + "eslint-plugin-markdown": "^3.0.1", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "tslib": "^2.6.2", + "unified": "^11.0.4", + "vfile": "^6.0.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "eslint": ">=8.0.0" } }, - "node_modules/eslint-plugin-es-x": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz", - "integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==", + "node_modules/eslint-plugin-mdx/node_modules/eslint-plugin-markdown": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-3.0.1.tgz", + "integrity": "sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==", "dev": true, - "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0", - "eslint-compat-utils": "^0.5.0" + "mdast-util-from-markdown": "^0.8.5" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": ">=8" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/eslint-plugin-i18next": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-i18next/-/eslint-plugin-i18next-6.0.3.tgz", - "integrity": "sha512-RtQXYfg6PZCjejIQ/YG+dUj/x15jPhufJ9hUDGH0kCpJ6CkVMAWOQ9exU1CrbPmzeykxLjrXkjAaOZF/V7+DOA==", + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, "dependencies": { - "lodash": "^4.17.21", - "requireindex": "~1.1.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": ">=0.10.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "node_modules/eslint-plugin-react": { + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { + "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", @@ -10785,1718 +10981,91 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=4.0" + "bin": { + "resolve": "bin/resolve" }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-markdown": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-3.0.1.tgz", - "integrity": "sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==", + "node_modules/eslint-plugin-storybook": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.8.0.tgz", + "integrity": "sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==", "dev": true, "dependencies": { - "mdast-util-from-markdown": "^0.8.5" + "@storybook/csf": "^0.0.1", + "@typescript-eslint/utils": "^5.62.0", + "requireindex": "^1.2.0", + "ts-dedent": "^2.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 18" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": ">=6" } }, - "node_modules/eslint-plugin-mdx": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-2.3.4.tgz", - "integrity": "sha512-kr6tgaifKL+AVGYMtdYc2VCsIjfYQXuUCKz4rK58d2DpnPFHrmgXIOC7NcMvaEld+VOEpxBSCCnjnsf4IVCQGg==", + "node_modules/eslint-plugin-storybook/node_modules/@storybook/csf": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", + "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", "dev": true, "dependencies": { - "eslint-mdx": "^2.3.4", - "eslint-plugin-markdown": "^3.0.1", - "remark-mdx": "^2.3.0", - "remark-parse": "^10.0.2", - "remark-stringify": "^10.0.3", - "tslib": "^2.6.1", - "unified": "^10.1.2", - "vfile": "^5.3.7" + "lodash": "^4.17.15" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "eslint": ">=8.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/@npmcli/config": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-6.4.1.tgz", - "integrity": "sha512-uSz+elSGzjCMANWa5IlbGczLYPkNI/LeR+cHrgaTqTrTSh9RHhOFA4daD2eRUz6lMtOW+Fnsb+qv7V2Zz8ML0g==", - "dev": true, - "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "ci-info": "^4.0.0", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/eslint-plugin-mdx/node_modules/@types/node": { - "version": "18.19.28", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.28.tgz", - "integrity": "sha512-J5cOGD9n4x3YGgVuaND6khm5x07MMdAKkRyXnjVR6KFhLMNh2yONGiP7Z+4+tBOt5mK+GvDTiacTOVGGpqiecw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "node_modules/eslint-plugin-mdx/node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/ci-info": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/eslint-mdx": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-2.3.4.tgz", - "integrity": "sha512-u4NszEUyoGtR7Q0A4qs0OymsEQdCO6yqWlTzDa9vGWsK7aMotdnW0hqifHTkf6lEtA2vHk2xlkWHTCrhYLyRbw==", - "dev": true, - "dependencies": { - "acorn": "^8.10.0", - "acorn-jsx": "^5.3.2", - "espree": "^9.6.1", - "estree-util-visit": "^1.2.1", - "remark-mdx": "^2.3.0", - "remark-parse": "^10.0.2", - "remark-stringify": "^10.0.3", - "synckit": "^0.9.0", - "tslib": "^2.6.1", - "unified": "^10.1.2", - "unified-engine": "^10.1.0", - "unist-util-visit": "^4.1.2", - "uvu": "^0.5.6", - "vfile": "^5.3.7" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "eslint": ">=8.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/estree-util-is-identifier-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz", - "integrity": "sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/estree-util-visit": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.1.tgz", - "integrity": "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/import-meta-resolve": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz", - "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dev": true, - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/load-plugin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-5.1.0.tgz", - "integrity": "sha512-Lg1CZa1CFj2CbNaxijTL6PCbzd4qGTlZov+iH2p5Xwy/ApcZJh+i6jMN2cYePouTfjJfrNu3nXFdEw8LvbjPFQ==", - "dev": true, - "dependencies": { - "@npmcli/config": "^6.0.0", - "import-meta-resolve": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/mdast-util-mdx": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz", - "integrity": "sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==", - "dev": true, - "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-mdx-expression": "^1.0.0", - "mdast-util-mdx-jsx": "^2.0.0", - "mdast-util-mdxjs-esm": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/mdast-util-mdx-expression": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz", - "integrity": "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/mdast-util-mdx-jsx": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz", - "integrity": "sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "ccount": "^2.0.0", - "mdast-util-from-markdown": "^1.1.0", - "mdast-util-to-markdown": "^1.3.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^4.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/mdast-util-mdxjs-esm": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz", - "integrity": "sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-extension-mdx-expression": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz", - "integrity": "sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "micromark-factory-mdx-expression": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-events-to-acorn": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-extension-mdx-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz", - "integrity": "sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==", - "dev": true, - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "micromark-factory-mdx-expression": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-extension-mdx-md": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz", - "integrity": "sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==", - "dev": true, - "dependencies": { - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-extension-mdxjs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz", - "integrity": "sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==", - "dev": true, - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^1.0.0", - "micromark-extension-mdx-jsx": "^1.0.0", - "micromark-extension-mdx-md": "^1.0.0", - "micromark-extension-mdxjs-esm": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-extension-mdxjs-esm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz", - "integrity": "sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "micromark-core-commonmark": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-events-to-acorn": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-position-from-estree": "^1.1.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-factory-mdx-expression": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz", - "integrity": "sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-events-to-acorn": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-position-from-estree": "^1.0.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-events-to-acorn": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz", - "integrity": "sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "@types/unist": "^2.0.0", - "estree-util-visit": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/eslint-plugin-mdx/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/eslint-plugin-mdx/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", - "dev": true, - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/parse-json": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-6.0.2.tgz", - "integrity": "sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.0", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^2.3.1", - "lines-and-columns": "^2.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/remark-mdx": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz", - "integrity": "sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==", - "dev": true, - "dependencies": { - "mdast-util-mdx": "^2.0.0", - "micromark-extension-mdxjs": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/remark-stringify": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.3.tgz", - "integrity": "sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-mdx/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==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-mdx/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/unified-engine": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-10.1.0.tgz", - "integrity": "sha512-5+JDIs4hqKfHnJcVCxTid1yBoI/++FfF/1PFdSMpaftZZZY+qg2JFruRbf7PaIwa9KgLotXQV3gSjtY0IdcFGQ==", - "dev": true, - "dependencies": { - "@types/concat-stream": "^2.0.0", - "@types/debug": "^4.0.0", - "@types/is-empty": "^1.0.0", - "@types/node": "^18.0.0", - "@types/unist": "^2.0.0", - "concat-stream": "^2.0.0", - "debug": "^4.0.0", - "fault": "^2.0.0", - "glob": "^8.0.0", - "ignore": "^5.0.0", - "is-buffer": "^2.0.0", - "is-empty": "^1.0.0", - "is-plain-obj": "^4.0.0", - "load-plugin": "^5.0.0", - "parse-json": "^6.0.0", - "to-vfile": "^7.0.0", - "trough": "^2.0.0", - "unist-util-inspect": "^7.0.0", - "vfile-message": "^3.0.0", - "vfile-reporter": "^7.0.0", - "vfile-statistics": "^2.0.0", - "yaml": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/unist-util-inspect": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/unist-util-inspect/-/unist-util-inspect-7.0.2.tgz", - "integrity": "sha512-Op0XnmHUl6C2zo/yJCwhXQSm/SmW22eDZdWP2qdf4WpGrgO1ZxFodq+5zFyeRGasFjJotAnLgfuD1jkcKqiH1Q==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/unist-util-position-from-estree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz", - "integrity": "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/unist-util-remove-position": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz", - "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/vfile-reporter": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-7.0.5.tgz", - "integrity": "sha512-NdWWXkv6gcd7AZMvDomlQbK3MqFWL1RlGzMn++/O2TI+68+nqxCPTvLugdOtfSzXmjh+xUyhp07HhlrbJjT+mw==", - "dev": true, - "dependencies": { - "@types/supports-color": "^8.0.0", - "string-width": "^5.0.0", - "supports-color": "^9.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile": "^5.0.0", - "vfile-message": "^3.0.0", - "vfile-sort": "^3.0.0", - "vfile-statistics": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/vfile-sort": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-3.0.1.tgz", - "integrity": "sha512-1os1733XY6y0D5x0ugqSeaVJm9lYgj0j5qdcZQFyxlZOSy1jYarL77lLyb5gK4Wqr1d5OxmuyflSO3zKyFnTFw==", - "dev": true, - "dependencies": { - "vfile": "^5.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/vfile-statistics": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-2.0.1.tgz", - "integrity": "sha512-W6dkECZmP32EG/l+dp2jCLdYzmnDBIw6jwiLZSER81oR5AHRcVqL+k3Z+pfH1R73le6ayDkJRMk0sutj1bMVeg==", - "dev": true, - "dependencies": { - "vfile": "^5.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/eslint-plugin-n": { - "version": "16.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", - "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", - "dev": true, - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.5.0", - "get-tsconfig": "^4.7.0", - "globals": "^13.24.0", - "ignore": "^5.2.4", - "is-builtin-module": "^3.2.1", - "is-core-module": "^2.12.1", - "minimatch": "^3.1.2", - "resolve": "^1.22.2", - "semver": "^7.5.3" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-n/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, - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", - "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-n/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, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-only-warn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-only-warn/-/eslint-plugin-only-warn-1.1.0.tgz", - "integrity": "sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-plugin-prettier/node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-storybook": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.8.0.tgz", - "integrity": "sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==", - "dev": true, - "dependencies": { - "@storybook/csf": "^0.0.1", - "@typescript-eslint/utils": "^5.62.0", - "requireindex": "^1.2.0", - "ts-dedent": "^2.2.0" - }, - "engines": { - "node": ">= 18" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": ">=6" - } - }, - "node_modules/eslint-plugin-storybook/node_modules/@storybook/csf": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", - "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/eslint-plugin-storybook/node_modules/requireindex": { @@ -12508,20 +11077,16 @@ "node": ">=0.10.5" } }, - "node_modules/eslint-plugin-tailwindcss": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.15.1.tgz", - "integrity": "sha512-4RXRMIaMG07C2TBEW1k0VM4+dDazz1kxcZhkK4zirvmHGZTA4jnlSO2kq5mamuSPi+Wo17dh2SlC8IyFBuCd7Q==", + "node_modules/eslint-plugin-storybook/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "fast-glob": "^3.2.5", - "postcss": "^8.4.4" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "tailwindcss": "^3.4.0" + "node": ">=10" } }, "node_modules/eslint-scope": { @@ -12548,6 +11113,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -12559,6 +11125,8 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -12570,15 +11138,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/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==" - }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -12594,6 +11159,8 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "peer": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -12601,29 +11168,22 @@ "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/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==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true }, "node_modules/eslint/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, + "peer": true, "engines": { "node": ">=10" }, @@ -12635,6 +11195,7 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -12651,6 +11212,7 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -12675,6 +11237,8 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -12705,6 +11269,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -12714,6 +11279,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "dev": true, "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" @@ -12733,6 +11299,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -12954,7 +11521,9 @@ "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==" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "peer": true }, "node_modules/fast-shuffle": { "version": "6.1.0", @@ -12969,21 +11538,9 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", "dev": true, "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "reusify": "^1.0.4" } }, "node_modules/fd-slicer": { @@ -13029,6 +11586,8 @@ "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, + "peer": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -13323,6 +11882,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -13338,6 +11898,8 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -13350,7 +11912,9 @@ "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "peer": true }, "node_modules/flow-parser": { "version": "0.236.0", @@ -13437,15 +12001,6 @@ "node": ">= 6" } }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -13538,7 +12093,8 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "devOptional": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -13808,6 +12364,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -13986,7 +12543,8 @@ "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/gunzip-maybe": { "version": "1.4.2", @@ -14599,6 +13157,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, "engines": { "node": ">= 4" } @@ -14627,9 +13186,10 @@ } }, "node_modules/import-meta-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", - "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -14639,6 +13199,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "engines": { "node": ">=0.8.19" } @@ -14656,6 +13217,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -14664,7 +13226,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "devOptional": true }, "node_modules/ini": { "version": "2.0.0", @@ -14992,12 +13555,14 @@ "node_modules/is-empty": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz", - "integrity": "sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==" + "integrity": "sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==", + "dev": true }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -15041,6 +13606,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -15184,6 +13750,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -15527,6 +14094,17 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -15587,7 +14165,9 @@ "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==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "peer": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -15609,7 +14189,9 @@ "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==" + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "peer": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -15684,6 +14266,8 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -15706,24 +14290,6 @@ "node": ">=6" } }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -15760,6 +14326,8 @@ "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, + "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -16223,9 +14791,10 @@ } }, "node_modules/load-plugin": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-6.0.2.tgz", - "integrity": "sha512-3KRkTvCOsyNrx4zvBl/+ZMqPdVyp26TIf6xkmfEGuGwCfNQ/HzhktwbJCxd1KJpzPbK42t/WVOL3cX+TDaMRuQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-6.0.3.tgz", + "integrity": "sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==", + "dev": true, "dependencies": { "@npmcli/config": "^8.0.0", "import-meta-resolve": "^4.0.0" @@ -16263,6 +14832,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -16305,7 +14875,8 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/lodash.once": { "version": "4.1.1", @@ -16399,6 +14970,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -16533,6 +15105,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "dev": true, "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", @@ -16549,6 +15122,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dev": true, "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -16566,22 +15140,25 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, "dependencies": { "@types/unist": "*" } }, "node_modules/mdast-util-mdx-expression/node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, "dependencies": { "@types/unist": "*" } }, "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -16605,6 +15182,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0" }, @@ -16617,6 +15195,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16651,6 +15230,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16666,6 +15246,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16686,6 +15267,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0" }, @@ -16698,6 +15280,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "dev": true, "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -16722,14 +15305,16 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, "dependencies": { "@types/unist": "*" } }, "node_modules/mdast-util-mdx-jsx/node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, "dependencies": { "@types/unist": "*" } @@ -16738,6 +15323,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -16747,6 +15333,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -16756,6 +15343,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -16765,6 +15353,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -16774,6 +15363,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" @@ -16787,6 +15377,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -16796,15 +15387,17 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/mdast-util-mdx-jsx/node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -16828,6 +15421,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0" }, @@ -16840,6 +15434,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16874,6 +15469,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16889,6 +15485,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16909,6 +15506,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dev": true, "dependencies": { "@types/unist": "^2.0.0", "character-entities": "^2.0.0", @@ -16927,12 +15525,14 @@ "node_modules/mdast-util-mdx-jsx/node_modules/parse-entities/node_modules/@types/unist": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", + "dev": true }, "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0" }, @@ -16942,17 +15542,19 @@ } }, "node_modules/mdast-util-mdx/node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, "dependencies": { "@types/unist": "*" } }, "node_modules/mdast-util-mdx/node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -16976,6 +15578,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0" }, @@ -16988,6 +15591,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17022,6 +15626,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17037,6 +15642,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17057,6 +15663,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0" }, @@ -17069,6 +15676,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dev": true, "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -17086,22 +15694,25 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, "dependencies": { "@types/unist": "*" } }, "node_modules/mdast-util-mdxjs-esm/node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, "dependencies": { "@types/unist": "*" } }, "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -17125,6 +15736,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0" }, @@ -17137,6 +15749,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17171,6 +15784,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17186,6 +15800,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17206,6 +15821,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0" }, @@ -17218,6 +15834,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -17228,9 +15845,10 @@ } }, "node_modules/mdast-util-phrasing/node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, "dependencies": { "@types/unist": "*" } @@ -17316,6 +15934,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -17332,9 +15951,10 @@ } }, "node_modules/mdast-util-to-markdown/node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, "dependencies": { "@types/unist": "*" } @@ -17343,6 +15963,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0" }, @@ -17450,9 +16071,10 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17486,6 +16108,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17510,12 +16133,14 @@ "node_modules/micromark-extension-mdx-expression/node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, "node_modules/micromark-extension-mdx-jsx": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "dev": true, "dependencies": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", @@ -17536,12 +16161,14 @@ "node_modules/micromark-extension-mdx-jsx/node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, "node_modules/micromark-extension-mdx-md": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "dev": true, "dependencies": { "micromark-util-types": "^2.0.0" }, @@ -17554,6 +16181,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "dev": true, "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", @@ -17573,6 +16201,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "dev": true, "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", @@ -17592,12 +16221,14 @@ "node_modules/micromark-extension-mdxjs-esm/node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, "node_modules/micromark-extension-mdxjs/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -17609,6 +16240,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17629,6 +16261,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17650,6 +16283,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17674,12 +16308,14 @@ "node_modules/micromark-factory-mdx-expression/node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, "node_modules/micromark-factory-space": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17699,6 +16335,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17720,6 +16357,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17741,6 +16379,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17760,6 +16399,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17778,6 +16418,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17798,6 +16439,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17817,6 +16459,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17835,6 +16478,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17871,6 +16515,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17895,12 +16540,14 @@ "node_modules/micromark-util-events-to-acorn/node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17916,6 +16563,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -17934,6 +16582,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -18018,9 +16667,10 @@ ] }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -18042,6 +16692,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -18057,6 +16708,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -18155,6 +16807,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -18341,12 +16994,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "node_modules/negotiator": { @@ -18469,15 +17117,112 @@ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/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 + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", + "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "node_modules/npm-pick-manifest/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10" } }, "node_modules/npm-run-path": { @@ -18759,37 +17504,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", @@ -18838,6 +17552,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "devOptional": true, "dependencies": { "wrappy": "1" } @@ -18878,6 +17593,8 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "peer": true, "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -18923,6 +17640,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -18937,6 +17655,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -19046,6 +17765,7 @@ "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, "engines": { "node": ">=8" } @@ -19054,6 +17774,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -19546,14 +18267,16 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "peer": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -19594,9 +18317,9 @@ } }, "node_modules/prettier-plugin-tailwindcss": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.14.tgz", - "integrity": "sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.5.tgz", + "integrity": "sha512-axfeOArc/RiGHjOIy9HytehlC0ZLeMaqY09mm8YCkMzznKiDkwFzOpBvtuhuv3xG5qB73+Mj7OCe2j/L1ryfuQ==", "dev": true, "engines": { "node": ">=14.21.3" @@ -19721,9 +18444,10 @@ } }, "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -19743,6 +18467,25 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -19871,6 +18614,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -20947,6 +19691,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, "dependencies": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -20956,9 +19701,10 @@ } }, "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -21069,6 +19815,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "devOptional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -21412,6 +20159,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", + "dev": true, "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" @@ -21425,6 +20173,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -21437,17 +20186,19 @@ } }, "node_modules/remark-parse/node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, "dependencies": { "@types/unist": "*" } }, "node_modules/remark-parse/node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -21471,6 +20222,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0" }, @@ -21483,6 +20235,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -21517,6 +20270,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -21532,6 +20286,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -21552,6 +20307,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0" }, @@ -21642,6 +20398,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dev": true, "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", @@ -21653,9 +20410,10 @@ } }, "node_modules/remark-stringify/node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, "dependencies": { "@types/unist": "*" } @@ -21731,24 +20489,6 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, - "node_modules/rescript": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/rescript/-/rescript-10.1.4.tgz", - "integrity": "sha512-FFKlS9AG/XrLepWsyw7B+A9DtQBPWEPDPDKghV831Y2KGbie+eeFBOS0xtRHp0xbt7S0N2Dm6hhX+kTZQ/3Ybg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "bsc": "bsc", - "bsrefmt": "bsrefmt", - "bstracing": "lib/bstracing", - "rescript": "rescript" - } - }, - "node_modules/rescript-webapi": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rescript-webapi/-/rescript-webapi-0.8.0.tgz", - "integrity": "sha512-PdjHqho8+kI7AIC3DlLgD99H8zzHphzpIhyv2skVtWaSJGK819+ZqWMC3mHEtSjlcFoYaLXliNt8sb6Taa2Mpg==" - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -21806,10 +20546,20 @@ "node": ">=8" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -21825,6 +20575,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "devOptional": true, "dependencies": { "glob": "^7.1.3" }, @@ -21839,6 +20590,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -21896,6 +20648,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -22607,6 +21360,7 @@ "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==", + "devOptional": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -22683,6 +21437,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", @@ -22733,9 +21497,10 @@ } }, "node_modules/stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -22749,6 +21514,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -22837,6 +21603,7 @@ "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, "engines": { "node": ">=8" }, @@ -22911,6 +21678,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -22931,9 +21699,10 @@ } }, "node_modules/synckit": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.0.tgz", - "integrity": "sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "dev": true, "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" @@ -23232,7 +22001,9 @@ "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==" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "peer": true }, "node_modules/thenify": { "version": "3.3.1", @@ -23368,69 +22139,6 @@ "node": ">=8.0" } }, - "node_modules/to-vfile": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-7.2.4.tgz", - "integrity": "sha512-2eQ+rJ2qGbyw3senPI0qjuM7aut8IYXK6AEoOWb+fJx/mQYzviTckm1wDjq91QYHAPBTYzmdJXxMFA6Mk14mdw==", - "dev": true, - "dependencies": { - "is-buffer": "^2.0.0", - "vfile": "^5.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/to-vfile/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "node_modules/to-vfile/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/to-vfile/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/to-vfile/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/tocbot": { "version": "4.27.20", "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.27.20.tgz", @@ -23499,6 +22207,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-custom-error": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", @@ -23522,34 +22242,11 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, - "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, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "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, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true }, "node_modules/tsutils": { "version": "3.21.0", @@ -23622,6 +22319,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -23739,7 +22438,8 @@ "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==" + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true }, "node_modules/typescript": { "version": "5.4.5", @@ -23858,9 +22558,10 @@ } }, "node_modules/unified": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", - "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -23876,18 +22577,19 @@ } }, "node_modules/unified-engine": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-11.2.0.tgz", - "integrity": "sha512-H9wEDpBSM0cpEUuuYAOIiPzLCVN0pjASZZ6FFNzgzYS/HHzl9tArk/ereOMGtcF8m8vgjzw+HrU3YN7oenT7Ww==", + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-11.2.1.tgz", + "integrity": "sha512-xBAdZ8UY2X4R9Hm6X6kMne4Nz0PlpOc1oE6DPeqJnewr5Imkb8uT5Eyvy1h7xNekPL3PSWh3ZJyNrMW6jnNQBg==", + "dev": true, "dependencies": { "@types/concat-stream": "^2.0.0", "@types/debug": "^4.0.0", "@types/is-empty": "^1.0.0", "@types/node": "^20.0.0", "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", "concat-stream": "^2.0.0", "debug": "^4.0.0", + "extend": "^3.0.0", "glob": "^10.0.0", "ignore": "^5.0.0", "is-empty": "^1.0.0", @@ -23908,9 +22610,10 @@ } }, "node_modules/unified-engine/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -23919,6 +22622,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -23927,6 +22631,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.21.4", "error-ex": "^1.3.2", @@ -23945,6 +22650,7 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, "engines": { "node": ">=14.16" }, @@ -23974,9 +22680,10 @@ } }, "node_modules/unist-util-inspect": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/unist-util-inspect/-/unist-util-inspect-8.0.0.tgz", - "integrity": "sha512-/3Wn/wU6/H6UEo4FoYUeo8KUePN8ERiZpQYFWYoihOsr1DoDuv80PeB0hobVZyYSvALa2e556bG1A1/AbwU4yg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/unist-util-inspect/-/unist-util-inspect-8.1.0.tgz", + "integrity": "sha512-mOlg8Mp33pR0eeFpo5d2902ojqFFOKMMG2hF8bmH7ZlhnmjFgh0NI3/ZDwdaBJNbvrS7LZFVrBVtIE9KZ9s7vQ==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0" }, @@ -23989,6 +22696,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0" }, @@ -24013,6 +22721,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0" }, @@ -24030,6 +22739,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" @@ -24062,6 +22772,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", @@ -24076,6 +22787,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -24272,7 +22984,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "devOptional": true }, "node_modules/utils-merge": { "version": "1.0.1", @@ -24335,6 +23048,15 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -24359,9 +23081,10 @@ } }, "node_modules/vfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", - "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0", @@ -24434,6 +23157,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" @@ -24447,6 +23171,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0" }, @@ -24456,9 +23181,10 @@ } }, "node_modules/vfile-reporter": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-8.1.0.tgz", - "integrity": "sha512-NfHyHdkCcy0BsXiLA3nId29TY7W7hgpc8nd8Soe3imATx5N4/+mkLYdMR+Y6Zvu6BXMMi0FZsD4FLCm1dN85Pg==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-8.1.1.tgz", + "integrity": "sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==", + "dev": true, "dependencies": { "@types/supports-color": "^8.0.0", "string-width": "^6.0.0", @@ -24478,6 +23204,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, "engines": { "node": ">=12" }, @@ -24488,12 +23215,14 @@ "node_modules/vfile-reporter/node_modules/emoji-regex": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true }, "node_modules/vfile-reporter/node_modules/string-width": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^10.2.1", @@ -24510,6 +23239,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -24524,6 +23254,7 @@ "version": "9.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "dev": true, "engines": { "node": ">=12" }, @@ -24535,6 +23266,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0" }, @@ -24547,6 +23279,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-4.0.0.tgz", "integrity": "sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==", + "dev": true, "dependencies": { "vfile": "^6.0.0", "vfile-message": "^4.0.0" @@ -24560,6 +23293,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-3.0.0.tgz", "integrity": "sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==", + "dev": true, "dependencies": { "vfile": "^6.0.0", "vfile-message": "^4.0.0" @@ -24573,6 +23307,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, "dependencies": { "@types/unist": "^3.0.0" }, @@ -24930,7 +23665,8 @@ "node_modules/walk-up-path": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==" + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "dev": true }, "node_modules/warning": { "version": "4.0.3", @@ -25105,13 +23841,13 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -25120,8 +23856,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -25580,7 +24316,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "devOptional": true }, "node_modules/write-file-atomic": { "version": "2.4.3", @@ -25653,6 +24390,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, "engines": { "node": ">= 14" } @@ -25671,6 +24409,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index aa8d3f5df01..28ad8b13ab6 100644 --- a/package.json +++ b/package.json @@ -19,21 +19,17 @@ "Coronasafe", "care", "react", - "rescript", "tailwind", "pwa", - "typescritp", + "typescript", "vite" ], "author": "Coronsafe Care Contributors", "license": "MIT", "scripts": { - "build:res": "rescript clean && rescript build", "build:react": "cross-env NODE_ENV=production vite build", - "build": "npm run build:res && npm run generate-build-meta && npm run build:react", - "dev:res": "rescript clean && rescript build -w", - "dev:react": "vite", - "dev": "npm run build:res && npm run dev:react", + "build": "npm run generate-build-meta && npm run build:react", + "dev": "vite", "preview": "cross-env NODE_ENV=production vite preview", "generate-build-meta": "node ./scripts/generate-build-version.js", "test": "snyk test", @@ -57,7 +53,6 @@ "@pnotify/core": "^5.2.0", "@pnotify/mobile": "^5.2.0", "@react-spring/web": "^9.7.3", - "@rescript/react": "^0.11.0", "@sentry/browser": "^8.12.0", "@yaireo/ui-range": "^2.1.15", "@yudiel/react-qr-scanner": "^2.0.0-beta.3", @@ -69,7 +64,6 @@ "dayjs": "^1.11.11", "echarts": "^5.5.0", "echarts-for-react": "^3.0.2", - "eslint-mdx": "^3.1.5", "events": "^3.3.0", "glob": "^10.4.2", "hi-profiles": "^1.0.6", @@ -97,7 +91,6 @@ "redux": "^4.2.1", "redux-thunk": "^2.4.2", "rehype-raw": "^6.1.1", - "rescript-webapi": "^0.8.0", "use-keyboard-shortcut": "^1.1.6", "uuid": "^9.0.1", "xlsx": "^0.18.5" @@ -124,37 +117,28 @@ "@types/react-google-recaptcha": "^2.1.9", "@types/react-qr-reader": "^2.1.7", "@types/react-transition-group": "^4.4.10", - "@typescript-eslint/eslint-plugin": "^5.61.0", - "@typescript-eslint/parser": "^5.61.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", "@vitejs/plugin-react-swc": "^3.6.0", "autoprefixer": "^10.4.19", "cypress": "^13.13.1", "cypress-localstorage-commands": "^2.2.5", "cypress-split": "^1.23.2", - "eslint": "^8.44.0", - "eslint-config-prettier": "^8.8.0", - "eslint-config-standard": "^17.1.0", - "eslint-plugin-i18next": "^6.0.3", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-plugin-mdx": "^2.2.0", - "eslint-plugin-only-warn": "^1.1.0", - "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.34.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-i18next": "^6.0.9", + "eslint-plugin-mdx": "^3.1.5", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.35.0", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-storybook": "^0.8.0", - "eslint-plugin-tailwindcss": "^3.15.1", "gentype": "^4.5.0", "husky": "^8.0.3", "lint-staged": "^13.2.3", "local-cypress": "^1.2.6", "postcss": "^8.4.38", - "prettier": "^3.2.5", - "prettier-plugin-tailwindcss": "^0.5.14", + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.5", "prop-types": "^15.8.1", "redux-devtools-extension": "^2.13.9", - "rescript": "^10.1.4", "snyk": "^1.1291.0", "storybook": "^8.1.0", "tailwindcss": "^3.4.3", @@ -186,4 +170,4 @@ "node": ">=20.12.0" }, "packageManager": "npm@10.5.0" -} +} \ No newline at end of file diff --git a/src/CAREUI/display/PopupModal.tsx b/src/CAREUI/display/PopupModal.tsx new file mode 100644 index 00000000000..37b5719d9bd --- /dev/null +++ b/src/CAREUI/display/PopupModal.tsx @@ -0,0 +1,124 @@ +import { ReactNode, useEffect, useRef, useState } from "react"; +import { Cancel, Submit } from "../../Components/Common/components/ButtonV2"; +import { classNames } from "../../Utils/utils"; +import { useTranslation } from "react-i18next"; +import useBreakpoints from "../../Common/hooks/useBreakpoints"; +import DialogModal from "../../Components/Common/Dialog"; + +type Props = { + show: boolean; + onHide: () => void; + children: ReactNode; + className?: string; + onSubmit?: () => void; +}; + +export default function PopupModal(props: Props) { + const { t } = useTranslation(); + const isMobile = useBreakpoints({ default: true, lg: false }); + + if (!isMobile) { + return ; + } + + return ( + +
+ {props.children} +
+ + {props.onSubmit && ( + + )} +
+
+
+ ); +} + +const DesktopView = (props: Props) => { + const { t } = useTranslation(); + const [position, setPosition] = useState({ x: 0, y: 0 }); + const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 }); + const modal = useRef(null); + const [children, setChildren] = useState(props.children); + + useEffect(() => { + // just to make sure the animation runs smoothly + if (props.show) { + setChildren(props.children); + } + }, [props.children, props.show]); + + useEffect(() => { + const handleOutsideClick = (e: MouseEvent) => { + const isModalClicked = + modal.current && modal.current.contains(e.target as Node); + if (!isModalClicked) { + props.onHide(); + } + }; + + if (props.show) { + const currentMousePosition = mousePosition; + const modalHeight = modal.current?.clientHeight || 0; + const modalWidth = modal.current?.clientWidth || 0; + const xRelative = currentMousePosition.x; + const yRelative = currentMousePosition.y; + const containerHeight = window.innerHeight; + const containerWidth = window.innerWidth; + const top = + yRelative + modalHeight > containerHeight + ? yRelative - modalHeight + : yRelative; + const left = + xRelative + modalWidth > containerWidth + ? xRelative - modalWidth + : xRelative; + setPosition({ x: left, y: top }); + } + + document.addEventListener("mousedown", handleOutsideClick); + return () => { + document.removeEventListener("mousedown", handleOutsideClick); + }; + }, [props.show]); + + useEffect(() => { + const handleMouseMove = (e: MouseEvent) => { + setMousePosition({ x: e.clientX, y: e.clientY }); + }; + document.addEventListener("mousemove", handleMouseMove); + return () => { + document.removeEventListener("mousemove", handleMouseMove); + }; + }, []); + + return ( +
+ {children} +
+ + {props.onSubmit && ( + + )} +
+
+ ); +}; diff --git a/src/CAREUI/interactive/HumanChart.tsx b/src/CAREUI/interactive/HumanChart.tsx new file mode 100644 index 00000000000..c3b7cca80c3 --- /dev/null +++ b/src/CAREUI/interactive/HumanChart.tsx @@ -0,0 +1,90 @@ +import { Fragment } from "react/jsx-runtime"; +import { HumanBodyPaths, HumanBodyRegion } from "../../Common/constants"; + +type Props = { + regionColor: (region: HumanBodyRegion) => string; + regionLabelClassName: (region: HumanBodyRegion) => string; + regionText: (region: HumanBodyRegion) => string; + onPartSelect: (region: HumanBodyRegion) => void; +}; + +export default function HumanBodyChart({ + regionLabelClassName, + regionColor, + regionText, + onPartSelect, +}: Props) { + const getTitle = (text: string) => text.split(/(?=[A-Z])/).join(" "); + + return ( +
+ {[HumanBodyPaths.anterior, HumanBodyPaths.posterior].map((paths, i) => ( +
+

+ {i === 0 ? "Front" : "Back"} +

+
+ {paths.map((path, j) => ( + + ))} +
+ + {paths.map((path, j) => { + const value = regionText(path.region); + return ( + + {value && ( + + {value} + + )} + onPartSelect(path.region)} + > + {getTitle(path.region)} + + + ); + })} + +
+ ))} +
+ ); +} diff --git a/src/Common/constants.tsx b/src/Common/constants.tsx index 2bfecf94395..6d37d91013a 100644 --- a/src/Common/constants.tsx +++ b/src/Common/constants.tsx @@ -346,26 +346,41 @@ export const DISCHARGE_REASONS = [ ] as const; export const CONSCIOUSNESS_LEVEL = [ - { id: "UNRESPONSIVE", text: "Unresponsive" }, - { id: "RESPONDS_TO_PAIN", text: "Responds to Pain" }, - { id: "RESPONDS_TO_VOICE", text: "Responds to Voice" }, - { id: "ALERT", text: "Alert" }, - { id: "AGITATED_OR_CONFUSED", text: "Agitated or Confused" }, + { id: 20, value: "UNRESPONSIVE" }, + { id: 15, value: "RESPONDS_TO_PAIN" }, + { id: 10, value: "RESPONDS_TO_VOICE" }, + { id: 5, value: "ALERT" }, + { id: 25, value: "AGITATED_OR_CONFUSED" }, { - id: "ONSET_OF_AGITATION_AND_CONFUSION", - text: "Onset of Agitation and Confusion", + id: 30, + value: "ONSET_OF_AGITATION_AND_CONFUSION", }, ] as const; -export const LINES_CATHETER_CHOICES: Array = [ - { id: 1, text: "CVP catheter " }, - { id: 2, text: "Arterial Line" }, - { id: 3, text: "Quinton catheter" }, - { id: 4, text: "Chest Tubes (ICD)" }, - { id: 5, text: "NG Tube/GT" }, - { id: 6, text: "Urine Catheters" }, - { id: 7, text: "Other" }, -]; +export const PUPIL_REACTION_OPTIONS = [ + { id: 0, value: "UNKNOWN" }, + { id: 5, value: "BRISK" }, + { id: 10, value: "SLUGGISH" }, + { id: 15, value: "FIXED" }, + { id: 20, value: "CANNOT_BE_ASSESSED" }, +] as const; + +export const LIMB_RESPONSE_OPTIONS = [ + { id: 0, value: "UNKNOWN" }, + { id: 5, value: "STRONG" }, + { id: 10, value: "MODERATE" }, + { id: 15, value: "WEAK" }, + { id: 20, value: "FLEXION" }, + { id: 25, value: "EXTENSION" }, + { id: 30, value: "NONE" }, +] as const; + +export const OXYGEN_MODALITY_OPTIONS = [ + { value: "NASAL_PRONGS" }, + { value: "SIMPLE_FACE_MASK" }, + { value: "NON_REBREATHING_MASK" }, + { value: "HIGH_FLOW_NASAL_CANNULA" }, +] as const; export const GENDER_TYPES = [ { id: 1, text: "Male", icon: "M" }, @@ -401,11 +416,30 @@ export const ADMITTED_TO = [ ]; export const RESPIRATORY_SUPPORT = [ - { id: "NIV", text: "NON_INVASIVE" }, - { id: "IV", text: "INVASIVE" }, - { id: "O2", text: "OXYGEN_SUPPORT" }, - { id: "NONE", text: "UNKNOWN" }, -]; + { id: "NIV", value: "NON_INVASIVE" }, + { id: "IV", value: "INVASIVE" }, + { id: "O2", value: "OXYGEN_SUPPORT" }, + { id: "NONE", value: "UNKNOWN" }, +] as const; + +export const VENTILATOR_MODE_OPTIONS = [ + "VCV", + "PCV", + "PRVC", + "APRV", + "VC_SIMV", + "PC_SIMV", + "PRVC_SIMV", + "ASV", + "PSV", +] as const; + +export const INSULIN_INTAKE_FREQUENCY_OPTIONS = [ + "UNKNOWN", + "OD", + "BD", + "TD", +] as const; export type PatientCategoryID = "Comfort" | "Stable" | "Moderate" | "Critical"; @@ -665,21 +699,21 @@ export const RESOURCE_FILTER_ORDER: Array = [ { id: 4, text: "-modified_date", desc: "DESC Modified Date" }, ]; -export const NURSING_CARE_FIELDS: Array = [ - { id: 1, text: "personal_hygiene", desc: "Personal Hygiene" }, - { id: 2, text: "positioning", desc: "Positioning" }, - { id: 3, text: "suctioning", desc: "Suctioning" }, - { id: 4, text: "ryles_tube_care", desc: "Ryles Tube Care" }, - { id: 5, text: "iv_sitecare", desc: "IV Site Care" }, - { id: 6, text: "nubulisation", desc: "Nubulisation" }, - { id: 7, text: "dressing", desc: "Dressing" }, - { id: 8, text: "dvt_pump_stocking", desc: "DVT Pump Stocking" }, - { id: 9, text: "restrain", desc: "Restrain" }, - { id: 10, text: "chest_tube_care", desc: "Chest Tube Care" }, - { id: 11, text: "tracheostomy_care", desc: "Tracheostomy Care" }, - { id: 12, text: "stoma_care", desc: "Stoma Care" }, - { id: 13, text: "catheter_care", desc: "Catheter Care" }, -]; +export const NURSING_CARE_PROCEDURES = [ + "personal_hygiene", + "positioning", + "suctioning", + "ryles_tube_care", + "iv_sitecare", + "nubulisation", + "dressing", + "dvt_pump_stocking", + "restrain", + "chest_tube_care", + "tracheostomy_care", + "stoma_care", + "catheter_care", +] as const; export const EYE_OPEN_SCALE = [ { value: 4, text: "Spontaneous" }, @@ -732,13 +766,7 @@ export const LOCATION_BED_TYPES: Array = [ { id: "BED_WITH_OXYGEN_SUPPORT", name: "Bed with oxygen support" }, { id: "REGULAR", name: "Regular" }, ]; -// Deprecated Bed Types -// { -// id: "ICU_WITH_NON_INVASIVE_VENTILATOR", -// name: "ICU with non invasive ventilator", -// }, -// { id: "ICU_WITH_OXYGEN_SUPPORT", name: "ICU with oxygen support" }, -// { id: "ICU_WITH_INVASIVE_VENTILATOR", name: "ICU with invasive ventilator" } + export const ASSET_META_TYPE = [ { id: "CAMERA", text: "Camera(ONVIF)" }, { id: "HL7MONITOR", text: "Vitals Monitor(HL7)" }, @@ -1405,3 +1433,230 @@ export const DEFAULT_ALLOWED_EXTENSIONS = [ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.oasis.opendocument.spreadsheet,application/pdf", ]; + +export const HumanBodyPaths = { + anterior: [ + { + d: "M535.244,212.572c32.253.43,32.684-31.823,32.684-31.823,9.891-.215,14.191-19.783,13.331-23.653s-7.526-1.5-7.526-1.5c3.656-30.1-9.676-48.38-17.847-53.756S535.244,95.6,535.244,95.6h.43s-12.472.86-20.643,6.236-21.5,23.653-17.846,53.756c0,0-6.666-2.365-7.526,1.5s3.44,23.438,13.331,23.653c0,0,.43,32.253,32.684,31.823Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorHead", + }, + { + d: "M512.129,213.97s31.608,4.954,47.574-1.394v14.456s-26.287,4.355-47.574,0Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorNeck", + }, + { + d: "M505.355,231.279s-56.766,25.8-69.452,34.4c0,0,15.7,20.857,21.072,66.872C456.975,332.555,469.417,246.838,505.355,231.279Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorRightShoulder", + }, + { + d: "M526.482,232.838l.806,137.346s-46.607-22.2-67.745,18.762C459.543,388.946,455.685,234.612,526.482,232.838Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorRightChest", + }, + { + d: "M433.108,269.768s34.728,55.552,18.279,141.992c0,0-19.57-9.107-33.761-7.333,0,0-1.613-106.276,0-110.952S429.721,271.058,433.108,269.768Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorRightArm", + }, + { + d: "M415.207,408.781s27.254-.968,35.963,11.45c0,0-7.58,59.024-13.547,77.57s-19.03,56.766-19.03,56.766l-22.254-2.742s1.451-34.672,1.29-45.477,5-49.993,9.514-62.249S415.207,408.781,415.207,408.781Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorRightForearm", + }, + { + d: "M396.6,556.524l18.245,2.606a1.808,1.808,0,0,1,1.565,1.776c.049,6.373.053,30.692-2.6,41.987-2.568,10.951-16.244,28.022-26.205,35.726a4.126,4.126,0,0,1-6.575-2.7c-.192-1.322-.39-2.923-.584-4.855a1.828,1.828,0,0,0-2.054-1.637l-4.174.551a1.818,1.818,0,0,1-2.026-2.171c.631-3.043,1.887-8.187,3.72-11.529,2.591-4.724,5.9-18.948,5.442-26.76a1.79,1.79,0,0,0-1.514-1.635,7.118,7.118,0,0,0-5.448,1c-1.364,1.043-3.83,4.558-5.963,7.825-1.941,2.973-6.715.452-5.152-2.736.018-.037.037-.074.056-.111,1.936-3.71,13.063-18.708,16.288-24.513,2.9-5.221,13.627-8.747,15.171-11.984A1.706,1.706,0,0,1,396.6,556.524Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorRightHand", + }, + { + d: "M674.037,556.2l-18.244,2.606a1.808,1.808,0,0,0-1.566,1.776c-.049,6.373-.052,30.692,2.6,41.988,2.569,10.951,16.244,28.021,26.205,35.726a4.126,4.126,0,0,0,6.576-2.7c.191-1.322.389-2.922.584-4.855a1.827,1.827,0,0,1,2.053-1.637l4.174.551a1.818,1.818,0,0,0,2.027-2.17c-.632-3.043-1.888-8.188-3.721-11.53-2.59-4.723-5.9-18.948-5.442-26.76a1.79,1.79,0,0,1,1.515-1.634,7.114,7.114,0,0,1,5.447,1c1.364,1.043,3.83,4.558,5.964,7.826,1.94,2.973,6.715.451,5.151-2.736-.018-.038-.037-.075-.056-.112-1.935-3.709-13.063-18.707-16.288-24.513-2.9-5.221-13.627-8.746-15.171-11.984A1.707,1.707,0,0,0,674.037,556.2Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorLeftHand", + }, + { + d: "M544.705,232.838h19.137s18.062,15.643,20,19.513,29.888,42.79,26.878,128.154c0,0-16.557-16.556-31.178-15.051,0,0,2.365-33.114-34.834-34.619Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorLeftChest", + }, + { + d: "M569.432,231.279s61.927,31.824,65.153,35.694c0,0-12.9,9.752-18.707,73.791C615.878,340.764,610.072,268.048,569.432,231.279Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorLeftShoulder", + }, + { + d: "M638.455,271.058s14.407,18.923,14.837,23.223-1.291,105.362.86,108.8c0,0-26.233,1.29-34.834,9.891,0,0-4.3-51.176.86-78.484S633.079,279.659,638.455,271.058Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorLeftArm", + }, + { + d: "M621.038,419s16.342-12.257,33.974-10.537c0,0,7.741,26.233,8.816,34.189s10.321,49.241,9.246,66.658.087,41.069.087,41.069-16.214,3.44-20.084,4.731c0,0-17.2-46.661-18.062-52.036S620.982,426.52,621.038,419Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorLeftForearm", + }, + { + d: "M510.758,934.272s-20.723,1.451-24.973,1.5a56.32,56.32,0,0,0-1.556,10.672c0,4.355.484,25.481-.645,28.061s-21.771,27.254-23.383,30.641.645,8.386,1.935,9.192,2.1,4.757,4.193,5.644c1.807.765,3.064,3.709,5.644,4.032s10.482-.645,12.418.726c0,0,.887,3.144,2.58,3.306.864.082,5.644,1.774,10.644-5.967s13.04-35.019,13.439-37.791c.249-1.732-1.183-2.125-1.506-5.189a112.484,112.484,0,0,1,1.855-20.64C513.419,948.3,510.758,934.272,510.758,934.272Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorRightFoot", + }, + { + d: "M563.251,934.191s20.756.564,25.006.616c0,0,.151,7.125.151,11.479s.162,24.351,1.29,26.932,22.531,27.576,24.144,30.963-.645,8.386-1.935,9.192-2.1,4.758-4.193,5.645c-1.807.764-3.064,3.709-5.645,4.031s-10.482-.645-12.417.726c0,0-.887,3.145-2.581,3.306-.864.082-5.644,1.774-10.643-5.967s-13.04-35.018-13.439-37.79c-.25-1.733,1.182-2.126,1.5-5.19a112.484,112.484,0,0,0-1.855-20.64C560.623,947.334,563.251,934.191,563.251,934.191Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorLeftFoot", + }, + { + d: "M485.2,932.363l24.513-1.4s1.666-37.2,2.526-41.285,4.731-85.149,4.086-99.771c0,0-30,2.527-49.348-3.924,0,0-6.451,44.026-1.828,62.841C467.775,859.527,484.874,929.6,485.2,932.363Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorRightLeg", + }, + { + d: "M469.231,420.715s-5.966-30.318-4.515-34.834a115.141,115.141,0,0,1,16.772-10.966c10.428-5.483,29.727-6.773,36.339-3.548,5.81,2.834,4.972,2.548,13.439,4.73l.054-142.13h9.192V334.92s32.415,1.291,31.931,33.06a72.9,72.9,0,0,0,8.869,2.419c5.322,1.129,23.062,9.031,25.642,19.675,0,0-4.945,22.2-3.655,32.684,0,0-39.4-29.835-47.306-31.609s-12.959,2.31-16.933,2.8c-4.483.547-11.71-.628-18.142-2.9C514.306,388.7,475.2,414.909,469.231,420.715Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorLowerChest", + }, + { + d: "M461.813,481.665c2.43-11.313,8.042-43.207,7.1-55.467,0,0,48.3-30.56,50.88-30.4s12.122,5.564,23.841,2.338c0,0,6.719-3.225,13.331.162s34.874,24.149,46.324,28.987c0,0-.524,28.746,1.573,37.777s10.159,42.091,10.966,46.123,0,.806,0,.806-58.057,50.155-59.669,52.574c0,0-6.451-6.29-20.481-6.774s-20.643,6.774-20.643,6.774l-60.152-51.122S460.965,485.617,461.813,481.665Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorAbdomen", + }, + { + d: "M554.381,790.77s30.748,3.226,51.39-4.945c0,0,3.441,40.424,0,63.432s-16.449,76.871-17.094,81.816c0,0-23.33.108-25.91-1.4,0,0-3.011-33.328-3.871-43S550.08,810.982,554.381,790.77Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorLeftLeg", + }, + { + d: "M454.072,520.056s-4.515,29.35-6.128,48.7.323,59.346,6.128,81.278,21.288,89.343,14.514,131.272c0,0,20.464,8.064,47.808,4.516,0,0,7.2-74.822,6.7-87.73,0,0,3.333-50.745,3.333-58.7s1.72-27.738,1.72-27.738-20.642-10.106-14.837-44.08C513.311,567.576,462.351,524.571,454.072,520.056Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorRightThigh", + }, + { + d: "M553.114,785.825s37.713,2.741,50.615-3.548c0,0-6.451-35.8-1.129-63.325s19.943-77.408,20.8-92.03,2.33-87.3-7.221-108.371l-56.426,49.455s3.441,37.629-18.922,44.725c0,0,7.741,68.807,7.741,78.913S554.857,777.654,553.114,785.825Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorLeftThigh", + }, + { + d: "M535.624,610.466s16.722-10.1,18.818-27.355-3.386-17.578-5.805-18.545-13.063-1.291-13.063-1.291h.1s-10.644.323-13.063,1.291-7.9,1.29-5.806,18.545S535.624,610.466,535.624,610.466Z", + transform: "translate(-362.967 -95.599)", + region: "AnteriorGroin", + }, + ], + + posterior: [ + { + d: "M 506.9838 158.0121 C 509.6029 173.1336 512.1258 187.9477 521.5039 184.4407 C 517.7283 191.6346 525.6919 202.9266 528.0919 210.8841 C 544.9623 208.3461 562.3174 208.3461 579.1878 210.8841 C 581.5893 202.9236 589.5363 191.6662 585.7863 184.4511 C 595.6744 187.4586 596.8188 174.3021 600.3813 158.5926 C 600.1173 156.4611 595.9999 158.5806 594.7788 159.0816 C 597.7384 128.3122 591.2088 97.1811 553.7104 97.22 C 516.1444 97.1497 509.5249 128.2116 512.5008 159.0891 C 511.0564 158.4651 508.4914 157.0971 506.9838 158.0121 Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorHead", + }, + { + d: "M 503.129 213.97 s 30.871 -1.97 46.871 0.03 v 12.456 s -26 -2.456 -47.574 0 Z", + transform: "translate(-362.967 -95.599)", + region: "PosteriorNeck", + }, + { + d: "M545.584,228.037V361.6s-13.6,10.828-25.282,13.145c-10.077,2-36.162,3.374-36.766-.857S478.9,239.117,545.584,228.037Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorLeftChest", + }, + { + d: "M563.865,228.037V361.6s13.6,10.828,25.282,13.145c10.076,2,36.161,3.374,36.766-.857S630.546,239.117,563.865,228.037Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorRightChest", + }, + { + d: "M550.973,228.188h8.914l.151,136.435s20.7,17.828,59.681,16.317c0,0-4.684,38.528-1.057,56.508s9.216,41.248,9.216,41.248-77.812,30.218-145.954-.151c0,0,9.67-35.96,9.972-58.321a167.6,167.6,0,0,0-4.23-39.888s37.924,5.439,62.1-15.713C549.764,364.623,550.52,228.188,550.973,228.188Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorAbdomen", + }, + { + d: "M523.223,230.857s-40.694,20.548-50.968,25.182-11.08,5.439-11.08,5.439,15.512,18.735,18.533,70.509C479.708,331.987,489.58,244.354,523.223,230.857Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorLeftShoulder", + }, + { + d: "M587.084,230.857s40.693,20.548,50.968,25.182,11.08,5.439,11.08,5.439S633.62,280.213,630.6,331.987C630.6,331.987,620.726,244.354,587.084,230.857Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorRightShoulder", + }, + { + d: "M457.951,265.306s-12.49,14.706-13.5,29.613,1.813,82.194.6,95.691c0,0,15.512-1.209,22.16,3.022s9.872,4.23,9.872,4.23,3.223-32.232,1.41-53.385S467.823,277.393,457.951,265.306Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorLeftArm", + }, + { + d: "M444.655,394.639s3.627-1.209,8.864,1.612,21.153,4.835,21.153,4.835a241.987,241.987,0,0,1-6.245,50.968c-6.446,27.8-23.167,79.977-22.966,81.992,0,0-17.325-4.03-20.951-3.828,0,0,1.209-21.354,1.612-31.427s.2-42.91,6.648-63.659S444.454,396.049,444.655,394.639Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorLeftForearm", + }, + { + d: "M423.5,533.844s-4.029,2.82-7.454,5.036-12.49,13.1-15.311,18.131-11.482,15.915-10.274,16.923,5.44.2,7.454-2.216,7.051-8.663,10.476-7.253c0,0,1.007,12.087-3.224,22.966s-4.633,13.7-4.633,13.7,2.591,2.22,7.063.809q.291-.091.592-.2s1.612,4.835.806,8.864,3.022,3.425,7.655,1.007,21.959-22.562,24.175-35.053,1.611-40.895,1.611-40.895S427.33,534.65,423.5,533.844Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorLeftHand", + }, + { + d: "M650.678,265.306s12.49,14.706,13.5,29.613-1.813,82.194-.6,95.691c0,0-15.512-1.209-22.16,3.022s-9.871,4.23-9.871,4.23-3.224-32.232-1.41-53.385S640.807,277.393,650.678,265.306Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorRightArm", + }, + { + d: "M663.974,394.639s-3.626-1.209-8.864,1.612-21.153,4.835-21.153,4.835a242.066,242.066,0,0,0,6.245,50.968c6.447,27.8,23.168,79.977,22.966,81.992,0,0,17.325-4.03,20.951-3.828,0,0-1.208-21.354-1.611-31.427s-.2-42.91-6.648-63.659S664.175,396.049,663.974,394.639Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorRightForearm", + }, + { + d: "M685.127,533.844s4.029,2.82,7.453,5.036,12.491,13.1,15.311,18.131,11.483,15.915,10.274,16.923-5.439.2-7.454-2.216-7.051-8.663-10.475-7.253c0,0-1.008,12.087,3.223,22.966s4.633,13.7,4.633,13.7-2.59,2.22-7.062.809q-.291-.091-.593-.2s-1.612,4.835-.806,8.864-3.022,3.425-7.655,1.007-21.958-22.562-24.174-35.053-1.612-40.895-1.612-40.895S681.3,534.65,685.127,533.844Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorRightHand", + }, + { + d: "M552.635,495.366s0,66.279-.6,69.9c-.051.277-.126.982-.2,2.065-5.691,6.673-27.473,28.254-58.673,9.04a10.164,10.164,0,0,1-1.738-1.309c-23.066-21.783-7.076-50.968-6.371-52.2l-2.216-1.234c-.176.327-17.652,32.107,6.849,55.249a14.16,14.16,0,0,0,2.166,1.662c9.519,5.842,18.232,8.033,25.988,8.033,16.116,0,27.977-9.519,33.642-15.235-1.661,20.07-6.144,82.369-6.5,86-.4,4.231-7.605,77.51-7.605,80.935,0,0-36.111-4.785-45.579-2.972,0,0,.2-37.672-2.821-59.63s-14.5-65.473-15.914-101.936-1.411-65.473,7.453-91.46C480.514,482.272,499.048,497.582,552.635,495.366Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorLeftThighAndButtock", + }, + { + d: "M555.471,495.366s0,66.279.6,69.9c.051.277.126.982.2,2.065,5.691,6.673,27.473,28.254,58.673,9.04a10.164,10.164,0,0,0,1.738-1.309c23.066-21.783,7.076-50.968,6.371-52.2l2.216-1.234c.176.327,17.652,32.107-6.85,55.249a14.151,14.151,0,0,1-2.165,1.662c-9.519,5.842-18.232,8.033-25.988,8.033-16.116,0-27.977-9.519-33.643-15.235,1.662,20.07,6.145,82.369,6.5,86,.4,4.231,7.605,77.51,7.605,80.935,0,0,36.111-4.785,45.579-2.972,0,0-.2-37.672,2.82-59.63s14.5-65.473,15.915-101.936,1.41-65.473-7.453-91.46C627.592,482.272,609.058,497.582,555.471,495.366Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorRightThighAndButtock", + }, + { + d: "M492.2,739.529s21.354-2.418,42.909,3.425c0,0,3.627,43.312,1.612,61.846s-7.655,75.445-6.849,80.078c0,0-19.944.907-25.988,2.518,0,0-2.619-29.009-9.267-49.154S486.961,754.839,492.2,739.529Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorLeftLeg", + }, + { + d: "M617.088,739.529s-21.354-2.418-42.909,3.425c0,0-3.626,43.312-1.612,61.846s7.655,75.445,6.85,80.078c0,0,19.944.907,25.987,2.518,0,0,2.619-29.009,9.267-49.154S622.326,754.839,617.088,739.529Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorRightLeg", + }, + { + d: "M504.387,891.023s17.728-.806,24.879-2.619c0,0,2.015,6.245,1.209,18.131s-1.007,21.555-.6,23.771,1.813,9.67-1.209,15.512S520,967.172,516.978,972.007s-10.275,5.439-11.886-1.611c0,0-1.813,3.424-7.857,1.41s-9.67-1.209-11.483-5.44-4.835-11.684-1.41-16.922,18.937-18.534,20.145-25.182S505.6,895.455,504.387,891.023Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorLeftFoot", + }, + { + d: "M604.752,891.023s-17.728-.806-24.88-2.619c0,0-2.014,6.245-1.209,18.131s1.008,21.555.605,23.771-1.813,9.67,1.209,15.512,8.662,21.354,11.684,26.189,10.274,5.439,11.886-1.611c0,0,1.813,3.424,7.856,1.41s9.67-1.209,11.483-5.44,4.835-11.684,1.41-16.922-18.936-18.534-20.145-25.182S603.543,895.455,604.752,891.023Z", + transform: "translate(-390.349 -94.472)", + region: "PosteriorRightFoot", + }, + ], +} as const; + +export type HumanBodyRegion = (typeof HumanBodyPaths)[ + | "anterior" + | "posterior"][number]["region"]; + +export const PressureSoreExudateAmountOptions = [ + "None", + "Light", + "Moderate", + "Heavy", +] as const; + +export const PressureSoreTissueTypeOptions = [ + "Closed", + "Epithelial", + "Granulation", + "Slough", + "Necrotic", +] as const; diff --git a/src/Components/ABDM/ABDMFacilityRecords.tsx b/src/Components/ABDM/ABDMFacilityRecords.tsx index cd21d269536..a37fc0d4932 100644 --- a/src/Components/ABDM/ABDMFacilityRecords.tsx +++ b/src/Components/ABDM/ABDMFacilityRecords.tsx @@ -42,8 +42,7 @@ export default function ABDMFacilityRecords({ facilityId }: IProps) {
- {/* eslint-disable-next-line tailwindcss/migration-from-tailwind-2 */} -
+
@@ -152,7 +151,7 @@ export default function ABDMFacilityRecords({ facilityId }: IProps) { View ) : ( -

+

View

)} diff --git a/src/Components/Assets/AssetFilter.tsx b/src/Components/Assets/AssetFilter.tsx index 0470ea7f701..bf07bad4b09 100644 --- a/src/Components/Assets/AssetFilter.tsx +++ b/src/Components/Assets/AssetFilter.tsx @@ -46,7 +46,7 @@ function AssetFilter(props: any) { useEffect(() => { setFacilityId(facility?.id ? `${facility?.id}` : ""); setLocationId( - facility?.id === qParams.facility ? qParams.location ?? "" : "", + facility?.id === qParams.facility ? (qParams.location ?? "") : "", ); }, [facility?.id, qParams.facility, qParams.location]); diff --git a/src/Components/Assets/AssetManage.tsx b/src/Components/Assets/AssetManage.tsx index 469d1556fb5..4c17721e1f9 100644 --- a/src/Components/Assets/AssetManage.tsx +++ b/src/Components/Assets/AssetManage.tsx @@ -110,7 +110,7 @@ const AssetManage = (props: AssetManageProps) => { const PrintPreview = () => (
-
+
-
+
{Object.keys(details).map((key) => (
diff --git a/src/Components/CameraFeed/AssetBedSelect.tsx b/src/Components/CameraFeed/AssetBedSelect.tsx index dafb28d133f..d9f37d5ed2a 100644 --- a/src/Components/CameraFeed/AssetBedSelect.tsx +++ b/src/Components/CameraFeed/AssetBedSelect.tsx @@ -109,7 +109,7 @@ export const CameraPresetDropdown = ( leaveFrom="opacity-100" leaveTo="opacity-0" > - + {options?.map((obj) => ( {
- {props.totalCount}{" "} + {props.totalCount}{" "} Camera(s) present
diff --git a/src/Components/CameraFeed/FeedControls.tsx b/src/Components/CameraFeed/FeedControls.tsx index 8cff960505a..1bacd6c1cfc 100644 --- a/src/Components/CameraFeed/FeedControls.tsx +++ b/src/Components/CameraFeed/FeedControls.tsx @@ -224,7 +224,7 @@ export default function FeedControls({ shortcutsDisabled, ...props }: Props) {
{controls.position}
-
+
{controls.zoom} {controls.reset} diff --git a/src/Components/Common/CareIcon.res b/src/Components/Common/CareIcon.res deleted file mode 100644 index 343e01f1ddb..00000000000 --- a/src/Components/Common/CareIcon.res +++ /dev/null @@ -1,19 +0,0 @@ -type reactClass -module CareIcon = { - @module("../../CAREUI/icons/CareIcon.tsx") @react.component - external make: ( - ~icon: option, - ~className: option, - ~onClick: option unit>, - ~id: option - ) => React.element = "default" -} - -@react.component -let make = ( - ~icon = ?, - ~className = ?, - ~onClick = ?, - ~id = ?, -) => - diff --git a/src/Components/Common/DialogModal.res b/src/Components/Common/DialogModal.res deleted file mode 100644 index ae03ad8139c..00000000000 --- a/src/Components/Common/DialogModal.res +++ /dev/null @@ -1,20 +0,0 @@ -type reactClass -module DialogModal = { - @module("./Dialog.tsx") @react.component - external make: ( - ~title: React.element, - ~show: bool, - ~onClose: unit => unit, - ~className: string, - ~children: React.element, - ) => React.element = "default" -} - -@react.component -let make = ( - ~title: React.element, - ~show: bool, - ~onClose: unit => unit, - ~className: string, - ~children: React.element, -) => {children} diff --git a/src/Components/Common/ExcelViewer.tsx b/src/Components/Common/ExcelViewer.tsx index 643b411a9b0..a7e5879ef1f 100644 --- a/src/Components/Common/ExcelViewer.tsx +++ b/src/Components/Common/ExcelViewer.tsx @@ -39,9 +39,9 @@ const ExcelViewer = ({ const [selectedRowsData, setSelectedRowsData] = useState([]); const initialSelectedRows = fileData - ? fileData + ? (fileData .map((_, i) => i) - .filter((i) => !errors.some((err) => err.index === i)) ?? [] + .filter((i) => !errors.some((err) => err.index === i)) ?? []) : []; const [selectedRows, setSelectedRows] = @@ -132,9 +132,7 @@ const ExcelViewer = ({ return (
{showCheckbox && (
@@ -197,10 +195,7 @@ const ExcelViewer = ({ <> +
{/* flexible spacing */} diff --git a/src/Components/Common/Sidebar/SidebarItem.tsx b/src/Components/Common/Sidebar/SidebarItem.tsx index b119aa58565..bf0b0589011 100644 --- a/src/Components/Common/Sidebar/SidebarItem.tsx +++ b/src/Components/Common/Sidebar/SidebarItem.tsx @@ -32,8 +32,7 @@ const SidebarItemBase = forwardRef( return ( - -
-
- -
setShow(false)} - /> - -
- -
children
-
-
-
-
- diff --git a/src/Components/Common/TemperatureFormField.tsx b/src/Components/Common/TemperatureFormField.tsx index 2d81ab3d8df..236d87826e9 100644 --- a/src/Components/Common/TemperatureFormField.tsx +++ b/src/Components/Common/TemperatureFormField.tsx @@ -3,6 +3,7 @@ import { FormFieldBaseProps } from "../Form/FormFields/Utils"; import RangeAutocompleteFormField from "../Form/FormFields/RangeAutocompleteFormField"; import CareIcon from "../../CAREUI/icons/CareIcon"; import ButtonV2 from "./components/ButtonV2"; +import { fahrenheitToCelsius } from "../../Utils/utils"; type TemperatureUnit = "celsius" | "fahrenheit"; @@ -74,11 +75,3 @@ export default function TemperatureFormField(props: Props) { /> ); } - -export const celsiusToFahrenheit = (celsius: number) => { - return (celsius * 9) / 5 + 32; -}; - -export const fahrenheitToCelsius = (fahrenheit: number) => { - return ((fahrenheit - 32) * 5) / 9; -}; diff --git a/src/Components/Common/Transition.res b/src/Components/Common/Transition.res deleted file mode 100644 index 54d3e4c772d..00000000000 --- a/src/Components/Common/Transition.res +++ /dev/null @@ -1,26 +0,0 @@ -type reactClass -module Transition = { - @module("./Transition.tsx") @react.component - external make: ( - ~show: option, - ~enter: string, - ~enterFrom: string, - ~enterTo: string, - ~leave: string, - ~leaveFrom: string, - ~leaveTo: string, - ~children: 'a, - ) => React.element = "default" -} - -@react.component -let make = ( - ~show=None, - ~enter="", - ~enterFrom="", - ~enterTo="", - ~leave="", - ~leaveFrom="", - ~leaveTo="", - ~children, -) => children diff --git a/src/Components/Common/Uptime.tsx b/src/Components/Common/Uptime.tsx index 6883d0f3871..a1cf0ee90b3 100644 --- a/src/Components/Common/Uptime.tsx +++ b/src/Components/Common/Uptime.tsx @@ -51,7 +51,7 @@ function UptimeInfo({
- {date} + {date}
{incidents.length === 0 ? ( <> diff --git a/src/Components/Common/UserAutocompleteFormField.tsx b/src/Components/Common/UserAutocompleteFormField.tsx index 3ff6a3ae7c2..a42fea1890c 100644 --- a/src/Components/Common/UserAutocompleteFormField.tsx +++ b/src/Components/Common/UserAutocompleteFormField.tsx @@ -151,7 +151,7 @@ export const LinkedFacilityUsers = (props: LinkedFacilitySearchProps) => { const userOnlineDot = (user: UserBareMinimum) => (
diff --git a/src/Components/Common/components/ButtonV2.tsx b/src/Components/Common/components/ButtonV2.tsx index 014a182ba94..bc67e150fdc 100644 --- a/src/Components/Common/components/ButtonV2.tsx +++ b/src/Components/Common/components/ButtonV2.tsx @@ -128,7 +128,7 @@ const ButtonV2 = ({ if (href && !(disabled || loading)) { return ( - + diff --git a/src/Components/Common/components/CheckBox.tsx b/src/Components/Common/components/CheckBox.tsx deleted file mode 100644 index ac1193220dc..00000000000 --- a/src/Components/Common/components/CheckBox.tsx +++ /dev/null @@ -1,28 +0,0 @@ -interface Props { - id?: string; - className?: string; - name?: string; - onCheck: (value: boolean) => void; - checked?: boolean; - error?: string; - required?: boolean; - label?: string; -} - -export default function Checkbox(props: Props) { - return ( -
-
- props.onCheck(event.target.checked)} - /> - -
-
- ); -} diff --git a/src/Components/Common/components/Checkbox.res b/src/Components/Common/components/Checkbox.res deleted file mode 100644 index 967de556c04..00000000000 --- a/src/Components/Common/components/Checkbox.res +++ /dev/null @@ -1,15 +0,0 @@ -let str = React.string - -@react.component -let make = (~id, ~label, ~onChange, ~checked=false) => -
- - -
diff --git a/src/Components/Common/components/ContactLink.tsx b/src/Components/Common/components/ContactLink.tsx index ff13433cc3b..ee834b3f2a9 100644 --- a/src/Components/Common/components/ContactLink.tsx +++ b/src/Components/Common/components/ContactLink.tsx @@ -9,7 +9,7 @@ export default function ContactLink(props: ContactLinkProps) {
Webapi.Dom.KeyboardEvent.t = "%identity" - -let onConfirm = (href, onClick, event) => { - ReactEvent.Mouse.preventDefault(event) - Belt.Option.mapWithDefault(onClick, (), onClick => onClick(event)) - RescriptReactRouter.push(href) -} - -let onCancel = event => event |> ReactEvent.Mouse.preventDefault - -let handleOnClick = (href, confirm, onClick, event) => { - let keyboardEvent = event |> unsafeAsKeyboardEvent - let modifierPressed = keyboardEvent |> ctrlKey || keyboardEvent |> metaKey - - switch (modifierPressed, confirm) { - | (true, _) => () - | (false, Some(confirmationText)) => - WindowUtils.confirm( - ~onCancel=() => onCancel(event), - confirmationText, - () => onConfirm(href, onClick, event), - ) - | (false, None) => onConfirm(href, onClick, event) - } -} - -@react.component -let make = ( - ~href, - ~ariaLabel=?, - ~className=?, - ~confirm=?, - ~id=?, - ~onClick=?, - ~title=?, - ~children, -) => - - children - diff --git a/src/Components/Common/components/Menu.tsx b/src/Components/Common/components/Menu.tsx index a6f66ff9d2f..632644df988 100644 --- a/src/Components/Common/components/Menu.tsx +++ b/src/Components/Common/components/Menu.tsx @@ -34,7 +34,7 @@ export default function DropdownMenu({
-
- - -
diff --git a/src/Components/Common/components/SkeletonLoading.res b/src/Components/Common/components/SkeletonLoading.res deleted file mode 100644 index 71f4f11df91..00000000000 --- a/src/Components/Common/components/SkeletonLoading.res +++ /dev/null @@ -1,144 +0,0 @@ -let card = (~className="", ()) => -
-
-
-
-
-
-
-
-
-
-
-
-
- -let smallCard = () => -
-
-
-
-
-
-
-
-
-
-
-
-
- -let userCard = () => -
-
-
-
-
-
-
-
-
-
-
-
-
-
- -let heading = () => -
-
-
-
-
-
-
- -let profileCard = () => -
-
-
-
-
-
-
-
-
-
-
- -let image = () => -
-
-
-
-
-
- -let courseCard = () => -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -let paragraph = () => -
-
-
-
-
-
-
-
- -let contents = () => -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -let pageLoad = () => -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -let multiple = (~count, ~element) => - Array.make(count, element) - |> Array.mapi((key, element) =>
string_of_int}> element
) - |> React.array diff --git a/src/Components/Common/prescription-builder/types/Prescription__Prescription.res b/src/Components/Common/prescription-builder/types/Prescription__Prescription.res deleted file mode 100644 index 97c42c6257f..00000000000 --- a/src/Components/Common/prescription-builder/types/Prescription__Prescription.res +++ /dev/null @@ -1,75 +0,0 @@ -@genType -type t = { - medicine: string, - dosage: string, - days: int, - dosage_new : string, - route : string, - notes : string -} - -let medicine = t => t.medicine -let dosage = t => t.dosage -let days = t => t.days -let dosage_new = t => t.dosage_new -let route = t => t.route -let notes = t => t.notes - -let make = (medicine, dosage, days, dosage_new, route, notes) => { - medicine: medicine, - dosage: dosage, - days: days, - route : route, - notes : notes, - dosage_new : dosage_new -} - -let empty = () => { - medicine: "", - route: "", - dosage: "", - dosage_new: "0 mg", - days: 0, - notes: "" -} - -let updateMedicine = (medicine, t) => {...t, medicine: medicine} -let updateDosage = (dosage, t) => {...t, dosage: dosage} -let updateDays = (days, t) => {...t, days: days} -let updateDosageNew = (dosage, t) => {...t, dosage_new: dosage} -let updateRoute = (route, t) => {...t, route: route} -let updateNotes = (notes, t) => {...t, notes: notes} - -let decode = json => { - open Json.Decode - { - medicine: json |> field("medicine", string), - dosage: json |> field("dosage", string), - days: json |> field("days", int), - route: json |> field("route", string), - dosage_new: json |> field("dosage_new", string), - notes: json |> field("notes", string), - } -} - -let encode = t => { - open Json.Encode - object_(list{ - ("medicine", t.medicine |> string), - ("dosage", t.dosage |> string), - ("dosage_new", t.dosage_new |> string), - ("route", t.route |> string), - ("notes", t.notes |> string), - ("days", t.days |> int), - }) -} - -let encodeArray = prescriptions => - prescriptions |> { - open Json.Encode - array(encode) - } - -let makeFromJs = json => { - Js.Array.isArray(json) ? Js.Array.map(p => make(p["medicine"], p["dosage"], p["days"], p["dosage_new"], p["route"], p["notes"]), json) : [] -} diff --git a/src/Components/Common/utils/ArrayUtils.res b/src/Components/Common/utils/ArrayUtils.res deleted file mode 100644 index c5f55b7b9e5..00000000000 --- a/src/Components/Common/utils/ArrayUtils.res +++ /dev/null @@ -1,44 +0,0 @@ -exception UnsafeFindFailed(string) - -let copyAndSort = (f, t) => { - let cp = Js.Array.copy(t) - Js.Array.sortInPlaceWith(f, cp) -} - -let copyAndPush = (e, t) => { - let copy = Js.Array.copy(t) - Js.Array.push(e, copy) |> ignore - copy -} - -let isEmpty = a => Js.Array.length(a) == 0 - -let isNotEmpty = a => !isEmpty(a) - -let replaceWithIndex = (i, t, l) => Js.Array.mapi((a, index) => index == i ? t : a, l) - -let flatten = a => a |> Js.Array.reduce((flat, next) => flat |> Js.Array.concat(next), []) - -let sort_uniq = (f, t) => t |> Array.to_list |> List.sort_uniq(f) |> Array.of_list - -let getOpt = (a, i) => - try Some(a |> Array.get(i)) catch { - | Not_found => None - } - -let swapUp = (i, t) => - if i <= 0 || i >= (t |> Array.length) { - t - } else { - let copy = Js.Array.copy(t) - - copy[i] = t[i - 1] - copy[i - 1] = t[i] - copy - } - -let swapDown = (i, t) => swapUp(i + 1, t) - -let last = t => t->Js.Array.unsafe_get(Js.Array.length(t) - 1) - -let findAndReplace = (index, f, array) => array |> Array.mapi((i, p) => i == index ? f(p) : p) diff --git a/src/Components/Common/utils/DateFns.res b/src/Components/Common/utils/DateFns.res deleted file mode 100644 index 4fa70abb144..00000000000 --- a/src/Components/Common/utils/DateFns.res +++ /dev/null @@ -1,129 +0,0 @@ -type locale - -@deriving(abstract) -type formatDistanceOptions = { - @optional - includeSeconds: bool, - @optional - addSuffix: bool, - @optional - locale: locale, -} - -@deriving(abstract) -type formatDistanceStrictOptions = { - @optional - addSuffix: bool, - @optional - unit: string, - @optional - roundingMethod: string, - @optional - locale: locale, -} - -// TODO: This function should return the user's actual / selected timezone. -let currentTimeZone = () => "Asia/Kolkata" - -// TODO: This function should return either "HH:mm", or "h:mm a" depending on user's preferred time format. -let selectedTimeFormat = () => "HH:mm" - -@module("date-fns") -external formatDistanceOpt: (Js.Date.t, Js.Date.t, formatDistanceOptions) => string = - "formatDistance" - -@module("date-fns") -external formatDistanceStrictOpt: (Js.Date.t, Js.Date.t, formatDistanceStrictOptions) => string = - "formatDistanceStrict" - -@module("date-fns") -external formatDistanceToNowOpt: (Js.Date.t, formatDistanceOptions) => string = - "formatDistanceToNow" - -@module("date-fns") -external formatDistanceToNowStrictOpt: (Js.Date.t, formatDistanceStrictOptions) => string = - "formatDistanceToNowStrict" - -let formatDistance = (date, baseDate, ~includeSeconds=false, ~addSuffix=false, ()) => { - let options = formatDistanceOptions(~includeSeconds, ~addSuffix, ()) - formatDistanceOpt(date, baseDate, options) -} - -let formatDistanceStrict = ( - date, - baseDate, - ~addSuffix=false, - ~unit=?, - ~roundingMethod="round", - (), -) => { - let options = formatDistanceStrictOptions(~addSuffix, ~unit?, ~roundingMethod, ()) - formatDistanceStrictOpt(date, baseDate, options) -} - -let formatDistanceToNow = (date, ~includeSeconds=false, ~addSuffix=false, ()) => { - let options = formatDistanceOptions(~includeSeconds, ~addSuffix, ()) - formatDistanceToNowOpt(date, options) -} - -let formatDistanceToNowStrict = (date, ~addSuffix=false, ~unit=?, ~roundingMethod="round", ()) => { - let options = formatDistanceStrictOptions(~addSuffix, ~unit?, ~roundingMethod, ()) - - formatDistanceToNowStrictOpt(date, options) -} - -@deriving(abstract) -type formatOptions = { - timeZone: string, - @optional - locale: locale, - @optional - weekStartsOn: int, - @optional - firstWeekContainsDate: int, - @optional - useAdditionalWeekYearTokens: bool, - @optional - useAdditionalDayOfYearTokens: bool, -} - -@module("date-fns-tz") -external formatTz: (Js.Date.t, string, formatOptions) => string = "format" - -let format = (date, fmt) => { - let timeZone = currentTimeZone() - - // Since the passed date is not time-zone-sensitive, we need to pass the - // time-zone here so that the user's timezone is displayed in the generated - // string. - formatTz(date, fmt, formatOptions(~timeZone, ())) -} - -let formatPreset = (date, ~short=false, ~year=false, ~time=false, ()) => { - let leading = short ? "MMM d" : "MMMM d" - let middle = year ? ", yyyy" : "" - let trailing = time ? " " ++ selectedTimeFormat() : "" - - format(date, leading ++ (middle ++ trailing)) -} - -@module("date-fns") -external decodeISOJs: Js.Json.t => Js.Date.t = "parseISO" - -let decodeISO = json => - if Js.typeof(json) == "string" { - decodeISOJs(json) - } else { - raise(Json.Decode.DecodeError("Expected string, got " ++ Js.typeof(json))) - } - -let encodeISO = date => Js.Date.toISOString(date)->Js.Json.string - -@module("date-fns") external parseISO: string => Js.Date.t = "parseISO" - -@module("date-fns") external isPast: Js.Date.t => bool = "isPast" - -@module("date-fns") external isFuture: Js.Date.t => bool = "isFuture" - -@module("date-fns") -external differenceInSeconds: (Js.Date.t, Js.Date.t) => int = "differenceInSeconds" diff --git a/src/Components/Common/utils/DictUtils.res b/src/Components/Common/utils/DictUtils.res deleted file mode 100644 index 748ceed51c7..00000000000 --- a/src/Components/Common/utils/DictUtils.res +++ /dev/null @@ -1,26 +0,0 @@ -let setOptionalString = (key, value, payload) => { - if String.trim(value) !== "" { - Js.Dict.set(payload, key, Js.Json.string(value)) - } -} - -let setOptionalNumber = (key, value, payload) => { - switch value { - | Some(v) => Js.Dict.set(payload, key, Js.Json.number(float_of_int(v))) - | None => Js.Dict.set(payload, key, Js.Json.null) - } -} - -let setOptionalFloat = (key, value, payload) => { - switch value { - | Some(v) => Js.Dict.set(payload, key, Js.Json.number(v)) - | None => Js.Dict.set(payload, key, Js.Json.null) - } -} - -let setOptionalBool = (key, value, payload) => { - switch value { - | Some(v) => Js.Dict.set(payload, key, Js.Json.boolean(v)) - | None => Js.Dict.set(payload, key, Js.Json.null) - } -} diff --git a/src/Components/Common/utils/ReactUtils.res b/src/Components/Common/utils/ReactUtils.res deleted file mode 100644 index c83a85853d4..00000000000 --- a/src/Components/Common/utils/ReactUtils.res +++ /dev/null @@ -1,3 +0,0 @@ -let nullUnless = (element, condition) => condition ? element : React.null - -let nullIf = (element, condition) => nullUnless(element, !condition) diff --git a/src/Components/Common/utils/ValidationUtils.res b/src/Components/Common/utils/ValidationUtils.res deleted file mode 100644 index 61a79fbffa2..00000000000 --- a/src/Components/Common/utils/ValidationUtils.res +++ /dev/null @@ -1,22 +0,0 @@ -let isInputInRangeFloat = (minString, maxString, val) => { - let min = Js.Float.fromString(minString) - let max = Js.Float.fromString(maxString) - let value = Js.Option.getWithDefault(min, val) - if value < min || value > max { - Some("Input outside range") - } else { - None - } -} - -let isInputInRangeInt = (min, max, val) => { - switch val { - | Some(value) => - switch (value < min, value > max) { - | (true, _) => Some("Input less than " ++ string_of_int(min)) - | (_, true) => Some("Input greater than maximum") - | _ => None - } - | None => None - } -} diff --git a/src/Components/Common/utils/WindowUtils.res b/src/Components/Common/utils/WindowUtils.res deleted file mode 100644 index e8eb1ceb4dc..00000000000 --- a/src/Components/Common/utils/WindowUtils.res +++ /dev/null @@ -1,9 +0,0 @@ -let confirm = (~onCancel=?, message, f) => - if { - open Webapi.Dom - window -> Window.confirm(message) - } { - f() - } else { - Belt.Option.mapWithDefault(onCancel, (), onCancel => onCancel()) - } diff --git a/src/Components/CriticalCareRecording/ABGAnalysisEditor/CriticalCare__ABGAnalysisEditor.res b/src/Components/CriticalCareRecording/ABGAnalysisEditor/CriticalCare__ABGAnalysisEditor.res deleted file mode 100644 index c3e5a6e7025..00000000000 --- a/src/Components/CriticalCareRecording/ABGAnalysisEditor/CriticalCare__ABGAnalysisEditor.res +++ /dev/null @@ -1,216 +0,0 @@ -open CriticalCare__Types -let str = React.string - -@module("../CriticalCare__API") -external updateDailyRound: (string, string, Js.Json.t, _ => unit, _ => unit) => unit = - "updateDailyRound" - -let string_of_float = data => Belt.Option.mapWithDefault(data, "", Js.Float.toString) -let string_of_int = data => Belt.Option.mapWithDefault(data, "", Js.Int.toString) -let int_of_string = data => data->Belt.Int.fromString -let float_of_string = data => data->Belt.Float.fromString - -type state = { - po2: option, - pco2: option, - pH: option, - hco3: option, - baseExcess: option, - lactate: option, - sodium: option, - potassium: option, - dirty: bool, - saving: bool, -} - -type action = - | SetPO2(option) - | SetPCO2(option) - | SetpH(option) - | SetHCO3(option) - | SetBaseExcess(option) - | SetLactate(option) - | SetSodium(option) - | SetPotassium(option) - | SetSaving - | ClearSaving - -let reducer = (state, action) => { - switch action { - | SetPO2(po2) => {...state, po2: po2, dirty: true} - | SetPCO2(pco2) => {...state, pco2: pco2, dirty: true} - | SetpH(pH) => {...state, pH: pH, dirty: true} - | SetHCO3(hco3) => {...state, hco3: hco3, dirty: true} - | SetBaseExcess(baseExcess) => {...state, baseExcess: baseExcess, dirty: true} - | SetLactate(lactate) => {...state, lactate: lactate, dirty: true} - | SetSodium(sodium) => {...state, sodium: sodium, dirty: true} - | SetPotassium(potassium) => {...state, potassium: potassium, dirty: true} - | SetSaving => {...state, saving: true} - | ClearSaving => {...state, saving: false} - } -} - -let initialState = abg => { - { - po2: ABGAnalysis.po2(abg), - pco2: ABGAnalysis.pco2(abg), - pH: ABGAnalysis.pH(abg), - hco3: ABGAnalysis.hco3(abg), - baseExcess: ABGAnalysis.baseExcess(abg), - lactate: ABGAnalysis.lactate(abg), - sodium: ABGAnalysis.sodium(abg), - potassium: ABGAnalysis.potassium(abg), - saving: false, - dirty: false, - } -} - -let makePayload = state => { - let payload = Js.Dict.empty() - DictUtils.setOptionalNumber("po2", state.po2, payload) - DictUtils.setOptionalNumber("pco2", state.pco2, payload) - DictUtils.setOptionalFloat("ph", state.pH, payload) - DictUtils.setOptionalFloat("hco3", state.hco3, payload) - DictUtils.setOptionalNumber("base_excess", state.baseExcess, payload) - DictUtils.setOptionalFloat("lactate", state.lactate, payload) - DictUtils.setOptionalFloat("sodium", state.sodium, payload) - DictUtils.setOptionalFloat("potassium", state.potassium, payload) - payload -} - -let successCB = (send, updateCB, data) => { - send(ClearSaving) - updateCB(CriticalCare__DailyRound.makeFromJs(data)) -} - -let errorCB = (send, _error) => { - send(ClearSaving) -} - -let saveData = (id, consultationId, state, send, updateCB) => { - send(SetSaving) - updateDailyRound( - consultationId, - id, - Js.Json.object_(makePayload(state)), - successCB(send, updateCB), - errorCB(send), - ) -} - -let getStatus = (min, minText, max, maxText, val) => { - if val >= min && val <= max { - ("Normal", "#059669") - } else if val < min { - (minText, "#DC2626") - } else { - (maxText, "#DC2626") - } -} - - - -@react.component -let make = (~arterialBloodGasAnalysis, ~updateCB, ~id, ~consultationId) => { - let (state, send) = React.useReducer(reducer, initialState(arterialBloodGasAnalysis)) - -
- -
- send(SetPO2(int_of_string(s)))} - getLabel={getStatus(50.0, "Low", 200.0, "High")} - hasError={ValidationUtils.isInputInRangeInt(10, 400, state.po2)} - /> - send(SetPCO2(int_of_string(s)))} - getLabel={getStatus(35.0, "Low", 45.0, "High")} - hasError={ValidationUtils.isInputInRangeInt(10, 200, state.pco2)} - /> - send(SetpH(float_of_string(s)))} - getLabel={getStatus(7.35, "Low", 7.45, "High")} - hasError={ValidationUtils.isInputInRangeFloat("0.0", "10.0", state.pH)} - /> - send(SetHCO3(float_of_string(s)))} - getLabel={getStatus(22.0, "Low", 26.0, "High")} - hasError={ValidationUtils.isInputInRangeFloat("5.0", "80.0", state.hco3)} - /> - send(SetBaseExcess(int_of_string(s)))} - getLabel={getStatus(-2.0, "Low", 2.0, "High")} - hasError={ValidationUtils.isInputInRangeInt(-20, 20, state.baseExcess)} - /> - send(SetLactate(float_of_string(s)))} - getLabel={getStatus(0.0, "Low", 2.0, "High")} - hasError={ValidationUtils.isInputInRangeFloat("0.0", "20.0", state.lactate)} - /> - send(SetSodium(float_of_string(s)))} - getLabel={getStatus(135.0, "Low", 145.0, "High")} - hasError={ValidationUtils.isInputInRangeFloat("100.0", "170.0", state.sodium)} - /> - send(SetPotassium(float_of_string(s)))} - getLabel={getStatus(3.5, "Low", 5.5, "High")} - hasError={ValidationUtils.isInputInRangeFloat("1.0", "10.0", state.potassium)} - /> -
- -
-} diff --git a/src/Components/CriticalCareRecording/ABGAnalysisEditor/DailyRound__ABG.res b/src/Components/CriticalCareRecording/ABGAnalysisEditor/DailyRound__ABG.res deleted file mode 100644 index 82b7e25f7e9..00000000000 --- a/src/Components/CriticalCareRecording/ABGAnalysisEditor/DailyRound__ABG.res +++ /dev/null @@ -1,68 +0,0 @@ -let str = React.string -open CriticalCare__Types - -@react.component -let make = ( - ~arterialBloodGasAnalysis, - ~renderOptionalIntWithIndicators, - ~renderOptionalFloatWithIndicators, -) => { -
- {renderOptionalIntWithIndicators( - "PO2", - ABGAnalysis.po2(arterialBloodGasAnalysis), - 35, - 45, - "Low", - "High", - )} - {renderOptionalFloatWithIndicators( - "pH", - ABGAnalysis.pH(arterialBloodGasAnalysis), - 7.35, - 7.45, - "Low", - "High", - )} - {renderOptionalFloatWithIndicators( - "HCO3", - ABGAnalysis.hco3(arterialBloodGasAnalysis), - 22.0, - 26.0, - "Low", - "High", - )} - {renderOptionalIntWithIndicators( - "Base Excess", - ABGAnalysis.baseExcess(arterialBloodGasAnalysis), - -2, - 2, - "Low", - "High", - )} - {renderOptionalFloatWithIndicators( - "Lactate", - ABGAnalysis.lactate(arterialBloodGasAnalysis), - 0.0, - 2.0, - "Low", - "High", - )} - {renderOptionalFloatWithIndicators( - "Sodium", - ABGAnalysis.sodium(arterialBloodGasAnalysis), - 135.0, - 145.0, - "Low", - "High", - )} - {renderOptionalFloatWithIndicators( - "Potassium", - ABGAnalysis.potassium(arterialBloodGasAnalysis), - 3.5, - 5.5, - "Low", - "High", - )} -
-} diff --git a/src/Components/CriticalCareRecording/BloodSugarEditor/CriticalCare_BloodSugarEditor.res b/src/Components/CriticalCareRecording/BloodSugarEditor/CriticalCare_BloodSugarEditor.res deleted file mode 100644 index 65db7a1bbf8..00000000000 --- a/src/Components/CriticalCareRecording/BloodSugarEditor/CriticalCare_BloodSugarEditor.res +++ /dev/null @@ -1,144 +0,0 @@ -let str = React.string -open CriticalCare__Types - -@module("../CriticalCare__API") -external updateDailyRound: (string, string, Js.Json.t, _ => unit, _ => unit) => unit = - "updateDailyRound" - -type state = { - blood_sugar_level: option, - insulin_intake_dose: option, - insulin_intake_frequency: BloodSugar.frequency, - dirty: bool, - saving: bool, -} - -type action = - | SetBloodSugarLevel(int) - | SetDosage(float) - | SetFrequency(BloodSugar.frequency) - | SetSaving - | ClearSaving - -let reducer = (state, action) => { - switch action { - | SetBloodSugarLevel(blood_sugar_level) => { - ...state, - blood_sugar_level: Some(blood_sugar_level), - dirty: true, - } - | SetDosage(dosage) => {...state, insulin_intake_dose: Some(dosage), dirty: true} - | SetFrequency(frequency) => {...state, insulin_intake_frequency: frequency, dirty: true} - | SetSaving => {...state, saving: true} - | ClearSaving => {...state, saving: false} - } -} - -let getStatus = (min, max, val) => { - if val >= min && val <= max { - ("Normal", "#059669") - } else if val < min { - ("Low", "#DC2626") - } else { - ("High", "#DC2626") - } -} - -let initialState = bloodsugarParameters => { - { - blood_sugar_level: BloodSugar.bloodsugar_level(bloodsugarParameters), - insulin_intake_dose: BloodSugar.dosage(bloodsugarParameters), - insulin_intake_frequency: BloodSugar.frequency(bloodsugarParameters), - saving: false, - dirty: false, - } -} - -let makePayload = state => { - let payload = Js.Dict.empty() - - DictUtils.setOptionalNumber("blood_sugar_level", state.blood_sugar_level, payload) - DictUtils.setOptionalFloat("insulin_intake_dose", state.insulin_intake_dose, payload) - Js.Dict.set( - payload, - "insulin_intake_frequency", - Js.Json.string(BloodSugar.encodeFrequency(state.insulin_intake_frequency)), - ) - payload -} - -let successCB = (send, updateCB, data) => { - send(ClearSaving) - updateCB(CriticalCare__DailyRound.makeFromJs(data)) -} - -let errorCB = (send, _error) => { - send(ClearSaving) -} - -let saveData = (id, consultationId, state, send, updateCB) => { - send(SetSaving) - updateDailyRound( - consultationId, - id, - Js.Json.object_(makePayload(state)), - successCB(send, updateCB), - errorCB(send), - ) -} - -@react.component -let make = (~bloodsugarParameters, ~updateCB, ~id, ~consultationId) => { - let (state, send) = React.useReducer(reducer, initialState(bloodsugarParameters)) - -
-

{str("Blood Sugar")}

-
- send(SetBloodSugarLevel(int_of_string(s)))} - getLabel={getStatus(70.0, 110.0)} - hasError={ValidationUtils.isInputInRangeInt(0, 700, state.blood_sugar_level)} - /> -

{str("Insulin Intake")}

- send(SetDosage(float_of_string(s)))} - getLabel={_ => ("", "#ff0000")} - hasError={ValidationUtils.isInputInRangeFloat("0", "100", state.insulin_intake_dose)} - /> -
- -
- {Js.Array.map( - f => - send(SetFrequency(f))} - />, - [OD, BD, TD, UNKNOWN], - )->React.array} -
-
-
- -
-} diff --git a/src/Components/CriticalCareRecording/BloodSugarEditor/DailyRound__BloodSugar.res b/src/Components/CriticalCareRecording/BloodSugarEditor/DailyRound__BloodSugar.res deleted file mode 100644 index c650e27284d..00000000000 --- a/src/Components/CriticalCareRecording/BloodSugarEditor/DailyRound__BloodSugar.res +++ /dev/null @@ -1,18 +0,0 @@ -let str = React.string -open CriticalCare__Types - -@react.component -let make = (~bloodSugar, ~renderLine, ~renderOptionalIntWithIndicators, ~renderOptionalFloat) => { -
- {renderOptionalIntWithIndicators( - "Blood Sugar Level", - BloodSugar.bloodsugar_level(bloodSugar), - 70, - 110, - "Low", - "High", - )} - {renderOptionalFloat("Dosage", BloodSugar.dosage(bloodSugar))} - {renderLine("Frequency", BloodSugar.frequencyToString(BloodSugar.frequency(bloodSugar)))} -
-} diff --git a/src/Components/CriticalCareRecording/CriticalCareRecording.res b/src/Components/CriticalCareRecording/CriticalCareRecording.res deleted file mode 100644 index acbd4aee531..00000000000 --- a/src/Components/CriticalCareRecording/CriticalCareRecording.res +++ /dev/null @@ -1,4 +0,0 @@ -@react.component -let make = (~id, ~facilityId, ~patientId, ~consultationId, ~preview) => { -
-} diff --git a/src/Components/CriticalCareRecording/CriticalCare__API.tsx b/src/Components/CriticalCareRecording/CriticalCare__API.tsx deleted file mode 100644 index 7bddbf9eaee..00000000000 --- a/src/Components/CriticalCareRecording/CriticalCare__API.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { fireRequestV2 } from "../../Redux/fireRequest"; -import routes from "../../Redux/api"; -import request from "../../Utils/request/request"; - -export const loadDailyRound = ( - consultationId: string, - id: string, - successCB: any = () => null, - errorCB: any = () => null, -) => { - fireRequestV2("getDailyReport", [], {}, successCB, errorCB, { - consultationId, - id, - }); -}; - -export const updateDailyRound = ( - consultationId: string, - id: string, - params: object, - successCB: any = () => null, - errorCB: any = () => null, -) => { - fireRequestV2("updateDailyRound", [], params, successCB, errorCB, { - consultationId, - id, - }); -}; - -export const getAsset = ( - consultationId: string, - setAsset: React.Dispatch>, -) => { - request(routes.listConsultationBeds, { - query: { consultation: consultationId, limit: 1 }, - }).then(({ data }) => { - // here its fetching the ventilator type assets - const assets = data?.results[0].assets_objects?.filter( - (asset) => asset.asset_class == "VENTILATOR", - ); - setAsset(assets?.length || 0); - }); -}; diff --git a/src/Components/CriticalCareRecording/CriticalCare__Index.res b/src/Components/CriticalCareRecording/CriticalCare__Index.res deleted file mode 100644 index 0290728fd82..00000000000 --- a/src/Components/CriticalCareRecording/CriticalCare__Index.res +++ /dev/null @@ -1,210 +0,0 @@ -let str = React.string -open CriticalCare__Types - -let renderLine = (title, value) => { -
- {str(`${title}:`)} - {str(value)} -
-} - -let renderIndicators = (title, value, isMin, isMax, minText, maxText) => { - let indicator = if isMax { - - - {str(maxText)} - - } else if isMin { - - - {str(minText)} - - } else { - - - {str("Normal")} - - } - -
- {str(`${title}:`)} - {str(value)} - {indicator} -
-} - -let renderOptionalIntWithIndicators = (title, value, min, max, minText, maxText) => { - Belt.Option.mapWithDefault(value, React.null, v => { - renderIndicators(title, string_of_int(v), v < min, v > max, minText, maxText) - }) -} - -let renderOptionalFloatWithIndicators = (title, value, min, max, minText, maxText) => { - Belt.Option.mapWithDefault(value, React.null, v => - renderIndicators(title, Js.Float.toString(v), v < min, v > max, minText, maxText) - ) -} - -let renderIntWithIndicators = (title, value, min, max, minText, maxText) => { - renderIndicators(title, string_of_int(value), value < min, value > max, minText, maxText) -} - -let renderFloatWithIndicators = (title, value, min, max, minText, maxText) => { - renderIndicators(title, Js.Float.toString(value), value < min, value > max, minText, maxText) -} - -let renderOptionalInt = (title, value) => { - Belt.Option.mapWithDefault(value, React.null, v => renderLine(title, string_of_int(v))) -} - -let renderOptionalFloat = (title, value) => { - Belt.Option.mapWithDefault(value, React.null, v => renderLine(title, Js.Float.toString(v))) -} - -let renderOptionalBool = (title, value) => { - Belt.Option.mapWithDefault(value, React.null, v => renderLine(title, v ? "Yes" : "No")) -} - -let renderOptionalDescription = (title, value) => { - switch value { - | Some(v) => -
- {str(`${title}:`)} - {str(v)} -
- | None => React.null - } -} - -let title = text => { -
{str(text)}
-} - -@genType @react.component -let make = ( - ~id, - ~facilityId, - ~patientId, - ~consultationId, - ~dailyRound: CriticalCare__DailyRound.t, -) => { - let neurologicalMonitoring = DailyRound.neurologicalMonitoring(dailyRound) - let hemodynamicParameter = DailyRound.hemodynamicParameters(dailyRound) - let nursingCare = DailyRound.nursingCare(dailyRound) - let arterialBloodGasAnalysis = DailyRound.arterialBloodGasAnalysis(dailyRound) - let ioBalance = DailyRound.ioBalance(dailyRound) - let dialysis = DailyRound.dialysis(dailyRound) - let pressureSoreParameter = DailyRound.pressureSoreParameter(dailyRound) - let bloodSugar = DailyRound.bloodSugar(dailyRound) - let ventilatorParameters = DailyRound.ventilatorParameters(dailyRound) - let medicine = DailyRound.medicine(dailyRound) - let others = DailyRound.others(dailyRound) - -
-
- - {str("Go back to Consultation")} - -
-
-
-

{str("Consultation Update")}

-
- - -
-
-
- - -
-
-
- - -
-
-
- - -
-
-
- - -
-
-
- - -
-
-
- - -
-
-
- - -
-
-
- - -
-
-
- - ()} - id={id} - consultationId={consultationId} - /> -
-
-
- - -
-
-
- - -
-
-
-
-
-} diff --git a/src/Components/CriticalCareRecording/CriticalCare__Root.res b/src/Components/CriticalCareRecording/CriticalCare__Root.res deleted file mode 100644 index 33f2564096c..00000000000 --- a/src/Components/CriticalCareRecording/CriticalCare__Root.res +++ /dev/null @@ -1,47 +0,0 @@ -@module("./CriticalCare__API") -external loadDailyRound: (string, string, _ => unit, _ => unit) => unit = "loadDailyRound" - -open CriticalCare__Types -let str = React.string - -type state = { - loading: bool, - dailyRound: option, -} - -let successCB = (setState, dailyRound) => { - setState(_state => {loading: false, dailyRound: Some(DailyRound.makeFromJs(dailyRound))}) -} - -let errorCB = (setState, _error) => { - setState(_state => {dailyRound: None, loading: false}) -} - -let loadData = (setState, consultationId, id) => { - loadDailyRound(consultationId, id, successCB(setState), errorCB(setState)) -} - -@react.component -let make = (~id, ~facilityId, ~patientId, ~consultationId, ~preview) => { - let (state, setState) = React.useState(() => {loading: true, dailyRound: None}) - React.useEffect1(() => { - loadData(setState, consultationId, id) - None - }, [id]) - -
- {state.loading - ? - : switch state.dailyRound { - | Some(dailyRound) => - preview - ? - : - - | None => { - Notifications.error({msg: "No Data "}) - <> - } - }} -
-} diff --git a/src/Components/CriticalCareRecording/DailyRound__Medicines.res b/src/Components/CriticalCareRecording/DailyRound__Medicines.res deleted file mode 100644 index ce143c24d29..00000000000 --- a/src/Components/CriticalCareRecording/DailyRound__Medicines.res +++ /dev/null @@ -1,50 +0,0 @@ -let str = React.string - -@react.component -let make = (~prescriptions) => { -
- {ArrayUtils.isEmpty(prescriptions) - ?
{str("No Medicines Prescribed")}
- :
-
-
- - - - - - - - - {Js.Array.mapi((p, index) => { - - - - - - }, prescriptions)->React.array} -
- {str("Medicine")} - - {str("Dosage")} - - {str("Days")} -
- {str(Prescription__Prescription.medicine(p))} - - {str(Prescription__Prescription.dosage(p))} - - {str(string_of_int(Prescription__Prescription.days(p)))} -
-
-
-
} -
-} diff --git a/src/Components/CriticalCareRecording/DialysisEditor/CriticalCare_DialysisEditor.res b/src/Components/CriticalCareRecording/DialysisEditor/CriticalCare_DialysisEditor.res deleted file mode 100644 index bb10cf38a69..00000000000 --- a/src/Components/CriticalCareRecording/DialysisEditor/CriticalCare_DialysisEditor.res +++ /dev/null @@ -1,116 +0,0 @@ -let str = React.string -open CriticalCare__Types - -@module("../CriticalCare__API") -external updateDailyRound: (string, string, Js.Json.t, _ => unit, _ => unit) => unit = - "updateDailyRound" - -type state = { - dialysis_fluid_balance: option, - dialysis_net_balance: option, - dirty: bool, - saving: bool, -} - -type action = - | SetFluidBalance(int) - | SetNetBalance(int) - | SetSaving - | ClearSaving - -let reducer = (state, action) => { - switch action { - | SetFluidBalance(fluid_balance) => { - ...state, - dialysis_fluid_balance: Some(fluid_balance), - dirty: true, - } - | SetNetBalance(net_balance) => { - ...state, - dialysis_net_balance: Some(net_balance), - dirty: true, - } - | SetSaving => {...state, saving: true} - | ClearSaving => {...state, saving: false} - } -} - -let initialState = dialysis_parameters => { - { - dialysis_fluid_balance: Dialysis.fluid_balance(dialysis_parameters), - dialysis_net_balance: Dialysis.net_balance(dialysis_parameters), - saving: false, - dirty: false, - } -} - -let makePayload = state => { - let payload = Js.Dict.empty() - - DictUtils.setOptionalNumber("dialysis_fluid_balance", state.dialysis_fluid_balance, payload) - DictUtils.setOptionalNumber("dialysis_net_balance", state.dialysis_net_balance, payload) - - payload -} - -let successCB = (send, updateCB, data) => { - send(ClearSaving) - updateCB(CriticalCare__DailyRound.makeFromJs(data)) -} - -let errorCB = (send, _error) => { - send(ClearSaving) -} - -let saveData = (id, consultationId, state, send, updateCB) => { - send(SetSaving) - updateDailyRound( - consultationId, - id, - Js.Json.object_(makePayload(state)), - successCB(send, updateCB), - errorCB(send), - ) -} - - -@react.component -let make = (~dialysisParameters, ~updateCB, ~id, ~consultationId) => { - let (state, send) = React.useReducer(reducer, initialState(dialysisParameters)) - -
-

{str("Dialysis")}

-
-
- send(SetFluidBalance(int_of_string(s)))} - getLabel={_ => ("", "#ff0000")} - hasError={ValidationUtils.isInputInRangeInt(0, 5000, state.dialysis_fluid_balance)} - /> - send(SetNetBalance(int_of_string(s)))} - getLabel={_ => ("", "#ff0000")} - hasError={ValidationUtils.isInputInRangeInt(0, 5000, state.dialysis_net_balance)} - /> -
- -
-
-} diff --git a/src/Components/CriticalCareRecording/DialysisEditor/DailyRound__Dialysis.res b/src/Components/CriticalCareRecording/DialysisEditor/DailyRound__Dialysis.res deleted file mode 100644 index c023acb1636..00000000000 --- a/src/Components/CriticalCareRecording/DialysisEditor/DailyRound__Dialysis.res +++ /dev/null @@ -1,10 +0,0 @@ -let str = React.string -open CriticalCare__Types - -@react.component -let make = (~dialysis, ~renderOptionalInt) => { -
- {renderOptionalInt("Fluid Balance", Dialysis.fluid_balance(dialysis))} - {renderOptionalInt("Net Balance", Dialysis.net_balance(dialysis))} -
-} diff --git a/src/Components/CriticalCareRecording/HemodynamicParameters/CriticalCare__HemodynamicParametersEditor.res b/src/Components/CriticalCareRecording/HemodynamicParameters/CriticalCare__HemodynamicParametersEditor.res deleted file mode 100644 index 47cc040440e..00000000000 --- a/src/Components/CriticalCareRecording/HemodynamicParameters/CriticalCare__HemodynamicParametersEditor.res +++ /dev/null @@ -1,358 +0,0 @@ -open CriticalCare__Types -let str = React.string - -@module("../CriticalCare__API") -external updateDailyRound: (string, string, Js.Json.t, _ => unit, _ => unit) => unit = - "updateDailyRound" - -let fahrenheitToCelcius = (temp: option) => { - switch temp { - | Some(x) => - Js.Float.toFixedWithPrecision((x -. 32.0) *. (5.0 /. 9.0), ~digits=2)->Belt.Float.fromString - | None => None - } -} -let celciusToFahrenheit = (temp: option) => { - switch temp { - | Some(x) => - Js.Float.toFixedWithPrecision(x *. 9.0 /. 5.0 +. 32.0, ~digits=2)->Belt.Float.fromString - | None => None - } -} - -type state = { - pain: array, - systolic: option, - diastolic: option, - pulse: option, - spo2: option, - temperature: option, - resp: option, - rhythm: HemodynamicParameters.rhythm, - rhythmDetails: string, - tempInCelcius: bool, - dirty: bool, - saving: bool, -} - -type action = - | SetPain(array) - | SetSystolic(int) - | SetDiastolic(int) - | SetPulse(int) - | SetSPO2(int) - | SetTemperature(float) - | ToggleTemperatureUnit - | SetResp(int) - | SetRhythm(HemodynamicParameters.rhythm) - | SetRhythmDetails(string) - | SetSaving - | ClearSaving - -let reducer = (state, action) => { - switch action { - | SetPain(pain) => { - ...state, - pain, - dirty: true, - } - | SetSystolic(systolic) => { - ...state, - systolic: Some(systolic), - dirty: true, - } - | SetDiastolic(diastolic) => { - ...state, - diastolic: Some(diastolic), - dirty: true, - } - | SetPulse(pulse) => {...state, pulse: Some(pulse), dirty: true} - | SetSPO2(spo2) => {...state, spo2: Some(spo2), dirty: true} - | SetTemperature(temperature) => { - ...state, - temperature: Some(temperature), - dirty: true, - } - | ToggleTemperatureUnit => { - ...state, - temperature: state.tempInCelcius - ? state.temperature->celciusToFahrenheit - : state.temperature->fahrenheitToCelcius, - tempInCelcius: !state.tempInCelcius, - } - | SetResp(resp) => { - ...state, - resp: Some(resp), - dirty: true, - } - | SetRhythm(rhythm) => {...state, rhythm, dirty: true} - | SetRhythmDetails(rhythmDetails) => { - ...state, - rhythmDetails, - dirty: true, - } - | SetSaving => {...state, saving: true} - | ClearSaving => {...state, saving: false} - } -} - -let initialState = hdp => { - let bp = HemodynamicParameters.bp(hdp) - - { - pain: HemodynamicParameters.pain(hdp), - systolic: Belt.Option.map(bp, HemodynamicParameters.systolic), - diastolic: Belt.Option.map(bp, HemodynamicParameters.diastolic), - pulse: HemodynamicParameters.pulse(hdp), - spo2: HemodynamicParameters.spo2(hdp), - temperature: HemodynamicParameters.temperature(hdp), - resp: HemodynamicParameters.resp(hdp), - rhythm: HemodynamicParameters.rhythm(hdp), - rhythmDetails: Belt.Option.getWithDefault(HemodynamicParameters.rhythmDetails(hdp), ""), - tempInCelcius: false, - saving: false, - dirty: false, - } -} - -let computeMeanArterialPressure = (systolic, diastolic) => { - float_of_int(systolic + 2 * diastolic) /. 3.0 -} - -let makePainField = p => { - let payload = Js.Dict.empty() - Js.Dict.set(payload, "region", Js.Json.string(Pain.endcodeRegion(p))) - Js.Dict.set(payload, "scale", Js.Json.number(float_of_int(Pain.scale(p)))) - Js.Dict.set(payload, "description", Js.Json.string(p.description)) - payload -} - -let makeBpPayload = (systolic, diastolic) => { - let payload = Js.Dict.empty() - Js.Dict.set(payload, "systolic", Js.Json.number(float_of_int(systolic))) - Js.Dict.set(payload, "diastolic", Js.Json.number(float_of_int(diastolic))) - Js.Dict.set(payload, "mean", Js.Json.number(computeMeanArterialPressure(systolic, diastolic))) - payload -} - -let makePayload = state => { - let payload = Js.Dict.empty() - - switch (state.systolic, state.diastolic) { - | (Some(systolic), Some(diastolic)) => - Js.Dict.set(payload, "bp", Js.Json.object_(makeBpPayload(systolic, diastolic))) - | (_, _) => () - } - Js.Dict.set( - payload, - "pain_scale_enhanced", - Js.Json.objectArray(Js.Array.map(makePainField, state.pain)), - ) - DictUtils.setOptionalNumber("pulse", state.pulse, payload) - DictUtils.setOptionalNumber("ventilator_spo2", state.spo2, payload) - DictUtils.setOptionalFloat( - "temperature", - state.tempInCelcius ? state.temperature->celciusToFahrenheit : state.temperature, - payload, - ) - DictUtils.setOptionalNumber("resp", state.resp, payload) - Js.Dict.set(payload, "rhythm", Js.Json.string(HemodynamicParameters.encodeRhythm(state.rhythm))) - DictUtils.setOptionalString("rhythm_detail", state.rhythmDetails, payload) - payload -} -let successCB = (send, updateCB, data) => { - send(ClearSaving) - updateCB(CriticalCare__DailyRound.makeFromJs(data)) -} - -let errorCB = (send, _error) => { - send(ClearSaving) -} - -let saveData = (id, consultationId, state, send, updateCB) => { - send(SetSaving) - updateDailyRound( - consultationId, - id, - Js.Json.object_(makePayload(state)), - successCB(send, updateCB), - errorCB(send), - ) -} - -let getStatus = (min, minText, max, maxText, val) => { - switch (val >= min, val <= max) { - | (true, true) => ("Normal", "#059669") - | (true, false) => (maxText, "#DC2626") - | _ => (minText, "#DC2626") - } -} - -let meanArterialPressure = state => { - switch (state.systolic, state.diastolic) { - | (Some(systolic), Some(diastolic)) => computeMeanArterialPressure(systolic, diastolic) - | (_, _) => 0.0 - } -} - -let getPainStatus = val => { - if val == 0.0 { - ("No Pain", "#059669") - } else if val < 4.0 { - ("Minute", "#ff3f00") - } else if val < 8.0 { - ("Moderate", "#ff002c") - } else { - ("Severe", "#de000c") - } -} - -@react.component -let make = (~hemodynamicParameter, ~updateCB, ~id, ~consultationId) => { - let (state, send) = React.useReducer(reducer, initialState(hemodynamicParameter)) - -
-

{str("Vitals")}

-
-
-
-

{str("BP (mm hg)")}

-

- {str( - `Mean Arterial Pressure: ${Js.Float.toFixedWithPrecision( - meanArterialPressure(state), - ~digits=2, - )}`, - )} -

-
- send(SetSystolic(int_of_string(s)))} - getLabel={getStatus(100.0, "Low", 140.0, "High")} - hasError={ValidationUtils.isInputInRangeInt(0, 250, state.systolic)} - /> - send(SetDiastolic(int_of_string(s)))} - getLabel={getStatus(50.0, "Low", 90.0, "High")} - hasError={ValidationUtils.isInputInRangeInt(30, 180, state.diastolic)} - /> - send(SetSPO2(int_of_string(s)))} - getLabel={getStatus(90.0, "Low", 100.0, "High")} - hasError={ValidationUtils.isInputInRangeInt(0, 100, state.spo2)} - /> -
-
- ToggleTemperatureUnit->send}> - {state.tempInCelcius ? "C"->str : "F"->str} -
} - start={state.tempInCelcius ? "35" : "95"} - end={state.tempInCelcius ? "41" : "106"} - interval={"10"} - step={0.1} - value={Belt.Option.mapWithDefault(state.temperature, "", Js.Float.toString)} - setValue={s => send(SetTemperature(float_of_string(s)))} - getLabel={state.tempInCelcius - ? getStatus(36.4, "Low", 37.5, "High") - : getStatus(97.6, "Low", 99.6, "High")} - hasError={state.tempInCelcius - ? ValidationUtils.isInputInRangeFloat("35", "41", state.temperature) - : ValidationUtils.isInputInRangeFloat("95", "106", state.temperature)} - /> - send(SetResp(int_of_string(s)))} - getLabel={getStatus(12.0, "Low", 16.0, "High")} - hasError={ValidationUtils.isInputInRangeInt(0, 150, state.resp)} - /> -
-
-

{str("Pain")}

-

{str("Mark region and intensity of pain")}

-
-
- { - send(SetPain(data)) - }} - id={id} - consultationId={consultationId} - /> -
- send(SetPulse(int_of_string(s)))} - getLabel={getStatus(40.0, "Bradycardia", 100.0, "Tachycardia")} - hasError={ValidationUtils.isInputInRangeInt(0, 200, state.pulse)} - /> -
- -
- {Js.Array.map( - r => - send(SetRhythm(r))} - />, - [Regular, IrRegular, UNKNOWN], - )->React.array} -
-
-
- -