From 97660a8998d142aeb8d44c815ad3c26e9678c156 Mon Sep 17 00:00:00 2001 From: Ayush <54752747+ayush-AI@users.noreply.github.com> Date: Mon, 19 Jun 2023 18:26:04 +0530 Subject: [PATCH 01/17] (fix) O3-2081: Add unit tests for patient-registration-validation (#707) --- .../patient-registration-validation.test.tsx | 242 +++++++++--------- 1 file changed, 128 insertions(+), 114 deletions(-) diff --git a/packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.test.tsx b/packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.test.tsx index 6c4f01649..497e80533 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.test.tsx +++ b/packages/esm-patient-registration-app/src/patient-registration/validation/patient-registration-validation.test.tsx @@ -1,129 +1,143 @@ -import React from 'react'; -import { render, fireEvent, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; -import { Formik, Form } from 'formik'; -import { useConfig } from '@openmrs/esm-framework'; import { validationSchema } from './patient-registration-validation'; -import { NameField } from '../field/name/name-field.component'; -import { PatientRegistrationContext } from '../patient-registration-context'; -import { initialFormValues } from '../patient-registration.component'; -import { FormValues } from '../patient-registration-types'; -const mockUseConfig = useConfig as jest.Mock; -const mockFieldConfigs = { - fieldConfigurations: { - name: { - displayMiddleName: true, - }, - }, -}; +describe('Patient Registration Validation', () => { + describe('validationSchema', () => { + const validFormValues = { + givenName: 'John', + familyName: 'Doe', + additionalGivenName: '', + additionalFamilyName: '', + gender: 'Male', + birthdate: new Date('1990-01-01'), + birthdateEstimated: false, + deathDate: null, + email: 'john.doe@example.com', + identifiers: { + nationalId: { + required: true, + identifierValue: '123456789', + }, + passportId: { + required: false, + identifierValue: '', + }, + }, + }; -jest.mock('@openmrs/esm-framework', () => { - const originalModule = jest.requireActual('@openmrs/esm-framework'); + const validateFormValues = async (formValues) => { + try { + await validationSchema.validate(formValues, { abortEarly: false }); + } catch (err) { + return err; + } + }; - return { - ...originalModule, - useConfig: jest.fn(), - validator: jest.fn(), - }; -}); + it('should allow valid form values', async () => { + const validationError = await validateFormValues(validFormValues); + expect(validationError).toBeFalsy(); + }); -describe('Name input', () => { - const formValues: FormValues = initialFormValues; + it('should require givenName', async () => { + const invalidFormValues = { + ...validFormValues, + givenName: '', + }; + const validationError = await validateFormValues(invalidFormValues); + expect(validationError.errors).toContain('givenNameRequired'); + }); - const testValidName = (givenNameValue: string, middleNameValue: string, familyNameValue: string) => { - it( - 'does not display error message when givenNameValue: ' + - givenNameValue + - ', middleNameValue: ' + - middleNameValue + - ', familyNameValue: ' + - familyNameValue, - async () => { - const error = await updateNameAndReturnError(givenNameValue, middleNameValue, familyNameValue); - Object.values(error).map((currentError) => expect(currentError).toBeNull()); - }, - ); - }; + it('should require familyName', async () => { + const invalidFormValues = { + ...validFormValues, + familyName: '', + }; + const validationError = await validateFormValues(invalidFormValues); + expect(validationError.errors).toContain('familyNameRequired'); + }); - const testInvalidName = ( - givenNameValue: string, - middleNameValue: string, - familyNameValue: string, - expectedError: string, - errorType: string, - ) => { - it.skip( - 'displays error message when givenNameValue: ' + - givenNameValue + - ', middleNameValue: ' + - middleNameValue + - ', familyNameValue: ' + - familyNameValue, - async () => { - const error = (await updateNameAndReturnError(givenNameValue, middleNameValue, familyNameValue))[errorType]; - expect(error.textContent).toEqual(expectedError); - }, - ); - }; + it('should require additionalGivenName when addNameInLocalLanguage is true', async () => { + const invalidFormValues = { + ...validFormValues, + addNameInLocalLanguage: true, + additionalGivenName: '', + }; + const validationError = await validateFormValues(invalidFormValues); + expect(validationError.errors).toContain('givenNameRequired'); + }); - const updateNameAndReturnError = async (givenNameValue: string, middleNameValue: string, familyNameValue: string) => { - const user = userEvent.setup(); + it('should require additionalFamilyName when addNameInLocalLanguage is true', async () => { + const invalidFormValues = { + ...validFormValues, + addNameInLocalLanguage: true, + additionalFamilyName: '', + }; + const validationError = await validateFormValues(invalidFormValues); + expect(validationError.errors).toContain('familyNameRequired'); + }); - mockUseConfig.mockReturnValue(mockFieldConfigs); + it('should require gender', async () => { + const invalidFormValues = { + ...validFormValues, + gender: '', + }; + const validationError = await validateFormValues(invalidFormValues); + expect(validationError.errors).toContain('genderUnspecified'); + }); - render( - -
- {}, - values: formValues, - inEditMode: false, - setFieldValue: () => null, - currentPhoto: 'TEST', - isOffline: true, - setCapturePhotoProps: (value) => {}, - }}> - - -
-
, - ); - const givenNameInput = screen.getByLabelText('First Name') as HTMLInputElement; - const middleNameInput = screen.getByLabelText(/Middle Name/i) as HTMLInputElement; - const familyNameInput = screen.getByLabelText('Family Name') as HTMLInputElement; + it('should allow Male as a valid gender', async () => { + const validFormValuesWithOtherGender = { + ...validFormValues, + gender: 'Male', + }; + const validationError = await validateFormValues(validFormValuesWithOtherGender); + expect(validationError).toBeFalsy(); + }); - await user.click(givenNameInput); + it('should allow Female as a valid gender', async () => { + const validFormValuesWithOtherGender = { + ...validFormValues, + gender: 'Female', + }; + const validationError = await validateFormValues(validFormValuesWithOtherGender); + expect(validationError).toBeFalsy(); + }); - fireEvent.change(givenNameInput, { target: { value: givenNameValue } }); - fireEvent.blur(givenNameInput); - fireEvent.change(middleNameInput, { target: { value: middleNameValue } }); - fireEvent.blur(middleNameInput); - fireEvent.change(familyNameInput, { target: { value: familyNameValue } }); - fireEvent.blur(familyNameInput); + it('should throw error when date of birth is a future date', async () => { + const invalidFormValues = { + ...validFormValues, + birthdate: new Date('2100-01-01'), + }; + const validationError = await validateFormValues(invalidFormValues); + expect(validationError.errors).toContain('birthdayNotInTheFuture'); + }); - return { - givenNameError: screen.queryByText('Given name is required'), - middleNameError: screen.queryByText('Middle name is required'), - familyNameError: screen.queryByText('Family name is required'), - }; - }; + it('should require yearsEstimated when birthdateEstimated is true', async () => { + const invalidFormValues = { + ...validFormValues, + birthdateEstimated: true, + }; + const validationError = await validateFormValues(invalidFormValues); + expect(validationError.errors).toContain('yearsEstimateRequired'); + }); + + it('should throw error when monthEstimated is negative', async () => { + const invalidFormValues = { + ...validFormValues, + birthdateEstimated: true, + yearsEstimated: 0, + monthsEstimated: -1, + }; + const validationError = await validateFormValues(invalidFormValues); + expect(validationError.errors).toContain('negativeMonths'); + }); - testValidName('Aaron', 'A', 'Aaronson'); - testValidName('No', '', 'Middle Name'); - testInvalidName('', '', '', 'Given name is required', 'givenNameError'); - testInvalidName('', '', '', 'Family name is required', 'familyNameError'); - testInvalidName('', 'No', 'Given Name', 'Given name is required', 'givenNameError'); - testInvalidName('No', 'Family Name', '', 'Family name is required', 'familyNameError'); + it('should throw error when deathDate is in future', async () => { + const invalidFormValues = { + ...validFormValues, + deathDate: new Date('2100-01-01'), + }; + const validationError = await validateFormValues(invalidFormValues); + expect(validationError.errors).toContain('deathdayNotInTheFuture'); + }); + }); }); From f7df862db45074cc3abb29ad947d4c2d5c745089 Mon Sep 17 00:00:00 2001 From: Dennis Kigen Date: Tue, 20 Jun 2023 05:58:51 +0300 Subject: [PATCH 02/17] (test) Refactor tests to use naming conventions and BDD-like syntax (#728) --- ...hortOperations.ts => cohort-operations.ts} | 2 +- ...rOperations.ts => encounter-operations.ts} | 0 e2e/commands/index.ts | 10 +- ...entOperations.ts => patient-operations.ts} | 0 ...erOperations.ts => provider-operations.ts} | 0 ...visitOperations.ts => visit-operations.ts} | 0 e2e/pages/{homePage.ts => home-page.ts} | 0 e2e/pages/index.ts | 6 +- ...ientListsPage.ts => patient-lists-page.ts} | 0 ...tPage.ts => registration-and-edit-page.ts} | 0 e2e/specs/active-visits.spec.ts | 63 +++++++++++ e2e/specs/activeVisits.spec.ts | 59 ---------- e2e/specs/edit-patient.spec.ts | 63 +++++++++++ e2e/specs/patient-list.spec.ts | 103 ++++++++++++++++++ ...tSearch.spec.ts => patient-search.spec.ts} | 6 +- e2e/specs/patientEdit.spec.ts | 57 ---------- e2e/specs/patientList.spec.ts | 92 ---------------- e2e/specs/patientRegistration.spec.ts | 57 ---------- e2e/specs/register-new-patient.spec.ts | 63 +++++++++++ 19 files changed, 304 insertions(+), 277 deletions(-) rename e2e/commands/{cohortOperations.ts => cohort-operations.ts} (97%) rename e2e/commands/{encounterOperations.ts => encounter-operations.ts} (100%) rename e2e/commands/{patientOperations.ts => patient-operations.ts} (100%) rename e2e/commands/{providerOperations.ts => provider-operations.ts} (100%) rename e2e/commands/{visitOperations.ts => visit-operations.ts} (100%) rename e2e/pages/{homePage.ts => home-page.ts} (100%) rename e2e/pages/{patientListsPage.ts => patient-lists-page.ts} (100%) rename e2e/pages/{registrationAndEditPage.ts => registration-and-edit-page.ts} (100%) create mode 100644 e2e/specs/active-visits.spec.ts delete mode 100644 e2e/specs/activeVisits.spec.ts create mode 100644 e2e/specs/edit-patient.spec.ts create mode 100644 e2e/specs/patient-list.spec.ts rename e2e/specs/{patientSearch.spec.ts => patient-search.spec.ts} (95%) delete mode 100644 e2e/specs/patientEdit.spec.ts delete mode 100644 e2e/specs/patientList.spec.ts delete mode 100644 e2e/specs/patientRegistration.spec.ts create mode 100644 e2e/specs/register-new-patient.spec.ts diff --git a/e2e/commands/cohortOperations.ts b/e2e/commands/cohort-operations.ts similarity index 97% rename from e2e/commands/cohortOperations.ts rename to e2e/commands/cohort-operations.ts index 2c55f0269..0c672510e 100644 --- a/e2e/commands/cohortOperations.ts +++ b/e2e/commands/cohort-operations.ts @@ -1,5 +1,5 @@ import { APIRequestContext, expect } from '@playwright/test'; -import { Patient } from './patientOperations'; +import { Patient } from './patient-operations'; export interface CohortType { uuid: string; diff --git a/e2e/commands/encounterOperations.ts b/e2e/commands/encounter-operations.ts similarity index 100% rename from e2e/commands/encounterOperations.ts rename to e2e/commands/encounter-operations.ts diff --git a/e2e/commands/index.ts b/e2e/commands/index.ts index cab5a29ba..9fb4a27f7 100644 --- a/e2e/commands/index.ts +++ b/e2e/commands/index.ts @@ -1,5 +1,5 @@ -export * from './patientOperations'; -export * from './encounterOperations'; -export * from './visitOperations'; -export * from './providerOperations'; -export * from './cohortOperations'; +export * from './patient-operations'; +export * from './encounter-operations'; +export * from './visit-operations'; +export * from './provider-operations'; +export * from './cohort-operations'; diff --git a/e2e/commands/patientOperations.ts b/e2e/commands/patient-operations.ts similarity index 100% rename from e2e/commands/patientOperations.ts rename to e2e/commands/patient-operations.ts diff --git a/e2e/commands/providerOperations.ts b/e2e/commands/provider-operations.ts similarity index 100% rename from e2e/commands/providerOperations.ts rename to e2e/commands/provider-operations.ts diff --git a/e2e/commands/visitOperations.ts b/e2e/commands/visit-operations.ts similarity index 100% rename from e2e/commands/visitOperations.ts rename to e2e/commands/visit-operations.ts diff --git a/e2e/pages/homePage.ts b/e2e/pages/home-page.ts similarity index 100% rename from e2e/pages/homePage.ts rename to e2e/pages/home-page.ts diff --git a/e2e/pages/index.ts b/e2e/pages/index.ts index 65d72dd22..c9d12e100 100644 --- a/e2e/pages/index.ts +++ b/e2e/pages/index.ts @@ -1,3 +1,3 @@ -export * from './homePage'; -export * from './registrationAndEditPage'; -export * from './patientListsPage'; +export * from './home-page'; +export * from './registration-and-edit-page'; +export * from './patient-lists-page'; diff --git a/e2e/pages/patientListsPage.ts b/e2e/pages/patient-lists-page.ts similarity index 100% rename from e2e/pages/patientListsPage.ts rename to e2e/pages/patient-lists-page.ts diff --git a/e2e/pages/registrationAndEditPage.ts b/e2e/pages/registration-and-edit-page.ts similarity index 100% rename from e2e/pages/registrationAndEditPage.ts rename to e2e/pages/registration-and-edit-page.ts diff --git a/e2e/specs/active-visits.spec.ts b/e2e/specs/active-visits.spec.ts new file mode 100644 index 000000000..f1f13089f --- /dev/null +++ b/e2e/specs/active-visits.spec.ts @@ -0,0 +1,63 @@ +import { expect } from '@playwright/test'; +import { Visit } from '@openmrs/esm-framework'; +import { test } from '../core'; +import type { Provider } from '../../packages/esm-appointments-app/src/types/index'; +import type { Encounter } from '../../packages/esm-active-visits-app/src/visits-summary/visit.resource'; +import { + createEncounter, + deleteEncounter, + deletePatient, + endVisit, + generateRandomPatient, + Patient, + startVisit, + getProvider, +} from '../commands'; +import { HomePage } from '../pages'; + +let patient: Patient; +let visit: Visit; +let encounter: Encounter; +let provider: Provider; +const encounterNote = 'This is a test note'; + +test.beforeEach(async ({ api }) => { + patient = await generateRandomPatient(api); + visit = await startVisit(api, patient.uuid); + provider = await getProvider(api); + encounter = await createEncounter(api, patient.uuid, provider.uuid, encounterNote); +}); + +test('View active visits', async ({ page }) => { + const homePage = new HomePage(page); + const openmrsIdentifier = patient.identifiers[0].display.split('=')[1].trim(); + const firstName = patient.person.display.split(' ')[0]; + const lastName = patient.person.display.split(' ')[1]; + + await test.step('When I visit the home page', async () => { + await homePage.goto(); + }); + + await test.step("And I click on a patient's name in the active visits table", async () => { + await homePage.clickOnActiveVisitPatient(patient.uuid); + }); + + await test.step('Then I should see data about the active visit such as the encounters recorded during their visit and their observations and a summary of the diagnoses, notes, and medications recorded', async () => { + // Checks the visit details + await expect(page.getByTestId(`${visit.uuid}:idNumber`)).toContainText(openmrsIdentifier); + await expect(page.getByTestId(`${visit.uuid}:name`)).toContainText(`${firstName} ${lastName}`); + await expect(page.getByTestId(`${visit.uuid}:visitType`)).toContainText(visit.visitType.display); + // Checks for the encounter + await expect(page.getByTestId(`${encounter.uuid}:encounterType`)).toContainText(encounter.encounterType.display); + await expect(page.getByTestId(`${encounter.uuid}:provider`)).toContainText('Super User: Clinician'); + // Checks for the visit note + await homePage.clickOnVisitSummaryTab(); + await expect(page.getByTestId('note')).toContainText(encounterNote); + }); +}); + +test.afterEach(async ({ api }) => { + await endVisit(api, patient.uuid); + await deleteEncounter(api, encounter.uuid); + await deletePatient(api, patient.uuid); +}); diff --git a/e2e/specs/activeVisits.spec.ts b/e2e/specs/activeVisits.spec.ts deleted file mode 100644 index cc16c2a3b..000000000 --- a/e2e/specs/activeVisits.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Provider } from './../../packages/esm-appointments-app/src/types/index'; -import { Encounter } from './../../packages/esm-active-visits-app/src/visits-summary/visit.resource'; -import { test } from '../core'; -import { HomePage } from '../pages'; -import { expect } from '@playwright/test'; -import { - createEncounter, - deleteEncounter, - deletePatient, - endVisit, - generateRandomPatient, - Patient, - startVisit, - getProvider, -} from '../commands'; -import { Visit } from '@openmrs/esm-framework'; - -let patient: Patient; -let visit: Visit; -let encounter: Encounter; -let provider: Provider; -const encounterNote = 'This is a test note'; - -test.beforeEach(async ({ api }) => { - patient = await generateRandomPatient(api); - visit = await startVisit(api, patient.uuid); - provider = await getProvider(api); - encounter = await createEncounter(api, patient.uuid, provider.uuid, encounterNote); -}); - -test('should be able to see the active visits', async ({ page }) => { - const homePage = new HomePage(page); - const openmrsIdentifier = patient.identifiers[0].display.split('=')[1].trim(); - const firstName = patient.person.display.split(' ')[0]; - const lastName = patient.person.display.split(' ')[1]; - - await homePage.goto(); - - await homePage.clickOnActiveVisitPatient(patient.uuid); - - // Checks the visit details - await expect(page.getByTestId(`${visit.uuid}:idNumber`)).toContainText(openmrsIdentifier); - await expect(page.getByTestId(`${visit.uuid}:name`)).toContainText(`${firstName} ${lastName}`); - await expect(page.getByTestId(`${visit.uuid}:visitType`)).toContainText(visit.visitType.display); - - // Checks for the encounter - await expect(page.getByTestId(`${encounter.uuid}:encounterType`)).toContainText(encounter.encounterType.display); - await expect(page.getByTestId(`${encounter.uuid}:provider`)).toContainText('Super User: Clinician'); - - // Checks for the visit note - await homePage.clickOnVisitSummaryTab(); - await expect(page.getByTestId('note')).toContainText(encounterNote); -}); - -test.afterEach(async ({ api }) => { - await endVisit(api, patient.uuid); - await deleteEncounter(api, encounter.uuid); - await deletePatient(api, patient.uuid); -}); diff --git a/e2e/specs/edit-patient.spec.ts b/e2e/specs/edit-patient.spec.ts new file mode 100644 index 000000000..6ae0c153e --- /dev/null +++ b/e2e/specs/edit-patient.spec.ts @@ -0,0 +1,63 @@ +import dayjs from 'dayjs'; +import { expect } from '@playwright/test'; +import { test } from '../core'; +import { deletePatient, generateRandomPatient, getPatient, Patient } from '../commands'; +import { PatientRegistrationFormValues, RegistrationAndEditPage } from '../pages'; + +let patient: Patient; +test.beforeEach(async ({ api }) => { + patient = await generateRandomPatient(api); +}); + +// TODO: Add email field after fixing O3-1883 (https://issues.openmrs.org/browse/O3-1883) +const formValues: PatientRegistrationFormValues = { + givenName: `Johnny`, + middleName: 'Donny', + familyName: `Ronny`, + sex: 'male', + birthdate: '01/02/2020', + postalCode: '', + address1: 'Bom Jesus Street', + address2: '', + country: 'Brazil', + countyDistrict: 'Antônio dos Santos', + stateProvince: 'Pernambuco', + cityVillage: 'Recife', + phone: '5555551234', +}; + +test('Edit a patient', async ({ page, api }) => { + test.setTimeout(5 * 60 * 1000); + const patientEditPage = new RegistrationAndEditPage(page); + + await test.step("When I visit the registration page to a patient's details", async () => { + await patientEditPage.goto(patient.uuid); + }); + + await test.step('And then I click on fill new values into the registration form and then click the `Submit` button', async () => { + await expect(patientEditPage.givenNameInput()).not.toHaveValue('', { timeout: 2 * 60 * 1000 }); + + await patientEditPage.fillPatientRegistrationForm(formValues); + }); + + await test.step("Then I should be redirected to the patient's chart page and the patient object should have updated information", async () => { + await expect(page).toHaveURL(`${process.env.E2E_BASE_URL}/spa/patient/${patient.uuid}/chart/Patient Summary`); + const updatedPatient = await getPatient(api, patient.uuid); + const { person } = updatedPatient; + const { givenName, middleName, familyName, sex } = formValues; + + await expect(person.display).toBe(`${givenName} ${middleName} ${familyName}`); + await expect(person.gender).toBe(sex[0].toUpperCase()); + await expect(dayjs(person.birthdate).format('DD/MM/YYYY')).toBe(formValues.birthdate); + await expect(person.preferredAddress.address1).toBe(formValues.address1); + await expect(person.preferredAddress.cityVillage).toBe(formValues.cityVillage); + await expect(person.preferredAddress.stateProvince).toBe(formValues.stateProvince); + await expect(person.preferredAddress.country).toBe(formValues.country); + await expect(person.preferredAddress.countyDistrict).toBe(formValues.countyDistrict); + await expect(person.attributes[0].display).toBe(`Telephone Number = ${formValues.phone}`); + }); +}); + +test.afterEach(async ({ api }) => { + await deletePatient(api, patient.uuid); +}); diff --git a/e2e/specs/patient-list.spec.ts b/e2e/specs/patient-list.spec.ts new file mode 100644 index 000000000..7be40f984 --- /dev/null +++ b/e2e/specs/patient-list.spec.ts @@ -0,0 +1,103 @@ +import { test } from '../core'; +import { PatientListsPage } from '../pages'; +import { expect } from '@playwright/test'; +import { + type Cohort, + type CohortMember, + type Patient, + addPatientToCohort, + deleteCohort, + deletePatient, + generateRandomCohort, + generateRandomPatient, + removePatientFromCohort, +} from '../commands'; + +let createdCohortMember: CohortMember; +let createdCohortUuid: string; +let cohort: Cohort; +let patient: Patient; + +test.beforeEach(async ({ api }) => { + patient = await generateRandomPatient(api); + cohort = await generateRandomCohort(api); +}); + +test('Create and edit a patient list', async ({ page }) => { + const patientListPage = new PatientListsPage(page); + + await test.step('When I visit the patient lists page', async () => { + await patientListPage.goto(); + }); + + // Create a new patient list + const patientListName = `Cohort ${Math.floor(Math.random() * 10000)}`; + const patientListDescription = `Cohort Description ${Math.floor(Math.random() * 10000)}`; + + await test.step('Then I create a new list', async () => { + await patientListPage.addNewPatientList(patientListName, patientListDescription); + }); + + await test.step("And then I navigate to the new list's page", async () => { + await patientListPage.allListsButton().click(); + await patientListPage.searchPatientList(patientListName); + await patientListPage.patientListsTable().getByText(patientListName).click(); + }); + + await test.step('Then I should see the information about the list', async () => { + await expect(page).toHaveURL(new RegExp('^[\\w\\d:\\/.-]+\\/patient-lists\\/[\\w\\d-]+$')); + createdCohortUuid = /patient-lists\/([\w\d-]+)/.exec(page.url())?.[1] ?? null; + + await expect(patientListPage.patientListHeader()).toHaveText(new RegExp(patientListName)); + await expect(patientListPage.patientListHeader()).toHaveText(new RegExp(patientListDescription)); + await expect(patientListPage.patientListHeader()).toHaveText(/0 patients/); + }); + + // Edit the patient list + const editedPatientListName = patientListName + ' edited'; + const editedPatientListDescription = patientListDescription + ' edited'; + + await test.step("When I edit the list's details", async () => { + await patientListPage.editPatientList(editedPatientListName, editedPatientListDescription); + }); + + await test.step('Then I should see the updated information about the list', async () => { + await expect(patientListPage.patientListHeader()).toHaveText(new RegExp(editedPatientListName)); + await expect(patientListPage.patientListHeader()).toHaveText(new RegExp(editedPatientListDescription)); + }); +}); + +test('Manage patients in a list', async ({ api, page }) => { + await test.step("When I visit a specific patient list's page", async () => { + const patientListPage = new PatientListsPage(page); + await patientListPage.goto(cohort.uuid); + }); + + await test.step('Then I should be able to add and remove patients from that list', async () => { + const patientListPage = new PatientListsPage(page); + + // Add a patient to the list + createdCohortMember = await addPatientToCohort(api, cohort.uuid, patient.uuid); + await patientListPage.goto(cohort.uuid); + await expect(patientListPage.patientListHeader()).toHaveText(/1 patients/); + await expect(patientListPage.patientsTable()).toHaveText(new RegExp(patient.person.display)); + + // Remove a patient from the list + await removePatientFromCohort(api, createdCohortMember.uuid); + await patientListPage.goto(cohort.uuid); + await expect(patientListPage.patientListHeader()).toHaveText(/0 patients/); + await expect(patientListPage.patientsTable()).not.toHaveText(new RegExp(patient.person.display)); + createdCohortMember = null; + }); +}); + +test.afterEach(async ({ api }) => { + if (createdCohortMember) { + await removePatientFromCohort(api, createdCohortMember.uuid); + } + if (createdCohortUuid) { + await deleteCohort(api, createdCohortUuid); + } + await deletePatient(api, patient.uuid); + await deleteCohort(api, cohort.uuid); +}); diff --git a/e2e/specs/patientSearch.spec.ts b/e2e/specs/patient-search.spec.ts similarity index 95% rename from e2e/specs/patientSearch.spec.ts rename to e2e/specs/patient-search.spec.ts index e4d2fe088..25e4bc55e 100644 --- a/e2e/specs/patientSearch.spec.ts +++ b/e2e/specs/patient-search.spec.ts @@ -1,6 +1,6 @@ +import { expect } from '@playwright/test'; import { test } from '../core'; import { HomePage } from '../pages'; -import { expect } from '@playwright/test'; import { generateRandomPatient, deletePatient, Patient } from '../commands'; let patient: Patient; @@ -31,11 +31,11 @@ test('Search patient by patient identifier', async ({ page, api }) => { await expect(homePage.floatingSearchResultsContainer()).toHaveText(new RegExp(openmrsIdentifier)); }); - await test.step('When I click on the patient', async () => { + await test.step('When I click on the patient record', async () => { await homePage.clickOnPatientResult(firstName); }); - await test.step("Then I should be in the patient's chart page", async () => { + await test.step("Then I should be redirected to the patient's chart page", async () => { await expect(homePage.page).toHaveURL( `${process.env.E2E_BASE_URL}/spa/patient/${patient.uuid}/chart/Patient Summary`, ); diff --git a/e2e/specs/patientEdit.spec.ts b/e2e/specs/patientEdit.spec.ts deleted file mode 100644 index fd711ab27..000000000 --- a/e2e/specs/patientEdit.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { test } from '../core'; -import { expect } from '@playwright/test'; -import { PatientRegistrationFormValues, RegistrationAndEditPage } from '../pages'; -import { deletePatient, generateRandomPatient, getPatient, Patient } from '../commands'; -import dayjs from 'dayjs'; - -let patient: Patient; -test.beforeEach(async ({ api }) => { - patient = await generateRandomPatient(api); -}); - -test('should be able to edit a patient', async ({ page, api }) => { - test.setTimeout(5 * 60 * 1000); - const patientEditPage = new RegistrationAndEditPage(page); - - await patientEditPage.goto(patient.uuid); - - await expect(patientEditPage.givenNameInput()).not.toHaveValue('', { timeout: 2 * 60 * 1000 }); - - // TODO: Add email field after fixing O3-1883 (https://issues.openmrs.org/browse/O3-1883) - const formValues: PatientRegistrationFormValues = { - givenName: `Johnny`, - middleName: 'Donny', - familyName: `Ronny`, - sex: 'male', - birthdate: '01/02/2020', - postalCode: '', - address1: 'Bom Jesus Street', - address2: '', - country: 'Brazil', - countyDistrict: 'Antônio dos Santos', - stateProvince: 'Pernambuco', - cityVillage: 'Recife', - phone: '5555551234', - }; - - await patientEditPage.fillPatientRegistrationForm(formValues); - - await expect(page).toHaveURL(`${process.env.E2E_BASE_URL}/spa/patient/${patient.uuid}/chart/Patient Summary`); - const updatedPatient = await getPatient(api, patient.uuid); - const { person } = updatedPatient; - const { givenName, middleName, familyName, sex } = formValues; - - await expect(person.display).toBe(`${givenName} ${middleName} ${familyName}`); - await expect(person.gender).toBe(sex[0].toUpperCase()); - await expect(dayjs(person.birthdate).format('DD/MM/YYYY')).toBe(formValues.birthdate); - await expect(person.preferredAddress.address1).toBe(formValues.address1); - await expect(person.preferredAddress.cityVillage).toBe(formValues.cityVillage); - await expect(person.preferredAddress.stateProvince).toBe(formValues.stateProvince); - await expect(person.preferredAddress.country).toBe(formValues.country); - await expect(person.preferredAddress.countyDistrict).toBe(formValues.countyDistrict); - await expect(person.attributes[0].display).toBe(`Telephone Number = ${formValues.phone}`); -}); - -test.afterEach(async ({ api }) => { - await deletePatient(api, patient.uuid); -}); diff --git a/e2e/specs/patientList.spec.ts b/e2e/specs/patientList.spec.ts deleted file mode 100644 index f079b5763..000000000 --- a/e2e/specs/patientList.spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { test } from '../core'; -import { PatientListsPage } from '../pages'; -import { expect } from '@playwright/test'; -import { - addPatientToCohort, - Cohort, - CohortMember, - deleteCohort, - deletePatient, - generateRandomCohort, - generateRandomPatient, - Patient, - removePatientFromCohort, -} from '../commands'; - -let patient: Patient; -let cohort: Cohort; -let createdCohortUuid: string; -let createdCohortMember: CohortMember; - -test.beforeEach(async ({ api }) => { - patient = await generateRandomPatient(api); - cohort = await generateRandomCohort(api); -}); - -test('should be able to create and edit a patient list', async ({ page }) => { - const patientListPage = new PatientListsPage(page); - await patientListPage.goto(); - - // Create a new patient list - const patientListName = `Cohort ${Math.floor(Math.random() * 10000)}`; - const patientListDescription = `Cohort Description ${Math.floor(Math.random() * 10000)}`; - await patientListPage.addNewPatientList(patientListName, patientListDescription); - - await patientListPage.allListsButton().click(); - await patientListPage.searchPatientList(patientListName); - await patientListPage.patientListsTable().getByText(patientListName).click(); - - await expect(page).toHaveURL(new RegExp('^[\\w\\d:\\/.-]+\\/patient-lists\\/[\\w\\d-]+$')); - createdCohortUuid = /patient-lists\/([\w\d-]+)/.exec(page.url())?.[1] ?? null; - - await expect(patientListPage.patientListHeader()).toHaveText(new RegExp(patientListName)); - await expect(patientListPage.patientListHeader()).toHaveText(new RegExp(patientListDescription)); - await expect(patientListPage.patientListHeader()).toHaveText(/0 patients/); - - // Edit the patient list - const editedPatientListName = patientListName + ' edited'; - const editedPatientListDescription = patientListDescription + ' edited'; - await patientListPage.editPatientList(editedPatientListName, editedPatientListDescription); - - await expect(patientListPage.patientListHeader()).toHaveText(new RegExp(editedPatientListName)); - await expect(patientListPage.patientListHeader()).toHaveText(new RegExp(editedPatientListDescription)); -}); - -test('should be able to delete a patient list', async ({ page }) => { - const patientListPage = new PatientListsPage(page); - await patientListPage.goto(cohort.uuid); - - await patientListPage.deletePatientList(); - - await patientListPage.allListsButton().click(); - await patientListPage.searchPatientList(cohort.name); - await expect(patientListPage.page.getByText('There are no patient lists to display')).toBeVisible(); -}); - -test('should be able to manage patients in a patient list', async ({ page, api }) => { - const patientListPage = new PatientListsPage(page); - - // Add a patient to the patient list - createdCohortMember = await addPatientToCohort(api, cohort.uuid, patient.uuid); - await patientListPage.goto(cohort.uuid); - await expect(patientListPage.patientListHeader()).toHaveText(/1 patients/); - await expect(patientListPage.patientsTable()).toHaveText(new RegExp(patient.person.display)); - - // Remove a patient from the patient list - await removePatientFromCohort(api, createdCohortMember.uuid); - await patientListPage.goto(cohort.uuid); - await expect(patientListPage.patientListHeader()).toHaveText(/0 patients/); - await expect(patientListPage.patientsTable()).not.toHaveText(new RegExp(patient.person.display)); - createdCohortMember = null; -}); - -test.afterEach(async ({ api }) => { - if (createdCohortMember) { - await removePatientFromCohort(api, createdCohortMember.uuid); - } - if (createdCohortUuid) { - await deleteCohort(api, createdCohortUuid); - } - await deletePatient(api, patient.uuid); - await deleteCohort(api, cohort.uuid); -}); diff --git a/e2e/specs/patientRegistration.spec.ts b/e2e/specs/patientRegistration.spec.ts deleted file mode 100644 index 67c351d07..000000000 --- a/e2e/specs/patientRegistration.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { test } from '../core'; -import { expect } from '@playwright/test'; -import { PatientRegistrationFormValues, RegistrationAndEditPage } from '../pages'; -import { deletePatient, getPatient } from '../commands'; -import dayjs from 'dayjs'; - -let patientUuid: string; - -test('should be able to register a patient', async ({ page, api }) => { - test.setTimeout(5 * 60 * 1000); - const patientRegistrationPage = new RegistrationAndEditPage(page); - - await patientRegistrationPage.goto(); - - // TODO: Add email field after fixing O3-1883 (https://issues.openmrs.org/browse/O3-1883) - const formValues: PatientRegistrationFormValues = { - givenName: `Johnny`, - middleName: 'Donny', - familyName: `Ronny`, - sex: 'male', - birthdate: '01/02/2020', - postalCode: '', - address1: 'Bom Jesus Street', - address2: '', - country: 'Brazil', - countyDistrict: 'Antônio dos Santos', - stateProvince: 'Pernambuco', - cityVillage: 'Recife', - phone: '5555551234', - }; - - await patientRegistrationPage.fillPatientRegistrationForm(formValues); - - await expect(page).toHaveURL(new RegExp('^[\\w\\d:\\/.-]+\\/patient\\/[\\w\\d-]+\\/chart\\/.*$')); - const patientUuid = /patient\/(.+)\/chart/.exec(page.url())?.[1] ?? null; - await expect(patientUuid).not.toBeNull(); - - const patient = await getPatient(api, patientUuid); - const { person } = patient; - const { givenName, middleName, familyName, sex } = formValues; - - await expect(person.display).toBe(`${givenName} ${middleName} ${familyName}`); - await expect(person.gender).toBe(sex[0].toUpperCase()); - await expect(dayjs(person.birthdate).format('DD/MM/YYYY')).toBe(formValues.birthdate); - await expect(person.preferredAddress.address1).toBe(formValues.address1); - await expect(person.preferredAddress.cityVillage).toBe(formValues.cityVillage); - await expect(person.preferredAddress.stateProvince).toBe(formValues.stateProvince); - await expect(person.preferredAddress.country).toBe(formValues.country); - await expect(person.preferredAddress.countyDistrict).toBe(formValues.countyDistrict); - await expect(person.attributes[0].display).toBe(`Telephone Number = ${formValues.phone}`); -}); - -test.afterEach(async ({ api }) => { - if (patientUuid) { - await deletePatient(api, patientUuid); - } -}); diff --git a/e2e/specs/register-new-patient.spec.ts b/e2e/specs/register-new-patient.spec.ts new file mode 100644 index 000000000..f3bf62f9d --- /dev/null +++ b/e2e/specs/register-new-patient.spec.ts @@ -0,0 +1,63 @@ +import dayjs from 'dayjs'; +import { expect } from '@playwright/test'; +import { test } from '../core'; +import { PatientRegistrationFormValues, RegistrationAndEditPage } from '../pages'; +import { deletePatient, getPatient } from '../commands'; + +let patientUuid: string; + +test('Register a new patient', async ({ page, api }) => { + test.setTimeout(5 * 60 * 1000); + const patientRegistrationPage = new RegistrationAndEditPage(page); + + // TODO: Add email field after fixing O3-1883 (https://issues.openmrs.org/browse/O3-1883) + const formValues: PatientRegistrationFormValues = { + givenName: `Johnny`, + middleName: 'Donny', + familyName: `Ronny`, + sex: 'male', + birthdate: '01/02/2020', + postalCode: '', + address1: 'Bom Jesus Street', + address2: '', + country: 'Brazil', + countyDistrict: 'Antônio dos Santos', + stateProvince: 'Pernambuco', + cityVillage: 'Recife', + phone: '5555551234', + }; + + await test.step('When I visit the registration page', async () => { + await patientRegistrationPage.goto(); + }); + + await test.step('And then I click on fill new values into the registration form and then click the `Submit` button', async () => { + await patientRegistrationPage.fillPatientRegistrationForm(formValues); + }); + + await test.step("Then I should be redirected to the new patient's chart page and a new patient record should be created from the information captured in the form", async () => { + await expect(page).toHaveURL(new RegExp('^[\\w\\d:\\/.-]+\\/patient\\/[\\w\\d-]+\\/chart\\/.*$')); + const patientUuid = /patient\/(.+)\/chart/.exec(page.url())?.[1] ?? null; + await expect(patientUuid).not.toBeNull(); + + const patient = await getPatient(api, patientUuid); + const { person } = patient; + const { givenName, middleName, familyName, sex } = formValues; + + await expect(person.display).toBe(`${givenName} ${middleName} ${familyName}`); + await expect(person.gender).toBe(sex[0].toUpperCase()); + await expect(dayjs(person.birthdate).format('DD/MM/YYYY')).toBe(formValues.birthdate); + await expect(person.preferredAddress.address1).toBe(formValues.address1); + await expect(person.preferredAddress.cityVillage).toBe(formValues.cityVillage); + await expect(person.preferredAddress.stateProvince).toBe(formValues.stateProvince); + await expect(person.preferredAddress.country).toBe(formValues.country); + await expect(person.preferredAddress.countyDistrict).toBe(formValues.countyDistrict); + await expect(person.attributes[0].display).toBe(`Telephone Number = ${formValues.phone}`); + }); +}); + +test.afterEach(async ({ api }) => { + if (patientUuid) { + await deletePatient(api, patientUuid); + } +}); From 980aec2babfb90a49aba4c6583a7520d5936f56c Mon Sep 17 00:00:00 2001 From: AlexanderMizgirev <68945262+AlexanderMizgirev@users.noreply.github.com> Date: Tue, 20 Jun 2023 12:22:56 +0300 Subject: [PATCH 03/17] (fix) O3-2152: Fix styles in appointments calendar, fix arrows in patient registration (#729) --- .../daily/daily-calendar.scss | 18 ++++++++++++++++++ .../daily/daily-workload-module.scss | 12 ++++++++++++ .../weekly/weekly-calendar.scss | 13 +++++++++++++ .../weekly/weekly-header.scss | 14 ++++++++++++++ .../patient-registration.scss | 14 ++++++++++++++ 5 files changed, 71 insertions(+) diff --git a/packages/esm-appointments-app/src/appointments-calendar/daily/daily-calendar.scss b/packages/esm-appointments-app/src/appointments-calendar/daily/daily-calendar.scss index f5035be90..0d4c74663 100644 --- a/packages/esm-appointments-app/src/appointments-calendar/daily/daily-calendar.scss +++ b/packages/esm-appointments-app/src/appointments-calendar/daily/daily-calendar.scss @@ -51,3 +51,21 @@ border-top: 1px solid colors.$gray-20; } } + +// Overriding styles for RTL support +html[dir='rtl'] { + .container { + padding-left: unset; + padding-right: 50px; + } + + .daily-calendar { + border-right: unset; + border-left: 1px solid colors.$gray-20; + } + + .empty-cell { + border-right: unset; + border-left: 1px solid colors.$gray-20; + } +} diff --git a/packages/esm-appointments-app/src/appointments-calendar/daily/daily-workload-module.scss b/packages/esm-appointments-app/src/appointments-calendar/daily/daily-workload-module.scss index ce303a81a..28a246594 100644 --- a/packages/esm-appointments-app/src/appointments-calendar/daily/daily-workload-module.scss +++ b/packages/esm-appointments-app/src/appointments-calendar/daily/daily-workload-module.scss @@ -138,3 +138,15 @@ color: colors.$white; font-weight: bold; } + +// Overriding styles for RTL support +html[dir='rtl'] { + .weekly-cell { + &:first-child { + .allDay { + border-left: 1px solid colors.$gray-20; + border-right: none; + } + } + } +} diff --git a/packages/esm-appointments-app/src/appointments-calendar/weekly/weekly-calendar.scss b/packages/esm-appointments-app/src/appointments-calendar/weekly/weekly-calendar.scss index 593b273f7..4d23da0a2 100644 --- a/packages/esm-appointments-app/src/appointments-calendar/weekly/weekly-calendar.scss +++ b/packages/esm-appointments-app/src/appointments-calendar/weekly/weekly-calendar.scss @@ -52,3 +52,16 @@ } } } + +// Overriding styles for RTL support +html[dir='rtl'] { + .container { + padding-left: unset; + padding-right: 50px; + } + + .weekly-cell { + border-right: unset; + border-left: 1px solid colors.$gray-20; + } +} diff --git a/packages/esm-appointments-app/src/appointments-calendar/weekly/weekly-header.scss b/packages/esm-appointments-app/src/appointments-calendar/weekly/weekly-header.scss index daf223d90..f72c519b1 100644 --- a/packages/esm-appointments-app/src/appointments-calendar/weekly/weekly-header.scss +++ b/packages/esm-appointments-app/src/appointments-calendar/weekly/weekly-header.scss @@ -43,3 +43,17 @@ @include carbon--type-style('productive-heading-01'); color: $text-02; } + +// Overriding styles for RTL support +html[dir='rtl'] { + .container { + & > span { + direction: ltr; + } + } + + .workLoadCard { + padding-left: unset; + padding-right: 60px; + } +} diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration.scss b/packages/esm-patient-registration-app/src/patient-registration/patient-registration.scss index 3ad7c3493..16da18d04 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/patient-registration.scss +++ b/packages/esm-patient-registration-app/src/patient-registration/patient-registration.scss @@ -92,3 +92,17 @@ max-width: unset; } } + +// Overriding styles for RTL support +html[dir='rtl'] { + .linkName { + & > svg { + transform: scale(-1, 1); + } + } + + .infoGrid { + padding-left: unset; + padding-right: spacing.$spacing-07; + } +} From 9a854a4760149ebed074e13e4ac26b19c3e82895 Mon Sep 17 00:00:00 2001 From: Mark Goodrich Date: Tue, 20 Jun 2023 06:41:57 -0400 Subject: [PATCH 04/17] O3-2022: Editing Patients changes Birthday in UTC-minus timezones (#727) * O3-2022: Editing Patients changes Birthday in UTC-minus timezones * Remove unnecessary type casting to `any` Co-authored-by: Ian <52504170+ibacher@users.noreply.github.com> --------- Co-authored-by: Dennis Kigen Co-authored-by: Ian <52504170+ibacher@users.noreply.github.com> --- .../src/patient-registration/patient-registration-utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration-utils.ts b/packages/esm-patient-registration-app/src/patient-registration/patient-registration-utils.ts index 8ea49881a..437eba037 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/patient-registration-utils.ts +++ b/packages/esm-patient-registration-app/src/patient-registration/patient-registration-utils.ts @@ -1,4 +1,3 @@ -import { navigate } from '@openmrs/esm-framework'; import * as Yup from 'yup'; import { AddressValidationSchemaType, @@ -8,6 +7,7 @@ import { PatientIdentifierValue, Encounter, } from './patient-registration-types'; +import { parseDate } from '@openmrs/esm-framework'; import camelCase from 'lodash-es/camelCase'; import capitalize from 'lodash-es/capitalize'; @@ -124,7 +124,7 @@ export function getFormValuesFromFhirPatient(patient: fhir.Patient) { result.additionalFamilyName = additionalPatientName?.family; result.gender = capitalize(patient.gender); - result.birthdate = patient.birthDate ? (new Date(patient.birthDate) as any) : undefined; + result.birthdate = patient.birthDate ? parseDate(patient.birthDate) : undefined; result.telephoneNumber = patient.telecom ? patient.telecom[0].value : ''; if (patient.deceasedBoolean || patient.deceasedDateTime) { From 795f4d10872251a73c167a8376eb2bbe4995c3bb Mon Sep 17 00:00:00 2001 From: jwnasambu <33891016+jwnasambu@users.noreply.github.com> Date: Tue, 20 Jun 2023 13:52:27 +0300 Subject: [PATCH 05/17] (fix)O3-2174:Services tag z-index too high on appointments (#723) Co-authored-by: jwnasambu Co-authored-by: Dennis Kigen --- packages/esm-appointments-app/src/overlay.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/esm-appointments-app/src/overlay.scss b/packages/esm-appointments-app/src/overlay.scss index 5fa40e201..a1d93673b 100644 --- a/packages/esm-appointments-app/src/overlay.scss +++ b/packages/esm-appointments-app/src/overlay.scss @@ -32,7 +32,7 @@ overflow-y: scroll; -ms-overflow-style: none; scrollbar-width: none; - z-index: 1; + z-index: 3; &::-webkit-scrollbar { width: 0; From 0d1aa87e20217cc40fe9fc5072a78d52a5f0c7f9 Mon Sep 17 00:00:00 2001 From: jwnasambu <33891016+jwnasambu@users.noreply.github.com> Date: Tue, 20 Jun 2023 14:21:56 +0300 Subject: [PATCH 06/17] (feat)Show details button on a Deceased patient banner (#724) Co-authored-by: jwnasambu Co-authored-by: Dennis Kigen --- .../banner/patient-banner.component.tsx | 25 ++++++++++++++----- .../patient-banner/banner/patient-banner.scss | 6 +++-- .../contact-details.component.tsx | 5 ++-- .../contact-details/contact-details.scss | 20 +++++++++++++++ .../translations/en.json | 4 +-- .../translations/fr.json | 3 ++- .../translations/he.json | 4 +-- .../translations/km.json | 4 +-- 8 files changed, 54 insertions(+), 17 deletions(-) diff --git a/packages/esm-patient-search-app/src/patient-search-page/patient-banner/banner/patient-banner.component.tsx b/packages/esm-patient-search-app/src/patient-search-page/patient-banner/banner/patient-banner.component.tsx index 2c4799369..96b488f0d 100644 --- a/packages/esm-patient-search-app/src/patient-search-page/patient-banner/banner/patient-banner.component.tsx +++ b/packages/esm-patient-search-app/src/patient-search-page/patient-banner/banner/patient-banner.component.tsx @@ -140,8 +140,8 @@ const PatientBanner: React.FC = ({ )} - {!isDeceased && - (!currentVisit ? ( + {!isDeceased ? ( + !currentVisit ? ( = ({ /> ) : ( - ))} + ) + ) : ( + + )} - {showContactDetails && } + {showContactDetails && ( + + )} ); }; diff --git a/packages/esm-patient-search-app/src/patient-search-page/patient-banner/banner/patient-banner.scss b/packages/esm-patient-search-app/src/patient-search-page/patient-banner/banner/patient-banner.scss index 2cacea09b..7a9791940 100644 --- a/packages/esm-patient-search-app/src/patient-search-page/patient-banner/banner/patient-banner.scss +++ b/packages/esm-patient-search-app/src/patient-search-page/patient-banner/banner/patient-banner.scss @@ -28,11 +28,13 @@ } .demographics, - .identifiers { + .identifiers, + .contactDetails .heading { color: $ui-02; } - .actionsButtonText { + .actionsButtonText, + .toggleContactDetailsButton { color: colors.$blue-40; } diff --git a/packages/esm-patient-search-app/src/patient-search-page/patient-banner/contact-details/contact-details.component.tsx b/packages/esm-patient-search-app/src/patient-search-page/patient-banner/contact-details/contact-details.component.tsx index 814661f85..ec42e7216 100644 --- a/packages/esm-patient-search-app/src/patient-search-page/patient-banner/contact-details/contact-details.component.tsx +++ b/packages/esm-patient-search-app/src/patient-search-page/patient-banner/contact-details/contact-details.component.tsx @@ -9,6 +9,7 @@ import styles from './contact-details.scss'; interface ContactDetailsProps { address: Array; patientId: string; + isDeceased: boolean; } const Address: React.FC<{ address: AddressType }> = ({ address }) => { @@ -86,11 +87,11 @@ const Relationships: React.FC<{ patientId: string }> = ({ patientId }) => { ); }; -const ContactDetails: React.FC = ({ address, patientId }) => { +const ContactDetails: React.FC = ({ address, patientId, isDeceased }) => { const currentAddress = address ? address.find((a) => a.preferred) : undefined; return ( -
+
diff --git a/packages/esm-patient-search-app/src/patient-search-page/patient-banner/contact-details/contact-details.scss b/packages/esm-patient-search-app/src/patient-search-page/patient-banner/contact-details/contact-details.scss index 8a442bc2a..cc4078bbd 100644 --- a/packages/esm-patient-search-app/src/patient-search-page/patient-banner/contact-details/contact-details.scss +++ b/packages/esm-patient-search-app/src/patient-search-page/patient-banner/contact-details/contact-details.scss @@ -1,3 +1,4 @@ +@use '@carbon/colors'; @use '@carbon/styles/scss/spacing'; @use '@carbon/styles/scss/type'; @import '~@openmrs/esm-styleguide/src/vars'; @@ -13,6 +14,25 @@ color: $text-02; } +.deceased { + .contactDetails, + .heading, + .row, + .row > .col { + color: $ui-02; + background-color: colors.$gray-80; + } + + .menu { + fill: colors.$blue-40; + } + + &:focus, + &:hover { + background-color: colors.$gray-90; + } +} + .row { @include type.type-style('body-compact-01'); display: flex; diff --git a/packages/esm-patient-search-app/translations/en.json b/packages/esm-patient-search-app/translations/en.json index 281f89c8e..279f4527f 100644 --- a/packages/esm-patient-search-app/translations/en.json +++ b/packages/esm-patient-search-app/translations/en.json @@ -13,6 +13,7 @@ "errorCopy": "Sorry, there was a an error. You can try to reload this page, or contact the site administrator and quote the error code above.", "female": "Female", "filtersAppliedText": "search queries added", + "hideDetails": "Hide details", "male": "Male", "monthOfBirth": "Month of Birth", "nextPage": "Next page", @@ -34,8 +35,7 @@ "searchResultsCount": "{count} search result{plural}", "searchResultsCount_plural": "{count} search result{plural}", "sex": "Sex", - "showAllDetails": "Show all details", - "showLess": "Show less", + "showDetails": "Show details", "trySearchWithPatientUniqueID": "Try to search again using the patient's unique ID number", "unknown": "Unknown", "yearOfBirth": "Year of Birth", diff --git a/packages/esm-patient-search-app/translations/fr.json b/packages/esm-patient-search-app/translations/fr.json index e159308fa..8e1e5f867 100644 --- a/packages/esm-patient-search-app/translations/fr.json +++ b/packages/esm-patient-search-app/translations/fr.json @@ -13,6 +13,7 @@ "errorCopy": "Désolé, une erreur s'est produite. Vous pouvez tenter de rafraîchir la page, ou bien contacter l'administrateur du site et transmettre le message d'erreur ci-dessus.", "female": "Femme", "filtersAppliedText": "Rechercher les requêtes ajoutées", + "hideDetails": "cacher les informations", "male": "Homme", "month": "Mois", "nextPage": "Page suivante", @@ -35,7 +36,7 @@ "searchResults": "Résultats de recherche", "searchResultsText": "résultats de recherche", "sex": "Sexe", - "showAllDetails": "Afficher toutes les informations", + "showDetails": "Afficher les informations", "showLess": "Afficher moins", "trySearchWithPatientUniqueID": "Essayez de chercher par l'identifiant unique du patient", "unknown": "Inconnu", diff --git a/packages/esm-patient-search-app/translations/he.json b/packages/esm-patient-search-app/translations/he.json index 389b7d427..a7773aafc 100644 --- a/packages/esm-patient-search-app/translations/he.json +++ b/packages/esm-patient-search-app/translations/he.json @@ -13,6 +13,7 @@ "errorCopy": "מצטערים, אירעה שגיאה. ניתן לנסות לטעון מחדש את הדף או ליצור קשר עם מנהל האתר ולציין את קוד השגיאה שמופיע למעלה.", "female": "נקבה", "filtersAppliedText": "תוספו שאילתות חיפוש", + "hideDetails": "הסתר פרטים", "male": "זכר", "month": "חודש", "nextPage": "הדף הבא", @@ -35,8 +36,7 @@ "searchResults": "תוצאות חיפוש", "searchResultsText": "תוצאות חיפוש", "sex": "מין", - "showAllDetails": "הצג את כל הפרטים", - "showLess": "הצג פחות", + "showDetails": "הראה פרטים", "trySearchWithPatientUniqueID": "נסה לחפש עם מספר הזיהוי הייחודי של המטופל", "unknown": "לא ידוע", "year": "שנה" diff --git a/packages/esm-patient-search-app/translations/km.json b/packages/esm-patient-search-app/translations/km.json index 4f2537489..d36442b59 100644 --- a/packages/esm-patient-search-app/translations/km.json +++ b/packages/esm-patient-search-app/translations/km.json @@ -13,6 +13,7 @@ "errorCopy": "សូមអភ័យទោស មានកំហុសមួយ។ អ្នកអាចព្យាយាមផ្ទុកទំព័រនេះឡើងវិញ ឬទាក់ទងអ្នកគ្រប់គ្រងគេហទំព័រ ហើយដកស្រង់កូដកំហុសខាងលើ។", "female": "ស្រី", "filtersAppliedText": "សំណួរស្វែងរកបានបន្ថែម", + "hideDetails": "ព័ត៌មានលម្អិតលាក់", "male": "ប្រុស", "month": "ខែ", "nextPage": "ទំ​ព​រ័​បន្ទាប់", @@ -35,8 +36,7 @@ "searchResults": "លទ្ធផលស្វែងរក", "searchResultsText": "លទ្ធផលស្វែងរក", "sex": "ភេទ", - "showAllDetails": "បង្ហាញព័ត៌មានលម្អិតទាំងអស់", - "showLess": "បង្ហាញឱ្យឃើញតិច", + "showDetails": "បង្ហាញព័ត៌មានលម្អិត", "trySearchWithPatientUniqueID": "ព្យាយាមស្វែងរកដោយប្រើអត្តលេខតែមួយគត់របស់អ្នកជំងឺ", "unknown": "មិនដឹង", "year": "ឆ្នាំ" From 399a70ec5a96c25b52fb18704f333c26d160d106 Mon Sep 17 00:00:00 2001 From: Vineet Sharma Date: Wed, 21 Jun 2023 14:36:54 +0530 Subject: [PATCH 07/17] (feat) O3-2098 & O3-1755 & O3-1834: Allow ordering fields and showing possible entries for an address field for address hierarchy (#725) * Ordering address fields and fetching possible entries for address fields * Updated translations * Allow entering values and selecting values from dropdown * autoComplete off on address fields * Keyboard navigation in place * Final changes * Clicking entry update bug fixed * Review changes * Fixed and improved tests for the address component --- .../field/address/address-field.component.tsx | 199 ++++++++++++++++-- .../address-hierarchy-levels.component.tsx | 68 ++++++ .../address/address-hierarchy.component.tsx | 143 ------------- .../address/address-hierarchy.resource.tsx | 102 +++++++++ .../custom-address-field.component.tsx | 30 +++ .../address/tests/address-hierarchy.test.tsx | 140 ++++++++++++ .../mocks.ts} | 83 +------- .../field/custom-field.component.tsx | 2 +- .../field/field.component.tsx | 4 +- .../combo-input/combo-input.component.tsx | 164 +++++++++------ .../input/combo-input/combo-input.test.tsx | 43 ---- .../combo-input/selection-tick.component.tsx | 20 ++ .../src/patient-registration/input/input.scss | 7 +- .../patient-registration-context.ts | 1 + .../patient-registration.component.tsx | 1 + .../translations/en.json | 1 + 16 files changed, 657 insertions(+), 351 deletions(-) create mode 100644 packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy-levels.component.tsx delete mode 100644 packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.component.tsx create mode 100644 packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.resource.tsx create mode 100644 packages/esm-patient-registration-app/src/patient-registration/field/address/custom-address-field.component.tsx create mode 100644 packages/esm-patient-registration-app/src/patient-registration/field/address/tests/address-hierarchy.test.tsx rename packages/esm-patient-registration-app/src/patient-registration/field/address/{address-hierarchy.test.tsx => tests/mocks.ts} (53%) delete mode 100644 packages/esm-patient-registration-app/src/patient-registration/input/combo-input/combo-input.test.tsx create mode 100644 packages/esm-patient-registration-app/src/patient-registration/input/combo-input/selection-tick.component.tsx diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/address/address-field.component.tsx index 1001141b2..3a329d9b2 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-field.component.tsx +++ b/packages/esm-patient-registration-app/src/patient-registration/field/address/address-field.component.tsx @@ -1,30 +1,191 @@ -import React from 'react'; +import React, { useEffect, useState, useContext, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { Input } from '../../input/basic-input/input/input.component'; +import { ResourcesContext } from '../../../offline.resources'; +import { SkeletonText, InlineNotification } from '@carbon/react'; import styles from '../field.scss'; -import { FieldDefinition } from '../../../config-schema'; -import { Field } from 'formik'; +import { Input } from '../../input/basic-input/input/input.component'; +import { useConfig } from '@openmrs/esm-framework'; +import AddressSearchComponent from './address-search.component'; +import { PatientRegistrationContext } from '../../patient-registration-context'; +import { useOrderedAddressHierarchyLevels } from './address-hierarchy.resource'; +import AddressHierarchyLevels from './address-hierarchy-levels.component'; -export interface AddressFieldProps { - fieldDefinition: FieldDefinition; +function parseString(xmlDockAsString: string) { + const parser = new DOMParser(); + return parser.parseFromString(xmlDockAsString, 'text/xml'); +} +function getTagAsDocument(tagName: string, template: XMLDocument) { + const tmp = template.getElementsByTagName(tagName)[0]; + return tmp ? parseString(tmp.outerHTML) : parseString(''); } -export const AddressField: React.FC = ({ fieldDefinition }) => { +export const AddressComponent: React.FC = () => { + const [selected, setSelected] = useState(''); + const [addressLayout, setAddressLayout] = useState< + Array<{ + id: string; + name: string; + value: string; + label: string; + }> + >([]); const { t } = useTranslation(); + const { addressTemplate } = useContext(ResourcesContext); + const addressTemplateXml = addressTemplate?.results[0].value; + const setSelectedValue = (value: string) => { + setSelected(value); + }; + const config = useConfig(); + const { + fieldConfigurations: { + address: { + useAddressHierarchy: { enabled, useQuickSearch, searchAddressByLevel }, + }, + }, + } = config; + + const { setFieldValue, values, setInitialFormValues } = useContext(PatientRegistrationContext); + const { orderedFields, isLoadingFieldOrder, errorFetchingFieldOrder } = useOrderedAddressHierarchyLevels(); + + useEffect(() => { + const templateXmlDoc = parseString(addressTemplateXml); + const elementDefaults = getTagAsDocument('elementDefaults', templateXmlDoc); + const defaultValuesEntries = elementDefaults.getElementsByTagName('entry'); + const defaultValues = Object.fromEntries( + Array.prototype.map.call(defaultValuesEntries, (entry: Element) => { + const [name, value] = Array.from(entry.getElementsByTagName('string')); + return [name.innerHTML, value.innerHTML]; + }), + ); + const nameMappings = getTagAsDocument('nameMappings', templateXmlDoc); + const properties = + Array.from(nameMappings.getElementsByTagName('property')).length > 0 + ? nameMappings.getElementsByTagName('property') + : nameMappings.getElementsByTagName('entry'); + + const propertiesObj = Array.prototype.map.call(properties, (property: Element) => { + const name = property.getAttribute('name') ?? property.getElementsByTagName('string')[0].innerHTML; + const label = property.getAttribute('value') ?? property.getElementsByTagName('string')[1].innerHTML; + /* + DO NOT REMOVE THIS COMMENT UNLESS YOU UNDERSTAND WHY IT IS HERE + + t('postalCode', 'Postal code') + t('address1', 'Address line 1') + t('address2', 'Address line 2') + t('countyDistrict', 'District') + t('stateProvince', 'State') + t('cityVillage', 'city') + t('country', 'Country') + t('countyDistrict', 'District') + */ + const value = defaultValues[name]; + setInitialFormValues((initialFormValues) => ({ + ...initialFormValues, + address: { + ...(initialFormValues.address ?? {}), + [name]: value, + }, + })); + return { + id: name, + name, + value, + label, + }; + }); + setAddressLayout(propertiesObj); + }, [t, addressTemplateXml, setFieldValue, values, setInitialFormValues]); + + const orderedAddressFields = useMemo(() => { + if (isLoadingFieldOrder || errorFetchingFieldOrder) { + return []; + } + + const orderMap = Object.fromEntries(orderedFields.map((field, indx) => [field, indx])); + + return [...addressLayout].sort( + (existingField1, existingField2) => orderMap[existingField1.name] - orderMap[existingField2.name], + ); + }, [isLoadingFieldOrder, errorFetchingFieldOrder, orderedFields, addressLayout]); + if (!addressTemplate) { + return ( + + + + ); + } + + if (!enabled) { + return ( + + {addressLayout.map((attributes, index) => ( + + ))} + + ); + } + + if (isLoadingFieldOrder) { + return ( + + + + ); + } + + if (errorFetchingFieldOrder) { + return ( + + + + ); + } + + return ( + + {useQuickSearch && } + {searchAddressByLevel ? ( + + ) : ( + orderedAddressFields.map((attributes, index) => ( + + )) + )} + + ); +}; + +const AddressComponentContainer = ({ children }) => { + const { t } = useTranslation(); return ( -
- - {({ field, form: { touched, errors }, meta }) => { - return ( - - ); - }} - +
+

{t('addressHeader', 'Address')}

+
+ {children} +
); }; diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy-levels.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy-levels.component.tsx new file mode 100644 index 000000000..bdb1e1e34 --- /dev/null +++ b/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy-levels.component.tsx @@ -0,0 +1,68 @@ +import React, { useCallback, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useAddressEntries, useAddressEntryFetchConfig } from './address-hierarchy.resource'; +import { useField } from 'formik'; +import ComboInput from '../../input/combo-input/combo-input.component'; +import { InlineNotification } from '@carbon/react'; + +interface AddressHierarchyLevelsProps { + orderedAddressFields: Array; +} + +const AddressHierarchyLevels: React.FC = ({ orderedAddressFields }) => { + const { t } = useTranslation(); + + return ( + <> + {orderedAddressFields.map((attribute) => ( + + ))} + + ); +}; + +export default AddressHierarchyLevels; + +interface AddressComboBoxProps { + attribute: { + id: string; + name: string; + value: string; + label: string; + }; +} + +const AddressComboBox: React.FC = ({ attribute }) => { + const { t } = useTranslation(); + const [field, meta, helpers] = useField(`address.${attribute.name}`); + const { fetchEntriesForField, searchString, updateChildElements } = useAddressEntryFetchConfig(attribute.name); + const { entries } = useAddressEntries(fetchEntriesForField, searchString); + + const handleInputChange = useCallback((newValue) => { + helpers.setValue(newValue); + }, []); + + const handleSelection = useCallback( + (selectedItem) => { + if (meta.value !== selectedItem) { + helpers.setValue(selectedItem); + updateChildElements(); + } + }, + [updateChildElements, helpers.setValue], + ); + + return ( + + ); +}; diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.component.tsx deleted file mode 100644 index bc786e201..000000000 --- a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.component.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import React, { useEffect, useState, useContext } from 'react'; -import { useTranslation } from 'react-i18next'; -import { ResourcesContext } from '../../../offline.resources'; -import { ComboInput } from '../../input/combo-input/combo-input.component'; -import { SkeletonText } from '@carbon/react'; -import styles from '../field.scss'; -import { Input } from '../../input/basic-input/input/input.component'; -import { useConfig } from '@openmrs/esm-framework'; -import AddressSearchComponent from './address-search.component'; -import { PatientRegistrationContext } from '../../patient-registration-context'; - -function parseString(xmlDockAsString: string) { - const parser = new DOMParser(); - return parser.parseFromString(xmlDockAsString, 'text/xml'); -} -function getTagAsDocument(tagName: string, template: XMLDocument) { - const tmp = template.getElementsByTagName(tagName)[0]; - return tmp ? parseString(tmp.outerHTML) : parseString(''); -} - -export const AddressHierarchy: React.FC = () => { - const [selected, setSelected] = useState(''); - const [addressLayout, setAddressLayout] = useState([]); - const { t } = useTranslation(); - const { addressTemplate } = useContext(ResourcesContext); - const addressTemplateXml = addressTemplate?.results[0].value; - const setSelectedValue = (value: string) => { - setSelected(value); - }; - const config = useConfig(); - const { - fieldConfigurations: { - address: { - useAddressHierarchy: { enabled, useQuickSearch, searchAddressByLevel }, - }, - }, - } = config; - - const { setFieldValue, values } = useContext(PatientRegistrationContext); - - useEffect(() => { - const templateXmlDoc = parseString(addressTemplateXml); - const elementDefaults = getTagAsDocument('elementDefaults', templateXmlDoc); - const defaultValuesEntries = elementDefaults.getElementsByTagName('entry'); - const defaultValues = Object.fromEntries( - Array.prototype.map.call(defaultValuesEntries, (entry: Element) => { - const [name, value] = Array.from(entry.getElementsByTagName('string')); - return [name.innerHTML, value.innerHTML]; - }), - ); - const nameMappings = getTagAsDocument('nameMappings', templateXmlDoc); - const properties = - Array.from(nameMappings.getElementsByTagName('property')).length > 0 - ? nameMappings.getElementsByTagName('property') - : nameMappings.getElementsByTagName('entry'); - - const propertiesObj = Array.prototype.map.call(properties, (property: Element) => { - const name = property.getAttribute('name') ?? property.getElementsByTagName('string')[0].innerHTML; - const label = property.getAttribute('value') ?? property.getElementsByTagName('string')[1].innerHTML; - /* - DO NOT REMOVE THIS COMMENT UNLESS YOU UNDERSTAND WHY IT IS HERE - - t('postalCode', 'Postal code') - t('address1', 'Address line 1') - t('address2', 'Address line 2') - t('countyDistrict', 'District') - t('stateProvince', 'State') - t('cityVillage', 'city') - t('country', 'Country') - t('countyDistrict', 'District') - */ - const value = defaultValues[name]; - if (!values?.address?.[name] && value) { - setFieldValue(`address.${name}`, value); - } - return { - id: name, - name, - value, - label, - }; - }); - setAddressLayout(propertiesObj); - }, [t, addressTemplateXml, setFieldValue, values]); - - if (!addressTemplate) { - return ( -
-

{t('addressHeader', 'Address')}

- -
- ); - } - - return ( -
-

{t('addressHeader', 'Address')}

-
- {enabled ? ( - <> - {useQuickSearch && } - {addressLayout.map((attributes, index) => - searchAddressByLevel ? ( - - ) : ( - - ), - )} - - ) : ( - addressLayout.map((attributes, index) => ( - - )) - )} -
-
- ); -}; diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.resource.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.resource.tsx new file mode 100644 index 000000000..204ce43e1 --- /dev/null +++ b/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.resource.tsx @@ -0,0 +1,102 @@ +import { FetchResponse, openmrsFetch } from '@openmrs/esm-framework'; +import { useField } from 'formik'; +import { useCallback, useContext, useEffect, useMemo } from 'react'; +import useSWRImmutable from 'swr/immutable'; +import { PatientRegistrationContext } from '../../patient-registration-context'; + +interface AddressFields { + addressField: string; +} + +export function useOrderedAddressHierarchyLevels() { + const url = '/module/addresshierarchy/ajax/getOrderedAddressHierarchyLevels.form'; + const { data, isLoading, error } = useSWRImmutable>>(url, openmrsFetch); + + const results = useMemo( + () => ({ + orderedFields: data?.data?.map((field) => field.addressField), + isLoadingFieldOrder: isLoading, + errorFetchingFieldOrder: error, + }), + [data, isLoading, error], + ); + + return results; +} + +export function useAddressEntries(fetchResults, searchString) { + const { data, isLoading, error } = useSWRImmutable>>( + fetchResults + ? `module/addresshierarchy/ajax/getChildAddressHierarchyEntries.form?searchString=${searchString}` + : null, + openmrsFetch, + ); + + useEffect(() => { + if (error) { + console.error(error); + } + }, [error]); + + const results = useMemo( + () => ({ + entries: data?.data?.map((item) => item.name), + isLoadingAddressEntries: isLoading, + errorFetchingAddressEntries: error, + }), + [data, isLoading, error], + ); + return results; +} + +/** + * This hook is being used to fetch ordered address fields as configured in the address hierarchy + * This hook returns the valid search term for valid fields to get suitable entries for the field + * This also returns the function to reset the lower ordered fields if the value of a field is changed. + */ +export function useAddressEntryFetchConfig(addressField: string) { + const { orderedFields, isLoadingFieldOrder, errorFetchingFieldOrder } = useOrderedAddressHierarchyLevels(); + const { setFieldValue } = useContext(PatientRegistrationContext); + const [, { value: addressValues }] = useField('address'); + + const index = useMemo( + () => (!isLoadingFieldOrder ? orderedFields.findIndex((field) => field === addressField) : -1), + [orderedFields, addressField, isLoadingFieldOrder], + ); + + const addressFieldSearchConfig = useMemo(() => { + let fetchEntriesForField = true; + const previousSelectedFields = orderedFields?.slice(0, index) ?? []; + let previousSelectedValues = []; + for (const fieldName of previousSelectedFields) { + if (!addressValues[fieldName]) { + fetchEntriesForField = false; + break; + } + previousSelectedValues.push(addressValues[fieldName]); + } + return { + fetchEntriesForField, + searchString: previousSelectedValues.join('|'), + }; + }, [orderedFields, index, addressValues]); + + const updateChildElements = useCallback(() => { + if (isLoadingFieldOrder) { + return; + } + orderedFields.slice(index + 1).map((fieldName) => { + setFieldValue(`address.${fieldName}`, ''); + }); + }, [index, isLoadingFieldOrder, orderedFields, setFieldValue]); + + const results = useMemo( + () => ({ + ...addressFieldSearchConfig, + updateChildElements, + }), + [addressFieldSearchConfig, updateChildElements], + ); + + return results; +} diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/custom-address-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/address/custom-address-field.component.tsx new file mode 100644 index 000000000..1001141b2 --- /dev/null +++ b/packages/esm-patient-registration-app/src/patient-registration/field/address/custom-address-field.component.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { Input } from '../../input/basic-input/input/input.component'; +import styles from '../field.scss'; +import { FieldDefinition } from '../../../config-schema'; +import { Field } from 'formik'; + +export interface AddressFieldProps { + fieldDefinition: FieldDefinition; +} + +export const AddressField: React.FC = ({ fieldDefinition }) => { + const { t } = useTranslation(); + + return ( +
+ + {({ field, form: { touched, errors }, meta }) => { + return ( + + ); + }} + +
+ ); +}; diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/tests/address-hierarchy.test.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/address/tests/address-hierarchy.test.tsx new file mode 100644 index 000000000..20b011434 --- /dev/null +++ b/packages/esm-patient-registration-app/src/patient-registration/field/address/tests/address-hierarchy.test.tsx @@ -0,0 +1,140 @@ +import React from 'react'; +import { cleanup, render, screen } from '@testing-library/react'; +import { AddressComponent } from '../address-field.component'; +import { Formik, Form } from 'formik'; +import { Resources, ResourcesContext } from '../../../../offline.resources'; +import { PatientRegistrationContext } from '../../../patient-registration-context'; +import { useConfig } from '@openmrs/esm-framework'; +import { useOrderedAddressHierarchyLevels } from '../address-hierarchy.resource'; +import { mockResponse1, mockResponse2, mockedOrderedFields } from './mocks'; +import AddressHierarchyLevels from '../address-hierarchy-levels.component'; + +jest.mock('@openmrs/esm-framework', () => ({ + ...jest.requireActual('@openmrs/esm-framework'), + useConfig: jest.fn(), +})); + +jest.mock('../address-hierarchy.resource', () => ({ + ...(jest.requireActual('../address-hierarchy.resource') as jest.Mock), + useOrderedAddressHierarchyLevels: jest.fn(), +})); + +async function testAddressHierarchy(mockResponse) { + await render( + + +
+ + + +
+
+
, + ); + + const countryInput = screen.getByLabelText('Country (optional)'); + expect(countryInput).toBeInTheDocument(); + expect(countryInput).toHaveAttribute('name', 'address.country'); + const stateInput = screen.getByLabelText('State (optional)'); + expect(stateInput).toBeInTheDocument(); + expect(stateInput).toHaveAttribute('name', 'address.stateProvince'); + const cityInput = screen.getByLabelText('City (optional)'); + expect(cityInput).toBeInTheDocument(); + expect(cityInput).toHaveAttribute('name', 'address.cityVillage'); + const address1Input = screen.getByLabelText('Address line 1 (optional)'); + expect(address1Input).toBeInTheDocument(); + expect(address1Input).toHaveAttribute('name', 'address.address1'); + const address2Input = screen.getByLabelText('Address line 2 (optional)'); + expect(address2Input).toBeInTheDocument(); + expect(address2Input).toHaveAttribute('name', 'address.address2'); + const postalCodeInput = screen.getByLabelText('Postcode (optional)'); + expect(postalCodeInput).toBeInTheDocument(); + expect(postalCodeInput).toHaveAttribute('name', 'address.postalCode'); +} + +function testInputFieldOrder() { + // Fields must be in the order of the orderedFields + const inputs = screen.getAllByRole('textbox'); + inputs.forEach((input, indx) => { + const inputName = input.getAttribute('name'); + // Names are in the format of address.${name} + const fieldName = inputName.split('.')?.[1]; + expect(fieldName).toBe(mockedOrderedFields[indx]); + }); +} + +describe('address hierarchy', () => { + beforeAll(() => { + (useOrderedAddressHierarchyLevels as jest.Mock).mockImplementation(() => ({ + orderedFields: mockedOrderedFields, + isLoadingFieldOrder: false, + errorFetchingFieldOrder: null, + })); + }); + + beforeEach(cleanup); + + it('renders text input fields matching addressTemplate config', async () => { + (useConfig as jest.Mock).mockImplementation(() => ({ + fieldConfigurations: { + address: { + useAddressHierarchy: { + enabled: false, + useQuickSearch: false, + searchAddressByLevel: false, + }, + }, + }, + })); + testAddressHierarchy(mockResponse1); + // For cleaning up the input fields generated in first render + cleanup(); + testAddressHierarchy(mockResponse2); + }); + + it('renders combo input fields matching addressTemplate config', async () => { + (useConfig as jest.Mock).mockImplementation(() => ({ + fieldConfigurations: { + address: { + useAddressHierarchy: { + enabled: true, + useQuickSearch: true, + searchAddressByLevel: false, + }, + }, + }, + })); + + testAddressHierarchy(mockResponse1); + const searchBox = screen.getByRole('searchbox'); + expect(searchBox).toBeInTheDocument(); + expect(searchBox.getAttribute('placeholder')).toBe('Search address'); + testInputFieldOrder(); + // For cleaning up the input fields generated in first render + cleanup(); + testAddressHierarchy(mockResponse2); + testInputFieldOrder(); + }); + + it('renders combo input fields matching addressTemplate config and ordered fields', async () => { + (useConfig as jest.Mock).mockImplementation(() => ({ + fieldConfigurations: { + address: { + useAddressHierarchy: { + enabled: true, + useQuickSearch: false, + searchAddressByLevel: true, + }, + }, + }, + })); + + testAddressHierarchy(mockResponse1); + testInputFieldOrder(); + // For cleaning up the input fields generated in first render + cleanup(); + testAddressHierarchy(mockResponse2); + testInputFieldOrder(); + }); +}); diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.test.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/address/tests/mocks.ts similarity index 53% rename from packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.test.tsx rename to packages/esm-patient-registration-app/src/patient-registration/field/address/tests/mocks.ts index cdf5831f6..fa3b1d6fa 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/field/address/address-hierarchy.test.tsx +++ b/packages/esm-patient-registration-app/src/patient-registration/field/address/tests/mocks.ts @@ -1,17 +1,4 @@ -import React from 'react'; -import { render, screen } from '@testing-library/react'; -import { AddressHierarchy } from './address-hierarchy.component'; -import { Formik, Form } from 'formik'; -import { Resources, ResourcesContext } from '../../../offline.resources'; -import { PatientRegistrationContext } from '../../patient-registration-context'; -import { useConfig } from '@openmrs/esm-framework'; - -jest.mock('@openmrs/esm-framework', () => ({ - ...jest.requireActual('@openmrs/esm-framework'), - useConfig: jest.fn(), -})); - -const mockResponse1 = { +export const mockResponse1 = { results: [ { value: @@ -44,7 +31,7 @@ const mockResponse1 = { ], }; -const mockResponse2 = { +export const mockResponse2 = { results: [ { value: @@ -114,68 +101,4 @@ const mockResponse2 = { ], }; -async function testAddressHierarchy(mockResponse) { - await render( - - -
- - - -
-
-
, - ); - const countryInput = screen.getByLabelText('Country (optional)'); - expect(countryInput).toBeInTheDocument(); - expect(countryInput).toHaveAttribute('name', 'address.country'); - const stateInput = screen.getByLabelText('State (optional)'); - expect(stateInput).toBeInTheDocument(); - expect(stateInput).toHaveAttribute('name', 'address.stateProvince'); - const cityInput = screen.getByLabelText('City (optional)'); - expect(cityInput).toBeInTheDocument(); - expect(cityInput).toHaveAttribute('name', 'address.cityVillage'); - const address1Input = screen.getByLabelText('Address line 1 (optional)'); - expect(address1Input).toBeInTheDocument(); - expect(address1Input).toHaveAttribute('name', 'address.address1'); - const address2Input = screen.getByLabelText('Address line 2 (optional)'); - expect(address2Input).toBeInTheDocument(); - expect(address2Input).toHaveAttribute('name', 'address.address2'); - const postalCodeInput = screen.getByLabelText('Postcode (optional)'); - expect(postalCodeInput).toBeInTheDocument(); - expect(postalCodeInput).toHaveAttribute('name', 'address.postalCode'); -} - -describe('address hierarchy', () => { - it('renders text input fields matching addressTemplate config', async () => { - (useConfig as jest.Mock).mockImplementation(() => ({ - fieldConfigurations: { - address: { - useAddressHierarchy: { - enabled: false, - useQuickSearch: false, - searchAddressByLevel: false, - }, - }, - }, - })); - testAddressHierarchy(mockResponse1); - testAddressHierarchy(mockResponse2); - }); - - it('renders combo input fields matching addressTemplate config', async () => { - (useConfig as jest.Mock).mockImplementation(() => ({ - fieldConfigurations: { - address: { - useAddressHierarchy: { - enabled: true, - useQuickSearch: false, - searchAddressByLevel: true, - }, - }, - }, - })); - testAddressHierarchy(mockResponse1); - testAddressHierarchy(mockResponse2); - }); -}); +export const mockedOrderedFields = ['country', 'stateProvince', 'cityVillage', 'postalCode', 'address1', 'address2']; diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/custom-field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/custom-field.component.tsx index 41d7d2c88..3b9f35ea2 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/field/custom-field.component.tsx +++ b/packages/esm-patient-registration-app/src/patient-registration/field/custom-field.component.tsx @@ -1,7 +1,7 @@ import { useConfig } from '@openmrs/esm-framework'; import React from 'react'; import { RegistrationConfig } from '../../config-schema'; -import { AddressField } from './address/address-field.component'; +import { AddressField } from './address/custom-address-field.component'; import { ObsField } from './obs/obs-field.component'; import { PersonAttributeField } from './person-attributes/person-attribute-field.component'; diff --git a/packages/esm-patient-registration-app/src/patient-registration/field/field.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/field/field.component.tsx index 528278ca8..d8bfa31cc 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/field/field.component.tsx +++ b/packages/esm-patient-registration-app/src/patient-registration/field/field.component.tsx @@ -6,7 +6,7 @@ import { DobField } from './dob/dob.component'; import { reportError, useConfig } from '@openmrs/esm-framework'; import { builtInFields, RegistrationConfig } from '../../config-schema'; import { CustomField } from './custom-field.component'; -import { AddressHierarchy } from './address/address-hierarchy.component'; +import { AddressComponent } from './address/address-field.component'; export interface FieldProps { name: string; @@ -35,7 +35,7 @@ export function Field({ name }: FieldProps) { case 'dob': return ; case 'address': - return ; + return ; case 'id': return ; default: diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/combo-input.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/combo-input.component.tsx index f15862a81..646ccbab4 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/combo-input.component.tsx +++ b/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/combo-input.component.tsx @@ -1,76 +1,116 @@ -import React, { useState } from 'react'; -import { ComboBox, ComboBoxProps, Layer } from '@carbon/react'; -import { useField } from 'formik'; -import { useTranslation } from 'react-i18next'; -import { performAdressHierarchyWithParentSearch } from '../../../resource'; +import React, { useCallback, useMemo, useRef, useState } from 'react'; +import { TextInput, Layer } from '@carbon/react'; +import SelectionTick from './selection-tick.component'; +import styles from '../input.scss'; -interface ComboInputProps extends Omit { +interface ComboInputProps { + entries: Array; name: string; - labelText: string; - placeholder?: string; - setSelectedValue: any; - selected: string; - textFieldName: string; - required?: boolean; + fieldProps: { + value: string; + labelText: string; + [x: string]: any; + }; + handleInputChange: (newValue: string) => void; + handleSelection: (newSelection) => void; } -export const ComboInput: React.FC = ({ - name, - labelText, - placeholder, - setSelectedValue, - selected, - textFieldName, - required, -}) => { - const { t } = useTranslation(); - const [field, _, helpers] = useField(name); - const [listItems, setListItems] = useState([]); - const [error, setError] = useState(); - const { setValue } = helpers; - const comboLabelText = !required ? `${labelText} (${t('optional', 'optional')})` : labelText; - const comboBoxEvent = (text, id) => { - if (text == '') { - } else { - performAdressHierarchyWithParentSearch(textFieldName.replace(' ', ''), selected, text) - .then((value) => { - setListItems(value.data.map((parent1) => ({ id: parent1['uuid'], text: parent1['name'] }))); - }) - .catch((err) => { - setError(err); - }); +const ComboInput: React.FC = ({ entries, fieldProps, handleInputChange, handleSelection }) => { + const [highlightedEntry, setHighlightedEntry] = useState(-1); + const { value = '' } = fieldProps; + const [showEntries, setShowEntries] = useState(false); + const comboInputRef = useRef(null); + + const handleFocus = useCallback(() => { + setShowEntries(true); + setHighlightedEntry(-1); + }, [setShowEntries, setHighlightedEntry]); + + const handleBlur = useCallback( + (e) => { + // This check is in place to not hide the entries when an entry is clicked + // Else the onClick of the entry will not be counted. + if (!comboInputRef?.current?.contains(e.target)) { + setShowEntries(false); + } + setHighlightedEntry(-1); + }, + [setShowEntries, setHighlightedEntry], + ); + + const filteredEntries = useMemo(() => { + if (!entries) { + return []; } - }; + if (!value) { + return entries; + } + return entries.filter((entry) => entry.toLowerCase().includes(value.toLowerCase())); + }, [entries, value]); - if (error) { - return {t(`${error.message}`)}; - } + const handleOptionClick = useCallback( + (newSelection: string, e: KeyboardEvent = null) => { + e?.preventDefault(); + handleSelection(newSelection); + setShowEntries(false); + }, + [handleSelection, setShowEntries], + ); + + const handleKeyPress = useCallback( + (e: KeyboardEvent) => { + const totalResults = filteredEntries.length ?? 0; + if (e.key === 'ArrowUp') { + setHighlightedEntry((prev) => Math.max(-1, prev - 1)); + } else if (e.key === 'ArrowDown') { + setHighlightedEntry((prev) => Math.min(totalResults - 1, prev + 1)); + } else if (e.key === 'Enter' && highlightedEntry > -1) { + handleOptionClick(filteredEntries[highlightedEntry], e); + } + }, + [highlightedEntry, handleOptionClick, filteredEntries, setHighlightedEntry], + ); return ( -
+
- { - comboBoxEvent(event, name); - setValue(event); - }} - items={listItems} - itemToString={(item) => item?.text ?? ''} - {...field} - onChange={(e) => { - if (Boolean(e.selectedItem)) { - setSelectedValue(e.selectedItem.id); - setValue(e.selectedItem.text); - } else { - setSelectedValue(undefined); - setValue(undefined); - } - }} - placeholder={placeholder} - titleText={comboLabelText} + handleInputChange(e.target.value)} + onFocus={handleFocus} + onBlur={handleBlur} + autoComplete={'off'} + onKeyDown={handleKeyPress} /> +
+ {showEntries && ( +
+ {filteredEntries.map((entry, indx) => ( +
handleOptionClick(entry)}> +
+ {entry} + {entry === value && } +
+
+ ))} +
+ )} +
); }; + +export default ComboInput; diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/combo-input.test.tsx b/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/combo-input.test.tsx deleted file mode 100644 index e0a7bf768..000000000 --- a/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/combo-input.test.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { fireEvent, render, screen, waitFor } from '@testing-library/react'; -import { Form, Formik } from 'formik'; -import { ComboInput } from './combo-input.component'; -import React from 'react'; - -describe('Combo box input', () => { - const setupInput = async () => { - const selected = null; - const setSelectedValue = null; - render( - -
- - -
, - ); - return screen.getByLabelText('Text') as HTMLInputElement; - }; - - it('exists', async () => { - const input = await setupInput(); - expect(input.type).toEqual('text'); - }); - - it('can input data', async () => { - const input = await setupInput(); - const expected = 'Some Text'; - - fireEvent.change(input, { target: { value: expected } }); - fireEvent.blur(input); - - await waitFor(() => expect(input.value).toEqual(expected)); - }); -}); diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/selection-tick.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/selection-tick.component.tsx new file mode 100644 index 000000000..fefc0b7f9 --- /dev/null +++ b/packages/esm-patient-registration-app/src/patient-registration/input/combo-input/selection-tick.component.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +function SelectionTick() { + return ( + + ); +} + +export default SelectionTick; diff --git a/packages/esm-patient-registration-app/src/patient-registration/input/input.scss b/packages/esm-patient-registration-app/src/patient-registration/input/input.scss index 558a437fb..5ea727b9a 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/input/input.scss +++ b/packages/esm-patient-registration-app/src/patient-registration/input/input.scss @@ -18,7 +18,8 @@ color: $text-02; } -.textID { +.textID, +.comboInput { margin-bottom: spacing.$spacing-05; } @@ -106,3 +107,7 @@ @include type.type-style('label-01'); color: $danger; } + +.comboInputEntries { + position: relative; +} diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration-context.ts b/packages/esm-patient-registration-app/src/patient-registration/patient-registration-context.ts index 81427aae4..53b13656c 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/patient-registration-context.ts +++ b/packages/esm-patient-registration-app/src/patient-registration/patient-registration-context.ts @@ -14,6 +14,7 @@ export interface PatientRegistrationContextProps { currentPhoto: string; isOffline: boolean; initialFormValues: FormValues; + setInitialFormValues?: React.Dispatch>; } export const PatientRegistrationContext = createContext(undefined); diff --git a/packages/esm-patient-registration-app/src/patient-registration/patient-registration.component.tsx b/packages/esm-patient-registration-app/src/patient-registration/patient-registration.component.tsx index e65e40a24..71380be97 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/patient-registration.component.tsx +++ b/packages/esm-patient-registration-app/src/patient-registration/patient-registration.component.tsx @@ -203,6 +203,7 @@ export const PatientRegistration: React.FC = ({ savePa currentPhoto: photo?.imageSrc, isOffline, initialFormValues: props.initialValues, + setInitialFormValues, }}> {sections.map((section, index) => ( Date: Fri, 23 Jun 2023 12:42:22 +0530 Subject: [PATCH 08/17] (BREAKING) Migrate esm-patient-management to use routes.json (#733) * BREAKING: Migrate esm-patient-management to routes.json * Add routes.json for patient-registration-app * Fix bogus import * Bump openmrs and openmrs-esm-framework * Bump peer deps and framework * Update jest config * Add routes.json for outpatient-app * Migrate `esm-active-visits-app` to use routes.json * Migrate `esm-appointments-app` to use routes.json * Migrate `esm-patient-lists-app to use routes.json * Bump core to v5.0.2 + add css-loader and @swc-node/loaderz --------- Co-authored-by: Ian Co-authored-by: Dennis Kigen --- jest.config.js | 38 + jest.config.json | 40 - package.json | 6 +- packages/esm-active-visits-app/package.json | 2 +- packages/esm-active-visits-app/src/index.ts | 29 +- .../esm-active-visits-app/src/routes.json | 21 + packages/esm-appointments-app/package.json | 2 +- packages/esm-appointments-app/src/index.ts | 70 +- packages/esm-appointments-app/src/routes.json | 45 + packages/esm-outpatient-app/package.json | 2 +- packages/esm-outpatient-app/src/index.ts | 211 +-- packages/esm-outpatient-app/src/routes.json | 74 + packages/esm-patient-list-app/package.json | 2 +- .../esm-patient-list-app/src/api/types.ts | 2 +- packages/esm-patient-list-app/src/index.ts | 107 +- packages/esm-patient-list-app/src/routes.json | 41 + .../esm-patient-registration-app/package.json | 2 +- .../esm-patient-registration-app/src/index.ts | 120 +- .../src/patient-registration/form-manager.ts | 1 + .../src/root.component.tsx | 18 +- .../src/routes.json | 46 + packages/esm-patient-search-app/package.json | 2 +- packages/esm-patient-search-app/src/index.ts | 66 +- .../esm-patient-search-app/src/routes.json | 26 + yarn.lock | 1479 ++++++++++------- 25 files changed, 1384 insertions(+), 1068 deletions(-) create mode 100644 jest.config.js delete mode 100644 jest.config.json create mode 100644 packages/esm-active-visits-app/src/routes.json create mode 100644 packages/esm-appointments-app/src/routes.json create mode 100644 packages/esm-outpatient-app/src/routes.json create mode 100644 packages/esm-patient-list-app/src/routes.json create mode 100644 packages/esm-patient-registration-app/src/routes.json create mode 100644 packages/esm-patient-search-app/src/routes.json diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 000000000..1b2ac8b2c --- /dev/null +++ b/jest.config.js @@ -0,0 +1,38 @@ +/** + * @returns {Promise} + */ +module.exports = { + transform: { + '^.+\\.(j|t)sx?$': '@swc/jest', + }, + transformIgnorePatterns: ['/node_modules/(?!@openmrs)'], + moduleNameMapper: { + '\\.(s?css)$': 'identity-obj-proxy', + '@openmrs/esm-framework': '@openmrs/esm-framework/mock', + '^lodash-es/(.*)$': 'lodash/$1', + '^uuid$': '/node_modules/uuid/dist/index.js', + '^dexie$': require.resolve('dexie'), + }, + collectCoverageFrom: [ + '**/src/**/*.component.tsx', + '!**/node_modules/**', + '!**/vendor/**', + '!**/src/**/*.test.*', + '!**/src/declarations.d.tsx', + '!**/e2e/**', + ], + coverageThreshold: { + global: { + statements: 80, + branches: 80, + functions: 80, + lines: 80, + }, + }, + setupFilesAfterEnv: ['/tools/setupTests.ts'], + testPathIgnorePatterns: ['/packages/esm-form-entry-app', '/e2e'], + testEnvironment: 'jsdom', + testEnvironmentOptions: { + url: 'http://localhost/', + }, +}; diff --git a/jest.config.json b/jest.config.json deleted file mode 100644 index d25890bd8..000000000 --- a/jest.config.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "transform": { - "^.+\\.tsx?$": "@swc/jest" - }, - "transformIgnorePatterns": [ - "/node_modules/(?!@openmrs)" - ], - "moduleNameMapper": { - "\\.(s?css)$": "identity-obj-proxy", - "@openmrs/esm-framework": "@openmrs/esm-framework/mock", - "lodash-es": "lodash" - }, - "collectCoverageFrom": [ - "**/packages/**/*.tsx", - "!**/node_modules/**", - "!**/vendor/**", - "!**/src/**/*.test.*", - "!**/src/declarations.d.tsx", - "!**/e2e/**" - ], - "coverageThreshold": { - "global": { - "statements": 8, - "branches": 5, - "functions": 7, - "lines": 8 - } - }, - "setupFilesAfterEnv": [ - "/tools/setupTests.ts" - ], - "testEnvironment": "jsdom", - "testEnvironmentOptions": { - "url": "http://localhost/" - }, - "resolver": "/jest-resolver.js", - "testPathIgnorePatterns" : [ - "/e2e" - ] -} diff --git a/package.json b/package.json index 366b656fc..744f1a893 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "release": "lerna version --no-git-tag-version", "verify": "turbo run lint && turbo run typescript", "prettier": "prettier --config prettier.config.js --write \"packages/**/*.{ts,tsx,css,scss}\" \"e2e/**/*.ts\"", - "test": "cross-env TZ=UTC jest --config jest.config.json --verbose false --passWithNoTests", - "test-watch": "cross-env TZ=UTC jest --watch --config jest.config.json", + "test": "cross-env TZ=UTC jest --config jest.config.js --verbose false --passWithNoTests", + "test-watch": "cross-env TZ=UTC jest --watch --config jest.config.js", "test-e2e": "playwright test", "coverage": "yarn test --coverage", "postinstall": "husky install", @@ -28,6 +28,7 @@ "@carbon/react": "^1.12.0", "@openmrs/esm-framework": "next", "@playwright/test": "1.34.0", + "@swc-node/loader": "^1.3.5", "@swc/core": "^1.2.165", "@swc/jest": "^0.2.20", "@testing-library/dom": "^8.13.0", @@ -47,6 +48,7 @@ "babel-preset-minify": "^0.5.1", "concurrently": "^5.3.0", "cross-env": "^7.0.3", + "css-loader": "^6.8.1", "dayjs": "^1.8.36", "dotenv": "^16.0.3", "eslint": "^7.20.0", diff --git a/packages/esm-active-visits-app/package.json b/packages/esm-active-visits-app/package.json index 2a2a33530..9e8b064ea 100644 --- a/packages/esm-active-visits-app/package.json +++ b/packages/esm-active-visits-app/package.json @@ -38,7 +38,7 @@ "lodash-es": "^4.17.15" }, "peerDependencies": { - "@openmrs/esm-framework": "4.x", + "@openmrs/esm-framework": "5.x", "dayjs": "1.x", "react": "^18.1.0", "react-dom": "^18.1.0", diff --git a/packages/esm-active-visits-app/src/index.ts b/packages/esm-active-visits-app/src/index.ts index 1cf98f4a3..77836daa4 100644 --- a/packages/esm-active-visits-app/src/index.ts +++ b/packages/esm-active-visits-app/src/index.ts @@ -1,28 +1,16 @@ import { defineConfigSchema, getAsyncLifecycle } from '@openmrs/esm-framework'; import { configSchema } from './config-schema'; -declare var __VERSION__: string; -// __VERSION__ is replaced by Webpack with the version from package.json -const version = __VERSION__; +const moduleName = '@openmrs/esm-active-visits-app'; -const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); - -const backendDependencies = { - 'webservices.rest': '^2.2.0', -}; - -const frontendDependencies = { - '@openmrs/esm-framework': process.env.FRAMEWORK_VERSION, +const options = { + featureName: 'active-visits', + moduleName, }; -function setupOpenMRS() { - const moduleName = '@openmrs/esm-active-visits-app'; - - const options = { - featureName: 'active-visits', - moduleName, - }; +export const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); +export function startupApp() { defineConfigSchema(moduleName, configSchema); return { @@ -42,4 +30,7 @@ function setupOpenMRS() { }; } -export { backendDependencies, frontendDependencies, importTranslation, setupOpenMRS, version }; +export const activeVisits = () => + getAsyncLifecycle(() => import('./active-visits-widget/active-visits.component'), options); + +export const visitDetail = () => getAsyncLifecycle(() => import('./visits-summary/visit-detail.component'), options); diff --git a/packages/esm-active-visits-app/src/routes.json b/packages/esm-active-visits-app/src/routes.json new file mode 100644 index 000000000..55f181dae --- /dev/null +++ b/packages/esm-active-visits-app/src/routes.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://json.openmrs.org/routes.schema.json", + "backendDependencies": { + "webservices.rest": "^2.2.0" + }, + "extensions": [ + { + "name": "active-visits-widget", + "slot": "homepage-widget-slot", + "component": "activeVisits", + "order": 0 + }, + { + "name": "visit-summary-widget", + "slot": "visit-summary-slot", + "component": "visitDetail", + "order": 0 + } + ], + "pages": [] +} \ No newline at end of file diff --git a/packages/esm-appointments-app/package.json b/packages/esm-appointments-app/package.json index bbf1c87b3..e3947e01b 100644 --- a/packages/esm-appointments-app/package.json +++ b/packages/esm-appointments-app/package.json @@ -40,7 +40,7 @@ "yup": "^0.32.11" }, "peerDependencies": { - "@openmrs/esm-framework": "4.x", + "@openmrs/esm-framework": "5.x", "react": "18.x", "react-i18next": "11.x", "react-router-dom": "6.x" diff --git a/packages/esm-appointments-app/src/index.ts b/packages/esm-appointments-app/src/index.ts index 5f7e763a4..4d22917b4 100644 --- a/packages/esm-appointments-app/src/index.ts +++ b/packages/esm-appointments-app/src/index.ts @@ -3,15 +3,7 @@ import { configSchema } from './config-schema'; import { createDashboardLink } from './createDashboardLink'; import { dashboardMeta, appointmentCalendarDashboardMeta } from './dashboard.meta'; -declare var __VERSION__: string; -// __VERSION__ is replaced by Webpack with the version from package.json -const version = __VERSION__; - -const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); - -const backendDependencies = { - 'webservices.rest': '^2.2.0', -}; +export const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); const moduleName = '@openmrs/esm-appointments-app'; @@ -20,7 +12,7 @@ const options = { moduleName, }; -function setupOpenMRS() { +export function startupApp() { const appointmentsBasePath = `${window.spaBase}/home/appointments`; defineConfigSchema(moduleName, configSchema); @@ -37,52 +29,16 @@ function setupOpenMRS() { parent: `${window.spaBase}`, }, ]); - - return { - extensions: [ - { - name: 'home-appointments', - slot: 'homepage-widgets-slot', - order: 1, - load: getAsyncLifecycle(() => import('./home-appointments'), options), - }, - { - name: 'clinical-appointments-dashboard-link', - slot: 'homepage-dashboard-slot', - load: getSyncLifecycle(createDashboardLink(dashboardMeta), options), - meta: dashboardMeta, - online: true, - offline: true, - }, - { - name: 'appointments-calendar-dashboard-link', - slot: 'calendar-dashboard-slot', - load: getSyncLifecycle(createDashboardLink(appointmentCalendarDashboardMeta), options), - online: true, - offline: true, - }, - { - name: 'clinical-appointments-dashboard', - slot: 'clinical-appointments-dashboard-slot', - load: getAsyncLifecycle(() => import('./appointments.component'), options), - online: true, - offline: true, - }, - { - name: 'todays-appointments-dashboard', - slot: 'todays-appointment-slot', - load: getAsyncLifecycle(() => import('./home-appointments/'), options), - online: true, - offline: true, - }, - { - name: 'check-in-appointment-modal', - load: getAsyncLifecycle(() => import('./home-appointments/check-in-modal/check-in-modal.component'), options), - online: true, - offline: false, - }, - ], - }; } -export { backendDependencies, importTranslation, setupOpenMRS, version }; +export const appointmentsDashboardLink = () => getSyncLifecycle(createDashboardLink(dashboardMeta), options); + +export const appointmentsCalendarDashboardLink = () => + getSyncLifecycle(createDashboardLink(appointmentCalendarDashboardMeta), options); + +export const appointmentsDashboard = () => getAsyncLifecycle(() => import('./appointments.component'), options); + +export const checkInModal = () => + getAsyncLifecycle(() => import('./home-appointments/check-in-modal/check-in-modal.component'), options); + +export const homeAppointments = () => getAsyncLifecycle(() => import('./home-appointments'), options); diff --git a/packages/esm-appointments-app/src/routes.json b/packages/esm-appointments-app/src/routes.json new file mode 100644 index 000000000..8b12c12a9 --- /dev/null +++ b/packages/esm-appointments-app/src/routes.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://json.openmrs.org/routes.schema.json", + "backendDependencies": { + "webservices.rest": "^2.2.0" + }, + "extensions": [ + { + "name": "home-appointments", + "slot": "homepage-widgets-slot", + "component": "homeAppointments", + "order": 1 + }, + { + "name": "clinical-appointments-dashboard-link", + "slot": "homepage-dashboard-slot", + "component": "appointmentsDashboardLink", + "meta": { + "name": "appointments", + "slot": "clinical-appointments-dashboard-slot", + "title": "Appointments" + } + }, + { + "name": "appointments-calendar-dashboard-link", + "slot": "calendar-dashboard-slot", + "component": "appointmentsCalendarDashboardLink" + }, + { + "name": "check-in-appointment-modal", + "slot": "todays-appointment-slot", + "component": "checkInModal" + }, + { + "name": "clinical-appointments-dashboard", + "slot": "clinical-appointments-dashboard-slot", + "component": "appointmentsDashboard" + }, + { + "name": "todays-appointments-dashboard", + "slot": "todays-appointment-slot", + "component": "homeAppointments" + } + ], + "pages": [] +} \ No newline at end of file diff --git a/packages/esm-outpatient-app/package.json b/packages/esm-outpatient-app/package.json index de0e13c06..327e11d11 100644 --- a/packages/esm-outpatient-app/package.json +++ b/packages/esm-outpatient-app/package.json @@ -38,7 +38,7 @@ "lodash-es": "^4.17.15" }, "peerDependencies": { - "@openmrs/esm-framework": "4.x", + "@openmrs/esm-framework": "5.x", "react": "^18.1.0", "react-i18next": "11.x", "react-router-dom": "6.x" diff --git a/packages/esm-outpatient-app/src/index.ts b/packages/esm-outpatient-app/src/index.ts index 4f4097eec..ef367cd4c 100644 --- a/packages/esm-outpatient-app/src/index.ts +++ b/packages/esm-outpatient-app/src/index.ts @@ -3,141 +3,98 @@ import { configSchema } from './config-schema'; import { createDashboardLink } from './createDashboardLink'; import { dashboardMeta } from './dashboard.meta'; -declare var __VERSION__: string; -// __VERSION__ is replaced by Webpack with the version from package.json -const version = __VERSION__; +export const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); -const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); +const moduleName = '@openmrs/esm-outpatient-app'; -const backendDependencies = { - 'webservices.rest': '^2.2.0', +const options = { + featureName: 'outpatient', + moduleName, }; -function setupOpenMRS() { - const moduleName = '@openmrs/esm-outpatient-app'; +export const appointmentsList = getAsyncLifecycle( + () => import('./queue-patient-linelists/scheduled-appointments-table.component'), + options, +); - const options = { - featureName: 'outpatient', +export const queueList = getAsyncLifecycle( + () => import('./queue-patient-linelists/queue-services-table.component'), + options, +); + +export const outpatientSideNav = getAsyncLifecycle(() => import('./side-menu/side-menu.component'), options); + +export const serviceQueuesDashboardLink = getSyncLifecycle(createDashboardLink(dashboardMeta), options); + +export const homeDashboard = getAsyncLifecycle(() => import('./home.component'), options); + +export const editQueueEntryStatusModal = getAsyncLifecycle( + () => import('./active-visits/change-status-dialog.component'), + { + featureName: 'edit queue status', + moduleName, + }, +); + +export const patientInfoBannerSlot = getAsyncLifecycle(() => import('./patient-info/patient-info.component'), { + featureName: 'patient info slot', + moduleName, +}); + +export const addPatientToQueue = getAsyncLifecycle(() => import('./patient-search/visit-form/visit-form.component'), { + featureName: 'patient info slot', + moduleName, +}); + +export const removeQueueEntry = getAsyncLifecycle( + () => import('./remove-queue-entry-dialog/remove-queue-entry.component'), + { + featureName: 'remove queue entry and end visit', + moduleName, + }, +); + +export const clearAllQueueEntries = getAsyncLifecycle( + () => import('./clear-queue-entries-dialog/clear-queue-entries-dialog.component'), + { + featureName: 'clear all queue entries and end visits', moduleName, - }; + }, +); +export const addVisitToQueueModal = getAsyncLifecycle( + () => import('./add-patient-toqueue/add-patient-toqueue-dialog.component'), + { + featureName: 'add visit to queue', + moduleName, + }, +); + +export const transitionQueueEntryStatusModal = getAsyncLifecycle( + () => import('./transition-queue-entry/transition-queue-entry-dialog.component'), + { + featureName: 'transition queue status', + moduleName, + }, +); + +export const previousVisitSummaryWidget = getAsyncLifecycle(() => import('./past-visit/past-visit.component'), options); + +export const addProviderToRoomModal = getAsyncLifecycle( + () => import('./add-provider-queue-room/add-provider-queue-room.component'), + { + featureName: 'add provider queue room', + moduleName, + }, +); + +export const addQueueEntryWidget = getAsyncLifecycle( + () => import('./patient-search/visit-form-queue-fields/visit-form-queue-fields.component'), + options, +); + +export function startupApp() { registerBreadcrumbs([]); defineConfigSchema(moduleName, configSchema); - - return { - pages: [ - { - load: getAsyncLifecycle( - () => import('./queue-patient-linelists/scheduled-appointments-table.component'), - options, - ), - route: /^appointments-list/, - online: true, - offline: true, - }, - { - load: getAsyncLifecycle(() => import('./queue-patient-linelists/queue-services-table.component'), options), - route: /^queue-list/, - online: true, - offline: true, - }, - ], - extensions: [ - { - id: 'outpatient-side-nav-ext', - slot: 'outpatient-sidebar-slot', - load: getAsyncLifecycle(() => import('./side-menu/side-menu.component'), options), - online: true, - offline: true, - }, - { - id: 'service-queues-dashboard-link', - slot: 'homepage-dashboard-slot', - load: getSyncLifecycle(createDashboardLink(dashboardMeta), options), - meta: dashboardMeta, - online: true, - offline: true, - }, - { - id: 'home-dashboard', - slot: 'service-queues-dashboard-slot', - load: getAsyncLifecycle(() => import('./home.component'), options), - online: true, - offline: true, - }, - { - id: 'edit-queue-entry-status-modal', - load: getAsyncLifecycle(() => import('./active-visits/change-status-dialog.component'), { - featureName: 'edit queue status', - moduleName, - }), - }, - { - id: 'patient-info-banner-slot', - load: getAsyncLifecycle(() => import('./patient-info/patient-info.component'), { - featureName: 'patient info slot', - moduleName, - }), - }, - { - id: 'add-patient-to-queue', - slot: 'add-patient-to-queue-slot', - load: getAsyncLifecycle(() => import('./patient-search/visit-form/visit-form.component'), { - featureName: 'patient info slot', - moduleName, - }), - }, - { - id: 'remove-queue-entry', - load: getAsyncLifecycle(() => import('./remove-queue-entry-dialog/remove-queue-entry.component'), { - featureName: 'remove queue entry and end visit', - moduleName, - }), - }, - { - id: 'clear-all-queue-entries', - load: getAsyncLifecycle(() => import('./clear-queue-entries-dialog/clear-queue-entries-dialog.component'), { - featureName: 'clear all queue entries and end visits', - moduleName, - }), - }, - { - id: 'add-visit-to-queue-modal', - load: getAsyncLifecycle(() => import('./add-patient-toqueue/add-patient-toqueue-dialog.component'), { - featureName: 'add visit to queue', - moduleName, - }), - }, - { - id: 'transition-queue-entry-status-modal', - load: getAsyncLifecycle(() => import('./transition-queue-entry/transition-queue-entry-dialog.component'), { - featureName: 'transition queue status', - moduleName, - }), - }, - { - id: 'previous-visit-summary-widget', - slot: 'previous-visit-summary-slot', - load: getAsyncLifecycle(() => import('./past-visit/past-visit.component'), options), - }, - { - id: 'add-provider-to-room-modal', - load: getAsyncLifecycle(() => import('./add-provider-queue-room/add-provider-queue-room.component'), { - featureName: 'add provider queue room', - moduleName, - }), - }, - { - id: 'add-queue-entry-widget', - slot: 'add-queue-entry-slot', - load: getAsyncLifecycle( - () => import('./patient-search/visit-form-queue-fields/visit-form-queue-fields.component'), - options, - ), - }, - ], - }; } - -export { backendDependencies, importTranslation, setupOpenMRS, version }; diff --git a/packages/esm-outpatient-app/src/routes.json b/packages/esm-outpatient-app/src/routes.json new file mode 100644 index 000000000..c39cb473c --- /dev/null +++ b/packages/esm-outpatient-app/src/routes.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://json.openmrs.org/routes.schema.json", + "backendDependencies": { + "webservices.rest": "^2.2.0" + }, + "pages": [{ + "component": "appointmentsList", + "route": "appointments-list", + "online": true, + "offline": true + }, { + "component": "queueList", + "route": "queue-list", + "online": true, + "offline": true + }], + "extensions": [{ + "name": "outpatient-side-nav-ext", + "component": "outpatientSideNav", + "slot": "outpatient-sidebar-slot", + "online": true, + "offline": true + }, { + "name": "service-queues-dashboard-link", + "component": "homepage-dashboard-slot", + "slot": "homepage-dashboard-slot", + "meta": { + "name": "service-queues", + "slot": "service-queues-dashboard-slot", + "title": "Service queues" + }, + "online": true, + "offline": true + }, { + "name": "home-dashboard", + "component": "homeDashboard", + "slot": "service-queues-dashboard-slot", + "online": true, + "offline": true + }, { + "name": "edit-queue-entry-status-modal", + "component": "editQueueEntryStatusModal" + }, { + "name": "patient-info-banner-slot", + "component": "patientInfoBannerSlot" + }, { + "name": "add-patient-to-queue", + "component": "addPatientToQueue", + "slot": "add-patient-to-queue-slot" + }, { + "name": "remove-queue-entry", + "component": "removeQueueEntry" + }, { + "name": "clear-all-queue-entries", + "component": "clearAllQueueEntries" + }, { + "name": "add-visit-to-queue-modal", + "component": "addVisitToQueueModal" + }, { + "name": "transition-queue-entry-status-modal", + "component": "transitionQueueEntryStatusModal" + }, { + "name": "previous-visit-summary-widget", + "component": "previousVisitSummaryWidget", + "slot": "previous-visit-summary-slot" + }, { + "name": "add-provider-to-room-modal", + "component": "addProviderToRoomModal" + }, { + "name": "add-queue-entry-widget", + "component": "addQueueEntryWidget", + "slot": "add-queue-entry-slot" + }] +} \ No newline at end of file diff --git a/packages/esm-patient-list-app/package.json b/packages/esm-patient-list-app/package.json index d97df4a0b..51a3cb653 100644 --- a/packages/esm-patient-list-app/package.json +++ b/packages/esm-patient-list-app/package.json @@ -39,7 +39,7 @@ "lodash-es": "^4.17.15" }, "peerDependencies": { - "@openmrs/esm-framework": "4.x", + "@openmrs/esm-framework": "5.x", "react": "18.x", "react-i18next": "11.x", "react-router-dom": "6.x" diff --git a/packages/esm-patient-list-app/src/api/types.ts b/packages/esm-patient-list-app/src/api/types.ts index 355f49928..c1b45be5f 100644 --- a/packages/esm-patient-list-app/src/api/types.ts +++ b/packages/esm-patient-list-app/src/api/types.ts @@ -1,4 +1,4 @@ -import { OpenmrsResource } from '@openmrs/esm-api'; +import type { OpenmrsResource } from '@openmrs/esm-framework'; export enum PatientListType { STARRED = 'Starred', diff --git a/packages/esm-patient-list-app/src/index.ts b/packages/esm-patient-list-app/src/index.ts index 55a128ad7..a63aeec01 100644 --- a/packages/esm-patient-list-app/src/index.ts +++ b/packages/esm-patient-list-app/src/index.ts @@ -5,27 +5,16 @@ import { createDashboardLink } from './createDashboardLink'; import { dashboardMeta } from './dashboard.meta'; import { setupOffline } from './offline'; -declare var __VERSION__: string; -// __VERSION__ is replaced by Webpack with the version from package.json -const version = __VERSION__; - -const backendDependencies = { - 'webservices.rest': '^2.2.0', -}; - -const frontendDependencies = { - '@openmrs/esm-framework': process.env.FRAMEWORK_VERSION, -}; - -const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); - const moduleName = '@openmrs/esm-patient-list-app'; + const options = { featureName: 'patient list', moduleName, }; -function setupOpenMRS() { +export const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); + +export function startupApp() { const patientListsBasePath = `${window.spaBase}/home/patient-lists`; async function getListName(patientListUuid: string): Promise { @@ -47,66 +36,32 @@ function setupOpenMRS() { parent: patientListsBasePath, }, ]); - - return { - pages: [ - { - load: getAsyncLifecycle(() => import('./root.component'), options), - route: 'patient-lists', - online: { syncUserPropertiesChangesOnLoad: true }, - offline: { syncUserPropertiesChangesOnLoad: false }, - }, - ], - extensions: [ - { - id: 'patient-lists-dashboard-link', - slot: 'homepage-dashboard-slot', - load: getSyncLifecycle(createDashboardLink(dashboardMeta), options), - meta: dashboardMeta, - online: true, - offline: true, - }, - { - id: 'patient-lists-dashboard', - slot: 'patient-lists-dashboard-slot', - load: getAsyncLifecycle(() => import('./root.component'), options), - online: true, - offline: true, - }, - { - id: 'add-patient-to-patient-list-button', - slot: 'patient-actions-slot', - load: getAsyncLifecycle(() => import('./add-patient-to-patient-list-menu-item.component'), { - featureName: 'patient-actions-slot', - moduleName, - }), - }, - { - name: 'patient-list-action-menu', - slot: 'action-menu-non-chart-items-slot', - load: getAsyncLifecycle(() => import('./patient-list-action-button.component'), { - featureName: 'patient-list-action-menu-item', - moduleName, - }), - }, - { - id: 'add-patient-to-patient-list-modal', - load: getAsyncLifecycle(() => import('./add-patient/add-patient.component'), { - featureName: 'patient-actions-modal', - moduleName, - }), - }, - { - id: 'patient-table', - load: getAsyncLifecycle(() => import('./patient-table/patient-table.component'), { - featureName: 'patient-table', - moduleName, - }), - online: true, - offline: true, - }, - ], - }; } -export { backendDependencies, frontendDependencies, importTranslation, setupOpenMRS, version }; +export const root = () => getAsyncLifecycle(() => import('./root.component'), options); + +export const addPatientToListModal = () => + getAsyncLifecycle(() => import('./add-patient/add-patient.component'), { + featureName: 'patient-actions-modal', + moduleName, + }); + +export const addPatientToPatientListMenuItem = () => + getAsyncLifecycle(() => import('./add-patient-to-patient-list-menu-item.component'), { + featureName: 'patient-actions-slot', + moduleName, + }); + +export const patientListActionButton = () => + getAsyncLifecycle(() => import('./patient-list-action-button.component'), { + featureName: 'patient-list-action-menu-item', + moduleName, + }); + +export const patientListDashboardLink = () => getSyncLifecycle(createDashboardLink(dashboardMeta), options); + +export const patientTable = () => + getAsyncLifecycle(() => import('./patient-table/patient-table.component'), { + featureName: 'patient-table', + moduleName, + }); diff --git a/packages/esm-patient-list-app/src/routes.json b/packages/esm-patient-list-app/src/routes.json new file mode 100644 index 000000000..bbf93cdd6 --- /dev/null +++ b/packages/esm-patient-list-app/src/routes.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://json.openmrs.org/routes.schema.json", + "backendDependencies": { + "webservices.rest": "^2.2.0" + }, + "pages": [ + { + "component": "root", + "route": "patient-lists" + } + ], + "extensions": [ + { + "name": "patient-lists-dashboard-link", + "component": "patientListDashboardLink", + "meta": { + "name": "patient-lists", + "slot": "patient-lists-dashboard-slot", + "title": "Patient lists" + } + }, + { + "name": "patient-table", + "component": "patientTable" + }, + { + "name": "add-patient-to-patient-list-modal", + "component": "addPatientToListModal" + }, + { + "name": "patient-list-action-menu", + "component": "patientListActionButton", + "slot": "action-menu-non-chart-items-slot" + }, + { + "name": "add-patient-to-patient-list-button", + "slot": "patient-actions-slot", + "component": "addPatientToPatientListMenuItem" + } + ] +} \ No newline at end of file diff --git a/packages/esm-patient-registration-app/package.json b/packages/esm-patient-registration-app/package.json index 96b5dcd4c..0d0f141dc 100644 --- a/packages/esm-patient-registration-app/package.json +++ b/packages/esm-patient-registration-app/package.json @@ -43,7 +43,7 @@ "yup": "^0.29.1" }, "peerDependencies": { - "@openmrs/esm-framework": "4.x", + "@openmrs/esm-framework": "5.x", "dayjs": "1.x", "react": "18.x", "react-i18next": "11.x", diff --git a/packages/esm-patient-registration-app/src/index.ts b/packages/esm-patient-registration-app/src/index.ts index 58f7ff622..f6746674e 100644 --- a/packages/esm-patient-registration-app/src/index.ts +++ b/packages/esm-patient-registration-app/src/index.ts @@ -1,25 +1,16 @@ import { registerBreadcrumbs, defineConfigSchema, getAsyncLifecycle } from '@openmrs/esm-framework'; -import { FormManager } from './patient-registration/form-manager'; import { esmPatientRegistrationSchema } from './config-schema'; import { moduleName, patientRegistration } from './constants'; import { setupOffline } from './offline'; -declare var __VERSION__: string; -// __VERSION__ is replaced by Webpack with the version from package.json -const version = __VERSION__; +export const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); -const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); - -const backendDependencies = { - 'webservices.rest': '^2.24.0', +const options = { + featureName: 'Patient Registration', + moduleName, }; -function setupOpenMRS() { - const options = { - featureName: 'Patient Registration', - moduleName, - }; - +export function startupApp() { defineConfigSchema(moduleName, esmPatientRegistrationSchema); registerBreadcrumbs([ @@ -36,78 +27,33 @@ function setupOpenMRS() { ]); setupOffline(); - - return { - pages: [ - { - load: getAsyncLifecycle(() => import('./root.component'), options), - route: 'patient-registration', - online: { - savePatientForm: FormManager.savePatientFormOnline, - isOffline: false, - }, - offline: { - savePatientForm: FormManager.savePatientFormOffline, - isOffline: true, - }, - }, - { - load: getAsyncLifecycle(() => import('./root.component'), { - featureName: 'edit-patient-details-form', - moduleName, - }), - route: /patient\/([a-zA-Z0-9\-]+)\/edit/, - online: { - savePatientForm: FormManager.savePatientFormOnline, - }, - offline: { - savePatientForm: FormManager.savePatientFormOffline, - }, - }, - ], - extensions: [ - { - id: 'add-patient-action', - slot: 'top-nav-actions-slot', - load: getAsyncLifecycle(() => import('./add-patient-link'), options), - online: true, - offline: true, - }, - { - id: 'cancel-patient-edit-modal', - load: getAsyncLifecycle(() => import('./widgets/cancel-patient-edit.component'), options), - online: true, - offline: true, - }, - { - id: 'patient-photo-widget', - slot: 'patient-photo-slot', - load: getAsyncLifecycle(() => import('./widgets/display-photo.component'), options), - online: true, - offline: true, - }, - { - id: 'edit-patient-details-button', - slot: 'patient-actions-slot', - load: getAsyncLifecycle(() => import('./widgets/edit-patient-details-button.component'), options), - online: true, - offline: true, - }, - { - id: 'edit-patient-details-button', - slot: 'patient-search-actions-slot', - load: getAsyncLifecycle(() => import('./widgets/edit-patient-details-button.component'), options), - online: true, - offline: true, - }, - { - id: 'delete-identifier-confirmation-modal', - load: getAsyncLifecycle(() => import('./widgets/delete-identifier-confirmation-modal'), options), - online: true, - offline: true, - }, - ], - }; } -export { backendDependencies, importTranslation, setupOpenMRS, version }; +export const root = getAsyncLifecycle(() => import('./root.component'), options); + +export const editPatient = getAsyncLifecycle(() => import('./root.component'), { + featureName: 'edit-patient-details-form', + moduleName, +}); + +export const addPatientLink = getAsyncLifecycle(() => import('./add-patient-link'), options); + +export const cancelPatientEditModal = getAsyncLifecycle( + () => import('./widgets/cancel-patient-edit.component'), + options, +); + +export const patientPhoto = getAsyncLifecycle(() => import('./widgets/display-photo.component'), options); + +export const editPatientDetailsButton = getAsyncLifecycle( + () => import('./widgets/edit-patient-details-button.component'), + { + featureName: 'edit-patient-details', + moduleName, + }, +); + +export const deleteIdentifierConfirmationModal = getAsyncLifecycle( + () => import('./widgets/delete-identifier-confirmation-modal'), + options, +); diff --git a/packages/esm-patient-registration-app/src/patient-registration/form-manager.ts b/packages/esm-patient-registration-app/src/patient-registration/form-manager.ts index e7b2c654b..685cd95e4 100644 --- a/packages/esm-patient-registration-app/src/patient-registration/form-manager.ts +++ b/packages/esm-patient-registration-app/src/patient-registration/form-manager.ts @@ -39,6 +39,7 @@ export type SavePatientForm = ( savePatientTransactionManager: SavePatientTransactionManager, abortController?: AbortController, ) => Promise; + export class FormManager { static savePatientFormOffline: SavePatientForm = async ( isNewPatient, diff --git a/packages/esm-patient-registration-app/src/root.component.tsx b/packages/esm-patient-registration-app/src/root.component.tsx index f81953f40..c300f8a24 100644 --- a/packages/esm-patient-registration-app/src/root.component.tsx +++ b/packages/esm-patient-registration-app/src/root.component.tsx @@ -1,24 +1,20 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import { BrowserRouter, Route, Routes } from 'react-router-dom'; import { Grid, Row } from '@carbon/react'; -import { ExtensionSlot, useSession } from '@openmrs/esm-framework'; +import { ExtensionSlot, useConnectivity, useSession } from '@openmrs/esm-framework'; import { - Resources, ResourcesContext, fetchAddressTemplate, fetchAllRelationshipTypes, fetchPatientIdentifierTypesWithSources, } from './offline.resources'; -import { SavePatientForm } from './patient-registration/form-manager'; +import { FormManager } from './patient-registration/form-manager'; import { PatientRegistration, PatientRegistrationProps } from './patient-registration/patient-registration.component'; import useSWRImmutable from 'swr/immutable'; import styles from './root.scss'; -export interface RootProps extends PatientRegistrationProps, Resources { - savePatientForm: SavePatientForm; - isOffline: boolean; -} -export default function Root({ savePatientForm, isOffline }: RootProps) { +export default function Root() { + const isOffline = useConnectivity(); const currentSession = useSession(); const { data: addressTemplate } = useSWRImmutable('patientRegistrationAddressTemplate', fetchAddressTemplate); const { data: relationshipTypes } = useSWRImmutable( @@ -29,6 +25,10 @@ export default function Root({ savePatientForm, isOffline }: RootProps) { 'patientRegistrationPatientIdentifiers', fetchPatientIdentifierTypesWithSources, ); + const savePatientForm = useMemo( + () => (isOffline ? FormManager.savePatientFormOffline : FormManager.savePatientFormOnline), + [isOffline], + ); return (
diff --git a/packages/esm-patient-registration-app/src/routes.json b/packages/esm-patient-registration-app/src/routes.json new file mode 100644 index 000000000..a1204a0ee --- /dev/null +++ b/packages/esm-patient-registration-app/src/routes.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://json.openmrs.org/routes.schema.json", + "backendDependencies": { + "webservices.rest": "^2.24.0" + }, + "pages": [{ + "component": "root", + "route": "patient-registration", + "online": true, + "offline": true + }, { + "component": "editPatient", + "routeRegex": "patient\\/([a-zA-Z0-9\\-]+)\\/edit", + "online": true, + "offline": true + }], + "extensions": [{ + "component": "addPatientLink", + "name": "add-patient-action", + "slot": "top-nav-actions-slot", + "online": true, + "offline": true + }, { + "component": "cancelPatientEditModal", + "name": "cancel-patient-edit-modal", + "online": true, + "offline": true + }, { + "component": "patientPhoto", + "name": "patient-photo-widget", + "slot": "patient-photo-slot", + "online": true, + "offline": true + }, { + "component": "editPatientDetailsButton", + "name": "edit-patient-details-button", + "slot": "patient-actions-slot", + "online": true, + "offline": true + }, { + "component": "deleteIdentifierConfirmationModal", + "name": "delete-identifier-confirmation-modal", + "online": true, + "offline": true + }] +} diff --git a/packages/esm-patient-search-app/package.json b/packages/esm-patient-search-app/package.json index ffff78d95..2236130d4 100644 --- a/packages/esm-patient-search-app/package.json +++ b/packages/esm-patient-search-app/package.json @@ -38,7 +38,7 @@ "lodash-es": "^4.17.15" }, "peerDependencies": { - "@openmrs/esm-framework": "4.x", + "@openmrs/esm-framework": "5.x", "react": "^18.1.0", "react-i18next": "11.x", "react-router-dom": "6.x" diff --git a/packages/esm-patient-search-app/src/index.ts b/packages/esm-patient-search-app/src/index.ts index e267da461..666260142 100644 --- a/packages/esm-patient-search-app/src/index.ts +++ b/packages/esm-patient-search-app/src/index.ts @@ -8,28 +8,29 @@ import { } from '@openmrs/esm-framework'; import { configSchema } from './config-schema'; -declare var __VERSION__: string; -// __VERSION__ is replaced by Webpack with the version from package.json -const version = __VERSION__; +const moduleName = '@openmrs/esm-patient-search-app'; -const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); - -const backendDependencies = { - 'webservices.rest': '^2.2.0', +const options = { + featureName: 'patient-search', + moduleName, }; -const frontendDependencies = { - '@openmrs/esm-framework': process.env.FRAMEWORK_VERSION, -}; +export const importTranslation = require.context('../translations', false, /.json$/, 'lazy'); + +export const root = getAsyncLifecycle(() => import('./root.component'), options); -function setupOpenMRS() { - const moduleName = '@openmrs/esm-patient-search-app'; +export const patientSearchIcon = getAsyncLifecycle(() => import('./patient-search-icon'), options); - const options = { - featureName: 'patient-search', - moduleName, - }; +// This extension renders the a Patient-Search Button, which when clicked, opens the search bar in an overlay. +export const patientSearchButton = getAsyncLifecycle( + () => import('./patient-search-button/patient-search-button.component'), + options, +); +// P.S. This extension is not compatible with the tablet view. +export const patientSearchBar = getAsyncLifecycle(() => import('./compact-patient-search-extension'), options); + +export function startupApp() { defineConfigSchema(moduleName, configSchema); setupDynamicOfflineDataHandler({ @@ -52,37 +53,4 @@ function setupOpenMRS() { await fetchCurrentPatient(patientUuid); }, }); - - return { - pages: [ - { - route: /^search/, - load: getAsyncLifecycle(() => import('./root.component'), options), - }, - ], - extensions: [ - { - id: 'patient-search-icon', - slot: 'top-nav-actions-slot', - order: 0, - load: getAsyncLifecycle(() => import('./patient-search-icon'), options), - }, - { - // This extension renders the a Patient-Search Button, which when clicked, opens the search bar in an overlay. - id: 'patient-search-button', - slot: 'patient-search-button-slot', - load: getAsyncLifecycle(() => import('./patient-search-button/patient-search-button.component'), options), - offline: true, - }, - { - // P.S. This extension is not compatible with the tablet view. - id: 'patient-search-bar', - slot: 'patient-search-bar-slot', - load: getAsyncLifecycle(() => import('./compact-patient-search-extension'), options), - offline: true, - }, - ], - }; } - -export { backendDependencies, frontendDependencies, importTranslation, setupOpenMRS, version }; diff --git a/packages/esm-patient-search-app/src/routes.json b/packages/esm-patient-search-app/src/routes.json new file mode 100644 index 000000000..f79651220 --- /dev/null +++ b/packages/esm-patient-search-app/src/routes.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://json.openmrs.org/routes.schema.json", + "backendDependencies": { + "webservices.rest": "^2.2.0" + }, + "pages": [{ + "component": "root", + "route": "search" + }], + "extensions": [{ + "name": "patient-search-icon", + "component": "patientSearchIcon", + "slot": "top-nav-actions-slot", + "order": 0 + }, { + "name": "patient-search-button", + "component": "patientSearchButton", + "slot": "patient-search-button-slot", + "offline": true + }, { + "name": "patient-search-bar", + "component": "patientSearchBar", + "slot": "patient-search-bar-slot", + "offline": true + }] +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index e78d5a73e..9f9caca75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -60,7 +60,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.17.9": +"@babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": version: 7.19.6 resolution: "@babel/core@npm:7.19.6" dependencies: @@ -1312,7 +1312,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.18.10, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.19.0, @babel/types@npm:^7.19.4, @babel/types@npm:^7.20.0, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.10, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.19.0, @babel/types@npm:^7.19.4, @babel/types@npm:^7.20.0, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.20.0 resolution: "@babel/types@npm:7.20.0" dependencies: @@ -1502,160 +1502,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/android-arm64@npm:0.16.17" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/android-arm@npm:0.16.17" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/android-x64@npm:0.16.17" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/darwin-arm64@npm:0.16.17" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/darwin-x64@npm:0.16.17" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/freebsd-arm64@npm:0.16.17" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/freebsd-x64@npm:0.16.17" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-arm64@npm:0.16.17" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-arm@npm:0.16.17" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-ia32@npm:0.16.17" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-loong64@npm:0.16.17" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-mips64el@npm:0.16.17" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-ppc64@npm:0.16.17" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-riscv64@npm:0.16.17" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-s390x@npm:0.16.17" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-x64@npm:0.16.17" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/netbsd-x64@npm:0.16.17" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/openbsd-x64@npm:0.16.17" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/sunos-x64@npm:0.16.17" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/win32-arm64@npm:0.16.17" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/win32-ia32@npm:0.16.17" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/win32-x64@npm:0.16.17" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@eslint/eslintrc@npm:^0.4.3": version: 0.4.3 resolution: "@eslint/eslintrc@npm:0.4.3" @@ -2561,6 +2407,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.3 + resolution: "@jridgewell/source-map@npm:0.3.3" + dependencies: + "@jridgewell/gen-mapping": ^0.3.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: ae1302146339667da5cd6541260ecbef46ae06819a60f88da8f58b3e64682f787c09359933d050dea5d2173ea7fa40f40dd4d4e7a8d325c5892cccd99aaf8959 + languageName: node + linkType: hard + "@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": version: 1.4.14 resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" @@ -2568,7 +2424,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.13, @jridgewell/trace-mapping@npm:^0.3.14, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.13, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.17 resolution: "@jridgewell/trace-mapping@npm:0.3.17" dependencies: @@ -2578,6 +2434,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.17": + version: 0.3.18 + resolution: "@jridgewell/trace-mapping@npm:0.3.18" + dependencies: + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + checksum: 0572669f855260808c16fe8f78f5f1b4356463b11d3f2c7c0b5580c8ba1cbf4ae53efe9f627595830856e57dbac2325ac17eb0c3dd0ec42102e6f227cc289c02 + languageName: node + linkType: hard + "@leichtgewicht/ip-codec@npm:^2.0.1": version: 2.0.4 resolution: "@leichtgewicht/ip-codec@npm:2.0.4" @@ -3677,7 +3543,7 @@ __metadata: lodash-es: ^4.17.15 webpack: ^5.74.0 peerDependencies: - "@openmrs/esm-framework": 4.x + "@openmrs/esm-framework": 5.x dayjs: 1.x react: ^18.1.0 react-dom: ^18.1.0 @@ -3685,28 +3551,31 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-api@npm:^4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-api@npm:4.2.1-pre.619" +"@openmrs/esm-api@npm:^5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-api@npm:5.0.2-pre.818" dependencies: "@types/fhir": 0.0.31 lodash-es: ^4.17.21 peerDependencies: "@openmrs/esm-config": 4.x "@openmrs/esm-error-handling": 4.x - checksum: ce77513cf82c31c2e8123b730bdef08804cdb44920c4799df777cbad1f4004e09a3259358b6acfeb4edfd4f7139b81900f71d32f6ec7a576680f5dc6663b5689 + "@openmrs/esm-offline": 4.x + checksum: 61f069bca8c6dce5043d1efef86f005cc7c512e3403fc6f4374380cc26ce09e456fc7442f5617d084d3598b67396061c23a32da5f7c9d1bebeb1263fcfc6fc2f languageName: node linkType: hard -"@openmrs/esm-app-shell@npm:4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-app-shell@npm:4.2.1-pre.619" +"@openmrs/esm-app-shell@npm:5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-app-shell@npm:5.0.2-pre.818" dependencies: "@carbon/react": ^1.12.0 - "@openmrs/esm-framework": 4.2.1-pre.619 - "@openmrs/esm-styleguide": 4.2.1-pre.619 + "@openmrs/esm-framework": 5.0.2-pre.818 + "@openmrs/esm-styleguide": 5.0.2-pre.818 + "@swc-node/loader": ^1.3.5 dayjs: ^1.10.4 dexie: ^3.0.3 + html-webpack-plugin: ^5.5.0 i18next: ^19.6.0 i18next-browser-languagedetector: ^4.3.1 i18next-icu: ^1.4.2 @@ -3719,11 +3588,14 @@ __metadata: rxjs: ^6.5.3 single-spa: ^5.9.2 systemjs: ^6.8.3 + webpack: ^5.88.0 + webpack-pwa-manifest: ^4.3.0 workbox-core: ^6.1.5 workbox-routing: ^6.1.5 workbox-strategies: ^6.1.5 + workbox-webpack-plugin: ^6.1.5 workbox-window: ^6.1.5 - checksum: 39204eca3e969b93923220d609a3b89265fcd0b4bfd5e9d481bc02a1a94903c6ad2bf3f902adf049ef1096372ae4c746d3f849fec3b069b72a8970749c0e39c7 + checksum: b6f7b399e24d90542c252827d06bdc9c6d09a85cbd1623d7f01d32cb7023b92559bde97d01ab01ae585f23a32ddc3ce9779f831df1a3b79944c9286afe161265 languageName: node linkType: hard @@ -3737,50 +3609,58 @@ __metadata: webpack: ^5.74.0 yup: ^0.32.11 peerDependencies: - "@openmrs/esm-framework": 4.x + "@openmrs/esm-framework": 5.x react: 18.x react-i18next: 11.x react-router-dom: 6.x languageName: unknown linkType: soft -"@openmrs/esm-breadcrumbs@npm:^4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-breadcrumbs@npm:4.2.1-pre.619" +"@openmrs/esm-breadcrumbs@npm:^5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-breadcrumbs@npm:5.0.2-pre.818" dependencies: path-to-regexp: 6.1.0 peerDependencies: "@openmrs/esm-state": 4.x - checksum: 60b6cf7eaecd76e4d5c5546d9c7ebe8086272bce6792eef980be11fecce4ce5ec75582ed7b85612b28defa550ebb887ed8915d8c9a92941b1e39cb9043a02fed + checksum: 293b0f44109f88ae03c282fd25f01ddd95da7ff9ea05d06c5c3c1894ec6fcc99961a25ebb056519ca9582edb9dd0743d4c0cc7a57b2adc8be4e57934fb32a718 languageName: node linkType: hard -"@openmrs/esm-config@npm:^4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-config@npm:4.2.1-pre.619" +"@openmrs/esm-config@npm:^5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-config@npm:5.0.2-pre.818" dependencies: ramda: ^0.26.1 peerDependencies: "@openmrs/esm-globals": 4.x "@openmrs/esm-state": 4.x single-spa: 5.x - systemjs: 6.x - checksum: b74e9fb87621706ba450cdf08610453a4d8f98b132a306a868fa7f622eaa2b56ce275e24639a7354e2ca33acbb4b9d3d160c5c2cca92bf63cc05cba25bfb017a + checksum: 96597fe3701f34fcbdb599e86ce8757e7b020df6dbc62f661862d7d2bf81124a4906c3974e713516ac2b37fde62e156fbca816209cf15ac3dda4b0357389dc29 + languageName: node + linkType: hard + +"@openmrs/esm-dynamic-loading@npm:^5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-dynamic-loading@npm:5.0.2-pre.818" + peerDependencies: + "@openmrs/esm-globals": 4.x + checksum: 72589debbb74fcd9a0508a29c5312f3ec82c650096b92b576a25a529e94c0595b0d2689ead29fdb1a17bc3ff2645a12a2847a33533e3b0d260f8486e9e5b816e languageName: node linkType: hard -"@openmrs/esm-error-handling@npm:^4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-error-handling@npm:4.2.1-pre.619" +"@openmrs/esm-error-handling@npm:^5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-error-handling@npm:5.0.2-pre.818" peerDependencies: "@openmrs/esm-globals": 4.x - checksum: 1b27d43290174bcb34d0a96180afb632fabdafe54324aa7ddbf1ac3886e6b5746b57c7e5849cfcbd76b35d51f59d53d4eae245d9f04e3133adaec0d68b602826 + checksum: bf3d4c024aba20ae0e51b3c4e95eccdcc86edf6a1c94eb2c9044f415925793409199f9bdc980b5dbcb7f73a607977ff8eadedd4e3a7ecd62231851b42a00fbcb languageName: node linkType: hard -"@openmrs/esm-extensions@npm:^4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-extensions@npm:4.2.1-pre.619" +"@openmrs/esm-extensions@npm:^5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-extensions@npm:5.0.2-pre.818" dependencies: lodash-es: ^4.17.21 peerDependencies: @@ -3788,46 +3668,55 @@ __metadata: "@openmrs/esm-config": 4.x "@openmrs/esm-state": 4.x single-spa: 5.x - checksum: 4d9a13715d381aecaedd17692150b531ef50ad3c89ea9f7dbb04ba625322cd5bd1dff334f9917a5a31552d3217e00c20432bb5409b5d64fd0e261224622f7fe8 - languageName: node - linkType: hard - -"@openmrs/esm-framework@npm:4.2.1-pre.619, @openmrs/esm-framework@npm:next": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-framework@npm:4.2.1-pre.619" - dependencies: - "@openmrs/esm-api": ^4.2.1-pre.619 - "@openmrs/esm-breadcrumbs": ^4.2.1-pre.619 - "@openmrs/esm-config": ^4.2.1-pre.619 - "@openmrs/esm-error-handling": ^4.2.1-pre.619 - "@openmrs/esm-extensions": ^4.2.1-pre.619 - "@openmrs/esm-globals": ^4.2.1-pre.619 - "@openmrs/esm-offline": ^4.2.1-pre.619 - "@openmrs/esm-react-utils": ^4.2.1-pre.619 - "@openmrs/esm-state": ^4.2.1-pre.619 - "@openmrs/esm-styleguide": ^4.2.1-pre.619 - "@openmrs/esm-utils": ^4.2.1-pre.619 + checksum: 4d6f8fabe3c5cfa73141badc1f8b87d8fa1bfba779f90ef5a6ab757d94d36662bc7f189e333253d327b86d8a33272d231ff531340d7e6edc8f109cc30c78439e + languageName: node + linkType: hard + +"@openmrs/esm-framework@npm:5.0.2-pre.818, @openmrs/esm-framework@npm:next": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-framework@npm:5.0.2-pre.818" + dependencies: + "@openmrs/esm-api": ^5.0.2-pre.818 + "@openmrs/esm-breadcrumbs": ^5.0.2-pre.818 + "@openmrs/esm-config": ^5.0.2-pre.818 + "@openmrs/esm-dynamic-loading": ^5.0.2-pre.818 + "@openmrs/esm-error-handling": ^5.0.2-pre.818 + "@openmrs/esm-extensions": ^5.0.2-pre.818 + "@openmrs/esm-globals": ^5.0.2-pre.818 + "@openmrs/esm-offline": ^5.0.2-pre.818 + "@openmrs/esm-react-utils": ^5.0.2-pre.818 + "@openmrs/esm-state": ^5.0.2-pre.818 + "@openmrs/esm-styleguide": ^5.0.2-pre.818 + "@openmrs/esm-utils": ^5.0.2-pre.818 dayjs: ^1.10.7 - checksum: 9a91d80b571cf4a1c33ae89115e3d45b06b359205ea6ac39eb39624e20a00cc3e104d850ae2c02e72e2a1d1071dc78742eacb30031f8023a603204be4909b08c + peerDependencies: + dayjs: 1.x + i18next: 19.x + react: 18.x + react-dom: 18.x + react-i18next: 11.x + rxjs: 6.x + single-spa: 5.x + checksum: 2c733464f87948fc0368a36c55dcf902559c96b6408498bf412fb2330d4d6618b18710a04dd2360b684fb1daeb668c41d6ea117d8133effb58260abf222f5640 languageName: node linkType: hard -"@openmrs/esm-globals@npm:^4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-globals@npm:4.2.1-pre.619" +"@openmrs/esm-globals@npm:^5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-globals@npm:5.0.2-pre.818" peerDependencies: single-spa: 5.x - checksum: 745f7df1eb9d1725270378a47aac6ced73495f9a35b61df7cc21c0664aaa6682a8dab16282f3d996411450a6fdcb0a91a486ca9e51ff19ad4abcecd681ed872f + checksum: 99b3f215574b07633e9cf238ff67bc170a33029d4622f2c816f81b9199dba32c2197105aa65bfe546757109597da5565089722e8ba915096c433ad7f9bcd6245 languageName: node linkType: hard -"@openmrs/esm-offline@npm:^4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-offline@npm:4.2.1-pre.619" +"@openmrs/esm-offline@npm:^5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-offline@npm:5.0.2-pre.818" dependencies: dexie: ^3.0.3 - lodash-es: 4.17.21 - uuid: ^8.3.2 + lodash-es: ^4.17.21 + uuid: ^9.0.0 workbox-window: ^6.1.5 peerDependencies: "@openmrs/esm-api": 4.x @@ -3835,7 +3724,7 @@ __metadata: "@openmrs/esm-state": 4.x "@openmrs/esm-styleguide": 4.x rxjs: 6.x - checksum: b019bae0488810a336656a2f4c8fc46e575adfc76d08656788c5f52e0aabd94f46ca7fa9e3d17e4dd43ceedf9f14ee9ad3016c5898c0326a08d481047daea034 + checksum: 8200f9a82d4f0bfd055b4326ee42ac82267bdaae27d6fb6e3e8bcba2e1eec3c05bdddd302e28dc71b8b9722c8894105362205970334f6089ed489fab5f33b93d languageName: node linkType: hard @@ -3847,7 +3736,7 @@ __metadata: lodash-es: ^4.17.15 webpack: ^5.74.0 peerDependencies: - "@openmrs/esm-framework": 4.x + "@openmrs/esm-framework": 5.x react: ^18.1.0 react-i18next: 11.x react-router-dom: 6.x @@ -3863,7 +3752,7 @@ __metadata: lodash-es: ^4.17.15 webpack: ^5.74.0 peerDependencies: - "@openmrs/esm-framework": 4.x + "@openmrs/esm-framework": 5.x react: 18.x react-i18next: 11.x react-router-dom: 6.x @@ -3878,6 +3767,7 @@ __metadata: "@carbon/react": ^1.12.0 "@openmrs/esm-framework": next "@playwright/test": 1.34.0 + "@swc-node/loader": ^1.3.5 "@swc/core": ^1.2.165 "@swc/jest": ^0.2.20 "@testing-library/dom": ^8.13.0 @@ -3897,6 +3787,7 @@ __metadata: babel-preset-minify: ^0.5.1 concurrently: ^5.3.0 cross-env: ^7.0.3 + css-loader: ^6.8.1 dayjs: ^1.8.36 dotenv: ^16.0.3 eslint: ^7.20.0 @@ -3943,7 +3834,7 @@ __metadata: webpack: ^5.74.0 yup: ^0.29.1 peerDependencies: - "@openmrs/esm-framework": 4.x + "@openmrs/esm-framework": 5.x dayjs: 1.x react: 18.x react-i18next: 11.x @@ -3959,19 +3850,19 @@ __metadata: lodash-es: ^4.17.15 webpack: ^5.74.0 peerDependencies: - "@openmrs/esm-framework": 4.x + "@openmrs/esm-framework": 5.x react: ^18.1.0 react-i18next: 11.x react-router-dom: 6.x languageName: unknown linkType: soft -"@openmrs/esm-react-utils@npm:^4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-react-utils@npm:4.2.1-pre.619" +"@openmrs/esm-react-utils@npm:^5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-react-utils@npm:5.0.2-pre.818" dependencies: lodash-es: ^4.17.21 - single-spa-react: ^5.0.0 + single-spa-react: ~5.0.0 swr: ^2.0.1 peerDependencies: "@openmrs/esm-api": 4.x @@ -3984,74 +3875,70 @@ __metadata: react: 18.x react-dom: 18.x react-i18next: 11.x - checksum: f16b67a28d5bb0dff1331a28e6ee7fcdee036016828f02afe93de70381744c93f6d1a51434e76a9a863ebeeb9a3b2131e628f3117a1ef640a3f1a25e91964f7e + checksum: 2334180abc1f542dac23ca95d605a3920dfac43dfcc8c5b3789101f557033fe859c39c0318337642636518c85a5e96df2685087fc16c8aaee05c814e96ff9485 languageName: node linkType: hard -"@openmrs/esm-state@npm:^4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-state@npm:4.2.1-pre.619" +"@openmrs/esm-state@npm:^5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-state@npm:5.0.2-pre.818" dependencies: - unistore: ^3.5.2 - checksum: a1e5bf51d01619b77af3ecf50db669ea9b7dfd2005b7d1cc27d4e84f17d90ff9feec6aac3a510233128cd85ddb165e8ce98f609b1140e68150343a32419d476c + zustand: ^4.3.6 + checksum: 48724501bfbb863d9bd2cf91ed13c293a64aac6e741b64cf5a47fb76c5dc5e66a3ec8ab8eec5fee25aba34b0df3980826fc2351ce4a472cb3fa3cb2ac338052a languageName: node linkType: hard -"@openmrs/esm-styleguide@npm:4.2.1-pre.619, @openmrs/esm-styleguide@npm:^4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-styleguide@npm:4.2.1-pre.619" +"@openmrs/esm-styleguide@npm:5.0.2-pre.818, @openmrs/esm-styleguide@npm:^5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-styleguide@npm:5.0.2-pre.818" dependencies: "@carbon/charts": ^1.6.3 "@carbon/react": ^1.12.0 d3: ^7.8.0 lodash-es: ^4.17.21 peerDependencies: - "@openmrs/esm-extensions": 4.x - "@openmrs/esm-react-utils": 4.x - "@openmrs/esm-state": 4.x + "@openmrs/esm-framework": 4.x react: 18.x react-dom: 18.x rxjs: 6.x - checksum: a01a5b0ce383c930fb7fc54d15eadddf709fd3a9bfed7c4e2f2d59ee5f0c660d84cfa2f4eb1eed323ee528cf7f7bdc03a6fd8dc46cc77efaa9e6b97324539187 + checksum: dc56184dfb7f337235dd906b3f395e92a6ae8cd15f30d11012794d0079124c2fc0c9a4e4bb9ce2f60df942c99c0143431364350400451e8915a23d48f22039e0 languageName: node linkType: hard -"@openmrs/esm-utils@npm:^4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/esm-utils@npm:4.2.1-pre.619" +"@openmrs/esm-utils@npm:^5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/esm-utils@npm:5.0.2-pre.818" dependencies: semver: 7.3.2 peerDependencies: dayjs: 1.x i18next: 19.x rxjs: 6.x - checksum: c0065167807e8e79b7d56f2e5c3fa9bcd347dc9591fb56c70b62ea085b9813db29474502dc870ca7683d2a35cffd741b993115e2baaba1ad0af0a911d1b723fa + checksum: 5605b77dffef057c1a5bc8ddd594f68378b8eec2e4194fefdcd432bf33b4579c2f6982f1efa0c92ddacc3255666cf81fad3cde341a611540594f6b5277beb9fa languageName: node linkType: hard -"@openmrs/webpack-config@npm:4.2.1-pre.619": - version: 4.2.1-pre.619 - resolution: "@openmrs/webpack-config@npm:4.2.1-pre.619" +"@openmrs/webpack-config@npm:5.0.2-pre.818": + version: 5.0.2-pre.818 + resolution: "@openmrs/webpack-config@npm:5.0.2-pre.818" dependencies: - "@babel/core": ^7.17.9 - "@babel/types": ^7.17.0 - "@swc/core": ^1.2.165 + "@swc-node/loader": ^1.3.5 + "@swc/core": ^1.3.58 babel-preset-minify: ^0.5.1 clean-webpack-plugin: ^4.0.0 + copy-webpack-plugin: ^11.0.0 css-loader: ^5.2.4 fork-ts-checker-webpack-plugin: ^6.5.0 lodash: ^4.17.21 sass: ^1.44.0 sass-loader: ^12.3.0 style-loader: ^3.3.1 - swc-loader: ^0.1.15 - systemjs-webpack-interop: ^2.3.7 - webpack: ^5.74.0 + webpack: ^5.88.0 webpack-bundle-analyzer: ^4.5.0 webpack-stats-plugin: ^1.0.3 peerDependencies: webpack: 5.x - checksum: 09a8b0ff9f9f3e87103b36096c14ed20f002bbd9944130e6d417b4f1ff9eae2091dd25e7a28b7e2500576d4410116aba2cf902e1b530154003ee256b167f8273 + checksum: fb12b87fb2544ac4042a0847ad2ed162ef5fca1d5bc29c123452ddf056bdd83998d5d3c85866c9856948f25e3fd39068e4ec1bc653c686956aa5ccf703ac47c1 languageName: node linkType: hard @@ -4207,6 +4094,55 @@ __metadata: languageName: node linkType: hard +"@swc-node/core@npm:^1.10.3": + version: 1.10.3 + resolution: "@swc-node/core@npm:1.10.3" + peerDependencies: + "@swc/core": ">= 1.3" + checksum: 6e3e50a44d7a1c1aa62599d83c58f21568c1da03422124b46634488aba02747939063eeb1a2710aab0ab9f14f347386226a017ed72e6ba608d4a26532cd426af + languageName: node + linkType: hard + +"@swc-node/loader@npm:^1.3.5": + version: 1.3.5 + resolution: "@swc-node/loader@npm:1.3.5" + dependencies: + "@swc-node/core": ^1.10.3 + "@swc-node/register": ^1.6.5 + peerDependencies: + typescript: ">= 4.3" + webpack: ">= 5.0.0" + checksum: f28208a5298d64f2452e048db279d3e9da2eaa5d4d146f8a6b78508f1a70bab3e8e56e1e19cff455d1001ea4af792589d73dd3a2a5ce5f8ef565dbed5622e8b7 + languageName: node + linkType: hard + +"@swc-node/register@npm:^1.6.5": + version: 1.6.5 + resolution: "@swc-node/register@npm:1.6.5" + dependencies: + "@swc-node/core": ^1.10.3 + "@swc-node/sourcemap-support": ^0.3.0 + colorette: ^2.0.19 + debug: ^4.3.4 + pirates: ^4.0.5 + tslib: ^2.5.0 + peerDependencies: + "@swc/core": ">= 1.3" + typescript: ">= 4.3" + checksum: 490b2c6d04d4be3e80f3cc4aeccd4e064f49100e7e21675de3e2a125d844857589a3e0b91a17f088c471cbb20725a02fadc9edd244c08253d1bae19b2e88e8e6 + languageName: node + linkType: hard + +"@swc-node/sourcemap-support@npm:^0.3.0": + version: 0.3.0 + resolution: "@swc-node/sourcemap-support@npm:0.3.0" + dependencies: + source-map-support: ^0.5.21 + tslib: ^2.5.0 + checksum: a3c837ed790238ef88682eb342b75d756eba5eb3b6cfe6cf14a597bd78dfc9a9797f1e54a4977c1297e5324fba2e33bd76ab8aa9c396ad463693de2001180c9e + languageName: node + linkType: hard + "@swc/core-android-arm-eabi@npm:1.3.11": version: 1.3.11 resolution: "@swc/core-android-arm-eabi@npm:1.3.11" @@ -4232,6 +4168,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-darwin-arm64@npm:1.3.66": + version: 1.3.66 + resolution: "@swc/core-darwin-arm64@npm:1.3.66" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@swc/core-darwin-x64@npm:1.3.11": version: 1.3.11 resolution: "@swc/core-darwin-x64@npm:1.3.11" @@ -4239,6 +4182,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-darwin-x64@npm:1.3.66": + version: 1.3.66 + resolution: "@swc/core-darwin-x64@npm:1.3.66" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@swc/core-freebsd-x64@npm:1.3.11": version: 1.3.11 resolution: "@swc/core-freebsd-x64@npm:1.3.11" @@ -4257,6 +4207,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-arm-gnueabihf@npm:1.3.66": + version: 1.3.66 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.66" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@swc/core-linux-arm64-gnu@npm:1.3.11": version: 1.3.11 resolution: "@swc/core-linux-arm64-gnu@npm:1.3.11" @@ -4264,6 +4221,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-arm64-gnu@npm:1.3.66": + version: 1.3.66 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.66" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@swc/core-linux-arm64-musl@npm:1.3.11": version: 1.3.11 resolution: "@swc/core-linux-arm64-musl@npm:1.3.11" @@ -4271,6 +4235,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-arm64-musl@npm:1.3.66": + version: 1.3.66 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.66" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@swc/core-linux-x64-gnu@npm:1.3.11": version: 1.3.11 resolution: "@swc/core-linux-x64-gnu@npm:1.3.11" @@ -4278,6 +4249,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-x64-gnu@npm:1.3.66": + version: 1.3.66 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.66" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@swc/core-linux-x64-musl@npm:1.3.11": version: 1.3.11 resolution: "@swc/core-linux-x64-musl@npm:1.3.11" @@ -4285,6 +4263,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-x64-musl@npm:1.3.66": + version: 1.3.66 + resolution: "@swc/core-linux-x64-musl@npm:1.3.66" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@swc/core-win32-arm64-msvc@npm:1.3.11": version: 1.3.11 resolution: "@swc/core-win32-arm64-msvc@npm:1.3.11" @@ -4294,6 +4279,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-win32-arm64-msvc@npm:1.3.66": + version: 1.3.66 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.66" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@swc/core-win32-ia32-msvc@npm:1.3.11": version: 1.3.11 resolution: "@swc/core-win32-ia32-msvc@npm:1.3.11" @@ -4303,6 +4295,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-win32-ia32-msvc@npm:1.3.66": + version: 1.3.66 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.66" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@swc/core-win32-x64-msvc@npm:1.3.11": version: 1.3.11 resolution: "@swc/core-win32-x64-msvc@npm:1.3.11" @@ -4310,6 +4309,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-win32-x64-msvc@npm:1.3.66": + version: 1.3.66 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.66" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@swc/core@npm:^1.2.165": version: 1.3.11 resolution: "@swc/core@npm:1.3.11" @@ -4360,6 +4366,50 @@ __metadata: languageName: node linkType: hard +"@swc/core@npm:^1.3.58": + version: 1.3.66 + resolution: "@swc/core@npm:1.3.66" + dependencies: + "@swc/core-darwin-arm64": 1.3.66 + "@swc/core-darwin-x64": 1.3.66 + "@swc/core-linux-arm-gnueabihf": 1.3.66 + "@swc/core-linux-arm64-gnu": 1.3.66 + "@swc/core-linux-arm64-musl": 1.3.66 + "@swc/core-linux-x64-gnu": 1.3.66 + "@swc/core-linux-x64-musl": 1.3.66 + "@swc/core-win32-arm64-msvc": 1.3.66 + "@swc/core-win32-ia32-msvc": 1.3.66 + "@swc/core-win32-x64-msvc": 1.3.66 + peerDependencies: + "@swc/helpers": ^0.5.0 + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: e6029c648ba47c522bed51a9f2fee606f82de1f9233e2e89197e43b0a4867054174ca05e825e688cdc4de332221c0da2e12ba7ba875549e8b5432aa70fe19263 + languageName: node + linkType: hard + "@swc/jest@npm:^0.2.20": version: 0.2.23 resolution: "@swc/jest@npm:0.2.23" @@ -4576,10 +4626,10 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:^0.0.51": - version: 0.0.51 - resolution: "@types/estree@npm:0.0.51" - checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189 +"@types/estree@npm:^1.0.0": + version: 1.0.1 + resolution: "@types/estree@npm:1.0.1" + checksum: e9aa175eacb797216fafce4d41e8202c7a75555bc55232dee0f9903d7171f8f19f0ae7d5191bb1a88cb90e65468be508c0df850a9fb81b4433b293a5a749899d languageName: node linkType: hard @@ -5109,154 +5159,154 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/ast@npm:1.11.1" +"@webassemblyjs/ast@npm:1.11.6, @webassemblyjs/ast@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/ast@npm:1.11.6" dependencies: - "@webassemblyjs/helper-numbers": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - checksum: 1eee1534adebeece635362f8e834ae03e389281972611408d64be7895fc49f48f98fddbbb5339bf8a72cb101bcb066e8bca3ca1bf1ef47dadf89def0395a8d87 + "@webassemblyjs/helper-numbers": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + checksum: 38ef1b526ca47c210f30975b06df2faf1a8170b1636ce239fc5738fc231ce28389dd61ecedd1bacfc03cbe95b16d1af848c805652080cb60982836eb4ed2c6cf languageName: node linkType: hard -"@webassemblyjs/floating-point-hex-parser@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.1" - checksum: b8efc6fa08e4787b7f8e682182d84dfdf8da9d9c77cae5d293818bc4a55c1f419a87fa265ab85252b3e6c1fd323d799efea68d825d341a7c365c64bc14750e97 +"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" + checksum: 29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 languageName: node linkType: hard -"@webassemblyjs/helper-api-error@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.1" - checksum: 0792813f0ed4a0e5ee0750e8b5d0c631f08e927f4bdfdd9fe9105dc410c786850b8c61bff7f9f515fdfb149903bec3c976a1310573a4c6866a94d49bc7271959 +"@webassemblyjs/helper-api-error@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" + checksum: e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.11.1" - checksum: a337ee44b45590c3a30db5a8b7b68a717526cf967ada9f10253995294dbd70a58b2da2165222e0b9830cd4fc6e4c833bf441a721128d1fe2e9a7ab26b36003ce +"@webassemblyjs/helper-buffer@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-buffer@npm:1.11.6" + checksum: b14d0573bf680d22b2522e8a341ec451fddd645d1f9c6bd9012ccb7e587a2973b86ab7b89fe91e1c79939ba96095f503af04369a3b356c8023c13a5893221644 languageName: node linkType: hard -"@webassemblyjs/helper-numbers@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.1" +"@webassemblyjs/helper-numbers@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" dependencies: - "@webassemblyjs/floating-point-hex-parser": 1.11.1 - "@webassemblyjs/helper-api-error": 1.11.1 + "@webassemblyjs/floating-point-hex-parser": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 "@xtuc/long": 4.2.2 - checksum: 44d2905dac2f14d1e9b5765cf1063a0fa3d57295c6d8930f6c59a36462afecc6e763e8a110b97b342a0f13376166c5d41aa928e6ced92e2f06b071fd0db59d3a + checksum: f4b562fa219f84368528339e0f8d273ad44e047a07641ffcaaec6f93e5b76fd86490a009aa91a294584e1436d74b0a01fa9fde45e333a4c657b58168b04da424 languageName: node linkType: hard -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.1" - checksum: eac400113127832c88f5826bcc3ad1c0db9b3dbd4c51a723cfdb16af6bfcbceb608170fdaac0ab7731a7e18b291be7af68a47fcdb41cfe0260c10857e7413d97 +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" + checksum: 3535ef4f1fba38de3475e383b3980f4bbf3de72bbb631c2b6584c7df45be4eccd62c6ff48b5edd3f1bcff275cfd605a37679ec199fc91fd0a7705d7f1e3972dc languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.1" +"@webassemblyjs/helper-wasm-section@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - checksum: 617696cfe8ecaf0532763162aaf748eb69096fb27950219bb87686c6b2e66e11cd0614d95d319d0ab1904bc14ebe4e29068b12c3e7c5e020281379741fe4bedf + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + checksum: b2cf751bf4552b5b9999d27bbb7692d0aca75260140195cb58ea6374d7b9c2dc69b61e10b211a0e773f66209c3ddd612137ed66097e3684d7816f854997682e9 languageName: node linkType: hard -"@webassemblyjs/ieee754@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/ieee754@npm:1.11.1" +"@webassemblyjs/ieee754@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/ieee754@npm:1.11.6" dependencies: "@xtuc/ieee754": ^1.2.0 - checksum: 23a0ac02a50f244471631802798a816524df17e56b1ef929f0c73e3cde70eaf105a24130105c60aff9d64a24ce3b640dad443d6f86e5967f922943a7115022ec + checksum: 13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de languageName: node linkType: hard -"@webassemblyjs/leb128@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/leb128@npm:1.11.1" +"@webassemblyjs/leb128@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/leb128@npm:1.11.6" dependencies: "@xtuc/long": 4.2.2 - checksum: 33ccc4ade2f24de07bf31690844d0b1ad224304ee2062b0e464a610b0209c79e0b3009ac190efe0e6bd568b0d1578d7c3047fc1f9d0197c92fc061f56224ff4a + checksum: 7ea942dc9777d4b18a5ebfa3a937b30ae9e1d2ce1fee637583ed7f376334dd1d4274f813d2e250056cca803e0952def4b954913f1a3c9068bcd4ab4ee5143bf0 languageName: node linkType: hard -"@webassemblyjs/utf8@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/utf8@npm:1.11.1" - checksum: 972c5cfc769d7af79313a6bfb96517253a270a4bf0c33ba486aa43cac43917184fb35e51dfc9e6b5601548cd5931479a42e42c89a13bb591ffabebf30c8a6a0b +"@webassemblyjs/utf8@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/utf8@npm:1.11.6" + checksum: 807fe5b5ce10c390cfdd93e0fb92abda8aebabb5199980681e7c3743ee3306a75729bcd1e56a3903980e96c885ee53ef901fcbaac8efdfa480f9c0dae1d08713 languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.11.1" +"@webassemblyjs/wasm-edit@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-edit@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/helper-wasm-section": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - "@webassemblyjs/wasm-opt": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 - "@webassemblyjs/wast-printer": 1.11.1 - checksum: 6d7d9efaec1227e7ef7585a5d7ff0be5f329f7c1c6b6c0e906b18ed2e9a28792a5635e450aca2d136770d0207225f204eff70a4b8fd879d3ac79e1dcc26dbeb9 + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/helper-wasm-section": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + "@webassemblyjs/wasm-opt": 1.11.6 + "@webassemblyjs/wasm-parser": 1.11.6 + "@webassemblyjs/wast-printer": 1.11.6 + checksum: 29ce75870496d6fad864d815ebb072395a8a3a04dc9c3f4e1ffdc63fc5fa58b1f34304a1117296d8240054cfdbc38aca88e71fb51483cf29ffab0a61ef27b481 languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.11.1" +"@webassemblyjs/wasm-gen@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-gen@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/ieee754": 1.11.1 - "@webassemblyjs/leb128": 1.11.1 - "@webassemblyjs/utf8": 1.11.1 - checksum: 1f6921e640293bf99fb16b21e09acb59b340a79f986c8f979853a0ae9f0b58557534b81e02ea2b4ef11e929d946708533fd0693c7f3712924128fdafd6465f5b + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 + checksum: a645a2eecbea24833c3260a249704a7f554ef4a94c6000984728e94bb2bc9140a68dfd6fd21d5e0bbb09f6dfc98e083a45760a83ae0417b41a0196ff6d45a23a languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.11.1" +"@webassemblyjs/wasm-opt@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-opt@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 - checksum: 21586883a20009e2b20feb67bdc451bbc6942252e038aae4c3a08e6f67b6bae0f5f88f20bfc7bd0452db5000bacaf5ab42b98cf9aa034a6c70e9fc616142e1db + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + "@webassemblyjs/wasm-parser": 1.11.6 + checksum: b4557f195487f8e97336ddf79f7bef40d788239169aac707f6eaa2fa5fe243557c2d74e550a8e57f2788e70c7ae4e7d32f7be16101afe183d597b747a3bdd528 languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.11.1" +"@webassemblyjs/wasm-parser@npm:1.11.6, @webassemblyjs/wasm-parser@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-parser@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-api-error": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/ieee754": 1.11.1 - "@webassemblyjs/leb128": 1.11.1 - "@webassemblyjs/utf8": 1.11.1 - checksum: 1521644065c360e7b27fad9f4bb2df1802d134dd62937fa1f601a1975cde56bc31a57b6e26408b9ee0228626ff3ba1131ae6f74ffb7d718415b6528c5a6dbfc2 + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 + checksum: 8200a8d77c15621724a23fdabe58d5571415cda98a7058f542e670ea965dd75499f5e34a48675184947c66f3df23adf55df060312e6d72d57908e3f049620d8a languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wast-printer@npm:1.11.1" +"@webassemblyjs/wast-printer@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wast-printer@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/ast": 1.11.6 "@xtuc/long": 4.2.2 - checksum: f15ae4c2441b979a3b4fce78f3d83472fb22350c6dc3fd34bfe7c3da108e0b2360718734d961bba20e7716cb8578e964b870da55b035e209e50ec9db0378a3f7 + checksum: d2fa6a4c427325ec81463e9c809aa6572af6d47f619f3091bf4c4a6fc34f1da3df7caddaac50b8e7a457f8784c62cd58c6311b6cb69b0162ccd8d4c072f79cf8 languageName: node linkType: hard @@ -5364,12 +5414,12 @@ __metadata: languageName: node linkType: hard -"acorn-import-assertions@npm:^1.7.6": - version: 1.8.0 - resolution: "acorn-import-assertions@npm:1.8.0" +"acorn-import-assertions@npm:^1.9.0": + version: 1.9.0 + resolution: "acorn-import-assertions@npm:1.9.0" peerDependencies: acorn: ^8 - checksum: 5c4cf7c850102ba7ae0eeae0deb40fb3158c8ca5ff15c0bca43b5c47e307a1de3d8ef761788f881343680ea374631ae9e9615ba8876fee5268dbe068c98bcba6 + checksum: 944fb2659d0845c467066bdcda2e20c05abe3aaf11972116df457ce2627628a81764d800dd55031ba19de513ee0d43bb771bc679cc0eda66dc8b4fade143bc0c languageName: node linkType: hard @@ -5414,6 +5464,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.8.2": + version: 8.8.2 + resolution: "acorn@npm:8.8.2" + bin: + acorn: bin/acorn + checksum: f790b99a1bf63ef160c967e23c46feea7787e531292bb827126334612c234ed489a0dc2c7ba33156416f0ffa8d25bf2b0fdb7f35c2ba60eb3e960572bece4001 + languageName: node + linkType: hard + "adler-32@npm:~1.3.0": version: 1.3.1 resolution: "adler-32@npm:1.3.1" @@ -5815,13 +5874,6 @@ __metadata: languageName: node linkType: hard -"array-union@npm:^3.0.1": - version: 3.0.1 - resolution: "array-union@npm:3.0.1" - checksum: 47b29f88258e8f37ffb93ddaa327d4308edd950b52943c172b73558afdd3fa74cfd68816ba5aa4b894242cf281fa3c6d0362ae057e4a18bddbaedbe46ebe7112 - languageName: node - linkType: hard - "array-uniq@npm:^1.0.1": version: 1.0.3 resolution: "array-uniq@npm:1.0.3" @@ -7375,6 +7427,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:^2.0.19": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d + languageName: node + linkType: hard + "colors@npm:~1.4.0": version: 1.4.0 resolution: "colors@npm:1.4.0" @@ -7727,19 +7786,19 @@ __metadata: languageName: node linkType: hard -"copy-webpack-plugin@npm:^10.0.0": - version: 10.2.4 - resolution: "copy-webpack-plugin@npm:10.2.4" +"copy-webpack-plugin@npm:^11.0.0": + version: 11.0.0 + resolution: "copy-webpack-plugin@npm:11.0.0" dependencies: - fast-glob: ^3.2.7 + fast-glob: ^3.2.11 glob-parent: ^6.0.1 - globby: ^12.0.2 + globby: ^13.1.1 normalize-path: ^3.0.0 schema-utils: ^4.0.0 serialize-javascript: ^6.0.0 peerDependencies: webpack: ^5.1.0 - checksum: 87f0f4530ab3e58ec06a7c3182028dfd8cc85b045a0d18c4464caafeae1ed1141c2aad6eae37e100a74a72b69dc48c93af358c07038b7a22f490a678c0ab142e + checksum: df4f8743f003a29ee7dd3d9b1789998a3a99051c92afb2ba2203d3dacfa696f4e757b275560fafb8f206e520a0aa78af34b990324a0e36c2326cefdeef3ca82e languageName: node linkType: hard @@ -7906,6 +7965,24 @@ __metadata: languageName: node linkType: hard +"css-loader@npm:^6.8.1": + version: 6.8.1 + resolution: "css-loader@npm:6.8.1" + dependencies: + icss-utils: ^5.1.0 + postcss: ^8.4.21 + postcss-modules-extract-imports: ^3.0.0 + postcss-modules-local-by-default: ^4.0.3 + postcss-modules-scope: ^3.0.0 + postcss-modules-values: ^4.0.0 + postcss-value-parser: ^4.2.0 + semver: ^7.3.8 + peerDependencies: + webpack: ^5.0.0 + checksum: 7c1784247bdbe76dc5c55fb1ac84f1d4177a74c47259942c9cfdb7a8e6baef11967a0bc85ac285f26bd26d5059decb848af8154a03fdb4f4894f41212f45eef3 + languageName: node + linkType: hard + "css-select@npm:^4.1.3": version: 4.3.0 resolution: "css-select@npm:4.3.0" @@ -8539,7 +8616,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.3": +"debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -9144,13 +9221,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.10.0": - version: 5.10.0 - resolution: "enhanced-resolve@npm:5.10.0" +"enhanced-resolve@npm:^5.14.1, enhanced-resolve@npm:^5.15.0": + version: 5.15.0 + resolution: "enhanced-resolve@npm:5.15.0" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: 0bb9830704db271610f900e8d79d70a740ea16f251263362b0c91af545576d09fe50103496606c1300a05e588372d6f9780a9bc2e30ce8ef9b827ec8f44687ff + checksum: fbd8cdc9263be71cc737aa8a7d6c57b43d6aa38f6cc75dde6fcd3598a130cc465f979d2f4d01bb3bf475acb43817749c79f8eef9be048683602ca91ab52e4f11 languageName: node linkType: hard @@ -9285,10 +9362,10 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^0.9.0": - version: 0.9.3 - resolution: "es-module-lexer@npm:0.9.3" - checksum: 84bbab23c396281db2c906c766af58b1ae2a1a2599844a504df10b9e8dc77ec800b3211fdaa133ff700f5703d791198807bba25d9667392d27a5e9feda344da8 +"es-module-lexer@npm:^1.2.1": + version: 1.3.0 + resolution: "es-module-lexer@npm:1.3.0" + checksum: 48fd9f504a9d2a894126f75c8b7ccc6273a289983e9b67255f165bfd9ae765d50100218251e94e702ca567826905ea2f7b3b4a0c4d74d3ce99cce3a2a606a238 languageName: node linkType: hard @@ -9298,117 +9375,24 @@ __metadata: dependencies: is-callable: ^1.1.4 is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed - languageName: node - linkType: hard - -"es6-promise@npm:^4.0.3": - version: 4.2.8 - resolution: "es6-promise@npm:4.2.8" - checksum: 95614a88873611cb9165a85d36afa7268af5c03a378b35ca7bda9508e1d4f1f6f19a788d4bc755b3fd37c8ebba40782018e02034564ff24c9d6fa37e959ad57d - languageName: node - linkType: hard - -"es6-promisify@npm:^5.0.0": - version: 5.0.0 - resolution: "es6-promisify@npm:5.0.0" - dependencies: - es6-promise: ^4.0.3 - checksum: fbed9d791598831413be84a5374eca8c24800ec71a16c1c528c43a98e2dadfb99331483d83ae6094ddb9b87e6f799a15d1553cebf756047e0865c753bc346b92 - languageName: node - linkType: hard - -"esbuild-loader@npm:^2.20.0": - version: 2.21.0 - resolution: "esbuild-loader@npm:2.21.0" - dependencies: - esbuild: ^0.16.17 - joycon: ^3.0.1 - json5: ^2.2.0 - loader-utils: ^2.0.0 - tapable: ^2.2.0 - webpack-sources: ^1.4.3 - peerDependencies: - webpack: ^4.40.0 || ^5.0.0 - checksum: a0456ed7794e2c220a6068e92d739bc19765bff352bf7e44442aa8127631cc517ecd02a3ee969e31fa6b6a91befeac928296488c95e3818a776cd3b11d46348c - languageName: node - linkType: hard - -"esbuild@npm:^0.16.17": - version: 0.16.17 - resolution: "esbuild@npm:0.16.17" - dependencies: - "@esbuild/android-arm": 0.16.17 - "@esbuild/android-arm64": 0.16.17 - "@esbuild/android-x64": 0.16.17 - "@esbuild/darwin-arm64": 0.16.17 - "@esbuild/darwin-x64": 0.16.17 - "@esbuild/freebsd-arm64": 0.16.17 - "@esbuild/freebsd-x64": 0.16.17 - "@esbuild/linux-arm": 0.16.17 - "@esbuild/linux-arm64": 0.16.17 - "@esbuild/linux-ia32": 0.16.17 - "@esbuild/linux-loong64": 0.16.17 - "@esbuild/linux-mips64el": 0.16.17 - "@esbuild/linux-ppc64": 0.16.17 - "@esbuild/linux-riscv64": 0.16.17 - "@esbuild/linux-s390x": 0.16.17 - "@esbuild/linux-x64": 0.16.17 - "@esbuild/netbsd-x64": 0.16.17 - "@esbuild/openbsd-x64": 0.16.17 - "@esbuild/sunos-x64": 0.16.17 - "@esbuild/win32-arm64": 0.16.17 - "@esbuild/win32-ia32": 0.16.17 - "@esbuild/win32-x64": 0.16.17 - dependenciesMeta: - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 4c2cc609ecfb426554bc3f75beb92d89eb2d0c515cfceebaa36c7599d7dcaab7056b70f6d6b51e72b45951ddf9021ee28e356cf205f8e42cc055d522312ea30c + is-symbol: ^1.0.2 + checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + languageName: node + linkType: hard + +"es6-promise@npm:^4.0.3": + version: 4.2.8 + resolution: "es6-promise@npm:4.2.8" + checksum: 95614a88873611cb9165a85d36afa7268af5c03a378b35ca7bda9508e1d4f1f6f19a788d4bc755b3fd37c8ebba40782018e02034564ff24c9d6fa37e959ad57d + languageName: node + linkType: hard + +"es6-promisify@npm:^5.0.0": + version: 5.0.0 + resolution: "es6-promisify@npm:5.0.0" + dependencies: + es6-promise: ^4.0.3 + checksum: fbed9d791598831413be84a5374eca8c24800ec71a16c1c528c43a98e2dadfb99331483d83ae6094ddb9b87e6f799a15d1553cebf756047e0865c753bc346b92 languageName: node linkType: hard @@ -9985,7 +9969,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9": +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9": version: 3.2.12 resolution: "fast-glob@npm:3.2.12" dependencies: @@ -10899,17 +10883,16 @@ __metadata: languageName: node linkType: hard -"globby@npm:^12.0.2": - version: 12.2.0 - resolution: "globby@npm:12.2.0" +"globby@npm:^13.1.1": + version: 13.1.4 + resolution: "globby@npm:13.1.4" dependencies: - array-union: ^3.0.1 dir-glob: ^3.0.1 - fast-glob: ^3.2.7 - ignore: ^5.1.9 + fast-glob: ^3.2.11 + ignore: ^5.2.0 merge2: ^1.4.1 slash: ^4.0.0 - checksum: 2539379a7fff3473d3e7c68b4540ba38f36970f43f760e36e301515d5cb98a0c5736554957d90390906bee632327beb2f9518d1acd6911f61e436db11b0da5b5 + checksum: e8bc13879972082d590cd1b0e27080d90d2e12fff7eeb2cee9329c29115ace14cc5b9f899e3d6beb136ba826307a727016658919a6f383e1511d698acee81741 languageName: node linkType: hard @@ -11589,7 +11572,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.1.4, ignore@npm:^5.1.8, ignore@npm:^5.1.9, ignore@npm:^5.2.0": +"ignore@npm:^5.1.4, ignore@npm:^5.1.8, ignore@npm:^5.2.0": version: 5.2.0 resolution: "ignore@npm:5.2.0" checksum: 6b1f926792d614f64c6c83da3a1f9c83f6196c2839aa41e1e32dd7b8d174cef2e329d75caabb62cb61ce9dc432f75e67d07d122a037312db7caa73166a1bdb77 @@ -13153,13 +13136,6 @@ __metadata: languageName: node linkType: hard -"joycon@npm:^3.0.1": - version: 3.1.1 - resolution: "joycon@npm:3.1.1" - checksum: 8003c9c3fc79c5c7602b1c7e9f7a2df2e9916f046b0dbad862aa589be78c15734d11beb9fe846f5e06138df22cb2ad29961b6a986ba81c4920ce2b15a7f11067 - languageName: node - linkType: hard - "jpeg-js@npm:^0.4.2": version: 0.4.4 resolution: "jpeg-js@npm:0.4.4" @@ -14624,6 +14600,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.6": + version: 3.3.6 + resolution: "nanoid@npm:3.3.6" + bin: + nanoid: bin/nanoid.cjs + checksum: 7d0eda657002738aa5206107bd0580aead6c95c460ef1bdd0b1a87a9c7ae6277ac2e9b945306aaa5b32c6dcb7feaf462d0f552e7f8b5718abfc6ead5c94a71b3 + languageName: node + linkType: hard + "nanomatch@npm:^1.2.9": version: 1.2.13 resolution: "nanomatch@npm:1.2.13" @@ -15270,19 +15255,19 @@ __metadata: linkType: hard "openmrs@npm:next": - version: 4.2.1-pre.619 - resolution: "openmrs@npm:4.2.1-pre.619" + version: 5.0.2-pre.818 + resolution: "openmrs@npm:5.0.2-pre.818" dependencies: - "@openmrs/esm-app-shell": 4.2.1-pre.619 - "@openmrs/webpack-config": 4.2.1-pre.619 + "@openmrs/esm-app-shell": 5.0.2-pre.818 + "@openmrs/webpack-config": 5.0.2-pre.818 "@pnpm/npm-conf": ^2.1.0 + "@swc-node/loader": ^1.3.5 autoprefixer: ^10.4.2 axios: ^0.21.1 browserslist-config-openmrs: ^1.0.1 - copy-webpack-plugin: ^10.0.0 + copy-webpack-plugin: ^11.0.0 cssnano: ^5.0.16 ejs: ^3.1.8 - esbuild-loader: ^2.20.0 glob: ^7.1.3 html-webpack-plugin: ^5.5.0 inquirer: ^7.3.3 @@ -15293,8 +15278,8 @@ __metadata: postcss-loader: ^6.2.1 rimraf: ^3.0.2 tar: ^6.0.5 - typescript: ~4.5.2 - webpack: ^5.74.0 + typescript: ^4.6.4 + webpack: ^5.88.0 webpack-cli: ^4.10.0 webpack-dev-server: ^4.10.1 webpack-pwa-manifest: ^4.3.0 @@ -15302,7 +15287,7 @@ __metadata: yargs: ^17.6.2 bin: openmrs: dist/cli.js - checksum: 0c20f6fd014dc62fa452a3b207fc7c79eeee398585fc40d9cf80e7421f7a86c9048a1623aacb087490a7fc0c194a512fe196905d2714aefa11adabf085ba9888 + checksum: 7559eece07650a507e646765b2d8c0331a29977525c367326fad9dcc1d33232a62bb2ba0a62e33ab3501eaca3d3ab0c5f8e2077ca27943ce3b52bd7c7609627e languageName: node linkType: hard @@ -15911,7 +15896,7 @@ __metadata: languageName: node linkType: hard -"pirates@npm:^4.0.4": +"pirates@npm:^4.0.4, pirates@npm:^4.0.5": version: 4.0.5 resolution: "pirates@npm:4.0.5" checksum: c9994e61b85260bec6c4fc0307016340d9b0c4f4b6550a957afaaff0c9b1ad58fbbea5cfcf083860a25cb27a375442e2b0edf52e2e1e40e69934e08dcc52d227 @@ -16152,6 +16137,19 @@ __metadata: languageName: node linkType: hard +"postcss-modules-local-by-default@npm:^4.0.3": + version: 4.0.3 + resolution: "postcss-modules-local-by-default@npm:4.0.3" + dependencies: + icss-utils: ^5.0.0 + postcss-selector-parser: ^6.0.2 + postcss-value-parser: ^4.1.0 + peerDependencies: + postcss: ^8.1.0 + checksum: 2f8083687f3d6067885f8863dd32dbbb4f779cfcc7e52c17abede9311d84faf6d3ed8760e7c54c6380281732ae1f78e5e56a28baf3c271b33f450a11c9e30485 + languageName: node + linkType: hard + "postcss-modules-scope@npm:^3.0.0": version: 3.0.0 resolution: "postcss-modules-scope@npm:3.0.0" @@ -16359,6 +16357,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.21": + version: 8.4.24 + resolution: "postcss@npm:8.4.24" + dependencies: + nanoid: ^3.3.6 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: 814e2126dacfea313588eda09cc99a9b4c26ec55c059188aa7a916d20d26d483483106dc5ff9e560731b59f45c5bb91b945dfadc670aed875cc90ddbbf4e787d + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -17719,7 +17728,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.0, schema-utils@npm:^3.1.1": +"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1": version: 3.1.1 resolution: "schema-utils@npm:3.1.1" dependencies: @@ -17730,6 +17739,28 @@ __metadata: languageName: node linkType: hard +"schema-utils@npm:^3.1.2": + version: 3.2.0 + resolution: "schema-utils@npm:3.2.0" + dependencies: + "@types/json-schema": ^7.0.8 + ajv: ^6.12.5 + ajv-keywords: ^3.5.2 + checksum: e8c590c525a58e135658dbe614c60e4821f98eb4c257c962ad61f72ad1e48b23148c7edd9295dbd5f9fc525ff8c6f448af0a932871fe9c9e1f523d1dbef917c8 + languageName: node + linkType: hard + +"schema-utils@npm:^3.2.0": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": ^7.0.8 + ajv: ^6.12.5 + ajv-keywords: ^3.5.2 + checksum: ea56971926fac2487f0757da939a871388891bc87c6a82220d125d587b388f1704788f3706e7f63a7b70e49fc2db974c41343528caea60444afd5ce0fe4b85c0 + languageName: node + linkType: hard + "schema-utils@npm:^4.0.0": version: 4.0.0 resolution: "schema-utils@npm:4.0.0" @@ -17796,6 +17827,17 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.3.8": + version: 7.5.3 + resolution: "semver@npm:7.5.3" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 9d58db16525e9f749ad0a696a1f27deabaa51f66e91d2fa2b0db3de3e9644e8677de3b7d7a03f4c15bc81521e0c3916d7369e0572dbde250d9bedf5194e2a8a7 + languageName: node + linkType: hard + "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -17835,6 +17877,15 @@ __metadata: languageName: node linkType: hard +"serialize-javascript@npm:^6.0.1": + version: 6.0.1 + resolution: "serialize-javascript@npm:6.0.1" + dependencies: + randombytes: ^2.1.0 + checksum: 3c4f4cb61d0893b988415bdb67243637333f3f574e9e9cc9a006a2ced0b390b0b3b44aef8d51c951272a9002ec50885eefdc0298891bc27eb2fe7510ea87dc4f + languageName: node + linkType: hard + "serve-index@npm:^1.9.1": version: 1.9.1 resolution: "serve-index@npm:1.9.1" @@ -17974,9 +18025,9 @@ __metadata: languageName: node linkType: hard -"single-spa-react@npm:^5.0.0": - version: 5.0.0 - resolution: "single-spa-react@npm:5.0.0" +"single-spa-react@npm:~5.0.0": + version: 5.0.2 + resolution: "single-spa-react@npm:5.0.2" dependencies: browserslist-config-single-spa: ^1.0.1 peerDependencies: @@ -17988,7 +18039,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 6b3d0c69720eaef494964f36a5c41fc601d80fcb1fead87bd73c9a7c2db53155ac70111626eec7d75260452f2a867c9139c88269900a2e5cb718264db4863ec7 + checksum: 3c2503384ab27aed7e4f9f5c6a40cf5aae120cae1749244aba12647159354c143ac03669bfc41a43533077c874866b7042dad9463abe253da198da3f200d8fe1 languageName: node linkType: hard @@ -18197,7 +18248,7 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:~0.5.20": +"source-map-support@npm:^0.5.21, source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -18828,16 +18879,6 @@ __metadata: languageName: node linkType: hard -"swc-loader@npm:^0.1.15": - version: 0.1.16 - resolution: "swc-loader@npm:0.1.16" - peerDependencies: - "@swc/core": ^1.2.147 - webpack: ">=2" - checksum: 168ddd62105a74884f8bc1dbecc913d8c542a55baeb484c22590dfe5f89f081dbdd4012ad8d04fb3b0c230729babee25b82a71208e573874b4156a074ab7d3d2 - languageName: node - linkType: hard - "swr@npm:^2.0.1": version: 2.0.1 resolution: "swr@npm:2.0.1" @@ -18870,15 +18911,6 @@ __metadata: languageName: node linkType: hard -"systemjs-webpack-interop@npm:^2.3.7": - version: 2.3.7 - resolution: "systemjs-webpack-interop@npm:2.3.7" - peerDependencies: - webpack: "*" - checksum: 6a294aa45281b208a43a2e8e358a58e1f37605c322c40180d5cc3bd7a283d4b5c310110274f8b2e96e6d8bf081a101bda6301f962669a1b0722bbd9043ce6933 - languageName: node - linkType: hard - "systemjs@npm:^6.8.3": version: 6.13.0 resolution: "systemjs@npm:6.13.0" @@ -18992,15 +19024,15 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.1.3": - version: 5.3.6 - resolution: "terser-webpack-plugin@npm:5.3.6" +"terser-webpack-plugin@npm:^5.3.7": + version: 5.3.9 + resolution: "terser-webpack-plugin@npm:5.3.9" dependencies: - "@jridgewell/trace-mapping": ^0.3.14 + "@jridgewell/trace-mapping": ^0.3.17 jest-worker: ^27.4.5 schema-utils: ^3.1.1 - serialize-javascript: ^6.0.0 - terser: ^5.14.1 + serialize-javascript: ^6.0.1 + terser: ^5.16.8 peerDependencies: webpack: ^5.1.0 peerDependenciesMeta: @@ -19010,11 +19042,11 @@ __metadata: optional: true uglify-js: optional: true - checksum: 8f3448d7fdb0434ce6a0c09d95c462bfd2f4a5a430233d854163337f734a7f5c07c74513d16081e06d4ca33d366d5b1a36f5444219bc41a7403afd6162107bad + checksum: 41705713d6f9cb83287936b21e27c658891c78c4392159f5148b5623f0e8c48559869779619b058382a4c9758e7820ea034695e57dc7c474b4962b79f553bc5f languageName: node linkType: hard -"terser@npm:^5.0.0, terser@npm:^5.10.0, terser@npm:^5.14.1": +"terser@npm:^5.0.0, terser@npm:^5.10.0": version: 5.15.1 resolution: "terser@npm:5.15.1" dependencies: @@ -19028,6 +19060,20 @@ __metadata: languageName: node linkType: hard +"terser@npm:^5.16.8": + version: 5.18.0 + resolution: "terser@npm:5.18.0" + dependencies: + "@jridgewell/source-map": ^0.3.3 + acorn: ^8.8.2 + commander: ^2.20.0 + source-map-support: ~0.5.20 + bin: + terser: bin/terser + checksum: d01eb9805a978b3338b68fd2d9e35c1cd4cad78ea093dc92c7b3c38965232f0af0f95e0c6d90920ecf600a74135c608aebae26302c036c01393a590e1918bb90 + languageName: node + linkType: hard + "test-exclude@npm:^6.0.0": version: 6.0.0 resolution: "test-exclude@npm:6.0.0" @@ -19346,6 +19392,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.5.0": + version: 2.5.2 + resolution: "tslib@npm:2.5.2" + checksum: 4d3c1e238b94127ed0e88aa0380db3c2ddae581dc0f4bae5a982345e9f50ee5eda90835b8bfba99b02df10a5734470be197158c36f9129ac49fdc14a6a9da222 + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -19552,43 +19605,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.0.3, typescript@npm:^4.2.4": - version: 4.8.4 - resolution: "typescript@npm:4.8.4" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 3e4f061658e0c8f36c820802fa809e0fd812b85687a9a2f5430bc3d0368e37d1c9605c3ce9b39df9a05af2ece67b1d844f9f6ea8ff42819f13bcb80f85629af0 - languageName: node - linkType: hard - -"typescript@npm:~4.5.2": - version: 4.5.5 - resolution: "typescript@npm:4.5.5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 506f4c919dc8aeaafa92068c997f1d213b9df4d9756d0fae1a1e7ab66b585ab3498050e236113a1c9e57ee08c21ec6814ca7a7f61378c058d79af50a4b1f5a5e - languageName: node - linkType: hard - -"typescript@patch:typescript@^4.0.3#~builtin, typescript@patch:typescript@^4.2.4#~builtin": - version: 4.8.4 - resolution: "typescript@patch:typescript@npm%3A4.8.4#~builtin::version=4.8.4&hash=1a91c8" +"typescript@npm:^4.0.3, typescript@npm:^4.2.4, typescript@npm:^4.6.4": + version: 4.9.5 + resolution: "typescript@npm:4.9.5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: c981e82b77a5acdcc4e69af9c56cdecf5b934a87a08e7b52120596701e389a878b8e3f860e73ffb287bf649cc47a8c741262ce058148f71de4cdd88bb9c75153 + checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db languageName: node linkType: hard -"typescript@patch:typescript@~4.5.2#~builtin": - version: 4.5.5 - resolution: "typescript@patch:typescript@npm%3A4.5.5#~builtin::version=4.5.5&hash=bcec9a" +"typescript@patch:typescript@^4.0.3#~builtin, typescript@patch:typescript@^4.2.4#~builtin, typescript@patch:typescript@^4.6.4#~builtin": + version: 4.9.5 + resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=289587" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 858c61fa63f7274ca4aaaffeced854d550bf416cff6e558c4884041b3311fb662f476f167cf5c9f8680c607239797e26a2ee0bcc6467fbc05bfcb218e1c6c671 + checksum: 1f8f3b6aaea19f0f67cba79057674ba580438a7db55057eb89cc06950483c5d632115c14077f6663ea76fd09fce3c190e6414bb98582ec80aa5a4eaf345d5b68 languageName: node linkType: hard @@ -19760,18 +19793,6 @@ __metadata: languageName: node linkType: hard -"unistore@npm:^3.5.2": - version: 3.5.2 - resolution: "unistore@npm:3.5.2" - peerDependenciesMeta: - preact: - optional: true - react: - optional: true - checksum: 0f7b3301190c7ebe2e5e0b3529f140b28e1de84518285169ee7b54b3e86defee64e9f3a652b59f07aefe5aa1b7d8282474ba342ff491e3ff9023aeb085f50339 - languageName: node - linkType: hard - "universal-user-agent@npm:^4.0.0": version: 4.0.1 resolution: "universal-user-agent@npm:4.0.1" @@ -19885,7 +19906,7 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.2.0": +"use-sync-external-store@npm:1.2.0, use-sync-external-store@npm:^1.2.0": version: 1.2.0 resolution: "use-sync-external-store@npm:1.2.0" peerDependencies: @@ -19958,6 +19979,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^9.0.0": + version: 9.0.0 + resolution: "uuid@npm:9.0.0" + bin: + uuid: dist/bin/uuid + checksum: 8dd2c83c43ddc7e1c71e36b60aea40030a6505139af6bee0f382ebcd1a56f6cd3028f7f06ffb07f8cf6ced320b76aea275284b224b002b289f89fe89c389b028 + languageName: node + linkType: hard + "v8-compile-cache@npm:^2.0.3": version: 2.3.0 resolution: "v8-compile-cache@npm:2.3.0" @@ -20368,20 +20398,57 @@ __metadata: linkType: hard "webpack@npm:^5.74.0": - version: 5.74.0 - resolution: "webpack@npm:5.74.0" + version: 5.86.0 + resolution: "webpack@npm:5.86.0" + dependencies: + "@types/eslint-scope": ^3.7.3 + "@types/estree": ^1.0.0 + "@webassemblyjs/ast": ^1.11.5 + "@webassemblyjs/wasm-edit": ^1.11.5 + "@webassemblyjs/wasm-parser": ^1.11.5 + acorn: ^8.7.1 + acorn-import-assertions: ^1.9.0 + browserslist: ^4.14.5 + chrome-trace-event: ^1.0.2 + enhanced-resolve: ^5.14.1 + es-module-lexer: ^1.2.1 + eslint-scope: 5.1.1 + events: ^3.2.0 + glob-to-regexp: ^0.4.1 + graceful-fs: ^4.2.9 + json-parse-even-better-errors: ^2.3.1 + loader-runner: ^4.2.0 + mime-types: ^2.1.27 + neo-async: ^2.6.2 + schema-utils: ^3.1.2 + tapable: ^2.1.1 + terser-webpack-plugin: ^5.3.7 + watchpack: ^2.4.0 + webpack-sources: ^3.2.3 + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 682b1aa8328bb9d52ae66a1d0a1078af88f9e3b3b3a9c9e1ce203e669581a8e61d522420ef253130eacd510d24d7275b840c1311d50bd048d6fd7c1af186ce55 + languageName: node + linkType: hard + +"webpack@npm:^5.88.0": + version: 5.88.0 + resolution: "webpack@npm:5.88.0" dependencies: "@types/eslint-scope": ^3.7.3 - "@types/estree": ^0.0.51 - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/wasm-edit": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 + "@types/estree": ^1.0.0 + "@webassemblyjs/ast": ^1.11.5 + "@webassemblyjs/wasm-edit": ^1.11.5 + "@webassemblyjs/wasm-parser": ^1.11.5 acorn: ^8.7.1 - acorn-import-assertions: ^1.7.6 + acorn-import-assertions: ^1.9.0 browserslist: ^4.14.5 chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.10.0 - es-module-lexer: ^0.9.0 + enhanced-resolve: ^5.15.0 + es-module-lexer: ^1.2.1 eslint-scope: 5.1.1 events: ^3.2.0 glob-to-regexp: ^0.4.1 @@ -20390,9 +20457,9 @@ __metadata: loader-runner: ^4.2.0 mime-types: ^2.1.27 neo-async: ^2.6.2 - schema-utils: ^3.1.0 + schema-utils: ^3.2.0 tapable: ^2.1.1 - terser-webpack-plugin: ^5.1.3 + terser-webpack-plugin: ^5.3.7 watchpack: ^2.4.0 webpack-sources: ^3.2.3 peerDependenciesMeta: @@ -20400,7 +20467,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 320c41369a75051b19e18c63f408b3dcc481852e992f83d311771c5ec0f05f2946385e8ebef62030cf3587f0a3d2f12779ffdb191569a966847289ba7313f946 + checksum: 9fd1568b34ec2e99ba97c8509a15ab2576ec80c396e7015551ec814b24cfc11de173acba3e114dafe95f1a6d460781b09d6201e6a1fb15110e1d01a09f61a283 languageName: node linkType: hard @@ -20635,6 +20702,16 @@ __metadata: languageName: node linkType: hard +"workbox-background-sync@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-background-sync@npm:6.6.0" + dependencies: + idb: ^7.0.1 + workbox-core: 6.6.0 + checksum: ac2990110643aef62ca0be54e962296de7b09593b0262bd09fe4893978a42fa1f256c6d989ed472a31ae500b2255b80c6678530a6024eafb0b2f3a93a3c94a5f + languageName: node + linkType: hard + "workbox-broadcast-update@npm:6.5.4": version: 6.5.4 resolution: "workbox-broadcast-update@npm:6.5.4" @@ -20644,6 +20721,15 @@ __metadata: languageName: node linkType: hard +"workbox-broadcast-update@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-broadcast-update@npm:6.6.0" + dependencies: + workbox-core: 6.6.0 + checksum: 46a74b3b703244eb363e1731a2d6fe1fb2cd9b82d454733dfc6941fd35b76a852685f56db92408383ac50d564c2fd4282f0c6c4db60ba9beb5f311ea8f944dc7 + languageName: node + linkType: hard + "workbox-build@npm:6.5.4": version: 6.5.4 resolution: "workbox-build@npm:6.5.4" @@ -20689,6 +20775,51 @@ __metadata: languageName: node linkType: hard +"workbox-build@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-build@npm:6.6.0" + dependencies: + "@apideck/better-ajv-errors": ^0.3.1 + "@babel/core": ^7.11.1 + "@babel/preset-env": ^7.11.0 + "@babel/runtime": ^7.11.2 + "@rollup/plugin-babel": ^5.2.0 + "@rollup/plugin-node-resolve": ^11.2.1 + "@rollup/plugin-replace": ^2.4.1 + "@surma/rollup-plugin-off-main-thread": ^2.2.3 + ajv: ^8.6.0 + common-tags: ^1.8.0 + fast-json-stable-stringify: ^2.1.0 + fs-extra: ^9.0.1 + glob: ^7.1.6 + lodash: ^4.17.20 + pretty-bytes: ^5.3.0 + rollup: ^2.43.1 + rollup-plugin-terser: ^7.0.0 + source-map: ^0.8.0-beta.0 + stringify-object: ^3.3.0 + strip-comments: ^2.0.1 + tempy: ^0.6.0 + upath: ^1.2.0 + workbox-background-sync: 6.6.0 + workbox-broadcast-update: 6.6.0 + workbox-cacheable-response: 6.6.0 + workbox-core: 6.6.0 + workbox-expiration: 6.6.0 + workbox-google-analytics: 6.6.0 + workbox-navigation-preload: 6.6.0 + workbox-precaching: 6.6.0 + workbox-range-requests: 6.6.0 + workbox-recipes: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + workbox-streams: 6.6.0 + workbox-sw: 6.6.0 + workbox-window: 6.6.0 + checksum: cd1a6c413659c2fd66f4438012f65b211cc748bb594c79bf0d9a60de0cefff3f8a4a23ab06f32c62064c37397ffffc1b77d3328658b7556ea7ff88e57f6ee4fd + languageName: node + linkType: hard + "workbox-cacheable-response@npm:6.5.4": version: 6.5.4 resolution: "workbox-cacheable-response@npm:6.5.4" @@ -20698,6 +20829,15 @@ __metadata: languageName: node linkType: hard +"workbox-cacheable-response@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-cacheable-response@npm:6.6.0" + dependencies: + workbox-core: 6.6.0 + checksum: 9e4e00c53679fd2020874cbdf54bb17560fd12353120ea08ca6213e5a11bf08139072616d79f5f8ab80d09f00efde94b003fe9bf5b6e23815be30d7aca760835 + languageName: node + linkType: hard + "workbox-core@npm:6.5.4, workbox-core@npm:^6.1.5": version: 6.5.4 resolution: "workbox-core@npm:6.5.4" @@ -20705,6 +20845,13 @@ __metadata: languageName: node linkType: hard +"workbox-core@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-core@npm:6.6.0" + checksum: 7d773a866b73a733780c52b895f9cf7bec926c9187395c307174deefba9a0a2fcd1edce0d1ca12b8a6c95ca9cf7755ccc1885b03bc82ebcfc4843e015bd84d7b + languageName: node + linkType: hard + "workbox-expiration@npm:6.5.4": version: 6.5.4 resolution: "workbox-expiration@npm:6.5.4" @@ -20715,6 +20862,16 @@ __metadata: languageName: node linkType: hard +"workbox-expiration@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-expiration@npm:6.6.0" + dependencies: + idb: ^7.0.1 + workbox-core: 6.6.0 + checksum: b100b9c512754bc3e1a9c7c7d20d215d72c601a7b956333ca7753704a771a9f00e1732e9b774da4549bae390dd3cd138c6392f6a25fd67f7dcd84f89b0df7e9c + languageName: node + linkType: hard + "workbox-google-analytics@npm:6.5.4": version: 6.5.4 resolution: "workbox-google-analytics@npm:6.5.4" @@ -20727,6 +20884,18 @@ __metadata: languageName: node linkType: hard +"workbox-google-analytics@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-google-analytics@npm:6.6.0" + dependencies: + workbox-background-sync: 6.6.0 + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + checksum: 7b287da7517ae416aae8ea1494830bb517a29ab9786b2a8b8bf98971377b83715070e784399065ab101d4bba381ab0abbb8bd0962b3010bc01f54fdafb0b6702 + languageName: node + linkType: hard + "workbox-navigation-preload@npm:6.5.4": version: 6.5.4 resolution: "workbox-navigation-preload@npm:6.5.4" @@ -20736,6 +20905,15 @@ __metadata: languageName: node linkType: hard +"workbox-navigation-preload@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-navigation-preload@npm:6.6.0" + dependencies: + workbox-core: 6.6.0 + checksum: d254465648e45ec6b6d7c3471354336501901d3872622ea9ba1aa1f935d4d52941d0f92fa6c06e7363e10dbac4874d5d4bff7d99cbe094925046f562a37e88cc + languageName: node + linkType: hard + "workbox-precaching@npm:6.5.4": version: 6.5.4 resolution: "workbox-precaching@npm:6.5.4" @@ -20747,6 +20925,17 @@ __metadata: languageName: node linkType: hard +"workbox-precaching@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-precaching@npm:6.6.0" + dependencies: + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + checksum: 62e5ee2e40568a56d4131bba461623579f56b9bd273aa7d2805e43151057f413c2ef32fb3d007aff0a5ac3ad84d5feae87408284249a487a5d51c3775c46c816 + languageName: node + linkType: hard + "workbox-range-requests@npm:6.5.4": version: 6.5.4 resolution: "workbox-range-requests@npm:6.5.4" @@ -20756,6 +20945,15 @@ __metadata: languageName: node linkType: hard +"workbox-range-requests@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-range-requests@npm:6.6.0" + dependencies: + workbox-core: 6.6.0 + checksum: a55d1a364b2155548695dc8f6f85baade196d7d1bec980bcdbda80236803b14167995a81b944cffe932a94c4d556466773121afe3661a6f0a13403cbe96d8d9f + languageName: node + linkType: hard + "workbox-recipes@npm:6.5.4": version: 6.5.4 resolution: "workbox-recipes@npm:6.5.4" @@ -20770,6 +20968,20 @@ __metadata: languageName: node linkType: hard +"workbox-recipes@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-recipes@npm:6.6.0" + dependencies: + workbox-cacheable-response: 6.6.0 + workbox-core: 6.6.0 + workbox-expiration: 6.6.0 + workbox-precaching: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + checksum: f2ecf38502260703e4b0dcef67e3ac26d615f2c90f6d863ca7308db52454f67934ba842fd577ee807d9f510f1a277fd66af7caf57d39e50a181d05dbb3e550a7 + languageName: node + linkType: hard + "workbox-routing@npm:6.5.4, workbox-routing@npm:^6.1.5": version: 6.5.4 resolution: "workbox-routing@npm:6.5.4" @@ -20779,6 +20991,15 @@ __metadata: languageName: node linkType: hard +"workbox-routing@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-routing@npm:6.6.0" + dependencies: + workbox-core: 6.6.0 + checksum: 7a70b836196eb67332d33a94c0b57859781fe869e81a9c95452d3f4f368d3199f8c3da632dbc10425fde902a1930cf8cfd83f6434ad2b586904ce68cd9f35c6d + languageName: node + linkType: hard + "workbox-strategies@npm:6.5.4, workbox-strategies@npm:^6.1.5": version: 6.5.4 resolution: "workbox-strategies@npm:6.5.4" @@ -20788,6 +21009,15 @@ __metadata: languageName: node linkType: hard +"workbox-strategies@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-strategies@npm:6.6.0" + dependencies: + workbox-core: 6.6.0 + checksum: 236232a77fb4a4847d1e9ae6c7c9bd9c6b9449209baab9d8d90f78240326a9c0f69551b408ebf9e76610d86da15563bf27439b7e885a7bac01dfd08047c0dd7b + languageName: node + linkType: hard + "workbox-streams@npm:6.5.4": version: 6.5.4 resolution: "workbox-streams@npm:6.5.4" @@ -20798,6 +21028,16 @@ __metadata: languageName: node linkType: hard +"workbox-streams@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-streams@npm:6.6.0" + dependencies: + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + checksum: 64a295e48e44e3fa4743b5baec646fc9117428e7592033475e38c461e45c294910712f322c32417d354b22999902ef8035119e070e61e159e531d878d991fc33 + languageName: node + linkType: hard + "workbox-sw@npm:6.5.4": version: 6.5.4 resolution: "workbox-sw@npm:6.5.4" @@ -20805,6 +21045,28 @@ __metadata: languageName: node linkType: hard +"workbox-sw@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-sw@npm:6.6.0" + checksum: bb5f8695de02f89c7955465dcbd568299915565008dc8a068c5d19c1347f75d417640b9f61590e16b169b703e77d02f8b1e10c4b241f74f43cfe76175bfa5fed + languageName: node + linkType: hard + +"workbox-webpack-plugin@npm:^6.1.5": + version: 6.6.0 + resolution: "workbox-webpack-plugin@npm:6.6.0" + dependencies: + fast-json-stable-stringify: ^2.1.0 + pretty-bytes: ^5.4.1 + upath: ^1.2.0 + webpack-sources: ^1.4.3 + workbox-build: 6.6.0 + peerDependencies: + webpack: ^4.4.0 || ^5.9.0 + checksum: b8e04a342f2d45086f28ae56e4806d74dd153c3b750855533a55954f4e85752113e76a6d79a32206eb697a342725897834c9e7976894374d8698cd950477d37a + languageName: node + linkType: hard + "workbox-webpack-plugin@npm:^6.4.1": version: 6.5.4 resolution: "workbox-webpack-plugin@npm:6.5.4" @@ -20830,6 +21092,16 @@ __metadata: languageName: node linkType: hard +"workbox-window@npm:6.6.0": + version: 6.6.0 + resolution: "workbox-window@npm:6.6.0" + dependencies: + "@types/trusted-types": ^2.0.2 + workbox-core: 6.6.0 + checksum: bb1dd031c1525317ceffbdc3e4f502a70dce461fd6355146e1050c1090f3c640bf65edf42a5d2a3b91b4d0c313df32c1405d88bf701d44c0e3ebc492cd77fe14 + languageName: node + linkType: hard + "wrap-ansi@npm:^5.1.0": version: 5.1.0 resolution: "wrap-ansi@npm:5.1.0" @@ -21194,3 +21466,20 @@ __metadata: checksum: 43a16786b47cc910fed4891cebdd89df6d6e31702e9462e8f969c73eac88551ce750732608012201ea6b93802c8847cb0aa27b5d57370640f4ecf30f9f97d4b0 languageName: node linkType: hard + +"zustand@npm:^4.3.6": + version: 4.3.8 + resolution: "zustand@npm:4.3.8" + dependencies: + use-sync-external-store: 1.2.0 + peerDependencies: + immer: ">=9.0" + react: ">=16.8" + peerDependenciesMeta: + immer: + optional: true + react: + optional: true + checksum: 24db6bf063ce1fc8b2ee238f13211a88f43236541a716e5f6f706f613c671a45332465f9ed06d694f8c353da3d24c53ea668e5712a86aceda9ad74f6c433e8c0 + languageName: node + linkType: hard From 3962249756a6e02bfe08951d9ffc116b2738bc42 Mon Sep 17 00:00:00 2001 From: Ian <52504170+ibacher@users.noreply.github.com> Date: Fri, 23 Jun 2023 15:58:09 -0400 Subject: [PATCH 09/17] (fix) Exports should reference the result of getSync / getAsync (#736) --- packages/esm-active-visits-app/src/index.ts | 21 ++--------- packages/esm-appointments-app/src/index.ts | 12 ++++--- packages/esm-patient-list-app/src/index.ts | 39 ++++++++++----------- 3 files changed, 28 insertions(+), 44 deletions(-) diff --git a/packages/esm-active-visits-app/src/index.ts b/packages/esm-active-visits-app/src/index.ts index 77836daa4..fe63dcd45 100644 --- a/packages/esm-active-visits-app/src/index.ts +++ b/packages/esm-active-visits-app/src/index.ts @@ -12,25 +12,8 @@ export const importTranslation = require.context('../translations', false, /.jso export function startupApp() { defineConfigSchema(moduleName, configSchema); - - return { - extensions: [ - { - name: 'active-visits-widget', - slot: 'homepage-widgets-slot', - order: 0, - load: getAsyncLifecycle(() => import('./active-visits-widget/active-visits.component'), options), - }, - { - id: 'visit-summary-widget', - slot: 'visit-summary-slot', - load: getAsyncLifecycle(() => import('./visits-summary/visit-detail.component'), options), - }, - ], - }; } -export const activeVisits = () => - getAsyncLifecycle(() => import('./active-visits-widget/active-visits.component'), options); +export const activeVisits = getAsyncLifecycle(() => import('./active-visits-widget/active-visits.component'), options); -export const visitDetail = () => getAsyncLifecycle(() => import('./visits-summary/visit-detail.component'), options); +export const visitDetail = getAsyncLifecycle(() => import('./visits-summary/visit-detail.component'), options); diff --git a/packages/esm-appointments-app/src/index.ts b/packages/esm-appointments-app/src/index.ts index 4d22917b4..a16852827 100644 --- a/packages/esm-appointments-app/src/index.ts +++ b/packages/esm-appointments-app/src/index.ts @@ -31,14 +31,16 @@ export function startupApp() { ]); } -export const appointmentsDashboardLink = () => getSyncLifecycle(createDashboardLink(dashboardMeta), options); +export const appointmentsDashboardLink = getSyncLifecycle(createDashboardLink(dashboardMeta), options); export const appointmentsCalendarDashboardLink = () => getSyncLifecycle(createDashboardLink(appointmentCalendarDashboardMeta), options); -export const appointmentsDashboard = () => getAsyncLifecycle(() => import('./appointments.component'), options); +export const appointmentsDashboard = getAsyncLifecycle(() => import('./appointments.component'), options); -export const checkInModal = () => - getAsyncLifecycle(() => import('./home-appointments/check-in-modal/check-in-modal.component'), options); +export const checkInModal = getAsyncLifecycle( + () => import('./home-appointments/check-in-modal/check-in-modal.component'), + options, +); -export const homeAppointments = () => getAsyncLifecycle(() => import('./home-appointments'), options); +export const homeAppointments = getAsyncLifecycle(() => import('./home-appointments'), options); diff --git a/packages/esm-patient-list-app/src/index.ts b/packages/esm-patient-list-app/src/index.ts index a63aeec01..e64aad742 100644 --- a/packages/esm-patient-list-app/src/index.ts +++ b/packages/esm-patient-list-app/src/index.ts @@ -38,30 +38,29 @@ export function startupApp() { ]); } -export const root = () => getAsyncLifecycle(() => import('./root.component'), options); +export const root = getAsyncLifecycle(() => import('./root.component'), options); -export const addPatientToListModal = () => - getAsyncLifecycle(() => import('./add-patient/add-patient.component'), { - featureName: 'patient-actions-modal', - moduleName, - }); +export const addPatientToListModal = getAsyncLifecycle(() => import('./add-patient/add-patient.component'), { + featureName: 'patient-actions-modal', + moduleName, +}); -export const addPatientToPatientListMenuItem = () => - getAsyncLifecycle(() => import('./add-patient-to-patient-list-menu-item.component'), { +export const addPatientToPatientListMenuItem = getAsyncLifecycle( + () => import('./add-patient-to-patient-list-menu-item.component'), + { featureName: 'patient-actions-slot', moduleName, - }); + }, +); -export const patientListActionButton = () => - getAsyncLifecycle(() => import('./patient-list-action-button.component'), { - featureName: 'patient-list-action-menu-item', - moduleName, - }); +export const patientListActionButton = getAsyncLifecycle(() => import('./patient-list-action-button.component'), { + featureName: 'patient-list-action-menu-item', + moduleName, +}); -export const patientListDashboardLink = () => getSyncLifecycle(createDashboardLink(dashboardMeta), options); +export const patientListDashboardLink = getSyncLifecycle(createDashboardLink(dashboardMeta), options); -export const patientTable = () => - getAsyncLifecycle(() => import('./patient-table/patient-table.component'), { - featureName: 'patient-table', - moduleName, - }); +export const patientTable = getAsyncLifecycle(() => import('./patient-table/patient-table.component'), { + featureName: 'patient-table', + moduleName, +}); From f933f51635dfc629586d05362a8b1838c1c47bbb Mon Sep 17 00:00:00 2001 From: Dennis Kigen Date: Sat, 24 Jun 2023 01:01:19 +0300 Subject: [PATCH 10/17] (fix) Fix wrong `component` name in outpatients app routes (#738) --- packages/esm-outpatient-app/src/routes.json | 151 +++++++++++--------- 1 file changed, 84 insertions(+), 67 deletions(-) diff --git a/packages/esm-outpatient-app/src/routes.json b/packages/esm-outpatient-app/src/routes.json index c39cb473c..a31fc46c6 100644 --- a/packages/esm-outpatient-app/src/routes.json +++ b/packages/esm-outpatient-app/src/routes.json @@ -3,72 +3,89 @@ "backendDependencies": { "webservices.rest": "^2.2.0" }, - "pages": [{ - "component": "appointmentsList", - "route": "appointments-list", - "online": true, - "offline": true - }, { - "component": "queueList", - "route": "queue-list", - "online": true, - "offline": true - }], - "extensions": [{ - "name": "outpatient-side-nav-ext", - "component": "outpatientSideNav", - "slot": "outpatient-sidebar-slot", - "online": true, - "offline": true - }, { - "name": "service-queues-dashboard-link", - "component": "homepage-dashboard-slot", - "slot": "homepage-dashboard-slot", - "meta": { - "name": "service-queues", + "pages": [ + { + "component": "appointmentsList", + "route": "appointments-list", + "online": true, + "offline": true + }, + { + "component": "queueList", + "route": "queue-list", + "online": true, + "offline": true + } + ], + "extensions": [ + { + "name": "outpatient-side-nav-ext", + "component": "outpatientSideNav", + "slot": "outpatient-sidebar-slot", + "online": true, + "offline": true + }, + { + "name": "service-queues-dashboard-link", + "component": "serviceQueuesDashboardLink", + "slot": "homepage-dashboard-slot", + "meta": { + "name": "service-queues", + "slot": "service-queues-dashboard-slot", + "title": "Service queues" + }, + "online": true, + "offline": true + }, + { + "name": "home-dashboard", + "component": "homeDashboard", "slot": "service-queues-dashboard-slot", - "title": "Service queues" - }, - "online": true, - "offline": true - }, { - "name": "home-dashboard", - "component": "homeDashboard", - "slot": "service-queues-dashboard-slot", - "online": true, - "offline": true - }, { - "name": "edit-queue-entry-status-modal", - "component": "editQueueEntryStatusModal" - }, { - "name": "patient-info-banner-slot", - "component": "patientInfoBannerSlot" - }, { - "name": "add-patient-to-queue", - "component": "addPatientToQueue", - "slot": "add-patient-to-queue-slot" - }, { - "name": "remove-queue-entry", - "component": "removeQueueEntry" - }, { - "name": "clear-all-queue-entries", - "component": "clearAllQueueEntries" - }, { - "name": "add-visit-to-queue-modal", - "component": "addVisitToQueueModal" - }, { - "name": "transition-queue-entry-status-modal", - "component": "transitionQueueEntryStatusModal" - }, { - "name": "previous-visit-summary-widget", - "component": "previousVisitSummaryWidget", - "slot": "previous-visit-summary-slot" - }, { - "name": "add-provider-to-room-modal", - "component": "addProviderToRoomModal" - }, { - "name": "add-queue-entry-widget", - "component": "addQueueEntryWidget", - "slot": "add-queue-entry-slot" - }] + "online": true, + "offline": true + }, + { + "name": "edit-queue-entry-status-modal", + "component": "editQueueEntryStatusModal" + }, + { + "name": "patient-info-banner-slot", + "component": "patientInfoBannerSlot" + }, + { + "name": "add-patient-to-queue", + "component": "addPatientToQueue", + "slot": "add-patient-to-queue-slot" + }, + { + "name": "remove-queue-entry", + "component": "removeQueueEntry" + }, + { + "name": "clear-all-queue-entries", + "component": "clearAllQueueEntries" + }, + { + "name": "add-visit-to-queue-modal", + "component": "addVisitToQueueModal" + }, + { + "name": "transition-queue-entry-status-modal", + "component": "transitionQueueEntryStatusModal" + }, + { + "name": "previous-visit-summary-widget", + "component": "previousVisitSummaryWidget", + "slot": "previous-visit-summary-slot" + }, + { + "name": "add-provider-to-room-modal", + "component": "addProviderToRoomModal" + }, + { + "name": "add-queue-entry-widget", + "component": "addQueueEntryWidget", + "slot": "add-queue-entry-slot" + } + ] } \ No newline at end of file From 4dc471d3d883225a3cdb9f02ff2ae6bc07dc5022 Mon Sep 17 00:00:00 2001 From: Dennis Kigen Date: Sat, 24 Jun 2023 01:02:25 +0300 Subject: [PATCH 11/17] (chore) Switch back to `swc-loader` (#737) --- package.json | 2 +- yarn.lock | 254 ++++++++++++++++++++------------------------------- 2 files changed, 102 insertions(+), 154 deletions(-) diff --git a/package.json b/package.json index 744f1a893..86a806365 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "@carbon/react": "^1.12.0", "@openmrs/esm-framework": "next", "@playwright/test": "1.34.0", - "@swc-node/loader": "^1.3.5", "@swc/core": "^1.2.165", "@swc/jest": "^0.2.20", "@testing-library/dom": "^8.13.0", @@ -72,6 +71,7 @@ "react-router-dom": "^6.3.0", "sass": "^1.29.0", "sass-loader": "^10.1.0", + "swc-loader": "^0.2.3", "turbo": "^1.6.3", "typedoc": "^0.22.15", "typescript": "^4.0.3", diff --git a/yarn.lock b/yarn.lock index 9f9caca75..c4173e85a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3551,9 +3551,9 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-api@npm:^5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-api@npm:5.0.2-pre.818" +"@openmrs/esm-api@npm:^5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-api@npm:5.0.3-pre.827" dependencies: "@types/fhir": 0.0.31 lodash-es: ^4.17.21 @@ -3561,18 +3561,17 @@ __metadata: "@openmrs/esm-config": 4.x "@openmrs/esm-error-handling": 4.x "@openmrs/esm-offline": 4.x - checksum: 61f069bca8c6dce5043d1efef86f005cc7c512e3403fc6f4374380cc26ce09e456fc7442f5617d084d3598b67396061c23a32da5f7c9d1bebeb1263fcfc6fc2f + checksum: 3a42e4f9734f28770f636dace4dff475c15ee6ee6b4819bb5fde37c6bc7a47fe7da9bb4c0c3b51e34cdd870b107d2046d33fb3fd6ca043012320d49c5588ef7d languageName: node linkType: hard -"@openmrs/esm-app-shell@npm:5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-app-shell@npm:5.0.2-pre.818" +"@openmrs/esm-app-shell@npm:5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-app-shell@npm:5.0.3-pre.827" dependencies: "@carbon/react": ^1.12.0 - "@openmrs/esm-framework": 5.0.2-pre.818 - "@openmrs/esm-styleguide": 5.0.2-pre.818 - "@swc-node/loader": ^1.3.5 + "@openmrs/esm-framework": 5.0.3-pre.827 + "@openmrs/esm-styleguide": 5.0.3-pre.827 dayjs: ^1.10.4 dexie: ^3.0.3 html-webpack-plugin: ^5.5.0 @@ -3587,6 +3586,7 @@ __metadata: react-router-dom: ^6.3.0 rxjs: ^6.5.3 single-spa: ^5.9.2 + swc-loader: ^0.2.3 systemjs: ^6.8.3 webpack: ^5.88.0 webpack-pwa-manifest: ^4.3.0 @@ -3595,7 +3595,7 @@ __metadata: workbox-strategies: ^6.1.5 workbox-webpack-plugin: ^6.1.5 workbox-window: ^6.1.5 - checksum: b6f7b399e24d90542c252827d06bdc9c6d09a85cbd1623d7f01d32cb7023b92559bde97d01ab01ae585f23a32ddc3ce9779f831df1a3b79944c9286afe161265 + checksum: 2e52ecd2cde36139da7b8b275dfbc77d6f778ea06e3eb3f9952010f30b3c86dd613e5012d2a87473c4f460f3867add156a56ebbb7241f5810411910b2b7fcee8 languageName: node linkType: hard @@ -3616,51 +3616,51 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-breadcrumbs@npm:^5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-breadcrumbs@npm:5.0.2-pre.818" +"@openmrs/esm-breadcrumbs@npm:^5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-breadcrumbs@npm:5.0.3-pre.827" dependencies: path-to-regexp: 6.1.0 peerDependencies: "@openmrs/esm-state": 4.x - checksum: 293b0f44109f88ae03c282fd25f01ddd95da7ff9ea05d06c5c3c1894ec6fcc99961a25ebb056519ca9582edb9dd0743d4c0cc7a57b2adc8be4e57934fb32a718 + checksum: f70534b9da127a153e92cdd357d6c30afae68b9589fa973be17fe67d173947b582a2c5c5d7ebad99eec18b9dfd9126cf5c1cca538c6d2127bb5b3d31fc54e5ed languageName: node linkType: hard -"@openmrs/esm-config@npm:^5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-config@npm:5.0.2-pre.818" +"@openmrs/esm-config@npm:^5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-config@npm:5.0.3-pre.827" dependencies: ramda: ^0.26.1 peerDependencies: "@openmrs/esm-globals": 4.x "@openmrs/esm-state": 4.x single-spa: 5.x - checksum: 96597fe3701f34fcbdb599e86ce8757e7b020df6dbc62f661862d7d2bf81124a4906c3974e713516ac2b37fde62e156fbca816209cf15ac3dda4b0357389dc29 + checksum: 72d9cb35eef3e7977169fbcde609648c7549c59979148e9839925bc0d3ccea16a2d35d868e689e7cc9de9d9ddc07d05132d4a2c828b23c8ba91a8282fba50594 languageName: node linkType: hard -"@openmrs/esm-dynamic-loading@npm:^5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-dynamic-loading@npm:5.0.2-pre.818" +"@openmrs/esm-dynamic-loading@npm:^5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-dynamic-loading@npm:5.0.3-pre.827" peerDependencies: "@openmrs/esm-globals": 4.x - checksum: 72589debbb74fcd9a0508a29c5312f3ec82c650096b92b576a25a529e94c0595b0d2689ead29fdb1a17bc3ff2645a12a2847a33533e3b0d260f8486e9e5b816e + checksum: 18445909ca6c4b631c5f61d3cc254a3bf4a44d301002d426165fe7db444c183b3df1f7efd46666c4d029a05c90baf50821d314d3b92fdea85229247501602926 languageName: node linkType: hard -"@openmrs/esm-error-handling@npm:^5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-error-handling@npm:5.0.2-pre.818" +"@openmrs/esm-error-handling@npm:^5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-error-handling@npm:5.0.3-pre.827" peerDependencies: "@openmrs/esm-globals": 4.x - checksum: bf3d4c024aba20ae0e51b3c4e95eccdcc86edf6a1c94eb2c9044f415925793409199f9bdc980b5dbcb7f73a607977ff8eadedd4e3a7ecd62231851b42a00fbcb + checksum: 378e60668a3d69663bedb009e122a61776ae8cf3c5b3f3460ec89b056dd4774cad9f284989e114eb4d312757db8cc26f2b2ecb0903be9dacb981476923362d8a languageName: node linkType: hard -"@openmrs/esm-extensions@npm:^5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-extensions@npm:5.0.2-pre.818" +"@openmrs/esm-extensions@npm:^5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-extensions@npm:5.0.3-pre.827" dependencies: lodash-es: ^4.17.21 peerDependencies: @@ -3668,26 +3668,26 @@ __metadata: "@openmrs/esm-config": 4.x "@openmrs/esm-state": 4.x single-spa: 5.x - checksum: 4d6f8fabe3c5cfa73141badc1f8b87d8fa1bfba779f90ef5a6ab757d94d36662bc7f189e333253d327b86d8a33272d231ff531340d7e6edc8f109cc30c78439e - languageName: node - linkType: hard - -"@openmrs/esm-framework@npm:5.0.2-pre.818, @openmrs/esm-framework@npm:next": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-framework@npm:5.0.2-pre.818" - dependencies: - "@openmrs/esm-api": ^5.0.2-pre.818 - "@openmrs/esm-breadcrumbs": ^5.0.2-pre.818 - "@openmrs/esm-config": ^5.0.2-pre.818 - "@openmrs/esm-dynamic-loading": ^5.0.2-pre.818 - "@openmrs/esm-error-handling": ^5.0.2-pre.818 - "@openmrs/esm-extensions": ^5.0.2-pre.818 - "@openmrs/esm-globals": ^5.0.2-pre.818 - "@openmrs/esm-offline": ^5.0.2-pre.818 - "@openmrs/esm-react-utils": ^5.0.2-pre.818 - "@openmrs/esm-state": ^5.0.2-pre.818 - "@openmrs/esm-styleguide": ^5.0.2-pre.818 - "@openmrs/esm-utils": ^5.0.2-pre.818 + checksum: cf4e287628965300582608f733871c55ba5efda159fa217488a5e459411987e69c0ec561507c11d4aa8deb59d6d2aef71e56fefed2b08ce9540605e4cb6694a7 + languageName: node + linkType: hard + +"@openmrs/esm-framework@npm:5.0.3-pre.827, @openmrs/esm-framework@npm:next": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-framework@npm:5.0.3-pre.827" + dependencies: + "@openmrs/esm-api": ^5.0.3-pre.827 + "@openmrs/esm-breadcrumbs": ^5.0.3-pre.827 + "@openmrs/esm-config": ^5.0.3-pre.827 + "@openmrs/esm-dynamic-loading": ^5.0.3-pre.827 + "@openmrs/esm-error-handling": ^5.0.3-pre.827 + "@openmrs/esm-extensions": ^5.0.3-pre.827 + "@openmrs/esm-globals": ^5.0.3-pre.827 + "@openmrs/esm-offline": ^5.0.3-pre.827 + "@openmrs/esm-react-utils": ^5.0.3-pre.827 + "@openmrs/esm-state": ^5.0.3-pre.827 + "@openmrs/esm-styleguide": ^5.0.3-pre.827 + "@openmrs/esm-utils": ^5.0.3-pre.827 dayjs: ^1.10.7 peerDependencies: dayjs: 1.x @@ -3697,22 +3697,22 @@ __metadata: react-i18next: 11.x rxjs: 6.x single-spa: 5.x - checksum: 2c733464f87948fc0368a36c55dcf902559c96b6408498bf412fb2330d4d6618b18710a04dd2360b684fb1daeb668c41d6ea117d8133effb58260abf222f5640 + checksum: ac75ac7288f6bb8e5687e2fe6adebb2f139c03aca87463b4f17830e6de06e50ea82d78d6fedc16e57e0fdbda999de9676d56e4a28bdb9a3f0fb211f43c9f6631 languageName: node linkType: hard -"@openmrs/esm-globals@npm:^5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-globals@npm:5.0.2-pre.818" +"@openmrs/esm-globals@npm:^5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-globals@npm:5.0.3-pre.827" peerDependencies: single-spa: 5.x - checksum: 99b3f215574b07633e9cf238ff67bc170a33029d4622f2c816f81b9199dba32c2197105aa65bfe546757109597da5565089722e8ba915096c433ad7f9bcd6245 + checksum: 5c2009ac22c4392405c642ed8d866cc8361bbcb2c51f6e4899ece2059ada6967c15d1301fe63889beeaa9838833b8f2635187d10e0a3fd1a2980cbd843ffe9fc languageName: node linkType: hard -"@openmrs/esm-offline@npm:^5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-offline@npm:5.0.2-pre.818" +"@openmrs/esm-offline@npm:^5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-offline@npm:5.0.3-pre.827" dependencies: dexie: ^3.0.3 lodash-es: ^4.17.21 @@ -3724,7 +3724,7 @@ __metadata: "@openmrs/esm-state": 4.x "@openmrs/esm-styleguide": 4.x rxjs: 6.x - checksum: 8200f9a82d4f0bfd055b4326ee42ac82267bdaae27d6fb6e3e8bcba2e1eec3c05bdddd302e28dc71b8b9722c8894105362205970334f6089ed489fab5f33b93d + checksum: 0dca265c87213998df664985fcd17b8d490fe8bed32a1ce21dd523ca6eca9b7e840bec5510afe022c8b25d00b6cd68e2629712ff3ad0fc3c00cc817cc48188eb languageName: node linkType: hard @@ -3767,7 +3767,6 @@ __metadata: "@carbon/react": ^1.12.0 "@openmrs/esm-framework": next "@playwright/test": 1.34.0 - "@swc-node/loader": ^1.3.5 "@swc/core": ^1.2.165 "@swc/jest": ^0.2.20 "@testing-library/dom": ^8.13.0 @@ -3811,6 +3810,7 @@ __metadata: react-router-dom: ^6.3.0 sass: ^1.29.0 sass-loader: ^10.1.0 + swc-loader: ^0.2.3 swr: ^2.0.1 turbo: ^1.6.3 typedoc: ^0.22.15 @@ -3857,9 +3857,9 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-react-utils@npm:^5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-react-utils@npm:5.0.2-pre.818" +"@openmrs/esm-react-utils@npm:^5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-react-utils@npm:5.0.3-pre.827" dependencies: lodash-es: ^4.17.21 single-spa-react: ~5.0.0 @@ -3875,22 +3875,22 @@ __metadata: react: 18.x react-dom: 18.x react-i18next: 11.x - checksum: 2334180abc1f542dac23ca95d605a3920dfac43dfcc8c5b3789101f557033fe859c39c0318337642636518c85a5e96df2685087fc16c8aaee05c814e96ff9485 + checksum: 3f041302f0666ec2db325561753187593f432f1c0c49286ca9f50fa73b11c3ece4f8f32c61856a15f964b1fbd5a41c6ac9b1d609e21032ffda02584d8e2d76b7 languageName: node linkType: hard -"@openmrs/esm-state@npm:^5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-state@npm:5.0.2-pre.818" +"@openmrs/esm-state@npm:^5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-state@npm:5.0.3-pre.827" dependencies: zustand: ^4.3.6 - checksum: 48724501bfbb863d9bd2cf91ed13c293a64aac6e741b64cf5a47fb76c5dc5e66a3ec8ab8eec5fee25aba34b0df3980826fc2351ce4a472cb3fa3cb2ac338052a + checksum: b55c0fce425484a7e0f6db9ce444e1a3729a57dadfdd48330e8c8bf69f31d70f51b0043a8251e4b6204be27bf8d33796942fdd399688b29860a4fb25a6cd9117 languageName: node linkType: hard -"@openmrs/esm-styleguide@npm:5.0.2-pre.818, @openmrs/esm-styleguide@npm:^5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-styleguide@npm:5.0.2-pre.818" +"@openmrs/esm-styleguide@npm:5.0.3-pre.827, @openmrs/esm-styleguide@npm:^5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-styleguide@npm:5.0.3-pre.827" dependencies: "@carbon/charts": ^1.6.3 "@carbon/react": ^1.12.0 @@ -3901,28 +3901,27 @@ __metadata: react: 18.x react-dom: 18.x rxjs: 6.x - checksum: dc56184dfb7f337235dd906b3f395e92a6ae8cd15f30d11012794d0079124c2fc0c9a4e4bb9ce2f60df942c99c0143431364350400451e8915a23d48f22039e0 + checksum: e6afd5466ea4a3ec0ca2c090b4fd2c35786ea03e7fd1c52f9a7af19f131e395f57312ddd5ce09e7fa0e7e2586986d433b6f05d56b2b3eca13d97c17d24578c66 languageName: node linkType: hard -"@openmrs/esm-utils@npm:^5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/esm-utils@npm:5.0.2-pre.818" +"@openmrs/esm-utils@npm:^5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/esm-utils@npm:5.0.3-pre.827" dependencies: semver: 7.3.2 peerDependencies: dayjs: 1.x i18next: 19.x rxjs: 6.x - checksum: 5605b77dffef057c1a5bc8ddd594f68378b8eec2e4194fefdcd432bf33b4579c2f6982f1efa0c92ddacc3255666cf81fad3cde341a611540594f6b5277beb9fa + checksum: 40d65f2267f825c590e572e55af5a77476f0c888ab2a4b74570dab9b2ab6f69327e3623e0755254379c521091413fac2fb94a97919c86485aa94202940bf331a languageName: node linkType: hard -"@openmrs/webpack-config@npm:5.0.2-pre.818": - version: 5.0.2-pre.818 - resolution: "@openmrs/webpack-config@npm:5.0.2-pre.818" +"@openmrs/webpack-config@npm:5.0.3-pre.827": + version: 5.0.3-pre.827 + resolution: "@openmrs/webpack-config@npm:5.0.3-pre.827" dependencies: - "@swc-node/loader": ^1.3.5 "@swc/core": ^1.3.58 babel-preset-minify: ^0.5.1 clean-webpack-plugin: ^4.0.0 @@ -3933,12 +3932,13 @@ __metadata: sass: ^1.44.0 sass-loader: ^12.3.0 style-loader: ^3.3.1 + swc-loader: ^0.2.3 webpack: ^5.88.0 webpack-bundle-analyzer: ^4.5.0 webpack-stats-plugin: ^1.0.3 peerDependencies: webpack: 5.x - checksum: fb12b87fb2544ac4042a0847ad2ed162ef5fca1d5bc29c123452ddf056bdd83998d5d3c85866c9856948f25e3fd39068e4ec1bc653c686956aa5ccf703ac47c1 + checksum: 2e3493e224acc24789cdeec7d8d54b35ff3601b7744aa7ab44b823af9ee2e3149c8d010d9de5450f0df51e7e634c73c9fe30fbc7e6d30ea4de9fabed9fb5659c languageName: node linkType: hard @@ -4094,55 +4094,6 @@ __metadata: languageName: node linkType: hard -"@swc-node/core@npm:^1.10.3": - version: 1.10.3 - resolution: "@swc-node/core@npm:1.10.3" - peerDependencies: - "@swc/core": ">= 1.3" - checksum: 6e3e50a44d7a1c1aa62599d83c58f21568c1da03422124b46634488aba02747939063eeb1a2710aab0ab9f14f347386226a017ed72e6ba608d4a26532cd426af - languageName: node - linkType: hard - -"@swc-node/loader@npm:^1.3.5": - version: 1.3.5 - resolution: "@swc-node/loader@npm:1.3.5" - dependencies: - "@swc-node/core": ^1.10.3 - "@swc-node/register": ^1.6.5 - peerDependencies: - typescript: ">= 4.3" - webpack: ">= 5.0.0" - checksum: f28208a5298d64f2452e048db279d3e9da2eaa5d4d146f8a6b78508f1a70bab3e8e56e1e19cff455d1001ea4af792589d73dd3a2a5ce5f8ef565dbed5622e8b7 - languageName: node - linkType: hard - -"@swc-node/register@npm:^1.6.5": - version: 1.6.5 - resolution: "@swc-node/register@npm:1.6.5" - dependencies: - "@swc-node/core": ^1.10.3 - "@swc-node/sourcemap-support": ^0.3.0 - colorette: ^2.0.19 - debug: ^4.3.4 - pirates: ^4.0.5 - tslib: ^2.5.0 - peerDependencies: - "@swc/core": ">= 1.3" - typescript: ">= 4.3" - checksum: 490b2c6d04d4be3e80f3cc4aeccd4e064f49100e7e21675de3e2a125d844857589a3e0b91a17f088c471cbb20725a02fadc9edd244c08253d1bae19b2e88e8e6 - languageName: node - linkType: hard - -"@swc-node/sourcemap-support@npm:^0.3.0": - version: 0.3.0 - resolution: "@swc-node/sourcemap-support@npm:0.3.0" - dependencies: - source-map-support: ^0.5.21 - tslib: ^2.5.0 - checksum: a3c837ed790238ef88682eb342b75d756eba5eb3b6cfe6cf14a597bd78dfc9a9797f1e54a4977c1297e5324fba2e33bd76ab8aa9c396ad463693de2001180c9e - languageName: node - linkType: hard - "@swc/core-android-arm-eabi@npm:1.3.11": version: 1.3.11 resolution: "@swc/core-android-arm-eabi@npm:1.3.11" @@ -7427,13 +7378,6 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.19": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d - languageName: node - linkType: hard - "colors@npm:~1.4.0": version: 1.4.0 resolution: "colors@npm:1.4.0" @@ -8616,7 +8560,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.3": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -15255,13 +15199,13 @@ __metadata: linkType: hard "openmrs@npm:next": - version: 5.0.2-pre.818 - resolution: "openmrs@npm:5.0.2-pre.818" + version: 5.0.3-pre.827 + resolution: "openmrs@npm:5.0.3-pre.827" dependencies: - "@openmrs/esm-app-shell": 5.0.2-pre.818 - "@openmrs/webpack-config": 5.0.2-pre.818 + "@openmrs/esm-app-shell": 5.0.3-pre.827 + "@openmrs/webpack-config": 5.0.3-pre.827 "@pnpm/npm-conf": ^2.1.0 - "@swc-node/loader": ^1.3.5 + "@swc/core": ^1.3.58 autoprefixer: ^10.4.2 axios: ^0.21.1 browserslist-config-openmrs: ^1.0.1 @@ -15277,6 +15221,7 @@ __metadata: postcss: ^8.4.6 postcss-loader: ^6.2.1 rimraf: ^3.0.2 + swc-loader: ^0.2.3 tar: ^6.0.5 typescript: ^4.6.4 webpack: ^5.88.0 @@ -15287,7 +15232,7 @@ __metadata: yargs: ^17.6.2 bin: openmrs: dist/cli.js - checksum: 7559eece07650a507e646765b2d8c0331a29977525c367326fad9dcc1d33232a62bb2ba0a62e33ab3501eaca3d3ab0c5f8e2077ca27943ce3b52bd7c7609627e + checksum: 4236575e96be7f9d56ecd263fbc6c1b3e1adefd4513a2a2271a2a4ad65ac84282654917f25e6470411202ad84da374087df263e87759bd482dac008543fc8d35 languageName: node linkType: hard @@ -15896,7 +15841,7 @@ __metadata: languageName: node linkType: hard -"pirates@npm:^4.0.4, pirates@npm:^4.0.5": +"pirates@npm:^4.0.4": version: 4.0.5 resolution: "pirates@npm:4.0.5" checksum: c9994e61b85260bec6c4fc0307016340d9b0c4f4b6550a957afaaff0c9b1ad58fbbea5cfcf083860a25cb27a375442e2b0edf52e2e1e40e69934e08dcc52d227 @@ -18248,7 +18193,7 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:^0.5.21, source-map-support@npm:~0.5.20": +"source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -18879,6 +18824,16 @@ __metadata: languageName: node linkType: hard +"swc-loader@npm:^0.2.3": + version: 0.2.3 + resolution: "swc-loader@npm:0.2.3" + peerDependencies: + "@swc/core": ^1.2.147 + webpack: ">=2" + checksum: 010d84d399525c0185d36d62c86c55ae017e7a90046bc8a39be4b7e07526924037868049f6037bc966da98151cb2600934b96a66279b742d3c413a718b427251 + languageName: node + linkType: hard + "swr@npm:^2.0.1": version: 2.0.1 resolution: "swr@npm:2.0.1" @@ -19392,13 +19347,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.5.0": - version: 2.5.2 - resolution: "tslib@npm:2.5.2" - checksum: 4d3c1e238b94127ed0e88aa0380db3c2ddae581dc0f4bae5a982345e9f50ee5eda90835b8bfba99b02df10a5734470be197158c36f9129ac49fdc14a6a9da222 - languageName: node - linkType: hard - "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" From 1423283acf69f0c459cfbdfc87f389f1e22bb91c Mon Sep 17 00:00:00 2001 From: Dennis Kigen Date: Sat, 24 Jun 2023 02:19:39 +0300 Subject: [PATCH 12/17] (fix) More fixes for routes (#740) --- packages/esm-outpatient-app/src/routes.json | 4 ++-- packages/esm-patient-list-app/src/routes.json | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/esm-outpatient-app/src/routes.json b/packages/esm-outpatient-app/src/routes.json index a31fc46c6..b18462510 100644 --- a/packages/esm-outpatient-app/src/routes.json +++ b/packages/esm-outpatient-app/src/routes.json @@ -6,13 +6,13 @@ "pages": [ { "component": "appointmentsList", - "route": "appointments-list", + "routeRegex": "^appointments-list", "online": true, "offline": true }, { "component": "queueList", - "route": "queue-list", + "routeRegex": "^queue-list", "online": true, "offline": true } diff --git a/packages/esm-patient-list-app/src/routes.json b/packages/esm-patient-list-app/src/routes.json index bbf93cdd6..c02ad0e12 100644 --- a/packages/esm-patient-list-app/src/routes.json +++ b/packages/esm-patient-list-app/src/routes.json @@ -13,12 +13,18 @@ { "name": "patient-lists-dashboard-link", "component": "patientListDashboardLink", + "slot": "homepage-dashboard-slot", "meta": { "name": "patient-lists", "slot": "patient-lists-dashboard-slot", "title": "Patient lists" } }, + { + "name": "patient-lists-dashboard", + "component": "root", + "slot": "patient-lists-dashboard-slot" + }, { "name": "patient-table", "component": "patientTable" From 2f168bdd96f04e5d34a59c1da853f4a09d4c7796 Mon Sep 17 00:00:00 2001 From: Dennis Kigen Date: Sat, 24 Jun 2023 02:24:06 +0300 Subject: [PATCH 13/17] (fix) Remove incorrect `order` property from routes (#739) --- packages/esm-active-visits-app/src/routes.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/esm-active-visits-app/src/routes.json b/packages/esm-active-visits-app/src/routes.json index 55f181dae..f6f08512b 100644 --- a/packages/esm-active-visits-app/src/routes.json +++ b/packages/esm-active-visits-app/src/routes.json @@ -13,8 +13,7 @@ { "name": "visit-summary-widget", "slot": "visit-summary-slot", - "component": "visitDetail", - "order": 0 + "component": "visitDetail" } ], "pages": [] From fe18000f5d971a568d5e564a517647cfbbf7f502 Mon Sep 17 00:00:00 2001 From: Dennis Kigen Date: Fri, 23 Jun 2023 16:57:34 -0700 Subject: [PATCH 14/17] (fix) Fix typo in slot name --- packages/esm-active-visits-app/src/routes.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/esm-active-visits-app/src/routes.json b/packages/esm-active-visits-app/src/routes.json index f6f08512b..ba74eb6c2 100644 --- a/packages/esm-active-visits-app/src/routes.json +++ b/packages/esm-active-visits-app/src/routes.json @@ -6,7 +6,7 @@ "extensions": [ { "name": "active-visits-widget", - "slot": "homepage-widget-slot", + "slot": "homepage-widgets-slot", "component": "activeVisits", "order": 0 }, @@ -17,4 +17,4 @@ } ], "pages": [] -} \ No newline at end of file +} From 554b13bcf61be04184d065806b51df9d90639d85 Mon Sep 17 00:00:00 2001 From: Dennis Kigen Date: Mon, 26 Jun 2023 14:13:54 +0300 Subject: [PATCH 15/17] (fix) Fix Appointments calendar dashboard link extension config (#742) --- packages/esm-appointments-app/src/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/esm-appointments-app/src/index.ts b/packages/esm-appointments-app/src/index.ts index a16852827..44a1bb204 100644 --- a/packages/esm-appointments-app/src/index.ts +++ b/packages/esm-appointments-app/src/index.ts @@ -33,8 +33,10 @@ export function startupApp() { export const appointmentsDashboardLink = getSyncLifecycle(createDashboardLink(dashboardMeta), options); -export const appointmentsCalendarDashboardLink = () => - getSyncLifecycle(createDashboardLink(appointmentCalendarDashboardMeta), options); +export const appointmentsCalendarDashboardLink = getSyncLifecycle( + createDashboardLink(appointmentCalendarDashboardMeta), + options, +); export const appointmentsDashboard = getAsyncLifecycle(() => import('./appointments.component'), options); From 3e52e5951e8a94c54bb5c38b62a1dd37bd74f7b6 Mon Sep 17 00:00:00 2001 From: Ian <52504170+ibacher@users.noreply.github.com> Date: Tue, 27 Jun 2023 15:08:30 -0400 Subject: [PATCH 16/17] (chore) Update to newer versions of openmrs and @openmrs/esm-framework (#743) --- yarn.lock | 166 +++++++++++++++++++++++++++--------------------------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/yarn.lock b/yarn.lock index c4173e85a..ffc431262 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3551,9 +3551,9 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-api@npm:^5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-api@npm:5.0.3-pre.827" +"@openmrs/esm-api@npm:^5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-api@npm:5.0.3-pre.846" dependencies: "@types/fhir": 0.0.31 lodash-es: ^4.17.21 @@ -3561,17 +3561,17 @@ __metadata: "@openmrs/esm-config": 4.x "@openmrs/esm-error-handling": 4.x "@openmrs/esm-offline": 4.x - checksum: 3a42e4f9734f28770f636dace4dff475c15ee6ee6b4819bb5fde37c6bc7a47fe7da9bb4c0c3b51e34cdd870b107d2046d33fb3fd6ca043012320d49c5588ef7d + checksum: 66e02f30e4a30536d835dc8630cc9e3d7866330e57bedc7cc629bf338b30558a51b03980ce19b7e83eba35011f57edcaf28e8e01c102f47e407f3d06b8043349 languageName: node linkType: hard -"@openmrs/esm-app-shell@npm:5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-app-shell@npm:5.0.3-pre.827" +"@openmrs/esm-app-shell@npm:5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-app-shell@npm:5.0.3-pre.846" dependencies: "@carbon/react": ^1.12.0 - "@openmrs/esm-framework": 5.0.3-pre.827 - "@openmrs/esm-styleguide": 5.0.3-pre.827 + "@openmrs/esm-framework": 5.0.3-pre.846 + "@openmrs/esm-styleguide": 5.0.3-pre.846 dayjs: ^1.10.4 dexie: ^3.0.3 html-webpack-plugin: ^5.5.0 @@ -3595,7 +3595,7 @@ __metadata: workbox-strategies: ^6.1.5 workbox-webpack-plugin: ^6.1.5 workbox-window: ^6.1.5 - checksum: 2e52ecd2cde36139da7b8b275dfbc77d6f778ea06e3eb3f9952010f30b3c86dd613e5012d2a87473c4f460f3867add156a56ebbb7241f5810411910b2b7fcee8 + checksum: d2630dc61cbcd26345a2685b9b52ec3744807e703a8af2341ffc7c48d7b5a9d06d7071fef86976fa24e33e3b5f737e517c8b30a18c493e01e7b283fd6944b400 languageName: node linkType: hard @@ -3616,51 +3616,51 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-breadcrumbs@npm:^5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-breadcrumbs@npm:5.0.3-pre.827" +"@openmrs/esm-breadcrumbs@npm:^5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-breadcrumbs@npm:5.0.3-pre.846" dependencies: path-to-regexp: 6.1.0 peerDependencies: "@openmrs/esm-state": 4.x - checksum: f70534b9da127a153e92cdd357d6c30afae68b9589fa973be17fe67d173947b582a2c5c5d7ebad99eec18b9dfd9126cf5c1cca538c6d2127bb5b3d31fc54e5ed + checksum: 80fe62635efe320dfd6e74f1f6d4730bf627f3451888d5b78951100868581aca922cad8bb7b3e4ac6f2068e6af55157a23ec1bf81f659720f33ff75a05cd76e1 languageName: node linkType: hard -"@openmrs/esm-config@npm:^5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-config@npm:5.0.3-pre.827" +"@openmrs/esm-config@npm:^5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-config@npm:5.0.3-pre.846" dependencies: ramda: ^0.26.1 peerDependencies: "@openmrs/esm-globals": 4.x "@openmrs/esm-state": 4.x single-spa: 5.x - checksum: 72d9cb35eef3e7977169fbcde609648c7549c59979148e9839925bc0d3ccea16a2d35d868e689e7cc9de9d9ddc07d05132d4a2c828b23c8ba91a8282fba50594 + checksum: 208c1fddc6af6ca2499b4881f9a16cd279ea3ef264b82cdde0c7abfb7d55530c768d42abc1f3aa10eaecb405995fb8e03bc028c461f2464b14ad9bf9d9420486 languageName: node linkType: hard -"@openmrs/esm-dynamic-loading@npm:^5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-dynamic-loading@npm:5.0.3-pre.827" +"@openmrs/esm-dynamic-loading@npm:^5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-dynamic-loading@npm:5.0.3-pre.846" peerDependencies: "@openmrs/esm-globals": 4.x - checksum: 18445909ca6c4b631c5f61d3cc254a3bf4a44d301002d426165fe7db444c183b3df1f7efd46666c4d029a05c90baf50821d314d3b92fdea85229247501602926 + checksum: a71098117aef13d19a04d6871c49c1531ca105d032adbf64fd23604c8e4bd27c7adb467a27b809ea46351f4e8030a55afcebb0a4219808d0dcad84668550d31b languageName: node linkType: hard -"@openmrs/esm-error-handling@npm:^5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-error-handling@npm:5.0.3-pre.827" +"@openmrs/esm-error-handling@npm:^5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-error-handling@npm:5.0.3-pre.846" peerDependencies: "@openmrs/esm-globals": 4.x - checksum: 378e60668a3d69663bedb009e122a61776ae8cf3c5b3f3460ec89b056dd4774cad9f284989e114eb4d312757db8cc26f2b2ecb0903be9dacb981476923362d8a + checksum: c899aa829383e739b575c0428291966cab87b6a16b86beb56d8a2654ac17c329c2018a9542d7e1dbadaa55163b1380f81fab821784da8839180e72385c708142 languageName: node linkType: hard -"@openmrs/esm-extensions@npm:^5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-extensions@npm:5.0.3-pre.827" +"@openmrs/esm-extensions@npm:^5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-extensions@npm:5.0.3-pre.846" dependencies: lodash-es: ^4.17.21 peerDependencies: @@ -3668,26 +3668,26 @@ __metadata: "@openmrs/esm-config": 4.x "@openmrs/esm-state": 4.x single-spa: 5.x - checksum: cf4e287628965300582608f733871c55ba5efda159fa217488a5e459411987e69c0ec561507c11d4aa8deb59d6d2aef71e56fefed2b08ce9540605e4cb6694a7 - languageName: node - linkType: hard - -"@openmrs/esm-framework@npm:5.0.3-pre.827, @openmrs/esm-framework@npm:next": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-framework@npm:5.0.3-pre.827" - dependencies: - "@openmrs/esm-api": ^5.0.3-pre.827 - "@openmrs/esm-breadcrumbs": ^5.0.3-pre.827 - "@openmrs/esm-config": ^5.0.3-pre.827 - "@openmrs/esm-dynamic-loading": ^5.0.3-pre.827 - "@openmrs/esm-error-handling": ^5.0.3-pre.827 - "@openmrs/esm-extensions": ^5.0.3-pre.827 - "@openmrs/esm-globals": ^5.0.3-pre.827 - "@openmrs/esm-offline": ^5.0.3-pre.827 - "@openmrs/esm-react-utils": ^5.0.3-pre.827 - "@openmrs/esm-state": ^5.0.3-pre.827 - "@openmrs/esm-styleguide": ^5.0.3-pre.827 - "@openmrs/esm-utils": ^5.0.3-pre.827 + checksum: 258f08331703a4e688121f7106d92f0e9eaf1cf26d05fc549a2723c098d8519b82372b0d701052e6a5bd29e1ea340ed60f24bf4cd588b191060276790078571b + languageName: node + linkType: hard + +"@openmrs/esm-framework@npm:5.0.3-pre.846, @openmrs/esm-framework@npm:next": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-framework@npm:5.0.3-pre.846" + dependencies: + "@openmrs/esm-api": ^5.0.3-pre.846 + "@openmrs/esm-breadcrumbs": ^5.0.3-pre.846 + "@openmrs/esm-config": ^5.0.3-pre.846 + "@openmrs/esm-dynamic-loading": ^5.0.3-pre.846 + "@openmrs/esm-error-handling": ^5.0.3-pre.846 + "@openmrs/esm-extensions": ^5.0.3-pre.846 + "@openmrs/esm-globals": ^5.0.3-pre.846 + "@openmrs/esm-offline": ^5.0.3-pre.846 + "@openmrs/esm-react-utils": ^5.0.3-pre.846 + "@openmrs/esm-state": ^5.0.3-pre.846 + "@openmrs/esm-styleguide": ^5.0.3-pre.846 + "@openmrs/esm-utils": ^5.0.3-pre.846 dayjs: ^1.10.7 peerDependencies: dayjs: 1.x @@ -3697,22 +3697,22 @@ __metadata: react-i18next: 11.x rxjs: 6.x single-spa: 5.x - checksum: ac75ac7288f6bb8e5687e2fe6adebb2f139c03aca87463b4f17830e6de06e50ea82d78d6fedc16e57e0fdbda999de9676d56e4a28bdb9a3f0fb211f43c9f6631 + checksum: a6a844e7dc3f734122b291768ead75767f27482cb399d47a09c885c8054e5747d31f3c92dc1b1ea6f74bfb64ea167b5f79fe14220ece8f5929298c6cbac40dee languageName: node linkType: hard -"@openmrs/esm-globals@npm:^5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-globals@npm:5.0.3-pre.827" +"@openmrs/esm-globals@npm:^5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-globals@npm:5.0.3-pre.846" peerDependencies: single-spa: 5.x - checksum: 5c2009ac22c4392405c642ed8d866cc8361bbcb2c51f6e4899ece2059ada6967c15d1301fe63889beeaa9838833b8f2635187d10e0a3fd1a2980cbd843ffe9fc + checksum: b19eaf9145adf6377ab43ad218bd13c506f101520b92fc9f0cda75ed40a00955a5c16f3777ffd47155e613625fc7d7db012c8e15c824afed0ff8cd85f481e72c languageName: node linkType: hard -"@openmrs/esm-offline@npm:^5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-offline@npm:5.0.3-pre.827" +"@openmrs/esm-offline@npm:^5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-offline@npm:5.0.3-pre.846" dependencies: dexie: ^3.0.3 lodash-es: ^4.17.21 @@ -3724,7 +3724,7 @@ __metadata: "@openmrs/esm-state": 4.x "@openmrs/esm-styleguide": 4.x rxjs: 6.x - checksum: 0dca265c87213998df664985fcd17b8d490fe8bed32a1ce21dd523ca6eca9b7e840bec5510afe022c8b25d00b6cd68e2629712ff3ad0fc3c00cc817cc48188eb + checksum: ab4325e53794d8f70db0569086aa405a0f9194ea771d78540208755f244e146182b5ae40286152e8446490fd4214d91f1a660973fc852660db9f2d694a7f3aaa languageName: node linkType: hard @@ -3857,9 +3857,9 @@ __metadata: languageName: unknown linkType: soft -"@openmrs/esm-react-utils@npm:^5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-react-utils@npm:5.0.3-pre.827" +"@openmrs/esm-react-utils@npm:^5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-react-utils@npm:5.0.3-pre.846" dependencies: lodash-es: ^4.17.21 single-spa-react: ~5.0.0 @@ -3875,22 +3875,22 @@ __metadata: react: 18.x react-dom: 18.x react-i18next: 11.x - checksum: 3f041302f0666ec2db325561753187593f432f1c0c49286ca9f50fa73b11c3ece4f8f32c61856a15f964b1fbd5a41c6ac9b1d609e21032ffda02584d8e2d76b7 + checksum: 6aade00f8031216485ca05533b4777258c9e9b623ac2e2494356e26d093946b89e3026a871fc8eb1e8c1be07d39a2dce0f76e5fb3026e6b3e51c52014a1b0593 languageName: node linkType: hard -"@openmrs/esm-state@npm:^5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-state@npm:5.0.3-pre.827" +"@openmrs/esm-state@npm:^5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-state@npm:5.0.3-pre.846" dependencies: zustand: ^4.3.6 - checksum: b55c0fce425484a7e0f6db9ce444e1a3729a57dadfdd48330e8c8bf69f31d70f51b0043a8251e4b6204be27bf8d33796942fdd399688b29860a4fb25a6cd9117 + checksum: 396d85fe53f81c3695848d72f04f2e39bd2a71997417653e86cfb6f679a1f1559821c6484bdde3f70b26873f615344edcd1eac1974650da8c39636cfcd9b64ca languageName: node linkType: hard -"@openmrs/esm-styleguide@npm:5.0.3-pre.827, @openmrs/esm-styleguide@npm:^5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-styleguide@npm:5.0.3-pre.827" +"@openmrs/esm-styleguide@npm:5.0.3-pre.846, @openmrs/esm-styleguide@npm:^5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-styleguide@npm:5.0.3-pre.846" dependencies: "@carbon/charts": ^1.6.3 "@carbon/react": ^1.12.0 @@ -3901,26 +3901,26 @@ __metadata: react: 18.x react-dom: 18.x rxjs: 6.x - checksum: e6afd5466ea4a3ec0ca2c090b4fd2c35786ea03e7fd1c52f9a7af19f131e395f57312ddd5ce09e7fa0e7e2586986d433b6f05d56b2b3eca13d97c17d24578c66 + checksum: 13c6ceeb1ced15bd2ca96be347d399a20a0e2a88de23f5670224a20f8b81e9afa8c86f28b14e6fbd8153917514a328d91a279b64cf006ca7b34af26fc41a419d languageName: node linkType: hard -"@openmrs/esm-utils@npm:^5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/esm-utils@npm:5.0.3-pre.827" +"@openmrs/esm-utils@npm:^5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/esm-utils@npm:5.0.3-pre.846" dependencies: semver: 7.3.2 peerDependencies: dayjs: 1.x i18next: 19.x rxjs: 6.x - checksum: 40d65f2267f825c590e572e55af5a77476f0c888ab2a4b74570dab9b2ab6f69327e3623e0755254379c521091413fac2fb94a97919c86485aa94202940bf331a + checksum: a6a136d67f1aba88922b7e6f4bd64dbd77bac57df35ed54f580c4d016539d65fda8f03580684fbcb1b20ec5d413e12e4125857ec553531e7ac5896ac442add1b languageName: node linkType: hard -"@openmrs/webpack-config@npm:5.0.3-pre.827": - version: 5.0.3-pre.827 - resolution: "@openmrs/webpack-config@npm:5.0.3-pre.827" +"@openmrs/webpack-config@npm:5.0.3-pre.846": + version: 5.0.3-pre.846 + resolution: "@openmrs/webpack-config@npm:5.0.3-pre.846" dependencies: "@swc/core": ^1.3.58 babel-preset-minify: ^0.5.1 @@ -3938,7 +3938,7 @@ __metadata: webpack-stats-plugin: ^1.0.3 peerDependencies: webpack: 5.x - checksum: 2e3493e224acc24789cdeec7d8d54b35ff3601b7744aa7ab44b823af9ee2e3149c8d010d9de5450f0df51e7e634c73c9fe30fbc7e6d30ea4de9fabed9fb5659c + checksum: 4f4a16d6114536e3c3ee2c90cef97e8c5f0448b0dd1f3bed693c6ceab03fbd3c75369371b9dfdb5f575ccdc4ebcac835545149ec39368c5d49dc257400476fc0 languageName: node linkType: hard @@ -15199,11 +15199,11 @@ __metadata: linkType: hard "openmrs@npm:next": - version: 5.0.3-pre.827 - resolution: "openmrs@npm:5.0.3-pre.827" + version: 5.0.3-pre.846 + resolution: "openmrs@npm:5.0.3-pre.846" dependencies: - "@openmrs/esm-app-shell": 5.0.3-pre.827 - "@openmrs/webpack-config": 5.0.3-pre.827 + "@openmrs/esm-app-shell": 5.0.3-pre.846 + "@openmrs/webpack-config": 5.0.3-pre.846 "@pnpm/npm-conf": ^2.1.0 "@swc/core": ^1.3.58 autoprefixer: ^10.4.2 @@ -15232,7 +15232,7 @@ __metadata: yargs: ^17.6.2 bin: openmrs: dist/cli.js - checksum: 4236575e96be7f9d56ecd263fbc6c1b3e1adefd4513a2a2271a2a4ad65ac84282654917f25e6470411202ad84da374087df263e87759bd482dac008543fc8d35 + checksum: 10a7f9aee91ff868f99ac16319dae5b87300f72d7e52f97bb55d866f0d13c93ee10b36475af53c9a0a5954a07d980af1810347f4f925fcf6499ea3b63b214bc8 languageName: node linkType: hard From 541a7fb0fdbdb6bc5c8590b9e0a0d2d26110bb29 Mon Sep 17 00:00:00 2001 From: Vineet Sharma Date: Thu, 29 Jun 2023 14:38:18 +0530 Subject: [PATCH 17/17] Fixed the incorrect assignment to isOffline (#746) --- .../src/root.component.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/esm-patient-registration-app/src/root.component.tsx b/packages/esm-patient-registration-app/src/root.component.tsx index c300f8a24..bdbe564c7 100644 --- a/packages/esm-patient-registration-app/src/root.component.tsx +++ b/packages/esm-patient-registration-app/src/root.component.tsx @@ -14,7 +14,7 @@ import useSWRImmutable from 'swr/immutable'; import styles from './root.scss'; export default function Root() { - const isOffline = useConnectivity(); + const isOnline = useConnectivity(); const currentSession = useSession(); const { data: addressTemplate } = useSWRImmutable('patientRegistrationAddressTemplate', fetchAddressTemplate); const { data: relationshipTypes } = useSWRImmutable( @@ -26,8 +26,8 @@ export default function Root() { fetchPatientIdentifierTypesWithSources, ); const savePatientForm = useMemo( - () => (isOffline ? FormManager.savePatientFormOffline : FormManager.savePatientFormOnline), - [isOffline], + () => (isOnline ? FormManager.savePatientFormOnline : FormManager.savePatientFormOffline), + [isOnline], ); return ( @@ -47,11 +47,11 @@ export default function Root() { } + element={} /> } + element={} />