From 02432da99a5b4e1ef7f683ec31125f2b48da9a1f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 19:59:21 +0530 Subject: [PATCH 01/30] fix(Income Tax Computation): include all tax components under Total Tax Deducted (backport #2607) (#2641) Co-authored-by: Aysha <74527579+AyshaHakeem@users.noreply.github.com> --- .../income_tax_computation.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/hrms/payroll/report/income_tax_computation/income_tax_computation.py b/hrms/payroll/report/income_tax_computation/income_tax_computation.py index d6a814ed23..f5e420e0ed 100644 --- a/hrms/payroll/report/income_tax_computation/income_tax_computation.py +++ b/hrms/payroll/report/income_tax_computation/income_tax_computation.py @@ -456,6 +456,20 @@ def get_data_for_eval(self, emp: str, emp_details: dict) -> tuple: return salary_slip.whitelisted_globals, eval_locals def get_total_deducted_tax(self): + SalaryComponent = frappe.qb.DocType("Salary Component") + tax_components = ( + frappe.qb.from_(SalaryComponent) + .select(SalaryComponent.name) + .where( + (SalaryComponent.is_income_tax_component == 1) + | (SalaryComponent.variable_based_on_taxable_salary == 1) + ) + .where(SalaryComponent.type == "Deduction") + .where(SalaryComponent.disabled == 0) + ).run(pluck="name") + if not tax_components: + return [] + self.add_column("Total Tax Deducted") ss = frappe.qb.DocType("Salary Slip") @@ -468,8 +482,8 @@ def get_total_deducted_tax(self): .select(ss.employee, Sum(ss_ded.amount).as_("amount")) .where(ss.docstatus == 1) .where(ss.employee.isin(list(self.employees.keys()))) + .where(ss_ded.salary_component.isin(tax_components)) .where(ss_ded.parentfield == "deductions") - .where(ss_ded.variable_based_on_taxable_salary == 1) .where(ss.start_date >= self.payroll_period_start_date) .where(ss.end_date <= self.payroll_period_end_date) .groupby(ss.employee) From 8c801ef58643430ce4167040b525f6f75863d508 Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Thu, 16 Jan 2025 13:11:40 +0530 Subject: [PATCH 02/30] fix: fetch designation in job applicant from job opening (cherry picked from commit 09eed053e0aa2143fe9d6eac9788d3551ac05781) # Conflicts: # hrms/hr/doctype/job_applicant/job_applicant.json --- hrms/hr/doctype/job_applicant/job_applicant.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hrms/hr/doctype/job_applicant/job_applicant.json b/hrms/hr/doctype/job_applicant/job_applicant.json index c88f4f538e..bb99941680 100644 --- a/hrms/hr/doctype/job_applicant/job_applicant.json +++ b/hrms/hr/doctype/job_applicant/job_applicant.json @@ -183,6 +183,7 @@ "fieldtype": "Column Break" }, { + "fetch_from": "job_title.designation", "fetch_if_empty": 1, "fieldname": "designation", "fieldtype": "Link", @@ -194,7 +195,11 @@ "idx": 1, "index_web_pages_for_search": 1, "links": [], +<<<<<<< HEAD "modified": "2023-09-14 17:03:48.838409", +======= + "modified": "2025-01-16 13:06:05.312255", +>>>>>>> 09eed053 (fix: fetch designation in job applicant from job opening) "modified_by": "Administrator", "module": "HR", "name": "Job Applicant", From 48e5128a3f58f3aa81cbd62151fc08cfdd67bea7 Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Fri, 10 Jan 2025 14:17:31 +0530 Subject: [PATCH 03/30] fix: create single leave ledger entry for encashment if leave is carry forward type. (cherry picked from commit acd618f84c5d6458b1c41947bd995305e5b56a71) # Conflicts: # hrms/hr/doctype/leave_encashment/leave_encashment.py --- hrms/hr/doctype/leave_encashment/leave_encashment.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hrms/hr/doctype/leave_encashment/leave_encashment.py b/hrms/hr/doctype/leave_encashment/leave_encashment.py index 66481f6bea..e25fad8bb6 100644 --- a/hrms/hr/doctype/leave_encashment/leave_encashment.py +++ b/hrms/hr/doctype/leave_encashment/leave_encashment.py @@ -205,14 +205,17 @@ def create_leave_ledger_entry(self, submit=True): to_date = leave_allocation.get("to_date") +<<<<<<< HEAD can_expire = not frappe.db.get_value("Leave Type", self.leave_type, "is_carry_forward") +======= + can_expire = not frappe.db.get_value("Leave Type",self.leave_type,"is_carry_forward") +>>>>>>> acd618f8 (fix: create single leave ledger entry for encashment if leave is carry forward type.) if to_date < getdate() and can_expire: args = frappe._dict( leaves=self.encashment_days, from_date=to_date, to_date=to_date, is_carry_forward=0 ) create_leave_ledger_entry(self, args, submit) - def create_leave_encashment(leave_allocation): """Creates leave encashment for the given allocations""" for allocation in leave_allocation: From dea0135914302fe20aa03b127da808a8b9bf2a52 Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Fri, 10 Jan 2025 15:01:05 +0530 Subject: [PATCH 04/30] chore: fixed linter issue (cherry picked from commit de06a25ad4668fe24015c24d390d8e861ebd0898) # Conflicts: # hrms/hr/doctype/leave_encashment/leave_encashment.py --- hrms/hr/doctype/leave_encashment/leave_encashment.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hrms/hr/doctype/leave_encashment/leave_encashment.py b/hrms/hr/doctype/leave_encashment/leave_encashment.py index e25fad8bb6..6db6b1425a 100644 --- a/hrms/hr/doctype/leave_encashment/leave_encashment.py +++ b/hrms/hr/doctype/leave_encashment/leave_encashment.py @@ -205,17 +205,22 @@ def create_leave_ledger_entry(self, submit=True): to_date = leave_allocation.get("to_date") +<<<<<<< HEAD <<<<<<< HEAD can_expire = not frappe.db.get_value("Leave Type", self.leave_type, "is_carry_forward") ======= can_expire = not frappe.db.get_value("Leave Type",self.leave_type,"is_carry_forward") >>>>>>> acd618f8 (fix: create single leave ledger entry for encashment if leave is carry forward type.) +======= + can_expire = not frappe.db.get_value("Leave Type", self.leave_type, "is_carry_forward") +>>>>>>> de06a25a (chore: fixed linter issue) if to_date < getdate() and can_expire: args = frappe._dict( leaves=self.encashment_days, from_date=to_date, to_date=to_date, is_carry_forward=0 ) create_leave_ledger_entry(self, args, submit) + def create_leave_encashment(leave_allocation): """Creates leave encashment for the given allocations""" for allocation in leave_allocation: From 853ddadc0ce0e99f68d97b8b2ae175a8a5d5da54 Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Mon, 13 Jan 2025 17:42:27 +0530 Subject: [PATCH 05/30] chore: test creation of leave ledger entries depending on leave type while creating leave encashment (cherry picked from commit 2a1632e6e54ad59e0916555034ce70d3c50574ce) --- .../leave_encashment/test_leave_encashment.py | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/hrms/hr/doctype/leave_encashment/test_leave_encashment.py b/hrms/hr/doctype/leave_encashment/test_leave_encashment.py index a315fcf846..28c555d79d 100644 --- a/hrms/hr/doctype/leave_encashment/test_leave_encashment.py +++ b/hrms/hr/doctype/leave_encashment/test_leave_encashment.py @@ -259,3 +259,91 @@ def test_creation_of_leave_ledger_entry_on_submit(self): frappe.db.delete("Additional Salary", {"ref_docname": leave_encashment.name}) leave_encashment.cancel() self.assertFalse(frappe.db.exists("Leave Ledger Entry", {"transaction_name": leave_encashment.name})) + + @set_holiday_list("_Test Leave Encashment", "_Test Company") + def test_creation_of_leave_ledger_entry_after_leave_period_expiry(self): + frappe.db.delete("Leave Period", {"name": self.leave_period.name}) + # create new leave period that has end date of yesterday + start_date = add_days(getdate(), -30) + end_date = add_days(getdate(), -1) + self.leave_period = create_leave_period(start_date, end_date, "_Test Company") + + # case 1: leave type carry forwards + frappe.db.set_value( + "Leave Type", + self.leave_type, + { + "is_carry_forward": 1, + }, + ) + + leave_policy = frappe.get_value("Leave Policy", {"title": "Test Leave Policy"}, "name") + data = { + "assignment_based_on": "Leave Period", + "leave_policy": leave_policy, + "leave_period": self.leave_period.name, + } + employee = make_employee("test_employee2_encashment@example.com", company="_Test Company") + create_assignment_for_multiple_employees([employee], frappe._dict(data)) + + make_salary_structure( + "Salary Structure for Encashment", + "Monthly", + employee, + other_details={"leave_encashment_amount_per_day": 50}, + ) + + leave_encashment = frappe.get_doc( + { + "doctype": "Leave Encashment", + "employee": employee, + "leave_type": self.leave_type, + "leave_period": self.leave_period.name, + "encashment_date": self.leave_period.to_date, + "currency": "INR", + } + ).insert() + leave_encashment.submit() + # check if single leave ledger entry is created of negative value + self.assertEqual(frappe.get_value("Leave Type", self.leave_type, "is_carry_forward"), 1) + leave_ledger_entry = frappe.get_all( + "Leave Ledger Entry", fields="*", filters={"transaction_name": leave_encashment.name} + ) + self.assertEqual(len(leave_ledger_entry), 1) + self.assertEqual(leave_ledger_entry[0].leaves, leave_encashment.encashment_days * -1) + + # case 2: leave type does not carry forward + # cancel previous encashment + frappe.db.delete("Additional Salary", {"ref_docname": leave_encashment.name}) + leave_encashment.cancel() + # set leave type to not carry forward + frappe.db.set_value( + "Leave Type", + self.leave_type, + { + "is_carry_forward": 0, + }, + ) + # create leave encashment + new_leave_encashment = frappe.get_doc( + { + "doctype": "Leave Encashment", + "employee": employee, + "leave_type": self.leave_type, + "leave_period": self.leave_period.name, + "encashment_date": self.leave_period.to_date, + "currency": "INR", + } + ).insert() + new_leave_encashment.submit() + # check if two leave ledger entries are created + self.assertEqual(frappe.get_value("Leave Type", self.leave_type, "is_carry_forward"), 0) + leave_ledger_entry = frappe.get_all( + "Leave Ledger Entry", + fields="*", + filters={"transaction_name": new_leave_encashment.name}, + order_by="leaves", + ) + self.assertEqual(len(leave_ledger_entry), 2) + self.assertEqual(leave_ledger_entry[0].leaves, new_leave_encashment.encashment_days * -1) + self.assertEqual(leave_ledger_entry[1].leaves, new_leave_encashment.encashment_days * 1) From 2e0c35ea8c6c7c98103bffffa806e3df80b57c9a Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Wed, 15 Jan 2025 15:17:20 +0530 Subject: [PATCH 06/30] chore: better test scenarios for encashments created after leave period (cherry picked from commit ebf0545cfbb5bc5dbf31b07dfdecda7b1fa69a1c) --- .../leave_encashment/test_leave_encashment.py | 114 ++++++++++-------- 1 file changed, 66 insertions(+), 48 deletions(-) diff --git a/hrms/hr/doctype/leave_encashment/test_leave_encashment.py b/hrms/hr/doctype/leave_encashment/test_leave_encashment.py index 28c555d79d..d43b2ac50f 100644 --- a/hrms/hr/doctype/leave_encashment/test_leave_encashment.py +++ b/hrms/hr/doctype/leave_encashment/test_leave_encashment.py @@ -8,6 +8,8 @@ from erpnext.setup.doctype.employee.test_employee import make_employee from erpnext.setup.doctype.holiday_list.test_holiday_list import set_holiday_list +from hrms.hr.doctype.leave_allocation.leave_allocation import get_unused_leaves +from hrms.hr.doctype.leave_ledger_entry.leave_ledger_entry import process_expired_allocation from hrms.hr.doctype.leave_period.test_leave_period import create_leave_period from hrms.hr.doctype.leave_policy.test_leave_policy import create_leave_policy from hrms.hr.doctype.leave_policy_assignment.leave_policy_assignment import ( @@ -261,19 +263,77 @@ def test_creation_of_leave_ledger_entry_on_submit(self): self.assertFalse(frappe.db.exists("Leave Ledger Entry", {"transaction_name": leave_encashment.name})) @set_holiday_list("_Test Leave Encashment", "_Test Company") - def test_creation_of_leave_ledger_entry_after_leave_period_expiry(self): + def test_unused_leaves_after_leave_encashment_for_carry_forwarding_leave_type(self): + employee = make_employee("test_employee2_encashment@example.com", company="_Test Company") + # allocated 10 leaves, encashed 5 + leave_encashment = self.get_encashment_created_after_leave_period( + employee, is_carry_forward=1, encashment_days=5 + ) + # check if unused leaves are 5 before processing expired allocation runs + unused_leaves = get_unused_leaves( + employee, self.leave_type, self.leave_period.from_date, self.leave_period.to_date + ) + self.assertEqual(unused_leaves, 5) + + # check if a single leave ledger entry is created + self.assertEqual(frappe.get_value("Leave Type", self.leave_type, "is_carry_forward"), 1) + leave_ledger_entry = frappe.get_all( + "Leave Ledger Entry", fields=["leaves"], filters={"transaction_name": leave_encashment.name} + ) + self.assertEqual(len(leave_ledger_entry), 1) + self.assertEqual(leave_ledger_entry[0].leaves, leave_encashment.encashment_days * -1) + + # check if unused leaves are 5 after processing expired allocation runs + process_expired_allocation() + unused_leaves = get_unused_leaves( + employee, self.leave_type, self.leave_period.from_date, self.leave_period.to_date + ) + self.assertEqual(unused_leaves, 5) + + @set_holiday_list("_Test Leave Encashment", "_Test Company") + def test_leave_expiry_after_leave_encashment_for_non_carry_forwarding_leave_type(self): + employee = make_employee("test_employee3_encashment@example.com", company="_Test Company") + # allocated 10 leaves, encashed 3 + + leave_encashment = self.get_encashment_created_after_leave_period( + employee, is_carry_forward=0, encashment_days=3 + ) + # when leave encashment is created after leave allocation period is over, + # it's assumed that process expired allocation has expired the leaves, + # hence a reverse ledger entry should be created for the encashment + # check if two leave ledger entries are created + self.assertEqual(frappe.get_value("Leave Type", self.leave_type, "is_carry_forward"), 0) + leave_ledger_entry = frappe.get_all( + "Leave Ledger Entry", + fields="*", + filters={"transaction_name": leave_encashment.name}, + order_by="leaves", + ) + self.assertEqual(len(leave_ledger_entry), 2) + self.assertEqual(leave_ledger_entry[0].leaves, leave_encashment.encashment_days * -1) + self.assertEqual(leave_ledger_entry[1].leaves, leave_encashment.encashment_days * 1) + + # check if 10 leaves are expired after processing expired allocation runs + process_expired_allocation() + + expired_leaves = frappe.get_value( + "Leave Ledger Entry", + {"employee": employee, "leave_type": self.leave_type, "is_expired": 1}, + "leaves", + ) + self.assertEqual(expired_leaves, -10) + + def get_encashment_created_after_leave_period(self, employee, is_carry_forward, encashment_days): frappe.db.delete("Leave Period", {"name": self.leave_period.name}) # create new leave period that has end date of yesterday start_date = add_days(getdate(), -30) end_date = add_days(getdate(), -1) self.leave_period = create_leave_period(start_date, end_date, "_Test Company") - - # case 1: leave type carry forwards frappe.db.set_value( "Leave Type", self.leave_type, { - "is_carry_forward": 1, + "is_carry_forward": is_carry_forward, }, ) @@ -283,7 +343,6 @@ def test_creation_of_leave_ledger_entry_after_leave_period_expiry(self): "leave_policy": leave_policy, "leave_period": self.leave_period.name, } - employee = make_employee("test_employee2_encashment@example.com", company="_Test Company") create_assignment_for_multiple_employees([employee], frappe._dict(data)) make_salary_structure( @@ -300,50 +359,9 @@ def test_creation_of_leave_ledger_entry_after_leave_period_expiry(self): "leave_type": self.leave_type, "leave_period": self.leave_period.name, "encashment_date": self.leave_period.to_date, + "encashment_days": encashment_days, "currency": "INR", } ).insert() leave_encashment.submit() - # check if single leave ledger entry is created of negative value - self.assertEqual(frappe.get_value("Leave Type", self.leave_type, "is_carry_forward"), 1) - leave_ledger_entry = frappe.get_all( - "Leave Ledger Entry", fields="*", filters={"transaction_name": leave_encashment.name} - ) - self.assertEqual(len(leave_ledger_entry), 1) - self.assertEqual(leave_ledger_entry[0].leaves, leave_encashment.encashment_days * -1) - - # case 2: leave type does not carry forward - # cancel previous encashment - frappe.db.delete("Additional Salary", {"ref_docname": leave_encashment.name}) - leave_encashment.cancel() - # set leave type to not carry forward - frappe.db.set_value( - "Leave Type", - self.leave_type, - { - "is_carry_forward": 0, - }, - ) - # create leave encashment - new_leave_encashment = frappe.get_doc( - { - "doctype": "Leave Encashment", - "employee": employee, - "leave_type": self.leave_type, - "leave_period": self.leave_period.name, - "encashment_date": self.leave_period.to_date, - "currency": "INR", - } - ).insert() - new_leave_encashment.submit() - # check if two leave ledger entries are created - self.assertEqual(frappe.get_value("Leave Type", self.leave_type, "is_carry_forward"), 0) - leave_ledger_entry = frappe.get_all( - "Leave Ledger Entry", - fields="*", - filters={"transaction_name": new_leave_encashment.name}, - order_by="leaves", - ) - self.assertEqual(len(leave_ledger_entry), 2) - self.assertEqual(leave_ledger_entry[0].leaves, new_leave_encashment.encashment_days * -1) - self.assertEqual(leave_ledger_entry[1].leaves, new_leave_encashment.encashment_days * 1) + return leave_encashment From b3a34f8d89379cc9c96673768a665dd447a4784d Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 16 Jan 2025 19:38:31 +0530 Subject: [PATCH 07/30] fix: translation in payroll (backport #2644) (#2656) Co-authored-by: mahsem <137205921+mahsem@users.noreply.github.com> --- hrms/payroll/doctype/salary_slip/salary_slip.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hrms/payroll/doctype/salary_slip/salary_slip.js b/hrms/payroll/doctype/salary_slip/salary_slip.js index 476ad134f0..e6fd498d29 100644 --- a/hrms/payroll/doctype/salary_slip/salary_slip.js +++ b/hrms/payroll/doctype/salary_slip/salary_slip.js @@ -287,8 +287,8 @@ frappe.ui.form.on("Salary Slip", { const message = `
${__("Note").bold()}: ${__("Payment Days calculations are based on these Payroll Settings")}: -

${__("Payroll Based On")}: ${payroll_based_on.bold()} -
${__("Consider Unmarked Attendance As")}: ${consider_unmarked_attendance_as.bold()} +

${__("Payroll Based On")}: ${__(payroll_based_on).bold()} +
${__("Consider Unmarked Attendance As")}: ${__(consider_unmarked_attendance_as).bold()}
${__("Consider Marked Attendance on Holidays")}: ${ cint(include_holidays_in_total_working_days) && From 5268ffe7cc94c2ef891cc711a49bc282b2d7bb2d Mon Sep 17 00:00:00 2001 From: Asmita Hase <44727809+asmitahase@users.noreply.github.com> Date: Fri, 17 Jan 2025 11:03:47 +0530 Subject: [PATCH 08/30] chore: resolved merge conflicts for modified timestamp --- hrms/hr/doctype/job_applicant/job_applicant.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/hrms/hr/doctype/job_applicant/job_applicant.json b/hrms/hr/doctype/job_applicant/job_applicant.json index bb99941680..2fdd2b9c91 100644 --- a/hrms/hr/doctype/job_applicant/job_applicant.json +++ b/hrms/hr/doctype/job_applicant/job_applicant.json @@ -195,11 +195,7 @@ "idx": 1, "index_web_pages_for_search": 1, "links": [], -<<<<<<< HEAD - "modified": "2023-09-14 17:03:48.838409", -======= "modified": "2025-01-16 13:06:05.312255", ->>>>>>> 09eed053 (fix: fetch designation in job applicant from job opening) "modified_by": "Administrator", "module": "HR", "name": "Job Applicant", @@ -225,4 +221,4 @@ "states": [], "subject_field": "notes", "title_field": "applicant_name" -} \ No newline at end of file +} From fc1c4bafaaf20894696d5067f94dceaed91f0bc1 Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Fri, 17 Jan 2025 11:12:27 +0530 Subject: [PATCH 09/30] chore: resolved merge conflicts --- hrms/hr/doctype/leave_encashment/leave_encashment.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/hrms/hr/doctype/leave_encashment/leave_encashment.py b/hrms/hr/doctype/leave_encashment/leave_encashment.py index 6db6b1425a..66481f6bea 100644 --- a/hrms/hr/doctype/leave_encashment/leave_encashment.py +++ b/hrms/hr/doctype/leave_encashment/leave_encashment.py @@ -205,15 +205,7 @@ def create_leave_ledger_entry(self, submit=True): to_date = leave_allocation.get("to_date") -<<<<<<< HEAD -<<<<<<< HEAD can_expire = not frappe.db.get_value("Leave Type", self.leave_type, "is_carry_forward") -======= - can_expire = not frappe.db.get_value("Leave Type",self.leave_type,"is_carry_forward") ->>>>>>> acd618f8 (fix: create single leave ledger entry for encashment if leave is carry forward type.) -======= - can_expire = not frappe.db.get_value("Leave Type", self.leave_type, "is_carry_forward") ->>>>>>> de06a25a (chore: fixed linter issue) if to_date < getdate() and can_expire: args = frappe._dict( leaves=self.encashment_days, from_date=to_date, to_date=to_date, is_carry_forward=0 From 5828ccd70595ea3098fb9570dd5bb5801a0edd4a Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Wed, 8 Jan 2025 17:35:32 +0530 Subject: [PATCH 10/30] fix: mark absense for default shift due to missing checkins when an assigned shift exists for the employee but the absent dates aren't overlapping with it chore: added a test for the case (cherry picked from commit 06790352b6c7ceb88c96a38f6d9edd2ec26819db) --- hrms/hr/doctype/shift_type/shift_type.py | 25 +++++++++++++------ hrms/hr/doctype/shift_type/test_shift_type.py | 23 +++++++++++++++++ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/hrms/hr/doctype/shift_type/shift_type.py b/hrms/hr/doctype/shift_type/shift_type.py index 328706c3f2..06e85920bf 100644 --- a/hrms/hr/doctype/shift_type/shift_type.py +++ b/hrms/hr/doctype/shift_type/shift_type.py @@ -258,17 +258,26 @@ def get_employees_with_default_shift(self, filters: dict) -> list: if not default_shift_employees: return [] - # exclude employees from default shift list if any other valid shift assignment exists + # exclude employees from default shift list if any other valid shift assignment exists such that + # the shift start and end dates overlap with absent dates + absent_employees = {} + for employee in default_shift_employees: + if absent_dates := self.get_dates_for_attendance(employee): + absent_employees[employee] = absent_dates del filters["shift_type"] - filters["employee"] = ("in", default_shift_employees) - + filters["employee"] = ("in", absent_employees.keys()) active_shift_assignments = frappe.get_all( - "Shift Assignment", - filters=filters, - pluck="employee", + "Shift Assignment", filters=filters, fields=["employee", "start_date", "end_date"] + ) + for shift in active_shift_assignments: + if self.is_overlap_between_dates(shift, absent_employees[shift.employee]): + default_shift_employees.remove(shift.employee) + return default_shift_employees + + def is_overlap_between_dates(self, shift, absent_dates): + return max(shift.start_date, absent_dates[0]) < ( + min(shift.end_date, absent_dates[-1]) if shift.end_date else absent_dates[-1] ) - - return list(set(default_shift_employees) - set(active_shift_assignments)) def get_holiday_list(self, employee: str) -> str: holiday_list_name = self.holiday_list or get_holiday_list_for_employee(employee, False) diff --git a/hrms/hr/doctype/shift_type/test_shift_type.py b/hrms/hr/doctype/shift_type/test_shift_type.py index 997856a52d..ea050fb74d 100644 --- a/hrms/hr/doctype/shift_type/test_shift_type.py +++ b/hrms/hr/doctype/shift_type/test_shift_type.py @@ -612,6 +612,24 @@ def test_skip_auto_attendance_for_overlapping_shift(self): self.assertEqual(log_in.skip_auto_attendance, 1) self.assertEqual(log_out.skip_auto_attendance, 1) + def test_mark_aattendance_for_default_shift_when_shift_assignment_is_not_overlapping(self): + shift_1 = setup_shift_type(shift_type="Deafult Shift", start_time="08:00:00", end_time="12:00:00") + shift_2 = setup_shift_type(shift_type="Not Default Shift", start_time="10:00:00", end_time="18:00:00") + employee = make_employee( + "test_employee_attendance@example.com", company="_Test Company", default_shift=shift_1.name + ) + shift_assigned_date = add_days(getdate(), +1) + make_shift_assignment(shift_2.name, employee, shift_assigned_date) + shift_1.process_auto_attendance() + self.assertEqual( + frappe.db.get_value( + "Attendance", + {"employee": employee, "attendance_date": add_days(getdate(), -1), "shift": shift_1.name}, + "status", + ), + "Absent", + ) + def setup_shift_type(**args): args = frappe._dict(args) @@ -671,3 +689,8 @@ def make_shift_assignment( shift_assignment.submit() return shift_assignment + + +def clear_exsiting_shift_assignments(employee): + for shift in frappe.get_all("Shift Assignment", filters={"employee": employee}): + frappe.delete_doc("Shift Assignment", shift.name) From 21db30cdd42ae1bbd9cd306a8dc34bb64eb02351 Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Thu, 9 Jan 2025 11:06:39 +0530 Subject: [PATCH 11/30] fix: added check for 0 absent employees chore: better test scenario (cherry picked from commit 83281c6a4941681bc7020a87e1b4a402c2ae2969) --- hrms/hr/doctype/shift_type/shift_type.py | 9 +++++---- hrms/hr/doctype/shift_type/test_shift_type.py | 12 +++++------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/hrms/hr/doctype/shift_type/shift_type.py b/hrms/hr/doctype/shift_type/shift_type.py index 06e85920bf..69c4113091 100644 --- a/hrms/hr/doctype/shift_type/shift_type.py +++ b/hrms/hr/doctype/shift_type/shift_type.py @@ -254,23 +254,24 @@ def get_employees_with_default_shift(self, filters: dict) -> list: default_shift_employees = frappe.get_all( "Employee", filters={"default_shift": self.name, "status": "Active"}, pluck="name" ) - if not default_shift_employees: return [] - # exclude employees from default shift list if any other valid shift assignment exists such that # the shift start and end dates overlap with absent dates absent_employees = {} for employee in default_shift_employees: if absent_dates := self.get_dates_for_attendance(employee): absent_employees[employee] = absent_dates - del filters["shift_type"] + if not absent_employees: + return [] + filters["employee"] = ("in", absent_employees.keys()) + del filters["shift_type"] active_shift_assignments = frappe.get_all( "Shift Assignment", filters=filters, fields=["employee", "start_date", "end_date"] ) for shift in active_shift_assignments: - if self.is_overlap_between_dates(shift, absent_employees[shift.employee]): + if self.is_overlap_between_dates(shift, absent_employees.get(shift.employee)): default_shift_employees.remove(shift.employee) return default_shift_employees diff --git a/hrms/hr/doctype/shift_type/test_shift_type.py b/hrms/hr/doctype/shift_type/test_shift_type.py index ea050fb74d..a5c3dd284a 100644 --- a/hrms/hr/doctype/shift_type/test_shift_type.py +++ b/hrms/hr/doctype/shift_type/test_shift_type.py @@ -612,7 +612,7 @@ def test_skip_auto_attendance_for_overlapping_shift(self): self.assertEqual(log_in.skip_auto_attendance, 1) self.assertEqual(log_out.skip_auto_attendance, 1) - def test_mark_aattendance_for_default_shift_when_shift_assignment_is_not_overlapping(self): + def test_mark_attendance_for_default_shift_when_shift_assignment_is_not_overlapping(self): shift_1 = setup_shift_type(shift_type="Deafult Shift", start_time="08:00:00", end_time="12:00:00") shift_2 = setup_shift_type(shift_type="Not Default Shift", start_time="10:00:00", end_time="18:00:00") employee = make_employee( @@ -620,11 +620,14 @@ def test_mark_aattendance_for_default_shift_when_shift_assignment_is_not_overlap ) shift_assigned_date = add_days(getdate(), +1) make_shift_assignment(shift_2.name, employee, shift_assigned_date) + from hrms.hr.doctype.attendance.attendance import mark_attendance + + mark_attendance(employee, add_days(getdate(), -1), "Present", shift=shift_1.name) shift_1.process_auto_attendance() self.assertEqual( frappe.db.get_value( "Attendance", - {"employee": employee, "attendance_date": add_days(getdate(), -1), "shift": shift_1.name}, + {"employee": employee, "attendance_date": getdate(), "shift": shift_1.name}, "status", ), "Absent", @@ -689,8 +692,3 @@ def make_shift_assignment( shift_assignment.submit() return shift_assignment - - -def clear_exsiting_shift_assignments(employee): - for shift in frappe.get_all("Shift Assignment", filters={"employee": employee}): - frappe.delete_doc("Shift Assignment", shift.name) From 51ce588821105990c178668d6aa86240d07a839c Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Thu, 9 Jan 2025 11:43:37 +0530 Subject: [PATCH 12/30] fix: removed unnecessary filter and checks for assigned shifts, mark_absent_for_dates_with_no_attendance function takes care of which dates to consider for attendance. (cherry picked from commit 96d5efc86ae3518ca5e06b848fd319d3300e6de9) --- hrms/hr/doctype/shift_type/shift_type.py | 29 ++++++++---------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/hrms/hr/doctype/shift_type/shift_type.py b/hrms/hr/doctype/shift_type/shift_type.py index 69c4113091..6cbca4c407 100644 --- a/hrms/hr/doctype/shift_type/shift_type.py +++ b/hrms/hr/doctype/shift_type/shift_type.py @@ -242,6 +242,7 @@ def get_assigned_employees(self, from_date=None, consider_default_shift=False) - assigned_employees = frappe.get_all("Shift Assignment", filters=filters, pluck="employee") if consider_default_shift: + filters["start_date"] = ("=", from_date) default_shift_employees = self.get_employees_with_default_shift(filters) assigned_employees = set(assigned_employees + default_shift_employees) @@ -254,32 +255,22 @@ def get_employees_with_default_shift(self, filters: dict) -> list: default_shift_employees = frappe.get_all( "Employee", filters={"default_shift": self.name, "status": "Active"}, pluck="name" ) + if not default_shift_employees: return [] - # exclude employees from default shift list if any other valid shift assignment exists such that - # the shift start and end dates overlap with absent dates - absent_employees = {} - for employee in default_shift_employees: - if absent_dates := self.get_dates_for_attendance(employee): - absent_employees[employee] = absent_dates - if not absent_employees: - return [] - filters["employee"] = ("in", absent_employees.keys()) + # exclude employees from default shift list if any other valid shift assignment exists del filters["shift_type"] + filters["employee"] = ("in", default_shift_employees) + active_shift_assignments = frappe.get_all( - "Shift Assignment", filters=filters, fields=["employee", "start_date", "end_date"] - ) - for shift in active_shift_assignments: - if self.is_overlap_between_dates(shift, absent_employees.get(shift.employee)): - default_shift_employees.remove(shift.employee) - return default_shift_employees - - def is_overlap_between_dates(self, shift, absent_dates): - return max(shift.start_date, absent_dates[0]) < ( - min(shift.end_date, absent_dates[-1]) if shift.end_date else absent_dates[-1] + "Shift Assignment", + filters=filters, + pluck="employee", ) + return list(set(default_shift_employees) - set(active_shift_assignments)) + def get_holiday_list(self, employee: str) -> str: holiday_list_name = self.holiday_list or get_holiday_list_for_employee(employee, False) return holiday_list_name From 6b348db2449ce7e4b98450094af33e40b90b3723 Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Thu, 9 Jan 2025 12:34:36 +0530 Subject: [PATCH 13/30] fix: updated filter to exclude past and current date shift assignment (cherry picked from commit ac81cd43f3087151fd65988f66d48710d42e624a) --- hrms/hr/doctype/shift_type/shift_type.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hrms/hr/doctype/shift_type/shift_type.py b/hrms/hr/doctype/shift_type/shift_type.py index 6cbca4c407..77174a03ab 100644 --- a/hrms/hr/doctype/shift_type/shift_type.py +++ b/hrms/hr/doctype/shift_type/shift_type.py @@ -242,8 +242,7 @@ def get_assigned_employees(self, from_date=None, consider_default_shift=False) - assigned_employees = frappe.get_all("Shift Assignment", filters=filters, pluck="employee") if consider_default_shift: - filters["start_date"] = ("=", from_date) - default_shift_employees = self.get_employees_with_default_shift(filters) + default_shift_employees = self.get_employees_with_default_shift(filters, from_date) assigned_employees = set(assigned_employees + default_shift_employees) # exclude inactive employees @@ -251,7 +250,8 @@ def get_assigned_employees(self, from_date=None, consider_default_shift=False) - return list(set(assigned_employees) - set(inactive_employees)) - def get_employees_with_default_shift(self, filters: dict) -> list: + def get_employees_with_default_shift(self, filters: dict, from_date) -> list: + filters["start_date"] = ("<=", from_date) default_shift_employees = frappe.get_all( "Employee", filters={"default_shift": self.name, "status": "Active"}, pluck="name" ) @@ -260,6 +260,7 @@ def get_employees_with_default_shift(self, filters: dict) -> list: return [] # exclude employees from default shift list if any other valid shift assignment exists + # that starts before the attendance processing date del filters["shift_type"] filters["employee"] = ("in", default_shift_employees) From 508fa3859b4ee0f7337c0256d40ffa7c27232a61 Mon Sep 17 00:00:00 2001 From: Conn Campbell Date: Mon, 20 Jan 2025 00:07:12 -0700 Subject: [PATCH 14/30] fix: Bank Reconciliation tool fails to match on expense claims with tax (#2594) --- hrms/hr/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hrms/hr/utils.py b/hrms/hr/utils.py index ba45c2387e..64dee12512 100644 --- a/hrms/hr/utils.py +++ b/hrms/hr/utils.py @@ -783,9 +783,9 @@ def get_ec_matching_query( ref_rank = frappe.qb.terms.Case().when(ec.employee == common_filters.party, 1).else_(0) + 1 if exact_match: - filters.append(ec.total_sanctioned_amount == common_filters.amount) + filters.append(ec.total_amount_reimbursed == common_filters.amount) else: - filters.append(ec.total_sanctioned_amount.gt(common_filters.amount)) + filters.append(ec.total_amount_reimbursed.gt(common_filters.amount)) else: ref_rank = ConstantColumn(1) From 76cbd4aaf9d4a2b649bac2bff223be11d3d8bd0f Mon Sep 17 00:00:00 2001 From: Conn Campbell Date: Mon, 20 Jan 2025 00:08:27 -0700 Subject: [PATCH 15/30] fix: Bank Reconciliation tool fails with KeyError: 'payment_doctype' (#2592) --- hrms/hr/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/hrms/hr/utils.py b/hrms/hr/utils.py index 64dee12512..af01d95111 100644 --- a/hrms/hr/utils.py +++ b/hrms/hr/utils.py @@ -796,6 +796,7 @@ def get_ec_matching_query( qb.from_(ec) .select( ref_rank.as_("rank"), + ConstantColumn("Expense Claim").as_("doctype"), ec.name, ec.total_sanctioned_amount.as_("paid_amount"), ConstantColumn("").as_("reference_no"), From d1329db753aa0278c33d75f68aef7537a5f2e3fb Mon Sep 17 00:00:00 2001 From: Aysha Date: Mon, 2 Dec 2024 15:47:11 +0530 Subject: [PATCH 16/30] fix: gratuity calculation for 'Sum of all previous slabs' option (cherry picked from commit ac80ace0219f526a7e1cfed7f68d2ce1c1f32670) --- hrms/payroll/doctype/gratuity/gratuity.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hrms/payroll/doctype/gratuity/gratuity.py b/hrms/payroll/doctype/gratuity/gratuity.py index ca6f2b7a7c..08df0f119d 100644 --- a/hrms/payroll/doctype/gratuity/gratuity.py +++ b/hrms/payroll/doctype/gratuity/gratuity.py @@ -241,7 +241,6 @@ def get_gratuity_amount(self, experience: float) -> float: * total_component_amount * slab.fraction_of_applicable_earnings ) - years_left -= slab.to_year - slab.from_year slab_found = True elif self._is_experience_within_slab(slab, experience): @@ -249,6 +248,7 @@ def get_gratuity_amount(self, experience: float) -> float: years_left * total_component_amount * slab.fraction_of_applicable_earnings ) slab_found = True + years_left -= slab.to_year - slab.from_year if not slab_found: frappe.throw( @@ -308,7 +308,7 @@ def get_gratuity_rule_slabs(self) -> list[dict]: ) def _is_experience_within_slab(self, slab: dict, experience: float) -> bool: - return bool(slab.from_year <= experience and (experience < slab.to_year or slab.to_year == 0)) + return bool(slab.from_year <= experience and (experience <= slab.to_year or slab.to_year == 0)) def _is_experience_beyond_slab(self, slab: dict, experience: float) -> bool: return bool(slab.from_year < experience and (slab.to_year < experience and slab.to_year != 0)) From 2d4d811627c2f57c4694192647bc40f21ca505d8 Mon Sep 17 00:00:00 2001 From: Aysha Date: Fri, 27 Dec 2024 10:14:33 +0530 Subject: [PATCH 17/30] fix: edit test to validate accurate gratuity calculation for employees with experience matching the upper limit of a slab (cherry picked from commit 9475155e61d3a03ddd34bc059b7b95b300471fa4) --- .../payroll/doctype/gratuity/test_gratuity.py | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/hrms/payroll/doctype/gratuity/test_gratuity.py b/hrms/payroll/doctype/gratuity/test_gratuity.py index e16e5baa59..40a5af571f 100644 --- a/hrms/payroll/doctype/gratuity/test_gratuity.py +++ b/hrms/payroll/doctype/gratuity/test_gratuity.py @@ -90,19 +90,41 @@ def test_gratuity_based_on_current_slab_via_additional_salary(self): @set_holiday_list("Salary Slip Test Holiday List", "_Test Company") def test_gratuity_based_on_all_previous_slabs_via_payment_entry(self): """ - Range | Fraction - 0-1 | 0 - 1-5 | 0.7 - 5-0 | 1 + Range | Fraction + 0-3 | 0.5 + 3-6 | 1.0 + 6-9 | 1.5 """ from hrms.overrides.employee_payment_entry import get_payment_entry_for_employee sal_slip = create_salary_slip(self.employee) + rule = setup_gratuity_rule("Rule Under Limited Contract (UAE)") + rule.gratuity_rule_slabs = [] + for slab in [ + {"from_year": 0, "to_year": 3, "fraction_of_applicable_earnings": 0.5}, + {"from_year": 3, "to_year": 6, "fraction_of_applicable_earnings": 1.0}, + {"from_year": 6, "to_year": 9, "fraction_of_applicable_earnings": 1.5}, + ]: + new_slab = frappe.get_doc( + { + "doctype": "Gratuity Rule Slab", + "from_year": slab["from_year"], + "to_year": slab["to_year"], + "fraction_of_applicable_earnings": slab["fraction_of_applicable_earnings"], + "parent": rule.name, + "parentfield": "gratuity_rule_slabs", + "parenttype": "Gratuity Rule", + } + ) + rule.append("gratuity_rule_slabs", new_slab) + rule.save() + rule.reload() + set_mode_of_payment_account() gratuity = create_gratuity( - expense_account="Payment Account - _TC", mode_of_payment="Cash", employee=self.employee + expense_account="Payment Account - _TC", mode_of_payment="Cash", employee=self.employee, rule=rule ) # work experience calculation @@ -125,7 +147,7 @@ def test_gratuity_based_on_all_previous_slabs_via_payment_entry(self): limit=1, ) - gratuity_amount = ((0 * 1) + (4 * 0.7) + (1 * 1)) * component_amount[0].amount + gratuity_amount = ((3 * 0.5) + (3 * 1.0)) * component_amount[0].amount self.assertEqual(flt(gratuity_amount, 2), flt(gratuity.amount, 2)) self.assertEqual(gratuity.status, "Unpaid") From 5a0fcbc40e381f3253f9554fcd3a8b828620fb8a Mon Sep 17 00:00:00 2001 From: Aysha Date: Thu, 9 Jan 2025 11:18:35 +0530 Subject: [PATCH 18/30] fix: further slabs need not to be checked if experience is within current slab (cherry picked from commit 08417527cab48bf3c5755cbac8fbd6b0951b6844) --- hrms/payroll/doctype/gratuity/gratuity.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hrms/payroll/doctype/gratuity/gratuity.py b/hrms/payroll/doctype/gratuity/gratuity.py index 08df0f119d..9be57b0dc3 100644 --- a/hrms/payroll/doctype/gratuity/gratuity.py +++ b/hrms/payroll/doctype/gratuity/gratuity.py @@ -241,6 +241,7 @@ def get_gratuity_amount(self, experience: float) -> float: * total_component_amount * slab.fraction_of_applicable_earnings ) + years_left -= slab.to_year - slab.from_year slab_found = True elif self._is_experience_within_slab(slab, experience): @@ -248,7 +249,7 @@ def get_gratuity_amount(self, experience: float) -> float: years_left * total_component_amount * slab.fraction_of_applicable_earnings ) slab_found = True - years_left -= slab.to_year - slab.from_year + break if not slab_found: frappe.throw( From 80494e0a14285a3d389b4e6fcb6dc424a1d811a9 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 14:22:00 +0530 Subject: [PATCH 19/30] fix: set leave encashment amount and payable account in fnf payables (backport #2646) (#2677) Co-authored-by: Aysha --- .../full_and_final_statement/full_and_final_statement.js | 1 + .../full_and_final_statement/full_and_final_statement.py | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.js b/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.js index 7e8e805dc4..f638fe9410 100644 --- a/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.js +++ b/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.js @@ -134,6 +134,7 @@ frappe.ui.form.on("Full and Final Outstanding Statement", { args: { ref_doctype: child.reference_document_type, ref_document: child.reference_document, + company: frm.doc.company, }, callback: function (r) { if (r.message) { diff --git a/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.py b/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.py index abf0889684..dd1a4ba2e6 100644 --- a/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.py +++ b/hrms/hr/doctype/full_and_final_statement/full_and_final_statement.py @@ -259,7 +259,7 @@ def set_gratuity_status(self): @frappe.whitelist() -def get_account_and_amount(ref_doctype, ref_document): +def get_account_and_amount(ref_doctype, ref_document, company): if not ref_doctype or not ref_document: return None @@ -309,6 +309,11 @@ def get_account_and_amount(ref_doctype, ref_document): amount = details.paid_amount - (details.claimed_amount + details.return_amount) return [payment_account, amount] + if ref_doctype == "Leave Encashment": + amount = frappe.db.get_value("Leave Encashment", ref_document, "encashment_amount") + payable_account = frappe.get_cached_value("Company", company, "default_payroll_payable_account") + return [payable_account, amount] + def update_full_and_final_statement_status(doc, method=None): """Updates FnF status on Journal Entry Submission/Cancellation""" From 13d7ec30608ec699bf7faeebfa4cfb512017cab6 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 15:19:10 +0530 Subject: [PATCH 20/30] =?UTF-8?q?fix:=20set=20default=20value=20for=20tota?= =?UTF-8?q?l=5Fexemption,=20remove=20tax=20exemption=20elig=E2=80=A6=20(ba?= =?UTF-8?q?ckport=20#2640)=20(#2674)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aysha --- .../report/income_tax_computation/income_tax_computation.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hrms/payroll/report/income_tax_computation/income_tax_computation.py b/hrms/payroll/report/income_tax_computation/income_tax_computation.py index f5e420e0ed..f3ca4a718e 100644 --- a/hrms/payroll/report/income_tax_computation/income_tax_computation.py +++ b/hrms/payroll/report/income_tax_computation/income_tax_computation.py @@ -389,13 +389,11 @@ def get_standard_tax_exemption(self): ) for emp, emp_details in self.employees.items(): - if not self.employees[emp]["allow_tax_exemption"]: - continue - income_tax_slab = emp_details.get("income_tax_slab") standard_exemption = standard_exemptions_per_slab.get(income_tax_slab, 0) emp_details["standard_tax_exemption"] = standard_exemption - self.employees[emp]["total_exemption"] += standard_exemption + emp_details.setdefault("total_exemption", 0) + emp_details["total_exemption"] += standard_exemption self.add_column("Total Exemption") From b32e44122b33380a5534c258f2f11ac3e202237b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 15:26:17 +0530 Subject: [PATCH 21/30] chore: fix linter issue for emp variable in report file (copy #2679) (#2682) Co-authored-by: Aysha <74527579+AyshaHakeem@users.noreply.github.com> --- .../report/income_tax_computation/income_tax_computation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hrms/payroll/report/income_tax_computation/income_tax_computation.py b/hrms/payroll/report/income_tax_computation/income_tax_computation.py index f3ca4a718e..0a50f8cde2 100644 --- a/hrms/payroll/report/income_tax_computation/income_tax_computation.py +++ b/hrms/payroll/report/income_tax_computation/income_tax_computation.py @@ -388,7 +388,7 @@ def get_standard_tax_exemption(self): ) ) - for emp, emp_details in self.employees.items(): + for emp_details in self.employees.values(): income_tax_slab = emp_details.get("income_tax_slab") standard_exemption = standard_exemptions_per_slab.get(income_tax_slab, 0) emp_details["standard_tax_exemption"] = standard_exemption From c7140ab7bc4d1b84d315d180af9a15dc95cab7bc Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Tue, 21 Jan 2025 15:07:26 +0530 Subject: [PATCH 22/30] build: upgrade frappe-ui to a fixed version - since frontend & roster use frappe-ui as a workspace, versions weren't locked for frappe-ui - use a specific version for more predictability & to avoid bumping up to breaking changes in frappe-ui (cherry picked from commit 3493623a72eebe13915b242e33baad4ad16250af) --- frontend/package.json | 2 +- roster/package.json | 2 +- yarn.lock | 180 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 177 insertions(+), 7 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 62e5a7da20..fc5685b567 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,7 +18,7 @@ "dayjs": "^1.11.11", "feather-icons": "^4.29.1", "firebase": "^10.8.0", - "frappe-ui": "^0.1.72", + "frappe-ui": "0.1.105", "postcss": "^8.4.5", "tailwindcss": "^3.4.3", "vite": "^5.4.10", diff --git a/roster/package.json b/roster/package.json index f07daeeac3..570fac7b59 100644 --- a/roster/package.json +++ b/roster/package.json @@ -13,7 +13,7 @@ "autoprefixer": "^10.4.19", "dayjs": "^1.11.11", "feather-icons": "^4.29.1", - "frappe-ui": "^0.1.72", + "frappe-ui": "0.1.105", "postcss": "^8.4.5", "tailwindcss": "^3.4.3", "vite": "^5.4.10", diff --git a/yarn.lock b/yarn.lock index 73c513c9a1..95b1b5893e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2885,6 +2885,11 @@ base64-arraybuffer@^1.0.2: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" @@ -2895,6 +2900,15 @@ birpc@^0.1.1: resolved "https://registry.yarnpkg.com/birpc/-/birpc-0.1.1.tgz#10b243ffe5a21ccaf4cbaf5a09a6f0cc035c4312" integrity sha512-B64AGL4ug2IS2jvV/zjTYDD1L+2gOJTT7Rv+VaK7KVQtQOo/xZbCDsh7g727ipckmU+QJYRqo5RcifVr0Kgcmg== +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -2937,6 +2951,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + builtin-modules@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" @@ -2999,7 +3021,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.0.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3050,6 +3072,13 @@ classnames@^2.2.5: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + cli-cursor@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" @@ -3057,6 +3086,11 @@ cli-cursor@^5.0.0: dependencies: restore-cursor "^5.0.0" +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + cli-truncate@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" @@ -3074,6 +3108,11 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -3277,7 +3316,7 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -dayjs@^1.11.11: +dayjs@^1.11.11, dayjs@^1.11.13: version "1.11.13" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== @@ -3318,6 +3357,13 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -3967,6 +4013,44 @@ fraction.js@^4.3.7: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +frappe-ui@0.1.105: + version "0.1.105" + resolved "https://registry.yarnpkg.com/frappe-ui/-/frappe-ui-0.1.105.tgz#3bdf3c458ba27f27ff2f2a28cf7eb6f9ed872367" + integrity sha512-9bZ/hj/HhQ9vp7DxE8aOKS8HqwETZrKT3IhSzjpYOk21efK8QwdbQ9sp0t4m3UII+HaUTSOTHnFzF7y9EhRZxg== + dependencies: + "@headlessui/vue" "^1.7.14" + "@popperjs/core" "^2.11.2" + "@tailwindcss/forms" "^0.5.3" + "@tailwindcss/typography" "^0.5.0" + "@tiptap/extension-color" "^2.0.3" + "@tiptap/extension-highlight" "^2.0.3" + "@tiptap/extension-image" "^2.0.3" + "@tiptap/extension-link" "^2.0.3" + "@tiptap/extension-mention" "^2.0.3" + "@tiptap/extension-placeholder" "^2.0.3" + "@tiptap/extension-table" "^2.0.3" + "@tiptap/extension-table-cell" "^2.0.3" + "@tiptap/extension-table-header" "^2.0.3" + "@tiptap/extension-table-row" "^2.0.3" + "@tiptap/extension-text-align" "^2.0.3" + "@tiptap/extension-text-style" "^2.0.3" + "@tiptap/extension-typography" "^2.0.3" + "@tiptap/pm" "^2.0.3" + "@tiptap/starter-kit" "^2.0.3" + "@tiptap/suggestion" "^2.0.3" + "@tiptap/vue-3" "^2.0.3" + "@vueuse/core" "^10.4.1" + dayjs "^1.11.13" + feather-icons "^4.28.0" + idb-keyval "^6.2.0" + ora "5.4.1" + prettier "^3.3.2" + radix-vue "^1.5.3" + showdown "^2.1.0" + socket.io-client "^4.5.1" + tippy.js "^6.3.7" + typescript "^5.0.2" + fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -4307,6 +4391,11 @@ idb@7.1.1, idb@^7.0.1: resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0, ignore@^5.2.4: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -4333,7 +4422,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4451,6 +4540,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -4539,6 +4633,11 @@ is-typed-array@^1.1.13: dependencies: which-typed-array "^1.1.14" +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -4823,6 +4922,14 @@ lodash@^4.17.20, lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + log-update@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" @@ -4950,6 +5057,11 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-fn@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" @@ -5148,6 +5260,13 @@ once@^1.3.0: dependencies: wrappy "1" +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + onetime@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" @@ -5174,6 +5293,21 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" +ora@5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + orderedmap@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2" @@ -5660,6 +5794,15 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -5749,6 +5892,14 @@ resolve@^1.1.7, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.22.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + restore-cursor@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" @@ -5842,7 +5993,7 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@>=5.1.0, safe-buffer@^5.1.0: +safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -5963,6 +6114,11 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" @@ -6152,6 +6308,13 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -6615,7 +6778,7 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -6732,6 +6895,13 @@ w3c-xmlserializer@^4.0.0: dependencies: xml-name-validator "^4.0.0" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" From f70bb03e8e2919fbaeb740f8489160cfe02a93fb Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Tue, 21 Jan 2025 15:08:25 +0530 Subject: [PATCH 23/30] fix(dayjs): use non esm import for relativeTime - fixes broken Notifications page (cherry picked from commit 7e042c5433747b884233fbb5afca4358683faa34) --- frontend/src/utils/dayjs.js | 2 +- frontend/src/views/Notifications.vue | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/utils/dayjs.js b/frontend/src/utils/dayjs.js index 922be22a83..6fb884a67a 100644 --- a/frontend/src/utils/dayjs.js +++ b/frontend/src/utils/dayjs.js @@ -1,7 +1,7 @@ import dayjs from "dayjs" import updateLocale from "dayjs/plugin/updateLocale" import localizedFormat from "dayjs/plugin/localizedFormat" -import relativeTime from "dayjs/esm/plugin/relativeTime" +import relativeTime from "dayjs/plugin/relativeTime" import isToday from "dayjs/plugin/isToday" import isYesterday from "dayjs/plugin/isYesterday" import isBetween from "dayjs/plugin/isBetween" diff --git a/frontend/src/views/Notifications.vue b/frontend/src/views/Notifications.vue index 554378bc3c..54ead03fe8 100644 --- a/frontend/src/views/Notifications.vue +++ b/frontend/src/views/Notifications.vue @@ -102,7 +102,6 @@ import { arePushNotificationsEnabled, } from "@/data/notifications" -const user = inject("$user") const dayjs = inject("$dayjs") const router = useRouter() From 10b6361331b0daed8b251bb5e81e053cf783a461 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Tue, 21 Jan 2025 15:16:09 +0530 Subject: [PATCH 24/30] chore: update frappe-ui submodule (cherry picked from commit 12c9a664b30236cdb25922d684ce046046c55fa6) --- frappe-ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe-ui b/frappe-ui index 3613b49380..863eaae9ad 160000 --- a/frappe-ui +++ b/frappe-ui @@ -1 +1 @@ -Subproject commit 3613b4938068588483699a82b40f7cdd604cf912 +Subproject commit 863eaae9ada2edb287fc09fb21d05212bb5eebe9 From 6dd51d7411f90c87146a17b6562df39cd3785eda Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Wed, 22 Jan 2025 12:22:03 +0530 Subject: [PATCH 25/30] chore: update yarn.lock (cherry picked from commit 69f952d6f96d4756d886355325a5a1b6a92d6196) --- yarn.lock | 764 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 535 insertions(+), 229 deletions(-) diff --git a/yarn.lock b/yarn.lock index 95b1b5893e..e73cf8c893 100644 --- a/yarn.lock +++ b/yarn.lock @@ -983,6 +983,28 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" +"@bundled-es-modules/cookie@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz#b41376af6a06b3e32a15241d927b840a9b4de507" + integrity sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw== + dependencies: + cookie "^0.7.2" + +"@bundled-es-modules/statuses@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz#761d10f44e51a94902c4da48675b71a76cc98872" + integrity sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg== + dependencies: + statuses "^2.0.1" + +"@bundled-es-modules/tough-cookie@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz#fa9cd3cedfeecd6783e8b0d378b4a99e52bde5d3" + integrity sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw== + dependencies: + "@types/tough-cookie" "^4.0.5" + tough-cookie "^4.1.4" + "@codemirror/commands@^6.3.0": version "6.7.1" resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.7.1.tgz#04561e95bc0779eaa49efd63e916c4efb3bbf6d6" @@ -1051,221 +1073,111 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== -"@esbuild/android-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" - integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== - "@esbuild/android-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== -"@esbuild/android-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" - integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== - "@esbuild/android-arm@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== -"@esbuild/android-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" - integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== - "@esbuild/android-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== -"@esbuild/darwin-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" - integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== - "@esbuild/darwin-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== -"@esbuild/darwin-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" - integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== - "@esbuild/darwin-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== -"@esbuild/freebsd-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" - integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== - "@esbuild/freebsd-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== -"@esbuild/freebsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" - integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== - "@esbuild/freebsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== -"@esbuild/linux-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" - integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== - "@esbuild/linux-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== -"@esbuild/linux-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" - integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== - "@esbuild/linux-arm@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== -"@esbuild/linux-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" - integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== - "@esbuild/linux-ia32@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== -"@esbuild/linux-loong64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" - integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== - "@esbuild/linux-loong64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== -"@esbuild/linux-mips64el@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" - integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== - "@esbuild/linux-mips64el@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== -"@esbuild/linux-ppc64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" - integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== - "@esbuild/linux-ppc64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== -"@esbuild/linux-riscv64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" - integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== - "@esbuild/linux-riscv64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== -"@esbuild/linux-s390x@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" - integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== - "@esbuild/linux-s390x@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== -"@esbuild/linux-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" - integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== - "@esbuild/linux-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== -"@esbuild/netbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" - integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== - "@esbuild/netbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== -"@esbuild/openbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" - integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== - "@esbuild/openbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== -"@esbuild/sunos-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" - integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== - "@esbuild/sunos-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== -"@esbuild/win32-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" - integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== - "@esbuild/win32-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== -"@esbuild/win32-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" - integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== - "@esbuild/win32-ia32@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== -"@esbuild/win32-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" - integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== - "@esbuild/win32-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" @@ -1773,7 +1685,7 @@ "@histoire/shared" "^0.17.17" "@histoire/vendors" "^0.17.17" -"@histoire/plugin-vue@^0.17.14": +"@histoire/plugin-vue@^0.17.17": version "0.17.17" resolved "https://registry.yarnpkg.com/@histoire/plugin-vue/-/plugin-vue-0.17.17.tgz#65cde4685738c06edf0f36b23b93f966a1f642c3" integrity sha512-O5h/Ww6IT2CygVVT4onN27IZt11Z2qE8XeHeXJCEese3dxnnVWRhjMpsaWAU5XqgfjKNAiALJk86b49/6NQaRg== @@ -1822,6 +1734,39 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@inquirer/confirm@^5.0.0": + version "5.1.3" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.3.tgz#c1ad57663f54758981811ccb86f823072ddf5c1a" + integrity sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA== + dependencies: + "@inquirer/core" "^10.1.4" + "@inquirer/type" "^3.0.2" + +"@inquirer/core@^10.1.4": + version "10.1.4" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.4.tgz#02394e68d894021935caca0d10fc68fd4f3a3ead" + integrity sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w== + dependencies: + "@inquirer/figures" "^1.0.9" + "@inquirer/type" "^3.0.2" + ansi-escapes "^4.3.2" + cli-width "^4.1.0" + mute-stream "^2.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/figures@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.9.tgz#9d8128f8274cde4ca009ca8547337cab3f37a4a3" + integrity sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ== + +"@inquirer/type@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.2.tgz#baff9f8d70947181deb36772cd9a5b6876d3e60c" + integrity sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g== + "@internationalized/date@^3.5.4": version "3.5.5" resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.5.5.tgz#7d34cb9da35127f98dd669fc926bb37e771e177f" @@ -1940,6 +1885,18 @@ dependencies: "@lezer/common" "^1.0.0" +"@mswjs/interceptors@^0.37.0": + version "0.37.5" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.37.5.tgz#9ce40c56be02b43fcbdb51b63f47e69fc4aaabe6" + integrity sha512-AAwRb5vXFcY4L+FvZ7LZusDuZ0vEe0Zm8ohn1FM6/X7A3bj4mqmkAcGRWuvC2JwSygNwHAAmMnAI73vPHeqsHA== + dependencies: + "@open-draft/deferred-promise" "^2.2.0" + "@open-draft/logger" "^0.3.0" + "@open-draft/until" "^2.0.0" + is-node-process "^1.2.0" + outvariant "^1.4.3" + strict-event-emitter "^0.5.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1961,6 +1918,24 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@open-draft/deferred-promise@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" + integrity sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA== + +"@open-draft/logger@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@open-draft/logger/-/logger-0.3.0.tgz#2b3ab1242b360aa0adb28b85f5d7da1c133a0954" + integrity sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ== + dependencies: + is-node-process "^1.2.0" + outvariant "^1.4.0" + +"@open-draft/until@^2.0.0", "@open-draft/until@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-2.1.0.tgz#0acf32f470af2ceaf47f095cdecd40d68666efda" + integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -2469,6 +2444,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== + "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" @@ -2528,6 +2508,16 @@ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== +"@types/statuses@^2.0.4": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.5.tgz#f61ab46d5352fd73c863a1ea4e1cef3b0b51ae63" + integrity sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A== + +"@types/tough-cookie@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + "@types/trusted-types@^2.0.2": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" @@ -2548,6 +2538,65 @@ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz#057d2ded94c4e71b94e9814f92dcd9306317aa46" integrity sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw== +"@vitest/expect@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.8.tgz#13fad0e8d5a0bf0feb675dcf1d1f1a36a1773bc1" + integrity sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw== + dependencies: + "@vitest/spy" "2.1.8" + "@vitest/utils" "2.1.8" + chai "^5.1.2" + tinyrainbow "^1.2.0" + +"@vitest/mocker@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.8.tgz#51dec42ac244e949d20009249e033e274e323f73" + integrity sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA== + dependencies: + "@vitest/spy" "2.1.8" + estree-walker "^3.0.3" + magic-string "^0.30.12" + +"@vitest/pretty-format@2.1.8", "@vitest/pretty-format@^2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.8.tgz#88f47726e5d0cf4ba873d50c135b02e4395e2bca" + integrity sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ== + dependencies: + tinyrainbow "^1.2.0" + +"@vitest/runner@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.8.tgz#b0e2dd29ca49c25e9323ea2a45a5125d8729759f" + integrity sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg== + dependencies: + "@vitest/utils" "2.1.8" + pathe "^1.1.2" + +"@vitest/snapshot@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.8.tgz#d5dc204f4b95dc8b5e468b455dfc99000047d2de" + integrity sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg== + dependencies: + "@vitest/pretty-format" "2.1.8" + magic-string "^0.30.12" + pathe "^1.1.2" + +"@vitest/spy@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.8.tgz#bc41af3e1e6a41ae3b67e51f09724136b88fa447" + integrity sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg== + dependencies: + tinyspy "^3.0.2" + +"@vitest/utils@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.8.tgz#f8ef85525f3362ebd37fd25d268745108d6ae388" + integrity sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA== + dependencies: + "@vitest/pretty-format" "2.1.8" + loupe "^3.1.2" + tinyrainbow "^1.2.0" + "@vue/compiler-core@3.5.12": version "3.5.12" resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.12.tgz#bd70b7dabd12b0b6f31bc53418ba3da77994c437" @@ -2559,6 +2608,17 @@ estree-walker "^2.0.2" source-map-js "^1.2.0" +"@vue/compiler-core@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05" + integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q== + dependencies: + "@babel/parser" "^7.25.3" + "@vue/shared" "3.5.13" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.0" + "@vue/compiler-dom@3.5.12": version "3.5.12" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz#456d631d11102535b7ee6fd954cf2c93158d0354" @@ -2567,6 +2627,14 @@ "@vue/compiler-core" "3.5.12" "@vue/shared" "3.5.12" +"@vue/compiler-dom@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58" + integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA== + dependencies: + "@vue/compiler-core" "3.5.13" + "@vue/shared" "3.5.13" + "@vue/compiler-sfc@3.5.12": version "3.5.12" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz#6688120d905fcf22f7e44d3cb90f8dabc4dd3cc8" @@ -2582,6 +2650,21 @@ postcss "^8.4.47" source-map-js "^1.2.0" +"@vue/compiler-sfc@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46" + integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ== + dependencies: + "@babel/parser" "^7.25.3" + "@vue/compiler-core" "3.5.13" + "@vue/compiler-dom" "3.5.13" + "@vue/compiler-ssr" "3.5.13" + "@vue/shared" "3.5.13" + estree-walker "^2.0.2" + magic-string "^0.30.11" + postcss "^8.4.48" + source-map-js "^1.2.0" + "@vue/compiler-ssr@3.5.12": version "3.5.12" resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz#5f1a3fbd5c44b79a6dbe88729f7801d9c9218bde" @@ -2590,6 +2673,14 @@ "@vue/compiler-dom" "3.5.12" "@vue/shared" "3.5.12" +"@vue/compiler-ssr@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba" + integrity sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA== + dependencies: + "@vue/compiler-dom" "3.5.13" + "@vue/shared" "3.5.13" + "@vue/devtools-api@^6.6.3": version "6.6.3" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.3.tgz#b23a588154cba8986bba82b6e1d0248bde3fd1a0" @@ -2607,6 +2698,13 @@ dependencies: "@vue/shared" "3.5.12" +"@vue/reactivity@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.13.tgz#b41ff2bb865e093899a22219f5b25f97b6fe155f" + integrity sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg== + dependencies: + "@vue/shared" "3.5.13" + "@vue/runtime-core@3.5.12": version "3.5.12" resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.12.tgz#849207f203d0fd82971f19574d30dbe7134c78c7" @@ -2615,6 +2713,14 @@ "@vue/reactivity" "3.5.12" "@vue/shared" "3.5.12" +"@vue/runtime-core@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz#1fafa4bf0b97af0ebdd9dbfe98cd630da363a455" + integrity sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw== + dependencies: + "@vue/reactivity" "3.5.13" + "@vue/shared" "3.5.13" + "@vue/runtime-dom@3.5.12": version "3.5.12" resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz#6d4de3df49a90a460b311b1100baa5e2d0d1c8c9" @@ -2625,6 +2731,16 @@ "@vue/shared" "3.5.12" csstype "^3.1.3" +"@vue/runtime-dom@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz#610fc795de9246300e8ae8865930d534e1246215" + integrity sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog== + dependencies: + "@vue/reactivity" "3.5.13" + "@vue/runtime-core" "3.5.13" + "@vue/shared" "3.5.13" + csstype "^3.1.3" + "@vue/server-renderer@3.5.12": version "3.5.12" resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.12.tgz#79c6bc3860e4e4ef80d85653c5d03fd94b26574e" @@ -2633,11 +2749,24 @@ "@vue/compiler-ssr" "3.5.12" "@vue/shared" "3.5.12" +"@vue/server-renderer@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz#429ead62ee51de789646c22efe908e489aad46f7" + integrity sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA== + dependencies: + "@vue/compiler-ssr" "3.5.13" + "@vue/shared" "3.5.13" + "@vue/shared@3.5.12": version "3.5.12" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.12.tgz#f9e45b7f63f2c3f40d84237b1194b7f67de192e3" integrity sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg== +"@vue/shared@3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f" + integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ== + "@vueuse/core@^10.11.0", "@vueuse/core@^10.4.1": version "10.11.1" resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.11.1.tgz#15d2c0b6448d2212235b23a7ba29c27173e0c2c6" @@ -2722,6 +2851,13 @@ ajv@^8.6.0: json-schema-traverse "^1.0.0" require-from-string "^2.0.2" +ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + ansi-escapes@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" @@ -2817,6 +2953,11 @@ arraybuffer.prototype.slice@^1.0.3: is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + async@^3.2.3: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" @@ -3012,6 +3153,17 @@ capital-case@^1.0.4: tslib "^2.0.3" upper-case-first "^2.0.2" +chai@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.2.tgz#3afbc340b994ae3610ca519a6c70ace77ad4378d" + integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3052,6 +3204,11 @@ change-case@^4.1.2: snake-case "^3.0.4" tslib "^2.0.3" +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -3099,6 +3256,11 @@ cli-truncate@^4.0.0: slice-ansi "^5.0.0" string-width "^7.0.0" +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -3208,6 +3370,11 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cookie@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + core-js-compat@^3.37.1, core-js-compat@^3.38.0: version "3.38.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" @@ -3225,13 +3392,6 @@ crelt@^1.0.0, crelt@^1.0.5: resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== -cross-fetch@^3.1.5: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -3342,11 +3502,23 @@ debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3 dependencies: ms "2.1.2" +debug@^4.3.7: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -3573,6 +3745,11 @@ es-errors@^1.2.1, es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-module-lexer@^1.5.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" + integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== + es-object-atoms@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" @@ -3598,34 +3775,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild@^0.18.10: - version "0.18.20" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" - integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== - optionalDependencies: - "@esbuild/android-arm" "0.18.20" - "@esbuild/android-arm64" "0.18.20" - "@esbuild/android-x64" "0.18.20" - "@esbuild/darwin-arm64" "0.18.20" - "@esbuild/darwin-x64" "0.18.20" - "@esbuild/freebsd-arm64" "0.18.20" - "@esbuild/freebsd-x64" "0.18.20" - "@esbuild/linux-arm" "0.18.20" - "@esbuild/linux-arm64" "0.18.20" - "@esbuild/linux-ia32" "0.18.20" - "@esbuild/linux-loong64" "0.18.20" - "@esbuild/linux-mips64el" "0.18.20" - "@esbuild/linux-ppc64" "0.18.20" - "@esbuild/linux-riscv64" "0.18.20" - "@esbuild/linux-s390x" "0.18.20" - "@esbuild/linux-x64" "0.18.20" - "@esbuild/netbsd-x64" "0.18.20" - "@esbuild/openbsd-x64" "0.18.20" - "@esbuild/sunos-x64" "0.18.20" - "@esbuild/win32-arm64" "0.18.20" - "@esbuild/win32-ia32" "0.18.20" - "@esbuild/win32-x64" "0.18.20" - esbuild@^0.21.3: version "0.21.5" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" @@ -3800,6 +3949,13 @@ estree-walker@^2.0.2: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -3825,6 +3981,11 @@ execa@~8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" +expect-type@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" + integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -4013,44 +4174,6 @@ fraction.js@^4.3.7: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== -frappe-ui@0.1.105: - version "0.1.105" - resolved "https://registry.yarnpkg.com/frappe-ui/-/frappe-ui-0.1.105.tgz#3bdf3c458ba27f27ff2f2a28cf7eb6f9ed872367" - integrity sha512-9bZ/hj/HhQ9vp7DxE8aOKS8HqwETZrKT3IhSzjpYOk21efK8QwdbQ9sp0t4m3UII+HaUTSOTHnFzF7y9EhRZxg== - dependencies: - "@headlessui/vue" "^1.7.14" - "@popperjs/core" "^2.11.2" - "@tailwindcss/forms" "^0.5.3" - "@tailwindcss/typography" "^0.5.0" - "@tiptap/extension-color" "^2.0.3" - "@tiptap/extension-highlight" "^2.0.3" - "@tiptap/extension-image" "^2.0.3" - "@tiptap/extension-link" "^2.0.3" - "@tiptap/extension-mention" "^2.0.3" - "@tiptap/extension-placeholder" "^2.0.3" - "@tiptap/extension-table" "^2.0.3" - "@tiptap/extension-table-cell" "^2.0.3" - "@tiptap/extension-table-header" "^2.0.3" - "@tiptap/extension-table-row" "^2.0.3" - "@tiptap/extension-text-align" "^2.0.3" - "@tiptap/extension-text-style" "^2.0.3" - "@tiptap/extension-typography" "^2.0.3" - "@tiptap/pm" "^2.0.3" - "@tiptap/starter-kit" "^2.0.3" - "@tiptap/suggestion" "^2.0.3" - "@tiptap/vue-3" "^2.0.3" - "@vueuse/core" "^10.4.1" - dayjs "^1.11.13" - feather-icons "^4.28.0" - idb-keyval "^6.2.0" - ora "5.4.1" - prettier "^3.3.2" - radix-vue "^1.5.3" - showdown "^2.1.0" - socket.io-client "^4.5.1" - tippy.js "^6.3.7" - typescript "^5.0.2" - fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -4231,6 +4354,11 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +graphql@^16.8.1: + version "16.10.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.10.0.tgz#24c01ae0af6b11ea87bf55694429198aaa8e220c" + integrity sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ== + gray-matter@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" @@ -4295,7 +4423,12 @@ header-case@^2.0.4: capital-case "^1.0.4" tslib "^2.0.3" -histoire@^0.17.14: +headers-polyfill@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-4.0.3.tgz#922a0155de30ecc1f785bcf04be77844ca95ad07" + integrity sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ== + +histoire@^0.17.17: version "0.17.17" resolved "https://registry.yarnpkg.com/histoire/-/histoire-0.17.17.tgz#3325344d0e3342938de38175ad82d91dec4fd235" integrity sha512-DAwY4sgIoP7NGE5ldaws2d3RWz4OOQcwhS8elRMiA2euqzLvDU2IXm+ZjeDDFVtGkvmQNQyfZBDKLCLHfRkSUg== @@ -4555,6 +4688,11 @@ is-negative-zero@^2.0.3: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== +is-node-process@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.2.0.tgz#ea02a1b90ddb3934a19aea414e88edef7e11d134" + integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -4946,6 +5084,11 @@ long@^5.0.0: resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== +loupe@^3.1.0, loupe@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" + integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -4979,6 +5122,13 @@ magic-string@^0.30.11: dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" +magic-string@^0.30.12: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + markdown-it-anchor@^8.6.7: version "8.6.7" resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" @@ -5143,6 +5293,35 @@ ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +msw@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.7.0.tgz#d13ff87f7e018fc4c359800ff72ba5017033fb56" + integrity sha512-BIodwZ19RWfCbYTxWTUfTXc+sg4OwjCAgxU1ZsgmggX/7S3LdUifsbUPJs61j0rWb19CZRGY5if77duhc0uXzw== + dependencies: + "@bundled-es-modules/cookie" "^2.0.1" + "@bundled-es-modules/statuses" "^1.0.1" + "@bundled-es-modules/tough-cookie" "^0.1.6" + "@inquirer/confirm" "^5.0.0" + "@mswjs/interceptors" "^0.37.0" + "@open-draft/deferred-promise" "^2.2.0" + "@open-draft/until" "^2.1.0" + "@types/cookie" "^0.6.0" + "@types/statuses" "^2.0.4" + graphql "^16.8.1" + headers-polyfill "^4.0.2" + is-node-process "^1.2.0" + outvariant "^1.4.3" + path-to-regexp "^6.3.0" + picocolors "^1.1.1" + strict-event-emitter "^0.5.1" + type-fest "^4.26.1" + yargs "^17.7.2" + +mute-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" + integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -5157,6 +5336,11 @@ nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +nanoid@^3.3.8: + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== + nanoid@^5.0.7: version "5.0.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.0.7.tgz#6452e8c5a816861fd9d2b898399f7e5fd6944cc6" @@ -5175,13 +5359,6 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@^2.6.12: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - node-releases@^2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" @@ -5313,6 +5490,11 @@ orderedmap@^2.0.0: resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2" integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== +outvariant@^1.4.0, outvariant@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" + integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -5408,6 +5590,11 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-to-regexp@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" + integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -5418,12 +5605,17 @@ pathe@^1.1.1, pathe@^1.1.2: resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== + picocolors@^1.0.0, picocolors@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== -picocolors@^1.1.0: +picocolors@^1.1.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -5519,7 +5711,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.21, postcss@^8.4.27, postcss@^8.4.43, postcss@^8.4.47: +postcss@^8.4.21, postcss@^8.4.43, postcss@^8.4.47: version "8.4.47" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== @@ -5537,6 +5729,15 @@ postcss@^8.4.23, postcss@^8.4.5: picocolors "^1.0.1" source-map-js "^1.2.0" +postcss@^8.4.48: + version "8.5.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" + integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== + dependencies: + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -5932,13 +6133,6 @@ rollup@^2.43.1: optionalDependencies: fsevents "~2.3.2" -rollup@^3.27.1: - version "3.29.5" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.5.tgz#8a2e477a758b520fb78daf04bca4c522c1da8a54" - integrity sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w== - optionalDependencies: - fsevents "~2.3.2" - rollup@^4.20.0: version "4.21.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.1.tgz#65b9b9e9de9a64604fab083fb127f3e9eac2935d" @@ -6114,6 +6308,11 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -6225,11 +6424,31 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +statuses@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +std-env@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.8.0.tgz#b56ffc1baf1a29dcc80a3bdf11d7fca7c315e7d5" + integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== + +strict-event-emitter@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" + integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== + string-argv@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" @@ -6507,6 +6726,16 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + tinyglobby@^0.2.0: version "0.2.10" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" @@ -6515,6 +6744,21 @@ tinyglobby@^0.2.0: fdir "^6.4.2" picomatch "^4.0.2" +tinypool@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.2.tgz#706193cc532f4c100f66aa00b01c42173d9051b2" + integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== + +tinyrainbow@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== + +tinyspy@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" + integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== + tippy.js@^6.3.7: version "6.3.7" resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" @@ -6539,7 +6783,7 @@ totalist@^3.0.0: resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== -tough-cookie@^4.1.2: +tough-cookie@^4.1.2, tough-cookie@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== @@ -6563,11 +6807,6 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" @@ -6600,6 +6839,16 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^4.26.1: + version "4.33.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.33.0.tgz#2da0c135b9afa76cf8b18ecfd4f260ecd414a432" + integrity sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g== + typed-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" @@ -6795,6 +7044,17 @@ utrie@^1.0.2: dependencies: base64-arraybuffer "^1.0.2" +vite-node@2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.8.tgz#9495ca17652f6f7f95ca7c4b568a235e0c8dbac5" + integrity sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg== + dependencies: + cac "^6.7.14" + debug "^4.3.7" + es-module-lexer "^1.5.4" + pathe "^1.1.2" + vite "^5.0.0" + vite-node@^0.34.6: version "0.34.7" resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.34.7.tgz#9fbcaf5597826d224e6301a486027faa22c2b09c" @@ -6829,16 +7089,42 @@ vite-plugin-pwa@^0.20.5: optionalDependencies: fsevents "~2.3.3" -vite@^4.1.0: - version "4.5.5" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.5.tgz#639b9feca5c0a3bfe3c60cb630ef28bf219d742e" - integrity sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ== +vite@^5.0.0, vite@^5.1.8: + version "5.4.14" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.14.tgz#ff8255edb02134df180dcfca1916c37a6abe8408" + integrity sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA== dependencies: - esbuild "^0.18.10" - postcss "^8.4.27" - rollup "^3.27.1" + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" optionalDependencies: - fsevents "~2.3.2" + fsevents "~2.3.3" + +vitest@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.8.tgz#2e6a00bc24833574d535c96d6602fb64163092fa" + integrity sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ== + dependencies: + "@vitest/expect" "2.1.8" + "@vitest/mocker" "2.1.8" + "@vitest/pretty-format" "^2.1.8" + "@vitest/runner" "2.1.8" + "@vitest/snapshot" "2.1.8" + "@vitest/spy" "2.1.8" + "@vitest/utils" "2.1.8" + chai "^5.1.2" + debug "^4.3.7" + expect-type "^1.1.0" + magic-string "^0.30.12" + pathe "^1.1.2" + std-env "^3.8.0" + tinybench "^2.9.0" + tinyexec "^0.3.1" + tinypool "^1.0.1" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-node "2.1.8" + why-is-node-running "^2.3.0" vue-demi@>=0.13.0, vue-demi@>=0.14.8: version "0.14.10" @@ -6872,7 +7158,18 @@ vue-router@^4.3.2: dependencies: "@vue/devtools-api" "^6.6.3" -vue@^3.2.45, vue@^3.5.12: +vue@^3.3.0: + version "3.5.13" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.13.tgz#9f760a1a982b09c0c04a867903fc339c9f29ec0a" + integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ== + dependencies: + "@vue/compiler-dom" "3.5.13" + "@vue/compiler-sfc" "3.5.13" + "@vue/runtime-dom" "3.5.13" + "@vue/server-renderer" "3.5.13" + "@vue/shared" "3.5.13" + +vue@^3.5.12: version "3.5.12" resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.12.tgz#e08421c601b3617ea2c9ef0413afcc747130b36c" integrity sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg== @@ -6902,11 +7199,6 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -6951,14 +7243,6 @@ whatwg-url@^11.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" @@ -6997,6 +7281,14 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" @@ -7197,6 +7489,15 @@ workbox-window@7.3.0, workbox-window@^7.1.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -7287,3 +7588,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yoctocolors-cjs@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" + integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== From 217cc1a00462232d97b3a4eace9b3ebcb9adf8af Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Wed, 22 Jan 2025 11:11:55 +0530 Subject: [PATCH 26/30] refactor: fetch all employees that may have shift type as active shift to be considered for attendance (cherry picked from commit 9bd360fd0ed311fe80f439bf5e4dafcce3b32999) --- hrms/hr/doctype/shift_type/shift_type.py | 36 +++++++----------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/hrms/hr/doctype/shift_type/shift_type.py b/hrms/hr/doctype/shift_type/shift_type.py index 77174a03ab..0370f24476 100644 --- a/hrms/hr/doctype/shift_type/shift_type.py +++ b/hrms/hr/doctype/shift_type/shift_type.py @@ -70,7 +70,6 @@ def process_auto_attendance(self): frappe.db.commit() # nosemgrep assigned_employees = self.get_assigned_employees(self.process_attendance_after, True) - # mark absent in batches & commit to avoid losing progress since this tries to process remaining attendance # right from "Process Attendance After" to "Last Sync of Checkin" for batch in create_batch(assigned_employees, EMPLOYEE_CHUNK_SIZE): @@ -235,14 +234,21 @@ def get_marked_attendance_dates_between(self, employee: str, start_date: str, en ).run(pluck=True) def get_assigned_employees(self, from_date=None, consider_default_shift=False) -> list[str]: + """Get all such employees who either have this shift assigned that hasn't ended or have this shift as default shift. + This may fetch some unnecessary employees who have another shift assigned that may have started or ended befor or after the + attendance processing date. But this is done to avoid missing any employee who may have this shift as active shift.""" filters = {"shift_type": self.name, "docstatus": "1", "status": "Active"} if from_date: - filters["start_date"] = (">=", from_date) + or_filters = [["end_date", ">=", from_date], ["end_date", "in", ("", None)]] - assigned_employees = frappe.get_all("Shift Assignment", filters=filters, pluck="employee") + assigned_employees = frappe.get_all( + "Shift Assignment", filters=filters, or_filters=or_filters, pluck="employee" + ) if consider_default_shift: - default_shift_employees = self.get_employees_with_default_shift(filters, from_date) + default_shift_employees = frappe.get_all( + "Employee", filters={"default_shift": self.name, "status": "Active"}, pluck="name" + ) assigned_employees = set(assigned_employees + default_shift_employees) # exclude inactive employees @@ -250,28 +256,6 @@ def get_assigned_employees(self, from_date=None, consider_default_shift=False) - return list(set(assigned_employees) - set(inactive_employees)) - def get_employees_with_default_shift(self, filters: dict, from_date) -> list: - filters["start_date"] = ("<=", from_date) - default_shift_employees = frappe.get_all( - "Employee", filters={"default_shift": self.name, "status": "Active"}, pluck="name" - ) - - if not default_shift_employees: - return [] - - # exclude employees from default shift list if any other valid shift assignment exists - # that starts before the attendance processing date - del filters["shift_type"] - filters["employee"] = ("in", default_shift_employees) - - active_shift_assignments = frappe.get_all( - "Shift Assignment", - filters=filters, - pluck="employee", - ) - - return list(set(default_shift_employees) - set(active_shift_assignments)) - def get_holiday_list(self, employee: str) -> str: holiday_list_name = self.holiday_list or get_holiday_list_for_employee(employee, False) return holiday_list_name From d416bef4d1123600d3c2eb921b7e38037ace8207 Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Wed, 22 Jan 2025 11:34:42 +0530 Subject: [PATCH 27/30] chore: typos in the comment (cherry picked from commit 91c29a828421430f556845148f3c8a654d347f4c) --- hrms/hr/doctype/shift_type/shift_type.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hrms/hr/doctype/shift_type/shift_type.py b/hrms/hr/doctype/shift_type/shift_type.py index 0370f24476..29c03d1ec4 100644 --- a/hrms/hr/doctype/shift_type/shift_type.py +++ b/hrms/hr/doctype/shift_type/shift_type.py @@ -235,7 +235,7 @@ def get_marked_attendance_dates_between(self, employee: str, start_date: str, en def get_assigned_employees(self, from_date=None, consider_default_shift=False) -> list[str]: """Get all such employees who either have this shift assigned that hasn't ended or have this shift as default shift. - This may fetch some unnecessary employees who have another shift assigned that may have started or ended befor or after the + This may fetch some redundant employees who have another shift assigned that may have started or ended before or after the attendance processing date. But this is done to avoid missing any employee who may have this shift as active shift.""" filters = {"shift_type": self.name, "docstatus": "1", "status": "Active"} if from_date: From 7fe95740aa4ca5cf4d8f8b586808f6a885d02750 Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Wed, 22 Jan 2025 13:10:11 +0530 Subject: [PATCH 28/30] chore: filter syntax chore: better test scenario (cherry picked from commit bb80a0e5bd15dff6cb4d534119944ace5e1e1bd5) --- hrms/hr/doctype/shift_type/shift_type.py | 2 +- hrms/hr/doctype/shift_type/test_shift_type.py | 67 +++++++++++++++++-- 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/hrms/hr/doctype/shift_type/shift_type.py b/hrms/hr/doctype/shift_type/shift_type.py index 29c03d1ec4..7435e75322 100644 --- a/hrms/hr/doctype/shift_type/shift_type.py +++ b/hrms/hr/doctype/shift_type/shift_type.py @@ -239,7 +239,7 @@ def get_assigned_employees(self, from_date=None, consider_default_shift=False) - attendance processing date. But this is done to avoid missing any employee who may have this shift as active shift.""" filters = {"shift_type": self.name, "docstatus": "1", "status": "Active"} if from_date: - or_filters = [["end_date", ">=", from_date], ["end_date", "in", ("", None)]] + or_filters = [["end_date", ">=", from_date], ["end_date", "is", "not set"]] assigned_employees = frappe.get_all( "Shift Assignment", filters=filters, or_filters=or_filters, pluck="employee" diff --git a/hrms/hr/doctype/shift_type/test_shift_type.py b/hrms/hr/doctype/shift_type/test_shift_type.py index a5c3dd284a..49d5b4c4b8 100644 --- a/hrms/hr/doctype/shift_type/test_shift_type.py +++ b/hrms/hr/doctype/shift_type/test_shift_type.py @@ -347,28 +347,83 @@ def test_mark_absent_for_dates_with_no_attendance_for_midnight_shift(self): shift_type="Test Absent with no Attendance", start_time="15:00:00", end_time="23:30:00", - process_attendance_after=add_days(today, -6), + process_attendance_after=add_days(today, -8), allow_check_out_after_shift_end_time=120, last_sync_of_checkin=f"{today} 15:00:00", ) # single day assignment - date1 = add_days(today, -5) + date1 = add_days(today, -7) make_shift_assignment(shift_type.name, employee, date1, date1) - # assignment without end date - date2 = add_days(today, -4) + # assignment after a gap + date2 = add_days(today, -5) make_shift_assignment(shift_type.name, employee, date2, date2) + # assignment without end date + date3 = add_days(today, -3) + make_shift_assignment(shift_type.name, employee, date3) + shift_type.process_auto_attendance() absent_records = frappe.get_all( "Attendance", - { + fields=["name", "employee", "attendance_date", "status", "shift"], + filters={ "attendance_date": ["between", [date1, today]], "employee": employee, "status": "Absent", }, ) - self.assertEqual(len(absent_records), 2) + + self.assertEqual(len(absent_records), 5) + # absent for first assignment + self.assertEqual( + frappe.db.get_value( + "Attendance", + {"attendance_date": date1, "shift": shift_type.name, "employee": employee}, + "status", + ), + "Absent", + ) + # no attendance for day after first assignment + self.assertIsNone( + frappe.db.get_value( + "Attendance", + {"attendance_date": add_days(date1, 1), "shift": shift_type.name, "employee": employee}, + ) + ) + # absent for second assignment + self.assertEqual( + frappe.db.get_value( + "Attendance", + {"attendance_date": date2, "shift": shift_type.name, "employee": employee}, + "status", + ), + "Absent", + ) + # no attendance for day after second assignment + self.assertIsNone( + frappe.db.get_value( + "Attendance", + {"attendance_date": add_days(date2, 1), "shift": shift_type.name, "employee": employee}, + ) + ) + # absent for third assignment + self.assertEqual( + frappe.db.get_value( + "Attendance", + {"attendance_date": date3, "shift": shift_type.name, "employee": employee}, + "status", + ), + "Absent", + ) + self.assertEqual( + frappe.db.get_value( + "Attendance", + {"attendance_date": add_days(date3, 1), "shift": shift_type.name, "employee": employee}, + "status", + ), + "Absent", + ) def test_do_not_mark_absent_before_shift_actual_end_time(self): from hrms.hr.doctype.employee_checkin.test_employee_checkin import make_checkin From 2961109e79537d3ff69a319bddd837485571d8b0 Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Wed, 22 Jan 2025 16:43:03 +0530 Subject: [PATCH 29/30] refactor: None check for process_attendance_after is unnecessary since the field is made mandatory for auto attendance (cherry picked from commit 11623cc236a6cc38eed44d4e0f6779ba70109481) --- hrms/hr/doctype/shift_type/shift_type.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hrms/hr/doctype/shift_type/shift_type.py b/hrms/hr/doctype/shift_type/shift_type.py index 7435e75322..295bf91d7f 100644 --- a/hrms/hr/doctype/shift_type/shift_type.py +++ b/hrms/hr/doctype/shift_type/shift_type.py @@ -238,8 +238,8 @@ def get_assigned_employees(self, from_date=None, consider_default_shift=False) - This may fetch some redundant employees who have another shift assigned that may have started or ended before or after the attendance processing date. But this is done to avoid missing any employee who may have this shift as active shift.""" filters = {"shift_type": self.name, "docstatus": "1", "status": "Active"} - if from_date: - or_filters = [["end_date", ">=", from_date], ["end_date", "is", "not set"]] + + or_filters = [["end_date", ">=", from_date], ["end_date", "is", "not set"]] assigned_employees = frappe.get_all( "Shift Assignment", filters=filters, or_filters=or_filters, pluck="employee" From 8d545ad9fdde2e49d8f91189f674d4c33e361867 Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Wed, 22 Jan 2025 17:01:29 +0530 Subject: [PATCH 30/30] refactor: type check for process_attendance_date (cherry picked from commit d0f6488fdaaec31b41d9469a3e7dd52e1a6916a2) --- hrms/hr/doctype/shift_type/shift_type.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hrms/hr/doctype/shift_type/shift_type.py b/hrms/hr/doctype/shift_type/shift_type.py index 295bf91d7f..6dc8cefb56 100644 --- a/hrms/hr/doctype/shift_type/shift_type.py +++ b/hrms/hr/doctype/shift_type/shift_type.py @@ -233,7 +233,7 @@ def get_marked_attendance_dates_between(self, employee: str, start_date: str, en ) ).run(pluck=True) - def get_assigned_employees(self, from_date=None, consider_default_shift=False) -> list[str]: + def get_assigned_employees(self, from_date: datetime.date, consider_default_shift=False) -> list[str]: """Get all such employees who either have this shift assigned that hasn't ended or have this shift as default shift. This may fetch some redundant employees who have another shift assigned that may have started or ended before or after the attendance processing date. But this is done to avoid missing any employee who may have this shift as active shift."""