From 7f8af2ad2da05cb9947bd358047cf392fa5b935b Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 4 Apr 2024 19:43:43 +0200 Subject: [PATCH 01/53] Add end to end tests for the cdr recipe This adds functional tests for the cdr recipe. We test the splitting of a fhir bundle such that the patient's clinical data is stored in the fhir datastore (hapi fhir), and the patient's demographic data is stored in the client registry (Jempi) --- .../features/cluster-mode/cdr.cluster.feature | 47 + .../features/resources/fhirBundle.json | 1114 +++++++++++++++++ .../features/resources/organization.json | 339 +++++ .../cucumber/features/single-mode/cdr.feature | 69 + test/cucumber/features/steps/recipesSteps.js | 91 ++ 5 files changed, 1660 insertions(+) create mode 100644 test/cucumber/features/cluster-mode/cdr.cluster.feature create mode 100644 test/cucumber/features/resources/fhirBundle.json create mode 100644 test/cucumber/features/resources/organization.json create mode 100644 test/cucumber/features/single-mode/cdr.feature create mode 100644 test/cucumber/features/steps/recipesSteps.js diff --git a/test/cucumber/features/cluster-mode/cdr.cluster.feature b/test/cucumber/features/cluster-mode/cdr.cluster.feature new file mode 100644 index 00000000..ac1d1851 --- /dev/null +++ b/test/cucumber/features/cluster-mode/cdr.cluster.feature @@ -0,0 +1,47 @@ +Feature: CDR recipe? + Does the recipe work as expected + +Scenario: Init the CDR recipe + Given I use parameters "package init -p cdr --dev --env-file=.env.cluster" + When I launch the platform with params + Then The service "mongo-1" should be started with 1 replica + And The service "openhim-core" should be started with 3 replica + And The service "openhim-console" should be started with 3 replica + +Scenario: Send Fhir bundle and store the clinical data in the Fhir datastore, and the patient info in the CR + Given I have configured the cdr + When I send a fhir patient bundle + Then the clinical data should be stored in hapi fhir + And the patient data in the Jempi client registry + +Scenario: Fetch International Patient summary (IPS) + When I send a fhir patient bundle + And I then send a fhir patient summary request + Then I should get a successful summary response + +Scenario: Fetch everything for a patient (all the clinical data) + When I send a fhir patient bundle + And I then send a request for all the patient's clinical data + Then I should get a successful everything response + +Scenario: Bring down the servers + Given I use parameters "package down -p cdr --dev --env-file=cdr.env" + When I launch the platform with params + Then a request to fetch data from the cdr should fail + +Scenario: Bring up the servers and test + Given I use parameters "package up -p cdr --dev --env-file=cdr.env" + When I launch the platform with params + Then The service "mongo-1" should be started with 1 replica + And The service "openhim-core" should be started with 3 replica + And The service "openhim-console" should be started with 3 replica + And The service "postgres-1" should be started with 1 replica + And The service "hapi-fhir" should be started with 3 replica + When I then send a request for all the patient's clinical data + Then I should get a successful everything response + +Scenario: Destroy the services + Given I use parameters "package remove -p cdr --dev --env-file=cdr.env" + When I launch the platform with params + Then There should be 0 service + And There should be 0 volume diff --git a/test/cucumber/features/resources/fhirBundle.json b/test/cucumber/features/resources/fhirBundle.json new file mode 100644 index 00000000..ce9ec14f --- /dev/null +++ b/test/cucumber/features/resources/fhirBundle.json @@ -0,0 +1,1114 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "fullUrl": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb", + "resource": { + "resourceType": "Patient", + "id": "642b83d3-a43c-41ef-a578-2b730f276bfb", + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/patient-religion", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://terminology.hl7.org/ValueSet/v3-ReligiousAffiliation", + "code": "1036", + "display": "Orthodox" + } + ] + } + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/patient-relatedPerson", + "valueReference": { + "reference": "RelatedPerson/f8b7dccb-f1ef-4365-9323-29303479d02bRelatedPerson481" + } + }, + { + "url": "http://cdr.aacahb.gov.et/EducationalLevel", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v3-EducationLevel", + "code": "ELEM", + "display": "Elementary School" + } + ] + } + }, + { + "url": "http://cdr.aacahb.gov.et/Occupation", + "valueString": "Foreman" + } + ], + "identifier": [ + { + "system": "http://cdr.aacahb.gov.et/SmartCareID", + "value": "642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + { + "system": "http://cdr.aacahb.gov.et/NationalID", + "value": "MRN-642b83d3-a43c-41ef-a578-2b730f476bf9" + }, + { + "system": "http://cdr.aacahb.gov.et/UAN", + "value": "UAN-642b83d3-a43c-41ef-a578-2b730f276bfb" + } + ], + "name": [ + { + "use": "official", + "family": "Rodrigues", + "given": ["Liniee"] + } + ], + "telecom": [ + { + "system": "phone", + "value": "+2519000000", + "use": "home" + } + ], + "gender": "female", + "birthDate": "1999-06-19", + "address": [ + { + "type": "physical", + "text": "Urban", + "state": "Addis Ababa", + "city": "Cherkos sub city", + "district": "10", + "line": ["17", "927/5"] + } + ], + "maritalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v3-MaritalStatus", + "code": "M", + "display": "Married" + } + ] + }, + "managingOrganization": { + "reference": "Organization/009a6a861c1b45778c0cbedadefe52a4" + } + }, + "request": { + "method": "PUT", + "url": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + } + }, + { + "resource": { + "resourceType": "Encounter", + "id": "13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481", + "status": "finished", + "extension": [ + { + "url": "http://cdr.aacahb.gov.et/visit-type", + "valueString": "Unscheduled" + }, + { + "url": "http://cdr.aacahb.gov.et/next-visit", + "valueDateTime": "2017-01-19" + } + ], + "identifier": [ + { + "system": "http://cdr.aacahb.gov.et/Encounter", + "value": "900326" + } + ], + "type": [ + { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "390906007" + } + ], + "text": "Follow-up encounter" + } + ], + "serviceType": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/service-type", + "code": "536", + "display": "Art therapy" + }, + { + "system": "http://snomed.info/sct", + "code": "65153003", + "display": "Art therapy" + } + ] + }, + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "period": { + "start": "2016-12-19", + "end": "2016-12-19" + } + }, + "request": { + "method": "PUT", + "url": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + } + }, + { + "resource": { + "resourceType": "MedicationStatement", + "id": "50d3b3fc-2c52-493f-8890-3eed413b1f66medStat481", + "status": "not-taken", + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "context": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "effectivePeriod": { + "start": "2016-12-22" + }, + "reasonCode": [ + { + "coding": [ + { + "system": "http://cdr.aacahb.gov.et/arv-therapy", + "code": "arv-treatment", + "display": "ARV Treatment started" + } + ], + "text": "ARV Treatment started" + } + ] + }, + "request": { + "method": "PUT", + "url": "MedicationStatement/50d3b3fc-2c52-493f-8890-3eed413b1f66medStat481" + } + }, + { + "resource": { + "resourceType": "MedicationDispense", + "id": "511f54b5-4f2d-4401-85fd-bfea7b2fa8bbMedDisp481", + "extension": [ + { + "url": "http://cdr.aacahb.gov.et/was-switched", + "valueBoolean": "false" + }, + { + "url": "http://cdr.aacahb.gov.et/switch-type", + "valueString": "1st switch" + }, + { + "url": "http://cdr.aacahb.gov.et/switch-reason", + "valueString": "Clinical failure" + }, + { + "url": "http://cdr.aacahb.gov.et/dose-end-date", + "valueDateTime": "2017-04-08" + } + ], + "status": "completed", + "statusReasonCodeableConcept": { + "coding": [ + { + "system": "http://cdr.aacahb.gov.et/medication-dispense/status-reason", + "code": "lost" + } + ] + }, + "context": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "medicationCodeableConcept": { + "coding": [ + { + "system": "http://cdr.aacahb.gov.et/hiv-regimen-codes", + "code": "1c" + } + ] + }, + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "quantity": { + "value": "168", + "system": "http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm", + "code": "Tablet", + "unit": "Tablet" + }, + "daysSupply": { + "value": "110", + "unit": "Day", + "system": "http://unitsofmeasure.org", + "code": "d" + } + }, + "request": { + "method": "PUT", + "url": "MedicationDispense/511f54b5-4f2d-4401-85fd-bfea7b2fa8bbMedDisp481" + } + }, + { + "resource": { + "resourceType": "QuestionnaireResponse", + "id": "fcc43c4a-03b5-4c62-87a4-43ace65d4a55PregnancyQuest481", + "questionnaire": "PregnancyStatus", + "status": "completed", + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "encounter": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "item": [ + { + "linkId": "pregnant", + "text": "Is Pregnant", + "answer": [ + { + "valueBoolean": "true", + "item": [ + { + "linkId": "pregnant.want-to-be-pregnant", + "text": "Want to be pregnant", + "answer": [ + { + "valueBoolean": false + } + ] + } + ] + } + ] + }, + { + "linkId": "is-breast-feeding", + "text": "Is breast feeding", + "answer": [ + { + "valueBoolean": "false" + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "QuestionnaireResponse/fcc43c4a-03b5-4c62-87a4-43ace65d4a55PregnancyQuest481" + } + }, + { + "resource": { + "resourceType": "QuestionnaireResponse", + "id": "66bb28b3-cd8a-400c-94a2-d669d2e47005ARTQuest481", + "questionnaire": "ARTEligibility", + "status": "completed", + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "source": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "encounter": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "item": [ + { + "linkId": "hiv-confirmation-date", + "text": "HIV Confirmed Date", + "answer": [ + { + "valueDate": "2016-03-15" + } + ] + }, + { + "linkId": "eligbility", + "item": [ + { + "linkId": "eligbility.eligbile", + "text": "Eligible for ART", + "answer": [ + { + "valueBoolean": true, + "item": [ + { + "linkId": "eligbility.eligbile.why", + "text": "Why Eligible", + "answer": [ + { + "valueString": "WHO HIV Clinical Stage 3 && 4,CD4 less than or equal to 500" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "QuestionnaireResponse/66bb28b3-cd8a-400c-94a2-d669d2e47005ARTQuest481" + } + }, + { + "resource": { + "resourceType": "Observation", + "id": "410ed3de-82e3-4086-b5bb-fa2f7dfa41baAdherence981", + "status": "final", + "encounter": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "partOf": [ + { + "reference": "MedicationDispense/511f54b5-4f2d-4401-85fd-bfea7b2fa8bbMedDisp481" + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "418633004", + "display": "Medication adherence" + } + ] + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "135818000", + "display": "Poor - grade" + } + ] + } + }, + "request": { + "method": "PUT", + "url": "Observation/410ed3de-82e3-4086-b5bb-fa2f7dfa41baAdherence981" + } + }, + { + "resource": { + "resourceType": "Observation", + "id": "190a54e9-b787-4b56-967b-0c929a1d6e31NutrtionalStatus481", + "status": "final", + "encounter": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "social-history", + "display": "Social History" + } + ] + } + ], + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "87276001", + "display": "Nutritional status" + } + ] + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "255604002", + "display": "Mild Malnutrition" + } + ] + } + }, + "request": { + "method": "PUT", + "url": "Observation/190a54e9-b787-4b56-967b-0c929a1d6e31NutrtionalStatus481" + } + }, + { + "resource": { + "resourceType": "Observation", + "id": "60601a7a-2031-4c43-8881-aaf959d3f3f8Weight481", + "status": "final", + "encounter": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ], + "text": "Vital Signs" + } + ], + "code": { + "coding": [ + { + "system": "http://loinc.org", + "code": "29463-7", + "display": "Body weight" + } + ], + "text": "Weight" + }, + "valueQuantity": { + "value": "39", + "unit": "kilogram", + "system": "http://unitsofmeasure.org", + "code": "kg" + } + }, + "request": { + "method": "PUT", + "url": "Observation/60601a7a-2031-4c43-8881-aaf959d3f3f8Weight481" + } + }, + { + "resource": { + "resourceType": "MedicationStatement", + "id": "4ba565ae-aab9-4009-a68d-a1afa6a5110aTbScreening481", + "extention": [ + { + "url": "http://cdr.aacahb.gov.et/TreatmentPhase", + "valueString": "INH1" + } + ], + "context": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "status": "stopped", + "category": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "699618001", + "display": "Tuberculosis preventive therapy" + } + ] + }, + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "effectivePeriod": { + "start": "2016-12-10", + "end": "2017-01-11" + }, + "reasonCode": [ + { + "coding": [ + { + "system": "http://cdr.aacahb.gov.et/prophylaxis-type", + "code": "continuous" + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "MedicationStatement/4ba565ae-aab9-4009-a68d-a1afa6a5110aTbScreening481" + } + }, + { + "resource": { + "resourceType": "MedicationStatement", + "id": "85823549-616c-4ed1-9f78-d385c4374072TbrxTreatment481", + "extention": [ + { + "url": "http://cdr.aacahb.gov.et/TreatmentPhase", + "valueString": "TBRx1" + } + ], + "context": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "status": "completed", + "category": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "tb-treatment", + "display": "TB Treatment" + } + ] + }, + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "effectivePeriod": { + "start": "2017-01-28", + "end": "2017-01-30" + }, + "reasonCode": [ + { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "56717001", + "display": "Tuberculosis (disorder)" + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "MedicationStatement/85823549-616c-4ed1-9f78-d385c4374072TbrxTreatment481" + } + }, + { + "resource": { + "resourceType": "MedicationStatement", + "id": "efc1a629-0e1a-4326-88e7-fbd0be2fe9dbCotrimoxazolTreatment481", + "extention": [ + { + "url": "http://cdr.aacahb.gov.et/Adherence-level", + "valueString": "good" + } + ], + "context": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "status": "active", + "medicationCodeableConcept": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "398731002", + "display": "Product containing sulfamethoxazole and trimethoprim" + } + ], + "text": "Co-trimoxazole" + }, + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "effectivePeriod": { + "start": "2016-11-10", + "end": "2016-11-20" + }, + "dosage": [ + { + "maxDosePerPeriod": { + "numerator": { + "value": 30, + "unit": "Dose", + "system": "http://unitsofmeasure.org", + "code": "Dose" + }, + "denominator": { + "value": 30, + "unit": "days", + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + } + ] + }, + "request": { + "method": "PUT", + "url": "MedicationStatement/efc1a629-0e1a-4326-88e7-fbd0be2fe9dbCotrimoxazolTreatment481" + } + }, + { + "resource": { + "resourceType": "MedicationStatement", + "id": "bf03f2eb-1fd0-4d45-972b-86c5969d33c4FluconazoleTreatment481", + "context": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "status": "active", + "medicationCodeableConcept": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "387174006", + "display": "Fluconazole" + } + ], + "text": "Fluconazole" + }, + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "effectivePeriod": { + "start": "2016-12-08", + "end": "2017-01-23" + } + }, + "request": { + "method": "PUT", + "url": "MedicationStatement/bf03f2eb-1fd0-4d45-972b-86c5969d33c4FluconazoleTreatment481" + } + }, + { + "resource": { + "resourceType": "DiagnosticReport", + "id": "1546df70-7168-4a2f-9f89-7e134d42c07eViralLoad481", + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0074", + "code": "LAB", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "315124004", + "display": "Human immunodeficiency virus viral load" + } + ], + "text": "viral load" + }, + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "encounter": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "effectivePeriod": { + "start": "2017-01-03", + "end": "2017-01-13" + }, + "conclusion": "Suppressed" + }, + "request": { + "method": "PUT", + "url": "DiagnosticReport/1546df70-7168-4a2f-9f89-7e134d42c07eViralLoad481" + } + }, + { + "resource": { + "resourceType": "QuestionnaireResponse", + "id": "141326b1-27f1-4c5e-9553-0bdccab9dc40ASM481", + "questionnaire": "AppointmentSpacingModel", + "status": "completed", + "encounter": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "item": [ + { + "linkId": "assessment", + "item": [ + { + "linkId": "assessment.assessed", + "text": "Assessed For ASM", + "answer": [ + { + "valueBoolean": "false" + } + ] + }, + { + "linkId": "assessment.date", + "text": "Assessed Date", + "answer": [ + { + "valueBoolean": "false" + } + ] + } + ] + }, + { + "linkId": "category", + "text": "Category", + "answer": [ + { + "valueString": "Category 4e" + } + ] + }, + { + "linkId": "eligible", + "text": "Is Eligible For ASM", + "answer": [ + { + "valueBoolean": "false" + } + ] + }, + { + "linkId": "counseled", + "text": "Counseled", + "answer": [ + { + "valueBoolean": "true" + } + ] + }, + { + "linkId": "enrollment", + "item": [ + { + "linkId": "enrollment.agree", + "text": "Agree To Be Enrolled", + "answer": [ + { + "valueBoolean": "true" + } + ] + }, + { + "linkId": "enrollment.enrolled", + "text": "Enrolled To ASM", + "answer": [ + { + "valueBoolean": "true" + } + ] + }, + { + "linkId": "enrollment.reason", + "text": "Reason Not Enrolled To ASM", + "answer": [ + { + "valueString": "Drug Stock Out" + } + ] + }, + { + "linkId": "enrollment.date", + "text": "Enrollment Date", + "answer": [ + { + "valueDate": "2016-12-31" + } + ] + } + ] + }, + { + "linkId": "couple-enrollment", + "item": [ + { + "linkId": "couple-enrollment.enrolled", + "text": "Couple Enrolled To ASM", + "answer": [ + { + "valueBoolean": "true" + } + ] + }, + { + "linkId": "couple-enrollment.uat-no", + "text": "Couple UAT No", + "answer": [ + { + "valueString": "14097912" + } + ] + } + ] + }, + { + "linkId": "new-category-change", + "item": [ + { + "linkId": "new-category-change.type", + "text": "New Category Change", + "answer": [ + { + "valueBoolean": "false" + } + ] + }, + { + "linkId": "new-category-change.reason", + "text": "Reason For Category Change", + "answer": [ + { + "valueBoolean": "false" + } + ] + }, + { + "linkId": "new-category-change.date", + "text": "Category Change Date", + "answer": [ + { + "valueBoolean": "false" + } + ] + } + ] + }, + { + "linkId": "termination", + "item": [ + { + "linkId": "termination.terminated", + "text": "Terminated From ASM", + "answer": [ + { + "valueBoolean": "true" + } + ] + }, + { + "linkId": "termination.reason", + "text": "Reason For Termination", + "answer": [ + { + "valueString": "Lost from follow up" + } + ] + }, + { + "linkId": "termination.date", + "text": "Terminated Date", + "answer": [ + { + "valueDate": "2016-12-27" + } + ] + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "QuestionnaireResponse/141326b1-27f1-4c5e-9553-0bdccab9dc40ASM481" + } + }, + { + "resource": { + "resourceType": "CarePlan", + "id": "691dac7c-ead7-4bfa-bd7c-32f33d10f4c4CarePlan481", + "category": [ + { + "coding": [ + { + "system": "http://cdr.aacahb.gov.et/care-plan", + "code": "hiv-positive-tracking", + "display": "HIV Positive Tracking" + } + ] + } + ], + "status": "active", + "intent": "order", + "created": "2016-12-14", + "period": { + "start": "2016-12-19", + "end": "2020-09-13" + }, + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "supportingInfo": { + "reference": "ServiceRequest/5366affa-0576-41a1-931b-aa6e3c64894dServiceRequest481" + }, + "activity": [ + { + "detail": { + "code": { + "coding": [ + { + "system": "http://cdr.aacahb.gov.et/tracking", + "code": "started-art", + "display": "Started ART" + } + ] + }, + "status": "not-started", + "statusReason": { + "coding": [ + { + "system": "http://cdr.aacahb.gov.et/tracking/status-reason", + "code": "on-oi-management" + } + ] + }, + "description": "Address adherence barriers" + } + }, + { + "detail": { + "code": { + "coding": [ + { + "system": "http://cdr.aacahb.gov.et/tracking", + "code": "linked-to-care", + "display": "Linked to care and treatment" + } + ] + }, + "status": "not-started", + "scheduledPeriod": { + "valueBoolean": "false" + } + } + }, + { + "extension": [ + { + "url": "http://cdr.aacahb.gov.et/FinalOutcomeKnown", + "valueBoolean": "true" + } + ], + "outcomeCodeableConcept": [ + { + "coding": [ + { + "system": "http://cdr.aacahb.gov.et/final-outcome", + "code": "confirmed-referral", + "display": "Confirmed referral" + } + ] + } + ], + "detail": { + "code": { + "coding": [ + { + "system": "http://cdr.aacahb.gov.et/tracking", + "code": "final-outcome", + "display": "Final Outcome" + } + ] + }, + "kind": "ServiceRequest", + "location": { + "display": "Teklehaymanot medium clinic" + }, + "scheduledPeriod": { + "start": "2017-01-12" + } + } + } + ] + }, + "request": { + "method": "PUT", + "url": "CarePlan/691dac7c-ead7-4bfa-bd7c-32f33d10f4c4CarePlan481" + } + }, + { + "resource": { + "resourceType": "Observation", + "id": "280ecb76-0f77-48ab-b1fd-4aa59fa91925ViralLoadResult480", + "status": "final", + "identifier": [ + { + "system": "http://cdr.aacahb.gov.et/Laoratory", + "value": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + } + ], + "encounter": { + "reference": "Encounter/13588dce-9c0d-4ac1-959f-3a9f49b0d573encounter481" + }, + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "315124004", + "display": "Human immunodeficiency virus viral load" + } + ], + "text": "Viral load count" + }, + "valueQuantity": { + "value": "1100", + "unit": "Count", + "system": "http://unitsofmeasure.org", + "code": "{Count}" + } + }, + "request": { + "method": "PUT", + "url": "Observation/280ecb76-0f77-48ab-b1fd-4aa59fa91925ViralLoadResult461" + } + }, + { + "resource": { + "resourceType": "ServiceRequest", + "id": "5366affa-0576-41a1-931b-aa6e3c64894dServiceRequest481", + "basedOn": [ + { + "reference": "CarePlan/691dac7c-ead7-4bfa-bd7c-32f33d10f4c4CarePlan481" + } + ], + "status": "active", + "code": { + "text": "From Within Facility", + "coding": [ + { + "display": "Internal facility referral or transfer", + "system": "http://loinc.org", + "code": "LA9328-1" + } + ] + }, + "locationCode": [ + { + "text": "Homenickmouth" + } + ], + "intent": "plan", + "subject": { + "reference": "Patient/642b83d3-a43c-41ef-a578-2b730f276bfb" + } + }, + "request": { + "method": "PUT", + "url": "ServiceRequest/5366affa-0576-41a1-931b-aa6e3c64894dServiceRequest481" + } + } + ] +} diff --git a/test/cucumber/features/resources/organization.json b/test/cucumber/features/resources/organization.json new file mode 100644 index 00000000..4d11a798 --- /dev/null +++ b/test/cucumber/features/resources/organization.json @@ -0,0 +1,339 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "resource": { + "resourceType": "Organization", + "id": "009a6a861c1b45778c0cbedadefe52a4", + "identifier": [ + { + "system": "http://cdr.aacahb.gov.et/MOHId", + "value": "141010063" + }, + { + "system": "http://cdr.aacahb.gov.et/HFUID", + "value": "xQcwHlb5f7a" + } + ], + "active": true, + "type": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/organization-type", + "code": "prov", + "display": "Healthcare Provider" + } + ] + } + ], + "name": "Teklehaymanot medium clinic", + "telecom": [ + { + "system": "phone", + "value": "+2519000003", + "use": "work" + } + ], + "address": [ + { + "type": "physical", + "text": "Urban", + "state": "Addis Ababa", + "city": "Cherkos sub city", + "district": "10", + "line": ["17", "927/5"] + } + ] + }, + "request": { + "method": "PUT", + "url": "Organization/009a6a861c1b45778c0cbedadefe52a4" + } + }, + { + "resource": { + "resourceType": "Organization", + "id": "878066e1-cca1-406e-ab74-fe49040aeec0", + "identifier": [ + { + "system": "http://cdr.aacahb.gov.et/MOHId", + "value": "111" + }, + { + "system": "http://cdr.aacahb.gov.et/HFUID", + "value": "DGjspVpNRWY" + } + ], + "active": true, + "type": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/organization-type", + "code": "prov", + "display": "Healthcare Provider" + } + ] + } + ], + "name": "22 Maazoria Higher Clinic", + "telecom": [ + { + "system": "phone", + "value": "+2519000003", + "use": "work" + } + ], + "address": [ + { + "type": "physical", + "text": "Urban", + "state": "Addis Ababa", + "city": "Bole Sub City", + "district": "10", + "line": ["17", "927/5"] + } + ] + }, + "request": { + "method": "PUT", + "url": "Organization/878066e1-cca1-406e-ab74-fe49040aeec0" + } + }, + { + "resource": { + "resourceType": "Organization", + "id": "90e0848e-0674-4f3d-af15-8b2f43530453", + "identifier": [ + { + "system": "http://cdr.aacahb.gov.et/MOHId", + "value": "222" + }, + { + "system": "http://cdr.aacahb.gov.et/HFUID", + "value": "zHir1atyWSU" + } + ], + "active": true, + "type": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/organization-type", + "code": "prov", + "display": "Healthcare Provider" + } + ] + } + ], + "name": "3S Pedatric Specality Clinc", + "telecom": [ + { + "system": "phone", + "value": "+2519000003", + "use": "work" + } + ], + "address": [ + { + "type": "physical", + "text": "Urban", + "state": "Addis Ababa", + "city": "Lideta Sub City", + "district": "10", + "line": ["17", "927/5"] + } + ] + }, + "request": { + "method": "PUT", + "url": "Organization/90e0848e-0674-4f3d-af15-8b2f43530453" + } + }, + { + "resource": { + "meta": { + "versionId": "1", + "lastUpdated": "2021-09-27T12:36:43.000+00:00", + "source": "#qlEFrVn4Kr0jUJJT" + }, + "active": true, + "id": "18d5a42102424a9586867549b5abb350", + "resourceType": "Organization", + "identifier": [ + { + "system": "http://cdr.aacahb.gov.et/MOHId", + "value": "141050012" + }, + { + "system": "http://cdr.aacahb.gov.et/HFUID" + } + ], + "type": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/organization-type", + "display": "Healthcare Provider", + "code": "prov" + } + ] + } + ], + "address": [ + { + "city": "Horo Gudru Welega", + "state": "Oromia", + "line": ["Ref Balcha Hamile"], + "district": "Hababo Gudru" + } + ], + "name": "Dj Balcha Hospital" + }, + "request": { + "method": "PUT", + "url": "Organization/18d5a42102424a9586867549b5abb350" + } + }, + { + "resource": { + "meta": { + "versionId": "1", + "lastUpdated": "2021-09-27T12:41:09.000+00:00", + "source": "#40prM4CLrTYzFp8d" + }, + "active": true, + "id": "b6e9f3f4307c4d12914a4ceba24f9217", + "resourceType": "Organization", + "identifier": [ + { + "system": "http://cdr.aacahb.gov.et/MOHId", + "value": "306120023" + }, + { + "system": "http://cdr.aacahb.gov.et/HFUID", + "value": "KZfdQbGXABc" + } + ], + "type": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/organization-type", + "display": "Healthcare Provider", + "code": "prov" + } + ] + } + ], + "address": [ + { + "city": "East Gojam", + "state": "Amhara", + "line": ["Ref Balcha Hamile"], + "district": "Awabel" + } + ], + "name": "Wojel Health Center" + }, + "request": { + "method": "PUT", + "url": "Organization/b6e9f3f4307c4d12914a4ceba24f9217" + } + }, + { + "resource": { + "meta": { + "versionId": "1", + "lastUpdated": "2021-09-27T12:49:09.000+00:00", + "source": "#SM7EDfMuLn9ehHd0" + }, + "active": true, + "id": "7c18655bec4542fd8d323045b8d953d4", + "resourceType": "Organization", + "identifier": [ + { + "system": "http://cdr.aacahb.gov.et/MOHId", + "value": "419040024" + }, + { + "system": "http://cdr.aacahb.gov.et/HFUID", + "value": "JsM59TuriZg" + } + ], + "type": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/organization-type", + "display": "Healthcare Provider", + "code": "prov" + } + ] + } + ], + "address": [ + { + "city": "Horo Gudru Welega", + "state": "Oromia", + "line": ["Ref Toko Tane Hamile"], + "district": "Hababo Gudru" + } + ], + "name": "Kenate Biya Health Center" + }, + "request": { + "method": "PUT", + "url": "Organization/7c18655bec4542fd8d323045b8d953d4" + } + }, + { + "resource": { + "meta": { + "versionId": "1", + "lastUpdated": "2021-09-27T12:55:13.000+00:00", + "source": "#A2NbGgtGWC0lO6j8" + }, + "active": true, + "id": "1490b3ca120c457b998b8d5b719d8378", + "resourceType": "Organization", + "identifier": [ + { + "system": "http://cdr.aacahb.gov.et/MOHId", + "value": "204050011" + }, + { + "system": "http://cdr.aacahb.gov.et/HFUID", + "value": "MxsObjvc3WV" + } + ], + "type": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/organization-type", + "display": "Healthcare Provider", + "code": "prov" + } + ] + } + ], + "address": [ + { + "city": "Fanti (zone 4)", + "state": "Afar", + "line": ["Kebele 01"], + "district": "Golina" + } + ], + "name": "Kelewan District Hospital" + }, + "request": { + "method": "PUT", + "url": "Organization/1490b3ca120c457b998b8d5b719d8378" + } + } + ] +} diff --git a/test/cucumber/features/single-mode/cdr.feature b/test/cucumber/features/single-mode/cdr.feature new file mode 100644 index 00000000..1bfd829d --- /dev/null +++ b/test/cucumber/features/single-mode/cdr.feature @@ -0,0 +1,69 @@ +Feature: CDR recipe? + Does the recipe work as expected + +Scenario: Init the CDR recipe + Given I use parameters "package init -p cdr --dev --env-file=cdr.env" + When I launch the platform with params + Then The service "mongo-1" should be started with 1 replica + And The service "openhim-core" should be started with 1 replica + And The service "openhim-console" should be started with 1 replica + And The service "postgres-1" should be started with 1 replica + And The service "hapi-fhir" should be started with 1 replica + And The service "kafka-01" should be started with 1 replica + And The service "kafdrop" should be started with 1 replica + And The service "kafka-minion" should be started with 1 replica + And The service "keycloak-postgres-1" should be started with 1 replica + And The service "identity-access-manager-keycloak" should be started with 1 replica + And The service "jempi-ratel" should be started with 1 replica + And The service "jempi-alpha-01" should be started with 1 replica + And The service "jempi-alpha-02" should be started with 1 replica + And The service "jempi-alpha-03" should be started with 1 replica + And The service "jempi-zero-01" should be started with 1 replica + And The service "jempi-async-receiver" should be started with 1 replica + And The service "kafka-unbundler-consumer" should be started with 1 replica + And The service "mpi-mediator" should be started with 1 replica + And The service "openhim-mapping-mediator" should be started with 1 replica + And The service "grafana" should be started with 1 replica + And The service "prometheus" should be started with 1 replica + And The service "cadvisor" should be started with 1 replica + And The service "node-exporter" should be started with 1 replica + And The service "cadvisor" should have healthy containers + And The service "loki" should be started with 1 replica + And The service "promtail" should be started with 1 replica + And The service "minio-01" should be started with 1 replica + +Scenario: Send Fhir bundle and store the clinical data in the Fhir datastore, and the patient info in the CR + Given I have configured the cdr + When I send a fhir patient bundle + Then the clinical data should be stored in hapi fhir + And the patient data in the Jempi client registry + +Scenario: Fetch International Patient summary (IPS) + When I then send a fhir patient summary request + Then I should get a successful summary response + +Scenario: Fetch everything for a patient (all the clinical data) + When I then send a request for all the patient's clinical data + Then I should get a successful everything response + +Scenario: Bring down the servers + Given I use parameters "package down -p cdr --dev --env-file=cdr.env" + When I launch the platform with params + Then a request to fetch data from the cdr should fail + +Scenario: Bring up the servers and test + Given I use parameters "package up -p cdr --dev --env-file=cdr.env" + When I launch the platform with params + Then The service "mongo-1" should be started with 1 replica + And The service "openhim-core" should be started with 1 replica + And The service "openhim-console" should be started with 1 replica + And The service "postgres-1" should be started with 1 replica + And The service "hapi-fhir" should be started with 1 replica + When I then send a request for all the patient's clinical data + Then I should get a successful everything response + +Scenario: Destroy the services + Given I use parameters "package remove -p cdr --dev --env-file=cdr.env" + When I launch the platform with params + Then There should be 0 service + And There should be 0 volume diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js new file mode 100644 index 00000000..1fc08d60 --- /dev/null +++ b/test/cucumber/features/steps/recipesSteps.js @@ -0,0 +1,91 @@ +"use strict" + +const axios = require("axios"); +const fs = require("fs"); +const path = require('path'); +const chai = require("chai"); +const { ClickHouse } = require('clickhouse'); +const { Given, When, Then, setDefaultTimeout } = require("@cucumber/cucumber"); +setDefaultTimeout(30 * 60 * 1000); + +const CLICKHOUSE_HOST = + process.env.CLICKHOUSE_HOST || 'analytics-datastore-clickhouse'; +const CLICKHOUSE_PORT = parseInt(process.env.CLICKHOUSE_PORT || '8123'); +const CLICKHOUSE_DEBUG = Boolean(process.env.CLICKHOUSE_DEBUG || false); + +const { expect } = chai; + +const clickhouse = new ClickHouse({ + url: CLICKHOUSE_HOST, + port: CLICKHOUSE_PORT, + debug: CLICKHOUSE_DEBUG, + raw: true, +}); + +const sendRequest = (url, method='POST', data={}) => { + return axios({ + url, + headers: { + 'Content-Type': 'application/fhir+json', + Authorization: `Custom test` + }, + data, + method + }) +}; + +let PatientID; + +Given("I have configured the cdr", async function () { + const organization = JSON.parse( + fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'organization.json')) + ); + + this.cdrConfigResult = await sendRequest('http://localhost:5001/fhir', 'POST', organization); +}); + +When("I send a fhir patient bundle", async function () { + const fhirBundle = JSON.parse( + fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'fhirBundle.json')) + ); + + this.fhirBundleSentResult = await sendRequest('http://localhost:5001/fhir', 'POST', fhirBundle); +}); + +When("I then send a fhir patient summary request", async function () { + this.IPSResult = await sendRequest(`http://localhost:5001/fhir/Patient/${PatientID}/$summary`, 'GET'); +}); + +When("I then send a request for all the patient's clinical data", async function () { + this.EverythingResult = await sendRequest(`http://localhost:5001/fhir/Patient/${PatientID}/$everything`, 'GET'); +}); + +Then("the clinical data should be stored in hapi fhir", async function () { + this.fhirBundleSentResult.data.entry.forEach(rec => { + expect(rec.response.status).to.match(/201|200/); + }); +}); + +Then("the patient data in the Jempi client registry", async function () { + const patientResource = this.fhirBundleSentResult.data.entry.filter(rec => rec.response.location.match('Patient'))[0]; + + PatientID = patientResource.response.location.split('/')[1]; + + const patient = await sendRequest(`http://localhost:3003/fhir/links/Patient/${PatientID}`, 'GET'); + + expect(patient.data.link.filter(pat => pat.other.reference.match(`Patient/${PatientID}`)).length).to.equal(1); +}); + +Then("I should get a successful summary response", function () { + expect(this.IPSResult.data.total).to.be.greaterThan(0); +}); + +Then("I should get a successful everything response", function () { + expect(this.EverythingResult.data.total).to.be.greaterThan(0); +}); + +Then("a request to fetch data from the cdr should fail", async function () { + await sendRequest(`http://localhost:3003/fhir/links/Patient/${PatientID}`).catch(err => { + expect(err.message).to.match(/ECONNREFUSED/); + }); +}); From eca611d897464fec0a25b9ee54b0149c404fc893 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 4 Apr 2024 19:53:48 +0200 Subject: [PATCH 02/53] Use version that exists --- interoperability-layer-openhim/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interoperability-layer-openhim/docker-compose.yml b/interoperability-layer-openhim/docker-compose.yml index 2a2073f3..b4ce2dde 100644 --- a/interoperability-layer-openhim/docker-compose.yml +++ b/interoperability-layer-openhim/docker-compose.yml @@ -39,7 +39,7 @@ services: - prometheus-port=8080 openhim-console: - image: jembi/openhim-console:v1.19.0 + image: jembi/openhim-console:v1.18.2 environment: OPENHIM_CORE_MEDIATOR_HOSTNAME: ${OPENHIM_CORE_MEDIATOR_HOSTNAME} OPENHIM_MEDIATOR_API_PORT: ${OPENHIM_MEDIATOR_API_PORT} From 7640bc04a9fbbaa6df03ced18a80fdc9b530867b Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 4 Apr 2024 19:58:21 +0200 Subject: [PATCH 03/53] Add axios dependency Used for sending requests in the functional tests --- test/cucumber/package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/cucumber/package.json b/test/cucumber/package.json index b9684654..a0a1c4a2 100644 --- a/test/cucumber/package.json +++ b/test/cucumber/package.json @@ -4,7 +4,9 @@ "description": "A package to test the platform", "scripts": { "test:single": "cucumber-js 'features/single-mode/**/*.feature'", + "test:single:cdr-recipe": "cucumber-js 'features/single-mode/cdr.feature'", "test:cluster": "cucumber-js 'features/cluster-mode/**/*.feature'", + "test:cluser:cdr-recipe": "cucumber-js 'features/cluster-mode/cdr.feature'", "test:single:clickhouse": "cucumber-js 'features/single-mode/clickhouse.feature'", "test:cluster:clickhouse": "cucumber-js 'features/cluster-mode/clickhouse.cluster.feature'", "test:single:elk": "cucumber-js 'features/single-mode/elastic-packages.feature'", @@ -31,6 +33,7 @@ }, "devDependencies": { "@cucumber/cucumber": "8.5.0", + "axios": "^1.6.8", "chai": "4.3.6", "chai-arrays": "2.2.0", "chai-things": "0.2.0", From fb8641e7e45e489a638d5757af10ac302d9c8cb2 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 4 Apr 2024 20:11:31 +0200 Subject: [PATCH 04/53] Run the cdr recipe tests Run the tests on for every pr created --- .github/workflows/run-tests.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/run-tests.sh b/.github/workflows/run-tests.sh index a144aa89..e69d51b9 100755 --- a/.github/workflows/run-tests.sh +++ b/.github/workflows/run-tests.sh @@ -26,10 +26,13 @@ for package in "${CHANGED_FILES[@]}"; do done if [[ ${#changed_packages[@]} -eq 0 ]] || [[ "${!changed_packages[*]}" == *"utils"* ]]; then + cdr_recipe="true" DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE" elif [[ "${!changed_packages[*]}" == *"features/single-mode"* ]] && [[ $NODE_MODE == "single" ]]; then + cdr_recipe="true" DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:single elif [[ "${!changed_packages[*]}" == *"features/cluster-mode"* ]] && [[ $NODE_MODE == "cluster" ]]; then + cdr_recipe="true" DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:cluster elif [[ "${!changed_packages[*]}" == *"infrastructure"* ]] && [[ $openhimRan == "false" ]]; then openhimRan="true" @@ -67,4 +70,8 @@ else DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":jempi fi done + +# Run the basic funtional end to end tests for the CDR recipe +if [[ $cdr_recipe !== "true" ]]; then + DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":cdr fi From 8693124b80a072611a37d01cdda402657a2da900 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Wed, 10 Apr 2024 14:10:44 +0200 Subject: [PATCH 05/53] Fix the superset keycloak integration config The new versions had a bug. Connecting to keycloak was not happening. --- dashboard-visualiser-superset/config/requirements-local.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dashboard-visualiser-superset/config/requirements-local.txt b/dashboard-visualiser-superset/config/requirements-local.txt index d545505f..f42562d3 100644 --- a/dashboard-visualiser-superset/config/requirements-local.txt +++ b/dashboard-visualiser-superset/config/requirements-local.txt @@ -1,5 +1,5 @@ psycopg2>=2.9.9 clickhouse-connect>=0.7.0 -flask-oidc>=1.3.0 -itsdangerous>=2.0.1 -flask_openid>=1.3.0 +flask-oidc==1.3.0 +itsdangerous==2.0.1 +flask_openid==1.3.0 From 0ab08dd2036491c1d881b368c8f2b01e99a0df0a Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Wed, 10 Apr 2024 14:14:45 +0200 Subject: [PATCH 06/53] Use latest version of mpi-mediator --- mpi-mediator/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mpi-mediator/docker-compose.yml b/mpi-mediator/docker-compose.yml index 7d5a295e..084d7e39 100644 --- a/mpi-mediator/docker-compose.yml +++ b/mpi-mediator/docker-compose.yml @@ -2,7 +2,7 @@ version: '3.9' services: mpi-mediator: - image: jembi/mpi-mediator:v2.1.0 + image: jembi/mpi-mediator:v2.1.1 networks: openhim: kafka: From 601d67492b8fb7cc3ebaf80bfb16c2db76897b73 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Wed, 10 Apr 2024 14:16:14 +0200 Subject: [PATCH 07/53] Add tests for the dataware house This adds tests for the dataware house. Tests that data is send through and can be retrieved from the jempi, hapi-fhir and clickhouse --- ...cluster.feature => recipe.cluster.feature} | 12 +- .../{cdr.feature => recipe.feature} | 17 +- test/cucumber/features/steps/recipesSteps.js | 19 +- test/cucumber/package.json | 5 +- test/cucumber/yarn.lock | 2231 ++++++++++------- 5 files changed, 1334 insertions(+), 950 deletions(-) rename test/cucumber/features/cluster-mode/{cdr.cluster.feature => recipe.cluster.feature} (76%) rename test/cucumber/features/single-mode/{cdr.feature => recipe.feature} (82%) diff --git a/test/cucumber/features/cluster-mode/cdr.cluster.feature b/test/cucumber/features/cluster-mode/recipe.cluster.feature similarity index 76% rename from test/cucumber/features/cluster-mode/cdr.cluster.feature rename to test/cucumber/features/cluster-mode/recipe.cluster.feature index ac1d1851..d3e3a8a8 100644 --- a/test/cucumber/features/cluster-mode/cdr.cluster.feature +++ b/test/cucumber/features/cluster-mode/recipe.cluster.feature @@ -2,17 +2,20 @@ Feature: CDR recipe? Does the recipe work as expected Scenario: Init the CDR recipe - Given I use parameters "package init -p cdr --dev --env-file=.env.cluster" + Given I use parameters "package init -p cdr-dw --dev --env-file=.env.cluster" When I launch the platform with params Then The service "mongo-1" should be started with 1 replica And The service "openhim-core" should be started with 3 replica And The service "openhim-console" should be started with 3 replica + And The service "kafka-unbundler-consumer" should be started with 1 replica + And The service "kafka-mapper-consumer" should be started with 1 replica Scenario: Send Fhir bundle and store the clinical data in the Fhir datastore, and the patient info in the CR Given I have configured the cdr When I send a fhir patient bundle Then the clinical data should be stored in hapi fhir And the patient data in the Jempi client registry + And the data should be stored in clickhouse Scenario: Fetch International Patient summary (IPS) When I send a fhir patient bundle @@ -25,12 +28,12 @@ Scenario: Fetch everything for a patient (all the clinical data) Then I should get a successful everything response Scenario: Bring down the servers - Given I use parameters "package down -p cdr --dev --env-file=cdr.env" + Given I use parameters "package down -p cdr-dw --dev --env-file=.env.cluster" When I launch the platform with params Then a request to fetch data from the cdr should fail Scenario: Bring up the servers and test - Given I use parameters "package up -p cdr --dev --env-file=cdr.env" + Given I use parameters "package up -p cdr-dw --dev --env-file=.env.cluster" When I launch the platform with params Then The service "mongo-1" should be started with 1 replica And The service "openhim-core" should be started with 3 replica @@ -39,9 +42,10 @@ Scenario: Bring up the servers and test And The service "hapi-fhir" should be started with 3 replica When I then send a request for all the patient's clinical data Then I should get a successful everything response + And the data should be stored in clickhouse Scenario: Destroy the services - Given I use parameters "package remove -p cdr --dev --env-file=cdr.env" + Given I use parameters "package remove -p cdr-dw --dev --env-file=.env.cluster" When I launch the platform with params Then There should be 0 service And There should be 0 volume diff --git a/test/cucumber/features/single-mode/cdr.feature b/test/cucumber/features/single-mode/recipe.feature similarity index 82% rename from test/cucumber/features/single-mode/cdr.feature rename to test/cucumber/features/single-mode/recipe.feature index 1bfd829d..cd16eb65 100644 --- a/test/cucumber/features/single-mode/cdr.feature +++ b/test/cucumber/features/single-mode/recipe.feature @@ -1,8 +1,8 @@ -Feature: CDR recipe? +Feature: CDR-DW recipe? Does the recipe work as expected Scenario: Init the CDR recipe - Given I use parameters "package init -p cdr --dev --env-file=cdr.env" + Given I use parameters "package init -p cdr-dw --dev --env-file=cdr-dw.env" When I launch the platform with params Then The service "mongo-1" should be started with 1 replica And The service "openhim-core" should be started with 1 replica @@ -21,6 +21,7 @@ Scenario: Init the CDR recipe And The service "jempi-zero-01" should be started with 1 replica And The service "jempi-async-receiver" should be started with 1 replica And The service "kafka-unbundler-consumer" should be started with 1 replica + And The service "kafka-mapper-consumer" should be started with 1 replica And The service "mpi-mediator" should be started with 1 replica And The service "openhim-mapping-mediator" should be started with 1 replica And The service "grafana" should be started with 1 replica @@ -31,12 +32,15 @@ Scenario: Init the CDR recipe And The service "loki" should be started with 1 replica And The service "promtail" should be started with 1 replica And The service "minio-01" should be started with 1 replica + And The service "dashboard-visualiser-superset" should be started with 1 replica + And The service "analytics-datastore-clickhouse" should be started with 1 replica -Scenario: Send Fhir bundle and store the clinical data in the Fhir datastore, and the patient info in the CR +Scenario: Send Fhir bundle and store the clinical data in the Fhir datastore, the patient info in the CR Given I have configured the cdr When I send a fhir patient bundle Then the clinical data should be stored in hapi fhir And the patient data in the Jempi client registry + And the data should be stored in clickhouse Scenario: Fetch International Patient summary (IPS) When I then send a fhir patient summary request @@ -47,12 +51,12 @@ Scenario: Fetch everything for a patient (all the clinical data) Then I should get a successful everything response Scenario: Bring down the servers - Given I use parameters "package down -p cdr --dev --env-file=cdr.env" + Given I use parameters "package down -p cdr-dw --dev --env-file=cdr-dw.env" When I launch the platform with params Then a request to fetch data from the cdr should fail Scenario: Bring up the servers and test - Given I use parameters "package up -p cdr --dev --env-file=cdr.env" + Given I use parameters "package up -p cdr-dw --dev --env-file=cdr-dw.env" When I launch the platform with params Then The service "mongo-1" should be started with 1 replica And The service "openhim-core" should be started with 1 replica @@ -61,9 +65,10 @@ Scenario: Bring up the servers and test And The service "hapi-fhir" should be started with 1 replica When I then send a request for all the patient's clinical data Then I should get a successful everything response + And the data should be stored in clickhouse Scenario: Destroy the services - Given I use parameters "package remove -p cdr --dev --env-file=cdr.env" + Given I use parameters "package remove -p cdr-dw --dev --env-file=cdr-dw.env" When I launch the platform with params Then There should be 0 service And There should be 0 volume diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 1fc08d60..5a358ba0 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -9,8 +9,8 @@ const { Given, When, Then, setDefaultTimeout } = require("@cucumber/cucumber"); setDefaultTimeout(30 * 60 * 1000); const CLICKHOUSE_HOST = - process.env.CLICKHOUSE_HOST || 'analytics-datastore-clickhouse'; -const CLICKHOUSE_PORT = parseInt(process.env.CLICKHOUSE_PORT || '8123'); + process.env.CLICKHOUSE_HOST || 'localhost'; +const CLICKHOUSE_PORT = parseInt(process.env.CLICKHOUSE_PORT || '8124'); const CLICKHOUSE_DEBUG = Boolean(process.env.CLICKHOUSE_DEBUG || false); const { expect } = chai; @@ -22,6 +22,8 @@ const clickhouse = new ClickHouse({ raw: true, }); +const query = table => `SELECT * FROM ${table}`; + const sendRequest = (url, method='POST', data={}) => { return axios({ url, @@ -89,3 +91,16 @@ Then("a request to fetch data from the cdr should fail", async function () { expect(err.message).to.match(/ECONNREFUSED/); }); }); + +Then("the data should be stored in clickhouse", async function () { + const patient = await clickhouse.query( + query("patient_example"), + ).toPromise(); + const observation = await clickhouse.query( + query("observation_example") + ).toPromise(); + + + expect(JSON.parse(patient).rows).to.be.greaterThan(0); + expect(JSON.parse(observation).rows).to.be.greaterThan(0); +}); diff --git a/test/cucumber/package.json b/test/cucumber/package.json index a0a1c4a2..ddd7786a 100644 --- a/test/cucumber/package.json +++ b/test/cucumber/package.json @@ -4,9 +4,9 @@ "description": "A package to test the platform", "scripts": { "test:single": "cucumber-js 'features/single-mode/**/*.feature'", - "test:single:cdr-recipe": "cucumber-js 'features/single-mode/cdr.feature'", + "test:single:recipe": "cucumber-js 'features/single-mode/recipe.feature'", "test:cluster": "cucumber-js 'features/cluster-mode/**/*.feature'", - "test:cluser:cdr-recipe": "cucumber-js 'features/cluster-mode/cdr.feature'", + "test:cluser:recipe": "cucumber-js 'features/cluster-mode/recipe.feature'", "test:single:clickhouse": "cucumber-js 'features/single-mode/clickhouse.feature'", "test:cluster:clickhouse": "cucumber-js 'features/cluster-mode/clickhouse.cluster.feature'", "test:single:elk": "cucumber-js 'features/single-mode/elastic-packages.feature'", @@ -37,6 +37,7 @@ "chai": "4.3.6", "chai-arrays": "2.2.0", "chai-things": "0.2.0", + "clickhouse": "^2.6.0", "dockerode": "3.3.2" } } diff --git a/test/cucumber/yarn.lock b/test/cucumber/yarn.lock index 548e8686..0246101d 100644 --- a/test/cucumber/yarn.lock +++ b/test/cucumber/yarn.lock @@ -3,40 +3,40 @@ "@babel/runtime@^7.15.4": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" - integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== + "integrity" "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==" + "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz" + "version" "7.22.6" dependencies: - regenerator-runtime "^0.13.4" + "regenerator-runtime" "^0.13.11" "@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "integrity" "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + "resolved" "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + "version" "1.5.0" "@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + "integrity" "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==" + "resolved" "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + "version" "0.8.1" dependencies: "@jridgewell/trace-mapping" "0.3.9" "@cucumber/ci-environment@9.0.4": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@cucumber/ci-environment/-/ci-environment-9.0.4.tgz#12cb8335905cbaa5029d43006eaa69f9e1b05ec5" - integrity sha512-da6H/wtVerhGUP4OCWTOmbNd4+gC1FhAcLzYgn6O68HgQbMwkmV3M8AwtbQWZkfF+Ph7z0M/UQYYdNIDu5V5MA== + "integrity" "sha512-da6H/wtVerhGUP4OCWTOmbNd4+gC1FhAcLzYgn6O68HgQbMwkmV3M8AwtbQWZkfF+Ph7z0M/UQYYdNIDu5V5MA==" + "resolved" "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-9.0.4.tgz" + "version" "9.0.4" "@cucumber/cucumber-expressions@16.0.0": - version "16.0.0" - resolved "https://registry.yarnpkg.com/@cucumber/cucumber-expressions/-/cucumber-expressions-16.0.0.tgz#f8bc43da26f12db8f0d74ff3031a881e4fa4516d" - integrity sha512-HTh+Pg7oQ5aLuCkSbD2Q6jBaE40M3R/XaLEz+UqD5d9dZRu6P38W4LTooV5bV6dZgBunlMLK8+6ug2ziYvRddw== + "integrity" "sha512-HTh+Pg7oQ5aLuCkSbD2Q6jBaE40M3R/XaLEz+UqD5d9dZRu6P38W4LTooV5bV6dZgBunlMLK8+6ug2ziYvRddw==" + "resolved" "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-16.0.0.tgz" + "version" "16.0.0" dependencies: - regexp-match-indices "1.0.2" + "regexp-match-indices" "1.0.2" "@cucumber/cucumber@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@cucumber/cucumber/-/cucumber-8.5.0.tgz#265348b0c7680426006fc4e41abc9424bd5cc8b3" - integrity sha512-Ac64lYhgzRxFGf3MnlysMG0zmHa18HfuOU1BA5RfXsrHeWtZx525zH4FsqtRW2AnlYHGu3pQpww5zyQKWi1WDA== + "integrity" "sha512-Ac64lYhgzRxFGf3MnlysMG0zmHa18HfuOU1BA5RfXsrHeWtZx525zH4FsqtRW2AnlYHGu3pQpww5zyQKWi1WDA==" + "resolved" "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-8.5.0.tgz" + "version" "8.5.0" dependencies: "@cspotcode/source-map-support" "^0.8.0" "@cucumber/ci-environment" "9.0.4" @@ -48,962 +48,1321 @@ "@cucumber/message-streams" "4.0.1" "@cucumber/messages" "19.1.2" "@cucumber/tag-expressions" "4.1.0" - assertion-error-formatter "^3.0.0" - capital-case "^1.0.4" - chalk "^4.1.2" - cli-table3 "0.6.2" - commander "^9.0.0" - duration "^0.2.2" - durations "^3.4.2" - figures "^3.2.0" - glob "^7.1.6" - has-ansi "^4.0.1" - indent-string "^4.0.0" - is-installed-globally "^0.4.0" - is-stream "^2.0.0" - knuth-shuffle-seeded "^1.0.6" - lodash.merge "^4.6.2" - lodash.mergewith "^4.6.2" - mz "^2.7.0" - progress "^2.0.3" - resolve-pkg "^2.0.0" - semver "7.3.7" - stack-chain "^2.0.0" - string-argv "^0.3.1" - strip-ansi "6.0.1" - supports-color "^8.1.1" - tmp "^0.2.1" - util-arity "^1.1.0" - verror "^1.10.0" - yup "^0.32.11" + "assertion-error-formatter" "^3.0.0" + "capital-case" "^1.0.4" + "chalk" "^4.1.2" + "cli-table3" "0.6.2" + "commander" "^9.0.0" + "duration" "^0.2.2" + "durations" "^3.4.2" + "figures" "^3.2.0" + "glob" "^7.1.6" + "has-ansi" "^4.0.1" + "indent-string" "^4.0.0" + "is-installed-globally" "^0.4.0" + "is-stream" "^2.0.0" + "knuth-shuffle-seeded" "^1.0.6" + "lodash.merge" "^4.6.2" + "lodash.mergewith" "^4.6.2" + "mz" "^2.7.0" + "progress" "^2.0.3" + "resolve-pkg" "^2.0.0" + "semver" "7.3.7" + "stack-chain" "^2.0.0" + "string-argv" "^0.3.1" + "strip-ansi" "6.0.1" + "supports-color" "^8.1.1" + "tmp" "^0.2.1" + "util-arity" "^1.1.0" + "verror" "^1.10.0" + "yup" "^0.32.11" "@cucumber/gherkin-streams@5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@cucumber/gherkin-streams/-/gherkin-streams-5.0.1.tgz#8c2142d295cd05644456be7282b4bd756c95c4cd" - integrity sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q== + "integrity" "sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q==" + "resolved" "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-5.0.1.tgz" + "version" "5.0.1" dependencies: - commander "9.1.0" - source-map-support "0.5.21" + "commander" "9.1.0" + "source-map-support" "0.5.21" "@cucumber/gherkin-utils@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@cucumber/gherkin-utils/-/gherkin-utils-8.0.0.tgz#8730d001f16ab9ff6e41febf72575d1c63477edb" - integrity sha512-8uIZInEe3cO1cASmy3BA0PbVFUI+xWBnZAxmICbVOPsZaMB85MtESZLafzErgfRQPsHf6uYbVagP7MIjNPM5Jw== + "integrity" "sha512-8uIZInEe3cO1cASmy3BA0PbVFUI+xWBnZAxmICbVOPsZaMB85MtESZLafzErgfRQPsHf6uYbVagP7MIjNPM5Jw==" + "resolved" "https://registry.npmjs.org/@cucumber/gherkin-utils/-/gherkin-utils-8.0.0.tgz" + "version" "8.0.0" dependencies: "@cucumber/messages" "^19.0.0" "@teppeis/multimaps" "2.0.0" - commander "9.3.0" + "commander" "9.3.0" -"@cucumber/gherkin@24.0.0": - version "24.0.0" - resolved "https://registry.yarnpkg.com/@cucumber/gherkin/-/gherkin-24.0.0.tgz#b0d2ab328caa5357491f1117c31195d3e545da0c" - integrity sha512-b7OsnvX1B8myDAKMc+RAiUX9bzgtNdjGsiMj10O13xu2HBWIOQ19EqBJ4xLO5CFG/lGk1J/+L0lANQVowxLVBg== +"@cucumber/gherkin@>=22.0.0", "@cucumber/gherkin@24.0.0": + "integrity" "sha512-b7OsnvX1B8myDAKMc+RAiUX9bzgtNdjGsiMj10O13xu2HBWIOQ19EqBJ4xLO5CFG/lGk1J/+L0lANQVowxLVBg==" + "resolved" "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-24.0.0.tgz" + "version" "24.0.0" dependencies: "@cucumber/messages" "^19.0.0" "@cucumber/html-formatter@19.2.0": - version "19.2.0" - resolved "https://registry.yarnpkg.com/@cucumber/html-formatter/-/html-formatter-19.2.0.tgz#47b9fcb58fbb48d0e6124fd2e867d9c6fe299470" - integrity sha512-qGms4588jmVF/G3fTbgZvxn6OQw9GaTFV007nZZ9/10M9DfrgRqjFjVxVI9TPV63xOLPicEVoqsKZtcECbdMSA== + "integrity" "sha512-qGms4588jmVF/G3fTbgZvxn6OQw9GaTFV007nZZ9/10M9DfrgRqjFjVxVI9TPV63xOLPicEVoqsKZtcECbdMSA==" + "resolved" "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-19.2.0.tgz" + "version" "19.2.0" -"@cucumber/message-streams@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@cucumber/message-streams/-/message-streams-4.0.1.tgz#a5339d3504594bb2edb5732aaae94dddb24d0970" - integrity sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA== +"@cucumber/message-streams@>=4.0.0", "@cucumber/message-streams@4.0.1": + "integrity" "sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==" + "resolved" "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-4.0.1.tgz" + "version" "4.0.1" -"@cucumber/messages@19.1.2", "@cucumber/messages@^19.0.0": - version "19.1.2" - resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-19.1.2.tgz#cc846c191b124deb352dd1992bd49a82f30b0add" - integrity sha512-vhWkNmQco+7tk/DWqpN0/R9KTNvsKsXVfZ7IsJs+dEeWmTuRztklHq8lJalwMSQBl71+2/KqGHzOO4BMTC9wIQ== +"@cucumber/messages@^19.0.0", "@cucumber/messages@>=17.1.1", "@cucumber/messages@>=18", "@cucumber/messages@19.1.2": + "integrity" "sha512-vhWkNmQco+7tk/DWqpN0/R9KTNvsKsXVfZ7IsJs+dEeWmTuRztklHq8lJalwMSQBl71+2/KqGHzOO4BMTC9wIQ==" + "resolved" "https://registry.npmjs.org/@cucumber/messages/-/messages-19.1.2.tgz" + "version" "19.1.2" dependencies: "@types/uuid" "8.3.4" - class-transformer "0.5.1" - reflect-metadata "0.1.13" - uuid "8.3.2" + "class-transformer" "0.5.1" + "reflect-metadata" "0.1.13" + "uuid" "8.3.2" "@cucumber/tag-expressions@4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@cucumber/tag-expressions/-/tag-expressions-4.1.0.tgz#9a91b0e0dd2f2ba703e3038c52b49b9ac06c2c6f" - integrity sha512-chTnjxV3vryL75N90wJIMdMafXmZoO2JgNJLYpsfcALL2/IQrRiny3vM9DgD5RDCSt1LNloMtb7rGey9YWxCsA== + "integrity" "sha512-chTnjxV3vryL75N90wJIMdMafXmZoO2JgNJLYpsfcALL2/IQrRiny3vM9DgD5RDCSt1LNloMtb7rGey9YWxCsA==" + "resolved" "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-4.1.0.tgz" + "version" "4.1.0" "@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + "integrity" "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" + "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" + "version" "3.1.1" "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "integrity" "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + "version" "1.4.15" "@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + "integrity" "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==" + "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + "version" "0.3.9" dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" "@teppeis/multimaps@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@teppeis/multimaps/-/multimaps-2.0.0.tgz#2114ee964b702f9777d0e07899087ad9cd89a0de" - integrity sha512-TL1adzq1HdxUf9WYduLcQ/DNGYiz71U31QRgbnr0Ef1cPyOUOsBojxHVWpFeOSUucB6Lrs0LxFRA14ntgtkc9w== + "integrity" "sha512-TL1adzq1HdxUf9WYduLcQ/DNGYiz71U31QRgbnr0Ef1cPyOUOsBojxHVWpFeOSUucB6Lrs0LxFRA14ntgtkc9w==" + "resolved" "https://registry.npmjs.org/@teppeis/multimaps/-/multimaps-2.0.0.tgz" + "version" "2.0.0" "@types/lodash@^4.14.175": - version "4.14.184" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.184.tgz#23f96cd2a21a28e106dc24d825d4aa966de7a9fe" - integrity sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q== + "integrity" "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==" + "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz" + "version" "4.14.195" "@types/uuid@8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -asn1@^0.2.4: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - -assertion-error-formatter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz#be9c8825dee6a8a6c72183d915912d9b57d5d265" - integrity sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ== - dependencies: - diff "^4.0.1" - pad-right "^0.2.2" - repeat-string "^1.6.1" - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bcrypt-pbkdf@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buildcheck@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/buildcheck/-/buildcheck-0.0.3.tgz#70451897a95d80f7807e68fc412eb2e7e35ff4d5" - integrity sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA== - -capital-case@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" - integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -chai-arrays@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/chai-arrays/-/chai-arrays-2.2.0.tgz#571479cbc5eca81605ed4eed1e8a2a28552d2a25" - integrity sha512-4awrdGI2EH8owJ9I58PXwG4N56/FiM8bsn4CVSNEgr4GKAM6Kq5JPVApUbhUBjDakbZNuRvV7quRSC38PWq/tg== - -chai-things@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/chai-things/-/chai-things-0.2.0.tgz#c55128378f9bb399e994f00052151984ed6ebe70" - integrity sha512-6ns0SU21xdRCoEXVKH3HGbwnsgfVMXQ+sU5V8PI9rfxaITos8lss1vUxbF1FAcJKjfqmmmLVlr/z3sLes00w+A== - -chai@4.3.6: - version "4.3.6" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" - integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - loupe "^2.3.1" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -class-transformer@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336" - integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== - -cli-table3@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a" - integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== - dependencies: - string-width "^4.2.0" + "integrity" "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + "resolved" "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" + "version" "8.3.4" + +"ajv@^6.12.3": + "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" + "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + "version" "6.12.6" + dependencies: + "fast-deep-equal" "^3.1.1" + "fast-json-stable-stringify" "^2.0.0" + "json-schema-traverse" "^0.4.1" + "uri-js" "^4.2.2" + +"ansi-regex@^4.1.0": + "integrity" "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" + "version" "4.1.1" + +"ansi-regex@^5.0.1": + "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + "version" "5.0.1" + +"ansi-styles@^4.1.0": + "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "color-convert" "^2.0.1" + +"any-promise@^1.0.0": + "integrity" "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + "resolved" "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + "version" "1.3.0" + +"asn1@^0.2.6", "asn1@~0.2.3": + "integrity" "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==" + "resolved" "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" + "version" "0.2.6" + dependencies: + "safer-buffer" "~2.1.0" + +"assert-plus@^1.0.0", "assert-plus@1.0.0": + "integrity" "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + "resolved" "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + "version" "1.0.0" + +"assertion-error-formatter@^3.0.0": + "integrity" "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==" + "resolved" "https://registry.npmjs.org/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "diff" "^4.0.1" + "pad-right" "^0.2.2" + "repeat-string" "^1.6.1" + +"assertion-error@^1.1.0": + "integrity" "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + "resolved" "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + "version" "1.1.0" + +"asynckit@^0.4.0": + "integrity" "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + "version" "0.4.0" + +"aws-sign2@~0.7.0": + "integrity" "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + "resolved" "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" + "version" "0.7.0" + +"aws4@^1.8.0": + "integrity" "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "resolved" "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" + "version" "1.12.0" + +"axios@^1.6.8": + "integrity" "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==" + "resolved" "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz" + "version" "1.6.8" + dependencies: + "follow-redirects" "^1.15.6" + "form-data" "^4.0.0" + "proxy-from-env" "^1.1.0" + +"balanced-match@^1.0.0": + "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + "version" "1.0.2" + +"base64-js@^1.3.1": + "integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + "version" "1.5.1" + +"bcrypt-pbkdf@^1.0.0", "bcrypt-pbkdf@^1.0.2": + "integrity" "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==" + "resolved" "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "tweetnacl" "^0.14.3" + +"bl@^4.0.3": + "integrity" "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==" + "resolved" "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "buffer" "^5.5.0" + "inherits" "^2.0.4" + "readable-stream" "^3.4.0" + +"brace-expansion@^1.1.7": + "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" + "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + "version" "1.1.11" + dependencies: + "balanced-match" "^1.0.0" + "concat-map" "0.0.1" + +"buffer-from@^1.0.0": + "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + "version" "1.1.2" + +"buffer@^5.5.0": + "integrity" "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==" + "resolved" "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + "version" "5.7.1" + dependencies: + "base64-js" "^1.3.1" + "ieee754" "^1.1.13" + +"buildcheck@~0.0.6": + "integrity" "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==" + "resolved" "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz" + "version" "0.0.6" + +"capital-case@^1.0.4": + "integrity" "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==" + "resolved" "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "no-case" "^3.0.4" + "tslib" "^2.0.3" + "upper-case-first" "^2.0.2" + +"caseless@~0.12.0": + "integrity" "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "resolved" "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + "version" "0.12.0" + +"chai-arrays@2.2.0": + "integrity" "sha512-4awrdGI2EH8owJ9I58PXwG4N56/FiM8bsn4CVSNEgr4GKAM6Kq5JPVApUbhUBjDakbZNuRvV7quRSC38PWq/tg==" + "resolved" "https://registry.npmjs.org/chai-arrays/-/chai-arrays-2.2.0.tgz" + "version" "2.2.0" + +"chai-things@0.2.0": + "integrity" "sha512-6ns0SU21xdRCoEXVKH3HGbwnsgfVMXQ+sU5V8PI9rfxaITos8lss1vUxbF1FAcJKjfqmmmLVlr/z3sLes00w+A==" + "resolved" "https://registry.npmjs.org/chai-things/-/chai-things-0.2.0.tgz" + "version" "0.2.0" + +"chai@4.3.6": + "integrity" "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==" + "resolved" "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz" + "version" "4.3.6" + dependencies: + "assertion-error" "^1.1.0" + "check-error" "^1.0.2" + "deep-eql" "^3.0.1" + "get-func-name" "^2.0.0" + "loupe" "^2.3.1" + "pathval" "^1.1.1" + "type-detect" "^4.0.5" + +"chalk@^4.1.2": + "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "ansi-styles" "^4.1.0" + "supports-color" "^7.1.0" + +"check-error@^1.0.2": + "integrity" "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==" + "resolved" "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + "version" "1.0.2" + +"chownr@^1.1.1": + "integrity" "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "resolved" "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + "version" "1.1.4" + +"class-transformer@0.5.1": + "integrity" "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + "resolved" "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz" + "version" "0.5.1" + +"cli-table3@0.6.2": + "integrity" "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==" + "resolved" "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz" + "version" "0.6.2" + dependencies: + "string-width" "^4.2.0" optionalDependencies: "@colors/colors" "1.5.0" -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.1.0.tgz#a6b263b2327f2e188c6402c42623327909f2dbec" - integrity sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w== - -commander@9.3.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.3.0.tgz#f619114a5a2d2054e0d9ff1b31d5ccf89255e26b" - integrity sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw== - -commander@^9.0.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.0.tgz#bc4a40918fefe52e22450c111ecd6b7acce6f11c" - integrity sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - -cpu-features@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.4.tgz#0023475bb4f4c525869c162e4108099e35bf19d8" - integrity sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A== - dependencies: - buildcheck "0.0.3" - nan "^2.15.0" - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -debug@^4.1.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -docker-modem@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-3.0.6.tgz#8c76338641679e28ec2323abb65b3276fb1ce597" - integrity sha512-h0Ow21gclbYsZ3mkHDfsYNDqtRhXS8fXr51bU0qr1dxgTMJj0XufbzX+jhNOvA8KuEEzn6JbvLVhXyv+fny9Uw== - dependencies: - debug "^4.1.1" - readable-stream "^3.5.0" - split-ca "^1.0.1" - ssh2 "^1.11.0" - -dockerode@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-3.3.2.tgz#f3545700d2f7f86141b58843a755eeb21e38d5cd" - integrity sha512-oXN+1XVH2TeyE0Jj9Ci6Fim8ZIDxyqeJrkx9qhEOaRiA+nhLihKfd3M2L+Aqrj5C2ObPw8RVN2zPWvvk0x2dwg== - dependencies: - docker-modem "^3.0.0" - tar-fs "~2.0.1" - -duration@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/duration/-/duration-0.2.2.tgz#ddf149bc3bc6901150fe9017111d016b3357f529" - integrity sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg== - dependencies: - d "1" - es5-ext "~0.10.46" - -durations@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/durations/-/durations-3.4.2.tgz#1de230454373cccfecab927de0bebae2295301db" - integrity sha512-V/lf7y33dGaypZZetVI1eu7BmvkbC4dItq12OElLRpKuaU5JxQstV2zHwLv8P7cNbQ+KL1WD80zMCTx5dNC4dg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.46: - version "0.10.62" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" - integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - next-tick "^1.1.0" - -es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -ext@^1.1.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" - integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== - dependencies: - type "^2.7.2" - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== - -glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" - integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== - dependencies: - ini "2.0.0" - -has-ansi@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-4.0.1.tgz#f216a8c8d7b129e490dc15f4a62cc1cdb9603ce8" - integrity sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A== - dependencies: - ansi-regex "^4.1.0" - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-installed-globally@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -knuth-shuffle-seeded@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz#01f1b65733aa7540ee08d8b0174164d22081e4e1" - integrity sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg== - dependencies: - seed-random "~2.2.0" - -lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.mergewith@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" - integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== - dependencies: - get-func-name "^2.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -mkdirp-classic@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nan@^2.15.0, nan@^2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" - integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== - -nanoclone@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4" - integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== - -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -pad-right@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/pad-right/-/pad-right-0.2.2.tgz#6fbc924045d244f2a2a244503060d3bfc6009774" - integrity sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g== - dependencies: - repeat-string "^1.5.2" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -progress@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -property-expr@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4" - integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -reflect-metadata@0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regexp-match-indices@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regexp-match-indices/-/regexp-match-indices-1.0.2.tgz#cf20054a6f7d5b3e116a701a7b00f82889d10da6" - integrity sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ== - dependencies: - regexp-tree "^0.1.11" - -regexp-tree@^0.1.11: - version "0.1.24" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" - integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-2.0.0.tgz#ac06991418a7623edc119084edc98b0e6bf05a41" - integrity sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ== - dependencies: - resolve-from "^5.0.0" - -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -seed-random@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/seed-random/-/seed-random-2.2.0.tgz#2a9b19e250a817099231a5b99a4daf80b7fbed54" - integrity sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ== - -semver@7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -source-map-support@0.5.21: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -split-ca@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" - integrity sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ== - -ssh2@^1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.11.0.tgz#ce60186216971e12f6deb553dcf82322498fe2e4" - integrity sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw== - dependencies: - asn1 "^0.2.4" - bcrypt-pbkdf "^1.0.2" +"clickhouse@^2.6.0": + "integrity" "sha512-HC5OV99GJOup4qZsTuWWPpXlj+847Z0OeygDU2x22rNYost0V/vWapzFWYZdV/5iRbGMrhFQPOyQEzmGvoaWRQ==" + "resolved" "https://registry.npmjs.org/clickhouse/-/clickhouse-2.6.0.tgz" + "version" "2.6.0" + dependencies: + "JSONStream" "1.3.4" + "lodash" "4.17.21" + "querystring" "0.2.0" + "request" "2.88.0" + "stream2asynciter" "1.0.3" + "through" "2.3.8" + "tsv" "0.2.0" + "uuid" "3.4.0" + +"color-convert@^2.0.1": + "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "color-name" "~1.1.4" + +"color-name@~1.1.4": + "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + "version" "1.1.4" + +"combined-stream@^1.0.6", "combined-stream@^1.0.8", "combined-stream@~1.0.6": + "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" + "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + "version" "1.0.8" + dependencies: + "delayed-stream" "~1.0.0" + +"commander@^9.0.0": + "integrity" "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==" + "resolved" "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" + "version" "9.5.0" + +"commander@9.1.0": + "integrity" "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==" + "resolved" "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz" + "version" "9.1.0" + +"commander@9.3.0": + "integrity" "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==" + "resolved" "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz" + "version" "9.3.0" + +"concat-map@0.0.1": + "integrity" "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "version" "0.0.1" + +"core-util-is@1.0.2": + "integrity" "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + "version" "1.0.2" + +"cpu-features@~0.0.8": + "integrity" "sha512-BbHBvtYhUhksqTjr6bhNOjGgMnhwhGTQmOoZGD+K7BCaQDCuZl/Ve1ZxUSMRwVC4D/rkCPQ2MAIeYzrWyK7eEg==" + "resolved" "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.8.tgz" + "version" "0.0.8" + dependencies: + "buildcheck" "~0.0.6" + "nan" "^2.17.0" + +"d@^1.0.1", "d@1": + "integrity" "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==" + "resolved" "https://registry.npmjs.org/d/-/d-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "es5-ext" "^0.10.50" + "type" "^1.0.1" + +"dashdash@^1.12.0": + "integrity" "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==" + "resolved" "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" + "version" "1.14.1" + dependencies: + "assert-plus" "^1.0.0" + +"debug@^4.1.1": + "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + "version" "4.3.4" + dependencies: + "ms" "2.1.2" + +"deep-eql@^3.0.1": + "integrity" "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==" + "resolved" "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "type-detect" "^4.0.0" + +"delayed-stream@~1.0.0": + "integrity" "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + "version" "1.0.0" + +"diff@^4.0.1": + "integrity" "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + "resolved" "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + "version" "4.0.2" + +"docker-modem@^3.0.0": + "integrity" "sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==" + "resolved" "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.8.tgz" + "version" "3.0.8" + dependencies: + "debug" "^4.1.1" + "readable-stream" "^3.5.0" + "split-ca" "^1.0.1" + "ssh2" "^1.11.0" + +"dockerode@3.3.2": + "integrity" "sha512-oXN+1XVH2TeyE0Jj9Ci6Fim8ZIDxyqeJrkx9qhEOaRiA+nhLihKfd3M2L+Aqrj5C2ObPw8RVN2zPWvvk0x2dwg==" + "resolved" "https://registry.npmjs.org/dockerode/-/dockerode-3.3.2.tgz" + "version" "3.3.2" + dependencies: + "docker-modem" "^3.0.0" + "tar-fs" "~2.0.1" + +"duration@^0.2.2": + "integrity" "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==" + "resolved" "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz" + "version" "0.2.2" + dependencies: + "d" "1" + "es5-ext" "~0.10.46" + +"durations@^3.4.2": + "integrity" "sha512-V/lf7y33dGaypZZetVI1eu7BmvkbC4dItq12OElLRpKuaU5JxQstV2zHwLv8P7cNbQ+KL1WD80zMCTx5dNC4dg==" + "resolved" "https://registry.npmjs.org/durations/-/durations-3.4.2.tgz" + "version" "3.4.2" + +"ecc-jsbn@~0.1.1": + "integrity" "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==" + "resolved" "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + "version" "0.1.2" + dependencies: + "jsbn" "~0.1.0" + "safer-buffer" "^2.1.0" + +"emoji-regex@^8.0.0": + "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + "version" "8.0.0" + +"end-of-stream@^1.1.0", "end-of-stream@^1.4.1": + "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==" + "resolved" "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + "version" "1.4.4" + dependencies: + "once" "^1.4.0" + +"es5-ext@^0.10.35", "es5-ext@^0.10.50", "es5-ext@~0.10.46": + "integrity" "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==" + "resolved" "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz" + "version" "0.10.62" + dependencies: + "es6-iterator" "^2.0.3" + "es6-symbol" "^3.1.3" + "next-tick" "^1.1.0" + +"es6-iterator@^2.0.3": + "integrity" "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==" + "resolved" "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" + "version" "2.0.3" + dependencies: + "d" "1" + "es5-ext" "^0.10.35" + "es6-symbol" "^3.1.1" + +"es6-symbol@^3.1.1", "es6-symbol@^3.1.3": + "integrity" "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==" + "resolved" "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz" + "version" "3.1.3" + dependencies: + "d" "^1.0.1" + "ext" "^1.1.2" + +"escape-string-regexp@^1.0.5": + "integrity" "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" + +"ext@^1.1.2": + "integrity" "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==" + "resolved" "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz" + "version" "1.7.0" + dependencies: + "type" "^2.7.2" + +"extend@~3.0.2": + "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + "version" "3.0.2" + +"extsprintf@^1.2.0": + "integrity" "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==" + "resolved" "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" + "version" "1.4.1" + +"extsprintf@1.3.0": + "integrity" "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + "resolved" "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + "version" "1.3.0" + +"fast-deep-equal@^3.1.1": + "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + "version" "3.1.3" + +"fast-json-stable-stringify@^2.0.0": + "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + "version" "2.1.0" + +"figures@^3.2.0": + "integrity" "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==" + "resolved" "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" + "version" "3.2.0" + dependencies: + "escape-string-regexp" "^1.0.5" + +"follow-redirects@^1.15.6": + "integrity" "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" + "version" "1.15.6" + +"forever-agent@~0.6.1": + "integrity" "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + "resolved" "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + "version" "0.6.1" + +"form-data@^4.0.0": + "integrity" "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==" + "resolved" "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "asynckit" "^0.4.0" + "combined-stream" "^1.0.8" + "mime-types" "^2.1.12" + +"form-data@~2.3.2": + "integrity" "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==" + "resolved" "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" + "version" "2.3.3" + dependencies: + "asynckit" "^0.4.0" + "combined-stream" "^1.0.6" + "mime-types" "^2.1.12" + +"fs-constants@^1.0.0": + "integrity" "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "resolved" "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + "version" "1.0.0" + +"fs.realpath@^1.0.0": + "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + "version" "1.0.0" + +"get-func-name@^2.0.0": + "integrity" "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" + "resolved" "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + "version" "2.0.0" + +"getpass@^0.1.1": + "integrity" "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==" + "resolved" "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" + "version" "0.1.7" + dependencies: + "assert-plus" "^1.0.0" + +"glob@^7.1.3", "glob@^7.1.6": + "integrity" "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + "version" "7.2.3" + dependencies: + "fs.realpath" "^1.0.0" + "inflight" "^1.0.4" + "inherits" "2" + "minimatch" "^3.1.1" + "once" "^1.3.0" + "path-is-absolute" "^1.0.0" + +"global-dirs@^3.0.0": + "integrity" "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==" + "resolved" "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "ini" "2.0.0" + +"har-schema@^2.0.0": + "integrity" "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" + "resolved" "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" + "version" "2.0.0" + +"har-validator@~5.1.0": + "integrity" "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==" + "resolved" "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" + "version" "5.1.5" + dependencies: + "ajv" "^6.12.3" + "har-schema" "^2.0.0" + +"has-ansi@^4.0.1": + "integrity" "sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A==" + "resolved" "https://registry.npmjs.org/has-ansi/-/has-ansi-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "ansi-regex" "^4.1.0" + +"has-flag@^4.0.0": + "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + "version" "4.0.0" + +"http-signature@~1.2.0": + "integrity" "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==" + "resolved" "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "assert-plus" "^1.0.0" + "jsprim" "^1.2.2" + "sshpk" "^1.7.0" + +"ieee754@^1.1.13": + "integrity" "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + "version" "1.2.1" + +"indent-string@^4.0.0": + "integrity" "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "resolved" "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + "version" "4.0.0" + +"inflight@^1.0.4": + "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" + "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + "version" "1.0.6" + dependencies: + "once" "^1.3.0" + "wrappy" "1" + +"inherits@^2.0.3", "inherits@^2.0.4", "inherits@2": + "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + "version" "2.0.4" + +"ini@2.0.0": + "integrity" "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + "resolved" "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + "version" "2.0.0" + +"is-fullwidth-code-point@^3.0.0": + "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + "version" "3.0.0" + +"is-installed-globally@^0.4.0": + "integrity" "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==" + "resolved" "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" + "version" "0.4.0" + dependencies: + "global-dirs" "^3.0.0" + "is-path-inside" "^3.0.2" + +"is-path-inside@^3.0.2": + "integrity" "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + "version" "3.0.3" + +"is-stream@^2.0.0": + "integrity" "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + "version" "2.0.1" + +"is-typedarray@~1.0.0": + "integrity" "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + "version" "1.0.0" + +"isstream@~0.1.2": + "integrity" "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "resolved" "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + "version" "0.1.2" + +"jsbn@~0.1.0": + "integrity" "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "resolved" "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + "version" "0.1.1" + +"json-schema-traverse@^0.4.1": + "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + "version" "0.4.1" + +"json-schema@0.4.0": + "integrity" "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "resolved" "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + "version" "0.4.0" + +"json-stringify-safe@~5.0.1": + "integrity" "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "resolved" "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + "version" "5.0.1" + +"jsonparse@^1.2.0": + "integrity" "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==" + "resolved" "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" + "version" "1.3.1" + +"JSONStream@1.3.4": + "integrity" "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==" + "resolved" "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz" + "version" "1.3.4" + dependencies: + "jsonparse" "^1.2.0" + "through" ">=2.2.7 <3" + +"jsprim@^1.2.2": + "integrity" "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==" + "resolved" "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" + "version" "1.4.2" + dependencies: + "assert-plus" "1.0.0" + "extsprintf" "1.3.0" + "json-schema" "0.4.0" + "verror" "1.10.0" + +"knuth-shuffle-seeded@^1.0.6": + "integrity" "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==" + "resolved" "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz" + "version" "1.0.6" + dependencies: + "seed-random" "~2.2.0" + +"lodash-es@^4.17.21": + "integrity" "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "resolved" "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + "version" "4.17.21" + +"lodash.merge@^4.6.2": + "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + "version" "4.6.2" + +"lodash.mergewith@^4.6.2": + "integrity" "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + "resolved" "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" + "version" "4.6.2" + +"lodash@^4.17.21", "lodash@4.17.21": + "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + "version" "4.17.21" + +"loupe@^2.3.1": + "integrity" "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==" + "resolved" "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz" + "version" "2.3.6" + dependencies: + "get-func-name" "^2.0.0" + +"lower-case@^2.0.2": + "integrity" "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==" + "resolved" "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "tslib" "^2.0.3" + +"lru-cache@^6.0.0": + "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "yallist" "^4.0.0" + +"mime-db@1.52.0": + "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + "version" "1.52.0" + +"mime-types@^2.1.12", "mime-types@~2.1.19": + "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + "version" "2.1.35" + dependencies: + "mime-db" "1.52.0" + +"minimatch@^3.1.1": + "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "brace-expansion" "^1.1.7" + +"mkdirp-classic@^0.5.2": + "integrity" "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "resolved" "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" + "version" "0.5.3" + +"ms@2.1.2": + "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + "version" "2.1.2" + +"mz@^2.7.0": + "integrity" "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==" + "resolved" "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + "version" "2.7.0" + dependencies: + "any-promise" "^1.0.0" + "object-assign" "^4.0.1" + "thenify-all" "^1.0.0" + +"nan@^2.17.0": + "integrity" "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + "resolved" "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz" + "version" "2.17.0" + +"nanoclone@^0.2.1": + "integrity" "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + "resolved" "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz" + "version" "0.2.1" + +"next-tick@^1.1.0": + "integrity" "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + "resolved" "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" + "version" "1.1.0" + +"no-case@^3.0.4": + "integrity" "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==" + "resolved" "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "lower-case" "^2.0.2" + "tslib" "^2.0.3" + +"oauth-sign@~0.9.0": + "integrity" "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "resolved" "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" + "version" "0.9.0" + +"object-assign@^4.0.1": + "integrity" "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "version" "4.1.1" + +"once@^1.3.0", "once@^1.3.1", "once@^1.4.0": + "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" + "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "wrappy" "1" + +"pad-right@^0.2.2": + "integrity" "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==" + "resolved" "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz" + "version" "0.2.2" + dependencies: + "repeat-string" "^1.5.2" + +"path-is-absolute@^1.0.0": + "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "version" "1.0.1" + +"pathval@^1.1.1": + "integrity" "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" + "resolved" "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" + "version" "1.1.1" + +"performance-now@^2.1.0": + "integrity" "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "resolved" "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + "version" "2.1.0" + +"progress@^2.0.3": + "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + "resolved" "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + "version" "2.0.3" + +"property-expr@^2.0.4": + "integrity" "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" + "resolved" "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz" + "version" "2.0.5" + +"proxy-from-env@^1.1.0": + "integrity" "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "resolved" "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + "version" "1.1.0" + +"psl@^1.1.24": + "integrity" "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "resolved" "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + "version" "1.9.0" + +"pump@^3.0.0": + "integrity" "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==" + "resolved" "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "end-of-stream" "^1.1.0" + "once" "^1.3.1" + +"punycode@^1.4.1": + "integrity" "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + "version" "1.4.1" + +"punycode@^2.1.0": + "integrity" "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + "version" "2.3.1" + +"qs@~6.5.2": + "integrity" "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + "resolved" "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" + "version" "6.5.3" + +"querystring@0.2.0": + "integrity" "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" + "resolved" "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + "version" "0.2.0" + +"readable-stream@^3.1.1", "readable-stream@^3.4.0", "readable-stream@^3.5.0": + "integrity" "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==" + "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + "version" "3.6.2" + dependencies: + "inherits" "^2.0.3" + "string_decoder" "^1.1.1" + "util-deprecate" "^1.0.1" + +"reflect-metadata@0.1.13": + "integrity" "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + "resolved" "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" + "version" "0.1.13" + +"regenerator-runtime@^0.13.11": + "integrity" "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + "version" "0.13.11" + +"regexp-match-indices@1.0.2": + "integrity" "sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ==" + "resolved" "https://registry.npmjs.org/regexp-match-indices/-/regexp-match-indices-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "regexp-tree" "^0.1.11" + +"regexp-tree@^0.1.11": + "integrity" "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==" + "resolved" "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz" + "version" "0.1.27" + +"repeat-string@^1.5.2", "repeat-string@^1.6.1": + "integrity" "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + "resolved" "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + "version" "1.6.1" + +"request@2.88.0": + "integrity" "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==" + "resolved" "https://registry.npmjs.org/request/-/request-2.88.0.tgz" + "version" "2.88.0" + dependencies: + "aws-sign2" "~0.7.0" + "aws4" "^1.8.0" + "caseless" "~0.12.0" + "combined-stream" "~1.0.6" + "extend" "~3.0.2" + "forever-agent" "~0.6.1" + "form-data" "~2.3.2" + "har-validator" "~5.1.0" + "http-signature" "~1.2.0" + "is-typedarray" "~1.0.0" + "isstream" "~0.1.2" + "json-stringify-safe" "~5.0.1" + "mime-types" "~2.1.19" + "oauth-sign" "~0.9.0" + "performance-now" "^2.1.0" + "qs" "~6.5.2" + "safe-buffer" "^5.1.2" + "tough-cookie" "~2.4.3" + "tunnel-agent" "^0.6.0" + "uuid" "^3.3.2" + +"resolve-from@^5.0.0": + "integrity" "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + "version" "5.0.0" + +"resolve-pkg@^2.0.0": + "integrity" "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==" + "resolved" "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "resolve-from" "^5.0.0" + +"rimraf@^3.0.0": + "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "glob" "^7.1.3" + +"safe-buffer@^5.0.1", "safe-buffer@^5.1.2", "safe-buffer@~5.2.0": + "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + "version" "5.2.1" + +"safer-buffer@^2.0.2", "safer-buffer@^2.1.0", "safer-buffer@~2.1.0": + "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + "version" "2.1.2" + +"seed-random@~2.2.0": + "integrity" "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==" + "resolved" "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz" + "version" "2.2.0" + +"semver@7.3.7": + "integrity" "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + "version" "7.3.7" + dependencies: + "lru-cache" "^6.0.0" + +"source-map-support@0.5.21": + "integrity" "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" + "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + "version" "0.5.21" + dependencies: + "buffer-from" "^1.0.0" + "source-map" "^0.6.0" + +"source-map@^0.6.0": + "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + "version" "0.6.1" + +"split-ca@^1.0.1": + "integrity" "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==" + "resolved" "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz" + "version" "1.0.1" + +"ssh2@^1.11.0": + "integrity" "sha512-AqzD1UCqit8tbOKoj6ztDDi1ffJZ2rV2SwlgrVVrHPkV5vWqGJOVp5pmtj18PunkPJAuKQsnInyKV+/Nb2bUnA==" + "resolved" "https://registry.npmjs.org/ssh2/-/ssh2-1.14.0.tgz" + "version" "1.14.0" + dependencies: + "asn1" "^0.2.6" + "bcrypt-pbkdf" "^1.0.2" optionalDependencies: - cpu-features "~0.0.4" - nan "^2.16.0" - -stack-chain@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/stack-chain/-/stack-chain-2.0.0.tgz#d73d1172af89565f07438b5bcc086831b6689b2d" - integrity sha512-GGrHXePi305aW7XQweYZZwiRwR7Js3MWoK/EHzzB9ROdc75nCnjSJVi21rdAGxFl+yCx2L2qdfl5y7NO4lTyqg== - -string-argv@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== - -string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@6.0.1, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -tar-fs@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.1.tgz#e44086c1c60d31a4f0cf893b1c4e155dabfae9e2" - integrity sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.0.0" - -tar-stream@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" + "cpu-features" "~0.0.8" + "nan" "^2.17.0" + +"sshpk@^1.7.0": + "integrity" "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==" + "resolved" "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz" + "version" "1.18.0" + dependencies: + "asn1" "~0.2.3" + "assert-plus" "^1.0.0" + "bcrypt-pbkdf" "^1.0.0" + "dashdash" "^1.12.0" + "ecc-jsbn" "~0.1.1" + "getpass" "^0.1.1" + "jsbn" "~0.1.0" + "safer-buffer" "^2.0.2" + "tweetnacl" "~0.14.0" + +"stack-chain@^2.0.0": + "integrity" "sha512-GGrHXePi305aW7XQweYZZwiRwR7Js3MWoK/EHzzB9ROdc75nCnjSJVi21rdAGxFl+yCx2L2qdfl5y7NO4lTyqg==" + "resolved" "https://registry.npmjs.org/stack-chain/-/stack-chain-2.0.0.tgz" + "version" "2.0.0" + +"stream2asynciter@1.0.3": + "integrity" "sha512-9/dEZW+LQjuW6ub5hmWi4n9Pn8W8qA8k7NAE1isecesA164e73xTdy1CJ3S9o9YS+O21HuiK7T+4uS7FgKDy4w==" + "resolved" "https://registry.npmjs.org/stream2asynciter/-/stream2asynciter-1.0.3.tgz" + "version" "1.0.3" + +"string_decoder@^1.1.1": + "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" + "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + "version" "1.3.0" + dependencies: + "safe-buffer" "~5.2.0" + +"string-argv@^0.3.1": + "integrity" "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==" + "resolved" "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" + "version" "0.3.2" + +"string-width@^4.2.0": + "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + "version" "4.2.3" + dependencies: + "emoji-regex" "^8.0.0" + "is-fullwidth-code-point" "^3.0.0" + "strip-ansi" "^6.0.1" + +"strip-ansi@^6.0.1", "strip-ansi@6.0.1": + "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "ansi-regex" "^5.0.1" + +"supports-color@^7.1.0": + "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + "version" "7.2.0" + dependencies: + "has-flag" "^4.0.0" + +"supports-color@^8.1.1": + "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + "version" "8.1.1" + dependencies: + "has-flag" "^4.0.0" + +"tar-fs@~2.0.1": + "integrity" "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==" + "resolved" "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "chownr" "^1.1.1" + "mkdirp-classic" "^0.5.2" + "pump" "^3.0.0" + "tar-stream" "^2.0.0" + +"tar-stream@^2.0.0": + "integrity" "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==" + "resolved" "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + "version" "2.2.0" + dependencies: + "bl" "^4.0.3" + "end-of-stream" "^1.4.1" + "fs-constants" "^1.0.0" + "inherits" "^2.0.3" + "readable-stream" "^3.1.1" + +"thenify-all@^1.0.0": + "integrity" "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==" + "resolved" "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" + "version" "1.6.0" + dependencies: + "thenify" ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -toposort@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" - integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== - -tslib@^2.0.3: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tweetnacl@^0.14.3: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" - integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== - -upper-case-first@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" - integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== - dependencies: - tslib "^2.0.3" - -util-arity@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/util-arity/-/util-arity-1.1.0.tgz#59d01af1fdb3fede0ac4e632b0ab5f6ce97c9330" - integrity sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -verror@^1.10.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" - integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yup@^0.32.11: - version "0.32.11" - resolved "https://registry.yarnpkg.com/yup/-/yup-0.32.11.tgz#d67fb83eefa4698607982e63f7ca4c5ed3cf18c5" - integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg== + "integrity" "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==" + "resolved" "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + "version" "3.3.1" + dependencies: + "any-promise" "^1.0.0" + +"through@>=2.2.7 <3", "through@2.3.8": + "integrity" "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "resolved" "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + "version" "2.3.8" + +"tmp@^0.2.1": + "integrity" "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==" + "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + "version" "0.2.1" + dependencies: + "rimraf" "^3.0.0" + +"toposort@^2.0.2": + "integrity" "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" + "resolved" "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz" + "version" "2.0.2" + +"tough-cookie@~2.4.3": + "integrity" "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==" + "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz" + "version" "2.4.3" + dependencies: + "psl" "^1.1.24" + "punycode" "^1.4.1" + +"tslib@^2.0.3": + "integrity" "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz" + "version" "2.6.0" + +"tsv@0.2.0": + "integrity" "sha512-GG6xbOP85giXXom0dS6z9uyDsxktznjpa1AuDlPrIXDqDnbhjr9Vk6Us8iz6U1nENL4CPS2jZDvIjEdaZsmc4Q==" + "resolved" "https://registry.npmjs.org/tsv/-/tsv-0.2.0.tgz" + "version" "0.2.0" + +"tunnel-agent@^0.6.0": + "integrity" "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==" + "resolved" "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + "version" "0.6.0" + dependencies: + "safe-buffer" "^5.0.1" + +"tweetnacl@^0.14.3", "tweetnacl@~0.14.0": + "integrity" "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "resolved" "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + "version" "0.14.5" + +"type-detect@^4.0.0", "type-detect@^4.0.5": + "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + "version" "4.0.8" + +"type@^1.0.1": + "integrity" "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + "resolved" "https://registry.npmjs.org/type/-/type-1.2.0.tgz" + "version" "1.2.0" + +"type@^2.7.2": + "integrity" "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + "resolved" "https://registry.npmjs.org/type/-/type-2.7.2.tgz" + "version" "2.7.2" + +"upper-case-first@^2.0.2": + "integrity" "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==" + "resolved" "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "tslib" "^2.0.3" + +"uri-js@^4.2.2": + "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" + "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + "version" "4.4.1" + dependencies: + "punycode" "^2.1.0" + +"util-arity@^1.1.0": + "integrity" "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==" + "resolved" "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz" + "version" "1.1.0" + +"util-deprecate@^1.0.1": + "integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "version" "1.0.2" + +"uuid@^3.3.2": + "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + "version" "3.4.0" + +"uuid@3.4.0": + "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + "version" "3.4.0" + +"uuid@8.3.2": + "integrity" "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "resolved" "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + "version" "8.3.2" + +"verror@^1.10.0": + "integrity" "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==" + "resolved" "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz" + "version" "1.10.1" + dependencies: + "assert-plus" "^1.0.0" + "core-util-is" "1.0.2" + "extsprintf" "^1.2.0" + +"verror@1.10.0": + "integrity" "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==" + "resolved" "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + "version" "1.10.0" + dependencies: + "assert-plus" "^1.0.0" + "core-util-is" "1.0.2" + "extsprintf" "^1.2.0" + +"wrappy@1": + "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "version" "1.0.2" + +"yallist@^4.0.0": + "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + "version" "4.0.0" + +"yup@^0.32.11": + "integrity" "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==" + "resolved" "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz" + "version" "0.32.11" dependencies: "@babel/runtime" "^7.15.4" "@types/lodash" "^4.14.175" - lodash "^4.17.21" - lodash-es "^4.17.21" - nanoclone "^0.2.1" - property-expr "^2.0.4" - toposort "^2.0.2" + "lodash" "^4.17.21" + "lodash-es" "^4.17.21" + "nanoclone" "^0.2.1" + "property-expr" "^2.0.4" + "toposort" "^2.0.2" From d7858ac21f895e2e89838024658e6ebcab8f9b8d Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Wed, 10 Apr 2024 14:22:40 +0200 Subject: [PATCH 08/53] rename variable to be more descriptive --- .github/workflows/run-tests.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/run-tests.sh b/.github/workflows/run-tests.sh index e69d51b9..76d956f8 100755 --- a/.github/workflows/run-tests.sh +++ b/.github/workflows/run-tests.sh @@ -26,13 +26,13 @@ for package in "${CHANGED_FILES[@]}"; do done if [[ ${#changed_packages[@]} -eq 0 ]] || [[ "${!changed_packages[*]}" == *"utils"* ]]; then - cdr_recipe="true" + recipe_run="true" DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE" elif [[ "${!changed_packages[*]}" == *"features/single-mode"* ]] && [[ $NODE_MODE == "single" ]]; then - cdr_recipe="true" + recipe_run="true" DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:single elif [[ "${!changed_packages[*]}" == *"features/cluster-mode"* ]] && [[ $NODE_MODE == "cluster" ]]; then - cdr_recipe="true" + recipe_run="true" DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:cluster elif [[ "${!changed_packages[*]}" == *"infrastructure"* ]] && [[ $openhimRan == "false" ]]; then openhimRan="true" @@ -72,6 +72,6 @@ else done # Run the basic funtional end to end tests for the CDR recipe -if [[ $cdr_recipe !== "true" ]]; then - DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":cdr +if [[ $recipe_run !== "true" ]]; then + DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":recipe fi From 7df4c84bb29ff83825c2ffaa6ea0c24e4b94029e Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 11 Apr 2024 08:45:14 +0200 Subject: [PATCH 09/53] Fix broken logic for running recipe tests --- .github/workflows/run-tests.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/run-tests.sh b/.github/workflows/run-tests.sh index 76d956f8..c860668e 100755 --- a/.github/workflows/run-tests.sh +++ b/.github/workflows/run-tests.sh @@ -11,6 +11,9 @@ cd ../../test/cucumber/ || exit # This ensures that the openhim and its mediators' tests are run only once when the openhim and its mediators have all been modified openhimRan="false" +# Ensures that the recipe tests are run only once +recipe_run="false" + declare -A changed_packages for package in "${CHANGED_FILES[@]}"; do if [[ $package == *"features/cluster-mode"* ]]; then @@ -72,6 +75,6 @@ else done # Run the basic funtional end to end tests for the CDR recipe -if [[ $recipe_run !== "true" ]]; then +if [[ $recipe_run == "false" ]]; then DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":recipe fi From 18b682dad6bebb109fbdec6f16274ad2cda0c1a3 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 11 Apr 2024 09:02:58 +0200 Subject: [PATCH 10/53] Add missing end of if statement --- .github/workflows/run-tests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/run-tests.sh b/.github/workflows/run-tests.sh index c860668e..469ff59f 100755 --- a/.github/workflows/run-tests.sh +++ b/.github/workflows/run-tests.sh @@ -73,6 +73,7 @@ else DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":jempi fi done +fi # Run the basic funtional end to end tests for the CDR recipe if [[ $recipe_run == "false" ]]; then From b83327fbcf8f5ea408e1bf48c1a0c0dad58e52fe Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 11 Apr 2024 09:39:31 +0200 Subject: [PATCH 11/53] Ensure that recipe cdr tests are run on every pr created --- .github/workflows/run-tests.sh | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/run-tests.sh b/.github/workflows/run-tests.sh index 469ff59f..fd5d2525 100755 --- a/.github/workflows/run-tests.sh +++ b/.github/workflows/run-tests.sh @@ -11,9 +11,6 @@ cd ../../test/cucumber/ || exit # This ensures that the openhim and its mediators' tests are run only once when the openhim and its mediators have all been modified openhimRan="false" -# Ensures that the recipe tests are run only once -recipe_run="false" - declare -A changed_packages for package in "${CHANGED_FILES[@]}"; do if [[ $package == *"features/cluster-mode"* ]]; then @@ -29,16 +26,12 @@ for package in "${CHANGED_FILES[@]}"; do done if [[ ${#changed_packages[@]} -eq 0 ]] || [[ "${!changed_packages[*]}" == *"utils"* ]]; then - recipe_run="true" DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE" elif [[ "${!changed_packages[*]}" == *"features/single-mode"* ]] && [[ $NODE_MODE == "single" ]]; then - recipe_run="true" DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:single elif [[ "${!changed_packages[*]}" == *"features/cluster-mode"* ]] && [[ $NODE_MODE == "cluster" ]]; then - recipe_run="true" DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:cluster elif [[ "${!changed_packages[*]}" == *"infrastructure"* ]] && [[ $openhimRan == "false" ]]; then - openhimRan="true" DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":openhim else for folder_name in "${!changed_packages[@]}"; do @@ -76,6 +69,5 @@ else fi # Run the basic funtional end to end tests for the CDR recipe -if [[ $recipe_run == "false" ]]; then - DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":recipe -fi +DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":recipe + From 6bb3584c47ba8774bcf2366eea62598c96088e70 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 12 Apr 2024 11:52:36 +0200 Subject: [PATCH 12/53] Run in prod mode This will allow us to test the flow of data through the reverse proxy --- cdr-dw.env | 2 ++ .../features/cluster-mode/recipe.cluster.feature | 9 +++++---- test/cucumber/features/single-mode/recipe.feature | 9 +++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/cdr-dw.env b/cdr-dw.env index e9e3a6f5..35b8b574 100644 --- a/cdr-dw.env +++ b/cdr-dw.env @@ -18,3 +18,5 @@ KC_JEMPI_SSO_ENABLED=true REACT_APP_JEMPI_BASE_API_PORT=50001 KC_SUPERSET_SSO_ENABLED=true KC_GRAFANA_SSO_ENABLED=true + +INSECURE_PORTS=5001:5001-80:80-8080:8080-3003:3003-8124:8123-5601:5601-5488:5488-3000:3000-9200:9200-8089:8089-9001:9001-3033:3033-50000:50000 diff --git a/test/cucumber/features/cluster-mode/recipe.cluster.feature b/test/cucumber/features/cluster-mode/recipe.cluster.feature index d3e3a8a8..2ed005de 100644 --- a/test/cucumber/features/cluster-mode/recipe.cluster.feature +++ b/test/cucumber/features/cluster-mode/recipe.cluster.feature @@ -2,13 +2,14 @@ Feature: CDR recipe? Does the recipe work as expected Scenario: Init the CDR recipe - Given I use parameters "package init -p cdr-dw --dev --env-file=.env.cluster" + Given I use parameters "package init -p cdr-dw --env-file=.env.cluster" When I launch the platform with params Then The service "mongo-1" should be started with 1 replica And The service "openhim-core" should be started with 3 replica And The service "openhim-console" should be started with 3 replica And The service "kafka-unbundler-consumer" should be started with 1 replica And The service "kafka-mapper-consumer" should be started with 1 replica + And The service "reverse-proxy-nginx" should be started with 3 replicas Scenario: Send Fhir bundle and store the clinical data in the Fhir datastore, and the patient info in the CR Given I have configured the cdr @@ -28,12 +29,12 @@ Scenario: Fetch everything for a patient (all the clinical data) Then I should get a successful everything response Scenario: Bring down the servers - Given I use parameters "package down -p cdr-dw --dev --env-file=.env.cluster" + Given I use parameters "package down -p cdr-dw --env-file=.env.cluster" When I launch the platform with params Then a request to fetch data from the cdr should fail Scenario: Bring up the servers and test - Given I use parameters "package up -p cdr-dw --dev --env-file=.env.cluster" + Given I use parameters "package up -p cdr-dw --env-file=.env.cluster" When I launch the platform with params Then The service "mongo-1" should be started with 1 replica And The service "openhim-core" should be started with 3 replica @@ -45,7 +46,7 @@ Scenario: Bring up the servers and test And the data should be stored in clickhouse Scenario: Destroy the services - Given I use parameters "package remove -p cdr-dw --dev --env-file=.env.cluster" + Given I use parameters "package remove -p cdr-dw --env-file=.env.cluster" When I launch the platform with params Then There should be 0 service And There should be 0 volume diff --git a/test/cucumber/features/single-mode/recipe.feature b/test/cucumber/features/single-mode/recipe.feature index cd16eb65..21447c01 100644 --- a/test/cucumber/features/single-mode/recipe.feature +++ b/test/cucumber/features/single-mode/recipe.feature @@ -2,7 +2,7 @@ Feature: CDR-DW recipe? Does the recipe work as expected Scenario: Init the CDR recipe - Given I use parameters "package init -p cdr-dw --dev --env-file=cdr-dw.env" + Given I use parameters "package init -p cdr-dw --env-file=cdr-dw.env" When I launch the platform with params Then The service "mongo-1" should be started with 1 replica And The service "openhim-core" should be started with 1 replica @@ -34,6 +34,7 @@ Scenario: Init the CDR recipe And The service "minio-01" should be started with 1 replica And The service "dashboard-visualiser-superset" should be started with 1 replica And The service "analytics-datastore-clickhouse" should be started with 1 replica + And The service "reverse-proxy-nginx" should be started with 1 replica Scenario: Send Fhir bundle and store the clinical data in the Fhir datastore, the patient info in the CR Given I have configured the cdr @@ -51,12 +52,12 @@ Scenario: Fetch everything for a patient (all the clinical data) Then I should get a successful everything response Scenario: Bring down the servers - Given I use parameters "package down -p cdr-dw --dev --env-file=cdr-dw.env" + Given I use parameters "package down -p cdr-dw --env-file=cdr-dw.env" When I launch the platform with params Then a request to fetch data from the cdr should fail Scenario: Bring up the servers and test - Given I use parameters "package up -p cdr-dw --dev --env-file=cdr-dw.env" + Given I use parameters "package up -p cdr-dw --env-file=cdr-dw.env" When I launch the platform with params Then The service "mongo-1" should be started with 1 replica And The service "openhim-core" should be started with 1 replica @@ -68,7 +69,7 @@ Scenario: Bring up the servers and test And the data should be stored in clickhouse Scenario: Destroy the services - Given I use parameters "package remove -p cdr-dw --dev --env-file=cdr-dw.env" + Given I use parameters "package remove -p cdr-dw --env-file=cdr-dw.env" When I launch the platform with params Then There should be 0 service And There should be 0 volume From 7d0f9975efd58c538b54aa9a3171e856fdef650c Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 12 Apr 2024 15:51:20 +0200 Subject: [PATCH 13/53] Increase the time-out for the test action --- .github/workflows/ci-cluster.yml | 2 +- .github/workflows/ci.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-cluster.yml b/.github/workflows/ci-cluster.yml index 0eae1e68..3cd587e3 100644 --- a/.github/workflows/ci-cluster.yml +++ b/.github/workflows/ci-cluster.yml @@ -72,7 +72,7 @@ jobs: run-e2e-tests: runs-on: ubuntu-20.04 needs: configure-e2e-server - timeout-minutes: 120 + timeout-minutes: 160 steps: - uses: actions/checkout@v3 with: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ed7cedd..87a1d836 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,7 +71,7 @@ jobs: run-e2e-tests: runs-on: ubuntu-20.04 needs: configure-e2e-server - timeout-minutes: 80 + timeout-minutes: 120 steps: - uses: actions/checkout@v3 with: From 435e1d9bd0c7a298437ba11bce0cdfe8e6f91f88 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 12 Apr 2024 15:52:10 +0200 Subject: [PATCH 14/53] Run one feature to test changes in the utils, steps and infrastructure folder You only need to run tests in one feature to ensure that the functionality used in all the features still works --- .github/workflows/run-tests.sh | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/run-tests.sh b/.github/workflows/run-tests.sh index fd5d2525..1844a58e 100755 --- a/.github/workflows/run-tests.sh +++ b/.github/workflows/run-tests.sh @@ -25,13 +25,8 @@ for package in "${CHANGED_FILES[@]}"; do fi done -if [[ ${#changed_packages[@]} -eq 0 ]] || [[ "${!changed_packages[*]}" == *"utils"* ]]; then - DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE" -elif [[ "${!changed_packages[*]}" == *"features/single-mode"* ]] && [[ $NODE_MODE == "single" ]]; then - DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:single -elif [[ "${!changed_packages[*]}" == *"features/cluster-mode"* ]] && [[ $NODE_MODE == "cluster" ]]; then - DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:cluster -elif [[ "${!changed_packages[*]}" == *"infrastructure"* ]] && [[ $openhimRan == "false" ]]; then +if [[ ${#changed_packages[@]} -eq 0 ]] || [[ "${!changed_packages[*]}" == *"utils"* ]] || [[ "${!changed_packages[*]}" == *"features/steps"* ]] || [[ "${!changed_packages[*]}" == *"infrastructure"* ]] ; then + openhim_ran="true" DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":openhim else for folder_name in "${!changed_packages[@]}"; do @@ -70,4 +65,3 @@ fi # Run the basic funtional end to end tests for the CDR recipe DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":recipe - From 97083290da51ff2b17a18ce014dd2d01ac2e9a34 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 12 Apr 2024 16:30:42 +0200 Subject: [PATCH 15/53] Fix typo --- test/cucumber/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cucumber/package.json b/test/cucumber/package.json index ddd7786a..2e008fc4 100644 --- a/test/cucumber/package.json +++ b/test/cucumber/package.json @@ -6,7 +6,7 @@ "test:single": "cucumber-js 'features/single-mode/**/*.feature'", "test:single:recipe": "cucumber-js 'features/single-mode/recipe.feature'", "test:cluster": "cucumber-js 'features/cluster-mode/**/*.feature'", - "test:cluser:recipe": "cucumber-js 'features/cluster-mode/recipe.feature'", + "test:cluster:recipe": "cucumber-js 'features/cluster-mode/recipe.feature'", "test:single:clickhouse": "cucumber-js 'features/single-mode/clickhouse.feature'", "test:cluster:clickhouse": "cucumber-js 'features/cluster-mode/clickhouse.cluster.feature'", "test:single:elk": "cucumber-js 'features/single-mode/elastic-packages.feature'", From ba00297e6311e6fa05009d431dbda29bee84c6d5 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 12 Apr 2024 16:31:03 +0200 Subject: [PATCH 16/53] Superset now consists of two services Its now using postgres database --- test/cucumber/features/single-mode/superset.feature | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/cucumber/features/single-mode/superset.feature b/test/cucumber/features/single-mode/superset.feature index 21463078..074dd14b 100644 --- a/test/cucumber/features/single-mode/superset.feature +++ b/test/cucumber/features/single-mode/superset.feature @@ -5,11 +5,12 @@ Feature: Dashboard Visualiser Superset? Given I use parameters "package init -n=dashboard-visualiser-superset --only --dev --env-file=.env.local" When I launch the platform with params Then The service "dashboard-visualiser-superset" should be started with 1 replica + And The service "postgres-metastore" should be started with 1 replica And The service "superset-config-importer" should be removed And The service "ddashboard-visualiser-superset" should have healthy containers And The service "dashboard-visualiser-superset" should be connected to the networks | reverse-proxy_public | clickhouse_public | keycloak_public | superset_default | - And There should be 1 service + And There should be 2 service And There should be 3 volumes Scenario: Destroy Dashboard Visualiser Superset From e23eae2d5f48170276c2faead365a41af5a1bced Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 12 Apr 2024 19:17:40 +0200 Subject: [PATCH 17/53] Fix typo --- test/cucumber/features/single-mode/superset.feature | 2 +- test/cucumber/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cucumber/features/single-mode/superset.feature b/test/cucumber/features/single-mode/superset.feature index 074dd14b..4666504f 100644 --- a/test/cucumber/features/single-mode/superset.feature +++ b/test/cucumber/features/single-mode/superset.feature @@ -11,7 +11,7 @@ Feature: Dashboard Visualiser Superset? And The service "dashboard-visualiser-superset" should be connected to the networks | reverse-proxy_public | clickhouse_public | keycloak_public | superset_default | And There should be 2 service - And There should be 3 volumes + And There should be 2 volumes Scenario: Destroy Dashboard Visualiser Superset Given I use parameters "package destroy -n=dashboard-visualiser-superset --only --dev --env-file=.env.local" diff --git a/test/cucumber/package.json b/test/cucumber/package.json index 2e008fc4..5cb81a4e 100644 --- a/test/cucumber/package.json +++ b/test/cucumber/package.json @@ -6,7 +6,7 @@ "test:single": "cucumber-js 'features/single-mode/**/*.feature'", "test:single:recipe": "cucumber-js 'features/single-mode/recipe.feature'", "test:cluster": "cucumber-js 'features/cluster-mode/**/*.feature'", - "test:cluster:recipe": "cucumber-js 'features/cluster-mode/recipe.feature'", + "test:cluster:recipe": "cucumber-js 'features/cluster-mode/recipe.cluster.feature'", "test:single:clickhouse": "cucumber-js 'features/single-mode/clickhouse.feature'", "test:cluster:clickhouse": "cucumber-js 'features/cluster-mode/clickhouse.cluster.feature'", "test:single:elk": "cucumber-js 'features/single-mode/elastic-packages.feature'", From 30028c0bcfbea4e27e4e0a95739430949a7005a9 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Sun, 14 Apr 2024 10:59:53 +0200 Subject: [PATCH 18/53] Use 0.0.0.0 instead of localhost The tests are run on aws ec2 instance --- test/cucumber/features/steps/recipesSteps.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 5a358ba0..972e5a89 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -9,7 +9,7 @@ const { Given, When, Then, setDefaultTimeout } = require("@cucumber/cucumber"); setDefaultTimeout(30 * 60 * 1000); const CLICKHOUSE_HOST = - process.env.CLICKHOUSE_HOST || 'localhost'; + process.env.CLICKHOUSE_HOST || '0.0.0.0'; const CLICKHOUSE_PORT = parseInt(process.env.CLICKHOUSE_PORT || '8124'); const CLICKHOUSE_DEBUG = Boolean(process.env.CLICKHOUSE_DEBUG || false); @@ -43,7 +43,7 @@ Given("I have configured the cdr", async function () { fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'organization.json')) ); - this.cdrConfigResult = await sendRequest('http://localhost:5001/fhir', 'POST', organization); + this.cdrConfigResult = await sendRequest('http://0.0.0.0:5001/fhir', 'POST', organization); }); When("I send a fhir patient bundle", async function () { @@ -51,15 +51,15 @@ When("I send a fhir patient bundle", async function () { fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'fhirBundle.json')) ); - this.fhirBundleSentResult = await sendRequest('http://localhost:5001/fhir', 'POST', fhirBundle); + this.fhirBundleSentResult = await sendRequest('http://0.0.0.0:5001/fhir', 'POST', fhirBundle); }); When("I then send a fhir patient summary request", async function () { - this.IPSResult = await sendRequest(`http://localhost:5001/fhir/Patient/${PatientID}/$summary`, 'GET'); + this.IPSResult = await sendRequest(`http://0.0.0.0:5001/fhir/Patient/${PatientID}/$summary`, 'GET'); }); When("I then send a request for all the patient's clinical data", async function () { - this.EverythingResult = await sendRequest(`http://localhost:5001/fhir/Patient/${PatientID}/$everything`, 'GET'); + this.EverythingResult = await sendRequest(`http://0.0.0.0:5001/fhir/Patient/${PatientID}/$everything`, 'GET'); }); Then("the clinical data should be stored in hapi fhir", async function () { @@ -73,7 +73,7 @@ Then("the patient data in the Jempi client registry", async function () { PatientID = patientResource.response.location.split('/')[1]; - const patient = await sendRequest(`http://localhost:3003/fhir/links/Patient/${PatientID}`, 'GET'); + const patient = await sendRequest(`http://0.0.0.0:3003/fhir/links/Patient/${PatientID}`, 'GET'); expect(patient.data.link.filter(pat => pat.other.reference.match(`Patient/${PatientID}`)).length).to.equal(1); }); @@ -87,7 +87,7 @@ Then("I should get a successful everything response", function () { }); Then("a request to fetch data from the cdr should fail", async function () { - await sendRequest(`http://localhost:3003/fhir/links/Patient/${PatientID}`).catch(err => { + await sendRequest(`http://0.0.0.0:3003/fhir/links/Patient/${PatientID}`).catch(err => { expect(err.message).to.match(/ECONNREFUSED/); }); }); From d94f678af0d982ebfaf44e17886e65bad70e6db4 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Sun, 14 Apr 2024 12:02:10 +0200 Subject: [PATCH 19/53] Access the services via the reverse proxy in the recipe tests --- test/cucumber/features/steps/recipesSteps.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 972e5a89..e05f72e8 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -43,7 +43,7 @@ Given("I have configured the cdr", async function () { fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'organization.json')) ); - this.cdrConfigResult = await sendRequest('http://0.0.0.0:5001/fhir', 'POST', organization); + this.cdrConfigResult = await sendRequest('http://openhimcomms.domain/fhir', 'POST', organization); }); When("I send a fhir patient bundle", async function () { @@ -51,15 +51,15 @@ When("I send a fhir patient bundle", async function () { fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'fhirBundle.json')) ); - this.fhirBundleSentResult = await sendRequest('http://0.0.0.0:5001/fhir', 'POST', fhirBundle); + this.fhirBundleSentResult = await sendRequest('http://openhimcomms.domain/fhir', 'POST', fhirBundle); }); When("I then send a fhir patient summary request", async function () { - this.IPSResult = await sendRequest(`http://0.0.0.0:5001/fhir/Patient/${PatientID}/$summary`, 'GET'); + this.IPSResult = await sendRequest(`http://openhimcomms.domain/fhir/Patient/${PatientID}/$summary`, 'GET'); }); When("I then send a request for all the patient's clinical data", async function () { - this.EverythingResult = await sendRequest(`http://0.0.0.0:5001/fhir/Patient/${PatientID}/$everything`, 'GET'); + this.EverythingResult = await sendRequest(`http://openhimcomms.domain/fhir/Patient/${PatientID}/$everything`, 'GET'); }); Then("the clinical data should be stored in hapi fhir", async function () { From e180c1d1da54574efd891260d5d83f86d6e1cd0b Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Sun, 14 Apr 2024 14:35:14 +0200 Subject: [PATCH 20/53] Use the ip of the aws instance for requests --- .github/workflows/run-tests.sh | 2 +- test/cucumber/features/steps/recipesSteps.js | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/run-tests.sh b/.github/workflows/run-tests.sh index 1844a58e..d1f9a7d7 100755 --- a/.github/workflows/run-tests.sh +++ b/.github/workflows/run-tests.sh @@ -64,4 +64,4 @@ else fi # Run the basic funtional end to end tests for the CDR recipe -DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":recipe +DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud HOST=$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":recipe diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index e05f72e8..c763973d 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -8,15 +8,15 @@ const { ClickHouse } = require('clickhouse'); const { Given, When, Then, setDefaultTimeout } = require("@cucumber/cucumber"); setDefaultTimeout(30 * 60 * 1000); -const CLICKHOUSE_HOST = - process.env.CLICKHOUSE_HOST || '0.0.0.0'; +const HOST = + process.env.HOST || 'localhost'; const CLICKHOUSE_PORT = parseInt(process.env.CLICKHOUSE_PORT || '8124'); const CLICKHOUSE_DEBUG = Boolean(process.env.CLICKHOUSE_DEBUG || false); const { expect } = chai; const clickhouse = new ClickHouse({ - url: CLICKHOUSE_HOST, + url: HOST, port: CLICKHOUSE_PORT, debug: CLICKHOUSE_DEBUG, raw: true, @@ -43,7 +43,7 @@ Given("I have configured the cdr", async function () { fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'organization.json')) ); - this.cdrConfigResult = await sendRequest('http://openhimcomms.domain/fhir', 'POST', organization); + this.cdrConfigResult = await sendRequest(`http://${HOST}/fhir`, 'POST', organization); }); When("I send a fhir patient bundle", async function () { @@ -51,15 +51,15 @@ When("I send a fhir patient bundle", async function () { fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'fhirBundle.json')) ); - this.fhirBundleSentResult = await sendRequest('http://openhimcomms.domain/fhir', 'POST', fhirBundle); + this.fhirBundleSentResult = await sendRequest(`http://${HOST}/fhir`, 'POST', fhirBundle); }); When("I then send a fhir patient summary request", async function () { - this.IPSResult = await sendRequest(`http://openhimcomms.domain/fhir/Patient/${PatientID}/$summary`, 'GET'); + this.IPSResult = await sendRequest(`http://${HOST}/fhir/Patient/${PatientID}/$summary`, 'GET'); }); When("I then send a request for all the patient's clinical data", async function () { - this.EverythingResult = await sendRequest(`http://openhimcomms.domain/fhir/Patient/${PatientID}/$everything`, 'GET'); + this.EverythingResult = await sendRequest(`http://${HOST}/fhir/Patient/${PatientID}/$everything`, 'GET'); }); Then("the clinical data should be stored in hapi fhir", async function () { @@ -73,7 +73,7 @@ Then("the patient data in the Jempi client registry", async function () { PatientID = patientResource.response.location.split('/')[1]; - const patient = await sendRequest(`http://0.0.0.0:3003/fhir/links/Patient/${PatientID}`, 'GET'); + const patient = await sendRequest(`http://${HOST}:3003/fhir/links/Patient/${PatientID}`, 'GET'); expect(patient.data.link.filter(pat => pat.other.reference.match(`Patient/${PatientID}`)).length).to.equal(1); }); @@ -87,7 +87,7 @@ Then("I should get a successful everything response", function () { }); Then("a request to fetch data from the cdr should fail", async function () { - await sendRequest(`http://0.0.0.0:3003/fhir/links/Patient/${PatientID}`).catch(err => { + await sendRequest(`http://${HOST}:3003/fhir/links/Patient/${PatientID}`).catch(err => { expect(err.message).to.match(/ECONNREFUSED/); }); }); From cf93d018af15e9dd541a9773e1e2a33f15058138 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Sun, 14 Apr 2024 20:29:23 +0200 Subject: [PATCH 21/53] Run tests in dev mode so all the services are exposed Cant use the reverse proxy as there is no domain for the tests --- test/cucumber/features/cluster-mode/recipe.cluster.feature | 5 ++--- test/cucumber/features/single-mode/recipe.feature | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/test/cucumber/features/cluster-mode/recipe.cluster.feature b/test/cucumber/features/cluster-mode/recipe.cluster.feature index 2ed005de..406afe60 100644 --- a/test/cucumber/features/cluster-mode/recipe.cluster.feature +++ b/test/cucumber/features/cluster-mode/recipe.cluster.feature @@ -2,14 +2,13 @@ Feature: CDR recipe? Does the recipe work as expected Scenario: Init the CDR recipe - Given I use parameters "package init -p cdr-dw --env-file=.env.cluster" + Given I use parameters "package init -p cdr-dw --dev --env-file=.env.cluster" When I launch the platform with params Then The service "mongo-1" should be started with 1 replica And The service "openhim-core" should be started with 3 replica And The service "openhim-console" should be started with 3 replica And The service "kafka-unbundler-consumer" should be started with 1 replica And The service "kafka-mapper-consumer" should be started with 1 replica - And The service "reverse-proxy-nginx" should be started with 3 replicas Scenario: Send Fhir bundle and store the clinical data in the Fhir datastore, and the patient info in the CR Given I have configured the cdr @@ -34,7 +33,7 @@ Scenario: Bring down the servers Then a request to fetch data from the cdr should fail Scenario: Bring up the servers and test - Given I use parameters "package up -p cdr-dw --env-file=.env.cluster" + Given I use parameters "package up -p cdr-dw --dev --env-file=.env.cluster" When I launch the platform with params Then The service "mongo-1" should be started with 1 replica And The service "openhim-core" should be started with 3 replica diff --git a/test/cucumber/features/single-mode/recipe.feature b/test/cucumber/features/single-mode/recipe.feature index 21447c01..54a93c50 100644 --- a/test/cucumber/features/single-mode/recipe.feature +++ b/test/cucumber/features/single-mode/recipe.feature @@ -2,7 +2,7 @@ Feature: CDR-DW recipe? Does the recipe work as expected Scenario: Init the CDR recipe - Given I use parameters "package init -p cdr-dw --env-file=cdr-dw.env" + Given I use parameters "package init -p cdr-dw --dev --env-file=cdr-dw.env" When I launch the platform with params Then The service "mongo-1" should be started with 1 replica And The service "openhim-core" should be started with 1 replica @@ -34,7 +34,6 @@ Scenario: Init the CDR recipe And The service "minio-01" should be started with 1 replica And The service "dashboard-visualiser-superset" should be started with 1 replica And The service "analytics-datastore-clickhouse" should be started with 1 replica - And The service "reverse-proxy-nginx" should be started with 1 replica Scenario: Send Fhir bundle and store the clinical data in the Fhir datastore, the patient info in the CR Given I have configured the cdr @@ -57,7 +56,7 @@ Scenario: Bring down the servers Then a request to fetch data from the cdr should fail Scenario: Bring up the servers and test - Given I use parameters "package up -p cdr-dw --env-file=cdr-dw.env" + Given I use parameters "package up -p cdr-dw --dev --env-file=cdr-dw.env" When I launch the platform with params Then The service "mongo-1" should be started with 1 replica And The service "openhim-core" should be started with 1 replica From 913346d467b4d0d1246dd5c8fd728658e7a8597e Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Sun, 14 Apr 2024 21:40:32 +0200 Subject: [PATCH 22/53] Specify the port --- test/cucumber/features/steps/recipesSteps.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index c763973d..731ec39d 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -43,7 +43,7 @@ Given("I have configured the cdr", async function () { fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'organization.json')) ); - this.cdrConfigResult = await sendRequest(`http://${HOST}/fhir`, 'POST', organization); + this.cdrConfigResult = await sendRequest(`http://${HOST}:5001/fhir`, 'POST', organization); }); When("I send a fhir patient bundle", async function () { @@ -51,15 +51,15 @@ When("I send a fhir patient bundle", async function () { fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'fhirBundle.json')) ); - this.fhirBundleSentResult = await sendRequest(`http://${HOST}/fhir`, 'POST', fhirBundle); + this.fhirBundleSentResult = await sendRequest(`http://${HOST}:5001/fhir`, 'POST', fhirBundle); }); When("I then send a fhir patient summary request", async function () { - this.IPSResult = await sendRequest(`http://${HOST}/fhir/Patient/${PatientID}/$summary`, 'GET'); + this.IPSResult = await sendRequest(`http://${HOST}:5001/fhir/Patient/${PatientID}/$summary`, 'GET'); }); When("I then send a request for all the patient's clinical data", async function () { - this.EverythingResult = await sendRequest(`http://${HOST}/fhir/Patient/${PatientID}/$everything`, 'GET'); + this.EverythingResult = await sendRequest(`http://${HOST}:5001/fhir/Patient/${PatientID}/$everything`, 'GET'); }); Then("the clinical data should be stored in hapi fhir", async function () { From 9e698e6e5e97b206437bd4a918f34e893f1218dd Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Mon, 15 Apr 2024 14:32:42 +0200 Subject: [PATCH 23/53] Use locahost as the services are being run in dev mode --- .github/workflows/run-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-tests.sh b/.github/workflows/run-tests.sh index d1f9a7d7..3cfe942e 100755 --- a/.github/workflows/run-tests.sh +++ b/.github/workflows/run-tests.sh @@ -64,4 +64,4 @@ else fi # Run the basic funtional end to end tests for the CDR recipe -DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud HOST=$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":recipe +DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud HOST=localhost yarn test:"$NODE_MODE":recipe From d67af888c74d83fd0d316c9b52da170a3757784b Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Mon, 15 Apr 2024 16:44:20 +0200 Subject: [PATCH 24/53] Use 0.0.0.0 instead of localhost --- .github/workflows/run-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-tests.sh b/.github/workflows/run-tests.sh index 3cfe942e..62cb0b78 100755 --- a/.github/workflows/run-tests.sh +++ b/.github/workflows/run-tests.sh @@ -64,4 +64,4 @@ else fi # Run the basic funtional end to end tests for the CDR recipe -DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud HOST=localhost yarn test:"$NODE_MODE":recipe +DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud HOST=0.0.0.0 yarn test:"$NODE_MODE":recipe From 678de01a7fdc15491d2fb076f23f26d7885ca023 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Mon, 15 Apr 2024 19:37:23 +0200 Subject: [PATCH 25/53] Open ports for the tests (temporary) --- infrastructure/terraform/security.tf | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/infrastructure/terraform/security.tf b/infrastructure/terraform/security.tf index 5a1293ff..855fb534 100644 --- a/infrastructure/terraform/security.tf +++ b/infrastructure/terraform/security.tf @@ -22,6 +22,20 @@ resource "aws_security_group" "docker_swarm_sg" { cidr_blocks = [ "0.0.0.0/0"] } + ingress { + from_port = 5001 + to_port = 5001 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } + ingress { + from_port = 3003 + to_port = 3003 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } ingress { from_port = 443 to_port = 443 From 93b90945d8dc2893a93cc5fa154e2d98a9e3df38 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Mon, 15 Apr 2024 19:42:46 +0200 Subject: [PATCH 26/53] Use host ip --- .github/workflows/run-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-tests.sh b/.github/workflows/run-tests.sh index 62cb0b78..d1f9a7d7 100755 --- a/.github/workflows/run-tests.sh +++ b/.github/workflows/run-tests.sh @@ -64,4 +64,4 @@ else fi # Run the basic funtional end to end tests for the CDR recipe -DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud HOST=0.0.0.0 yarn test:"$NODE_MODE":recipe +DOCKER_HOST=ssh://ubuntu@$GITHUB_RUN_ID.jembi.cloud HOST=$GITHUB_RUN_ID.jembi.cloud yarn test:"$NODE_MODE":recipe From c59b0a7f75c6f82454bca4091bd4cb49af72f753 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Tue, 16 Apr 2024 09:20:35 +0200 Subject: [PATCH 27/53] Add channel for retrieving patient using the interaction id --- .../importer/volume/openhim-import.json | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/mpi-mediator/importer/volume/openhim-import.json b/mpi-mediator/importer/volume/openhim-import.json index 9475b1fa..230dbaf1 100644 --- a/mpi-mediator/importer/volume/openhim-import.json +++ b/mpi-mediator/importer/volume/openhim-import.json @@ -189,6 +189,72 @@ "id": "65d47e98223a0672c3c9808b", "name": "Super User" } + }, + { + "name": "JeMPI Patient links endpoint in fhir", + "description": "JeMPI Patient endpoint for retrieving using the patient interaction id", + "urlPattern": "^/fhir/links/Patient/?[^/]*$", + "isAsynchronousProcess": false, + "methods": [ + "GET", + "POST", + "DELETE", + "PUT", + "OPTIONS", + "HEAD", + "TRACE", + "CONNECT", + "PATCH" + ], + "type": "http", + "tcpPort": null, + "tcpHost": null, + "pollingSchedule": null, + "requestBody": true, + "responseBody": true, + "allow": [ + "instant" + ], + "whitelist": [], + "authType": "private", + "routes": [ + { + "name": "Generic Mapping Mediator", + "type": "http", + "status": "enabled", + "secured": false, + "host": "openhim-mapping-mediator", + "port": 3003, + "path": "", + "pathTransform": "", + "primary": true, + "username": "", + "password": "", + "forwardAuthHeader": true, + "waitPrimaryResponse": false, + "statusCodesCheck": "2**" + } + ], + "matchContentTypes": [], + "matchContentRegex": null, + "matchContentXpath": null, + "matchContentJson": null, + "matchContentValue": null, + "properties": [], + "txViewAcl": [], + "txViewFullAcl": [], + "txRerunAcl": [], + "alerts": [], + "status": "enabled", + "rewriteUrls": false, + "addAutoRewriteRules": true, + "rewriteUrlsConfig": [], + "autoRetryEnabled": false, + "autoRetryPeriodMinutes": 60, + "updatedBy": { + "id": "661e1f5400aefa5bfd3ea14d", + "name": "test test" + } } ], "Mediators": [ From 688cc217fbfd6d02dc276fd1f9a58506415fa507 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Tue, 16 Apr 2024 09:21:35 +0200 Subject: [PATCH 28/53] Open the clickhouse port for testing --- infrastructure/terraform/security.tf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infrastructure/terraform/security.tf b/infrastructure/terraform/security.tf index 855fb534..7a6a7ba3 100644 --- a/infrastructure/terraform/security.tf +++ b/infrastructure/terraform/security.tf @@ -30,8 +30,8 @@ resource "aws_security_group" "docker_swarm_sg" { "0.0.0.0/0"] } ingress { - from_port = 3003 - to_port = 3003 + from_port = 8124 + to_port = 8124 protocol = "tcp" cidr_blocks = [ "0.0.0.0/0"] From b1b6ac37f0f10a131372f64f2c0898b7ce759944 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Tue, 16 Apr 2024 09:22:26 +0200 Subject: [PATCH 29/53] Use the correct port --- test/cucumber/features/steps/recipesSteps.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 731ec39d..75c790d1 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -73,7 +73,7 @@ Then("the patient data in the Jempi client registry", async function () { PatientID = patientResource.response.location.split('/')[1]; - const patient = await sendRequest(`http://${HOST}:3003/fhir/links/Patient/${PatientID}`, 'GET'); + const patient = await sendRequest(`http://${HOST}:5001/fhir/links/Patient/${PatientID}`, 'GET'); expect(patient.data.link.filter(pat => pat.other.reference.match(`Patient/${PatientID}`)).length).to.equal(1); }); From c76cca12b7788fd5ddc1a1eeceadb1e8fe4b91d5 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Tue, 16 Apr 2024 12:00:55 +0200 Subject: [PATCH 30/53] Increase channel priority so that is can be accessed --- mpi-mediator/importer/volume/openhim-import.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mpi-mediator/importer/volume/openhim-import.json b/mpi-mediator/importer/volume/openhim-import.json index 230dbaf1..3538f3d7 100644 --- a/mpi-mediator/importer/volume/openhim-import.json +++ b/mpi-mediator/importer/volume/openhim-import.json @@ -252,9 +252,10 @@ "autoRetryEnabled": false, "autoRetryPeriodMinutes": 60, "updatedBy": { - "id": "661e1f5400aefa5bfd3ea14d", + "id": "661e3c1206d33f9dfbcb3094", "name": "test test" - } + }, + "priority": 1 } ], "Mediators": [ From f69cc7a8b4f54da3475331bd541757c5c8854651 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Tue, 16 Apr 2024 12:02:17 +0200 Subject: [PATCH 31/53] Cater for socket hang up error --- test/cucumber/features/steps/recipesSteps.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 75c790d1..8cc6ff94 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -87,8 +87,8 @@ Then("I should get a successful everything response", function () { }); Then("a request to fetch data from the cdr should fail", async function () { - await sendRequest(`http://${HOST}:3003/fhir/links/Patient/${PatientID}`).catch(err => { - expect(err.message).to.match(/ECONNREFUSED/); + await sendRequest(`http://${HOST}:5001/fhir/links/Patient/${PatientID}`).catch(err => { + expect(err.message).to.match(/ECONNREFUSED|socket hang up/); }); }); From c96c2b168d2f9309af35ee0810b74d698dee8151 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Tue, 16 Apr 2024 13:46:47 +0200 Subject: [PATCH 32/53] Debug --- test/cucumber/features/steps/recipesSteps.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 8cc6ff94..59ad94ea 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -6,6 +6,7 @@ const path = require('path'); const chai = require("chai"); const { ClickHouse } = require('clickhouse'); const { Given, When, Then, setDefaultTimeout } = require("@cucumber/cucumber"); +const { Console } = require("console"); setDefaultTimeout(30 * 60 * 1000); const HOST = @@ -100,7 +101,8 @@ Then("the data should be stored in clickhouse", async function () { query("observation_example") ).toPromise(); - + console.log(patient) + console.log(observation) expect(JSON.parse(patient).rows).to.be.greaterThan(0); expect(JSON.parse(observation).rows).to.be.greaterThan(0); }); From f199cc68b8d2987d6fc10ddeee421c02d6e83e60 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Wed, 17 Apr 2024 09:07:45 +0200 Subject: [PATCH 33/53] Set the correct kafka host value for clustered mode --- .env.cluster | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.env.cluster b/.env.cluster index 1e4b52c6..739703ef 100644 --- a/.env.cluster +++ b/.env.cluster @@ -66,6 +66,10 @@ JS_REPORT_PACKAGE_PATH= KAFKA_TOPICS=2xx,reprocess,3xx,metrics:3:3 KAFKA_HOSTS=kafka-01:9092,kafka-02:9092,kafka-03:9092 +# Kafka consumer mapper +KAFKA_HOST=kafka-01,kafka-02,kafka-03 +KAFKA_PORT=9092 + # MPI MEDIATOR MPI_MEDIATOR_INSTANCES=3 From 8b65d2d45c486e9df755dc0db4676ea0e0133f7f Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 18 Apr 2024 12:11:34 +0200 Subject: [PATCH 34/53] Wait for the data to be in clickhouse before quering clickhouse is replicated in cluster mode. The data will only be available after replication --- test/cucumber/features/steps/recipesSteps.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 59ad94ea..04d7a4a7 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -6,7 +6,6 @@ const path = require('path'); const chai = require("chai"); const { ClickHouse } = require('clickhouse'); const { Given, When, Then, setDefaultTimeout } = require("@cucumber/cucumber"); -const { Console } = require("console"); setDefaultTimeout(30 * 60 * 1000); const HOST = @@ -60,7 +59,7 @@ When("I then send a fhir patient summary request", async function () { }); When("I then send a request for all the patient's clinical data", async function () { - this.EverythingResult = await sendRequest(`http://${HOST}:5001/fhir/Patient/${PatientID}/$everything`, 'GET'); + this.EverythingResult = await sendRequest(`http://${HOST}:5001/fhir/Patient/${PatientID}/$everything?_mdm=true`, 'GET'); }); Then("the clinical data should be stored in hapi fhir", async function () { @@ -94,6 +93,10 @@ Then("a request to fetch data from the cdr should fail", async function () { }); Then("the data should be stored in clickhouse", async function () { + await new Promise((resolve) => { + setTimeout(() => resolve(), 10000) + }); + const patient = await clickhouse.query( query("patient_example"), ).toPromise(); From 5e013c6ff76a64de8b029184c2f6a118f7d448f4 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 18 Apr 2024 12:13:21 +0200 Subject: [PATCH 35/53] Correct the brokers for openhim in cluster mode --- .env.cluster | 1 + 1 file changed, 1 insertion(+) diff --git a/.env.cluster b/.env.cluster index 739703ef..426cd0b3 100644 --- a/.env.cluster +++ b/.env.cluster @@ -16,6 +16,7 @@ OPENHIM_MEDIATOR_API_PORT=443 MONGO_SET_COUNT=3 OPENHIM_MONGO_URL=mongodb://mongo-1:27017,mongo-2:27017,mongo-3:27017/openhim?replicaSet=mongo-set OPENHIM_MONGO_ATNAURL=mongodb://mongo-1:27017,mongo-2:27017,mongo-3:27017/openhim?replicaSet=mongo-set +KAFKA_BROKERS=kafka-01,kafka-02,kafka-03 # FHIR Datastore - HAPI FHIR HAPI_FHIR_INSTANCES=3 From 24a1ee178c1515c04bed7198d8a79c0f0f587b17 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 18 Apr 2024 13:03:12 +0200 Subject: [PATCH 36/53] Increase waiting period before clickhouse query --- test/cucumber/features/steps/recipesSteps.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 04d7a4a7..d789edee 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -94,7 +94,7 @@ Then("a request to fetch data from the cdr should fail", async function () { Then("the data should be stored in clickhouse", async function () { await new Promise((resolve) => { - setTimeout(() => resolve(), 10000) + setTimeout(() => resolve(), 20000) }); const patient = await clickhouse.query( From 6464a7044df2a85cdfe9413fcd42a5f774eff2d5 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 18 Apr 2024 14:41:35 +0200 Subject: [PATCH 37/53] wait for the services to be started up before tests --- test/cucumber/features/steps/recipesSteps.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index d789edee..231b965a 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -39,6 +39,9 @@ const sendRequest = (url, method='POST', data={}) => { let PatientID; Given("I have configured the cdr", async function () { + await new Promise((resolve) => { + setTimeout(() => resolve(), 3000000) + }); const organization = JSON.parse( fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'organization.json')) ); From cbe245dc0683862ac6ac85d52488879d27847646 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 18 Apr 2024 18:07:14 +0200 Subject: [PATCH 38/53] Reduce timeout fro debugging purposes --- test/cucumber/features/steps/recipesSteps.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 231b965a..363867ef 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -40,7 +40,7 @@ let PatientID; Given("I have configured the cdr", async function () { await new Promise((resolve) => { - setTimeout(() => resolve(), 3000000) + setTimeout(() => resolve(), 900000) }); const organization = JSON.parse( fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'organization.json')) From 891783e81079ad5a636d891aab33058e831a0238 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 18 Apr 2024 19:42:54 +0200 Subject: [PATCH 39/53] Wait for services to up and running --- test/cucumber/features/steps/recipesSteps.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 363867ef..291800c3 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -65,6 +65,12 @@ When("I then send a request for all the patient's clinical data", async function this.EverythingResult = await sendRequest(`http://${HOST}:5001/fhir/Patient/${PatientID}/$everything?_mdm=true`, 'GET'); }); +When("I wait for the services to start up", async function() { + await new Promise((resolve) => { + setTimeout(() => resolve(), 600000); + }); +}); + Then("the clinical data should be stored in hapi fhir", async function () { this.fhirBundleSentResult.data.entry.forEach(rec => { expect(rec.response.status).to.match(/201|200/); From dce7720611634b51181c9715801e4108d8cda366 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Thu, 18 Apr 2024 21:03:00 +0200 Subject: [PATCH 40/53] add step for waiting for the services to be up --- test/cucumber/features/cluster-mode/recipe.cluster.feature | 1 + 1 file changed, 1 insertion(+) diff --git a/test/cucumber/features/cluster-mode/recipe.cluster.feature b/test/cucumber/features/cluster-mode/recipe.cluster.feature index 406afe60..968256c8 100644 --- a/test/cucumber/features/cluster-mode/recipe.cluster.feature +++ b/test/cucumber/features/cluster-mode/recipe.cluster.feature @@ -40,6 +40,7 @@ Scenario: Bring up the servers and test And The service "openhim-console" should be started with 3 replica And The service "postgres-1" should be started with 1 replica And The service "hapi-fhir" should be started with 3 replica + And I wait for the services to start up When I then send a request for all the patient's clinical data Then I should get a successful everything response And the data should be stored in clickhouse From 1b6a2ab992ffe177ba7093ba0b29a19ef6d8fb30 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 19 Apr 2024 07:58:59 +0200 Subject: [PATCH 41/53] Add the topics used so they are created before the services try to connect --- .env.cluster | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.cluster b/.env.cluster index 426cd0b3..a4797172 100644 --- a/.env.cluster +++ b/.env.cluster @@ -64,7 +64,7 @@ JS_REPORT_PACKAGE_PATH= # Message Bus Kafka # Topics should comma seperated, optional include partion and repliction values # e.g. :: -> test:3:2 (defaults to :3:1) -KAFKA_TOPICS=2xx,reprocess,3xx,metrics:3:3 +KAFKA_TOPICS=2xx,2xx-async,reprocess,3xx,metrics:3:3,patient,observation KAFKA_HOSTS=kafka-01:9092,kafka-02:9092,kafka-03:9092 # Kafka consumer mapper From c6e0202bd872340e827deb6d4a66305541178901 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 19 Apr 2024 08:00:11 +0200 Subject: [PATCH 42/53] Log response for debugging purposes --- test/cucumber/features/steps/recipesSteps.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 291800c3..1c0540eb 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -63,11 +63,13 @@ When("I then send a fhir patient summary request", async function () { When("I then send a request for all the patient's clinical data", async function () { this.EverythingResult = await sendRequest(`http://${HOST}:5001/fhir/Patient/${PatientID}/$everything?_mdm=true`, 'GET'); + console.log(this.EverythingResult); + console.log(this.EverythingResult.data) }); When("I wait for the services to start up", async function() { await new Promise((resolve) => { - setTimeout(() => resolve(), 600000); + setTimeout(() => resolve(), 300000); }); }); From 7da9e984b6b89d017d06ca1b3b46c6f694271b55 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 19 Apr 2024 08:01:17 +0200 Subject: [PATCH 43/53] Change order of starting up packages Kafka should be started first because in a replicated state it takes long to start up and this results in services failing to connect (for those services that fail and never try to reconnect) --- config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config.yaml b/config.yaml index c548503f..cb39cb09 100644 --- a/config.yaml +++ b/config.yaml @@ -27,13 +27,11 @@ packages: profiles: - name: cdr-dw packages: + - message-bus-kafka - interoperability-layer-openhim - reverse-proxy-nginx - fhir-datastore-hapi-fhir - - message-bus-kafka - job-scheduler-ofelia - - kafka-mapper-consumer - - kafka-unbundler-consumer - analytics-datastore-clickhouse - dashboard-visualiser-superset - monitoring @@ -41,6 +39,8 @@ profiles: - client-registry-jempi - identity-access-manager-keycloak - openhim-mapping-mediator + - kafka-mapper-consumer + - kafka-unbundler-consumer envFiles: - cdr-dw.env From 304ffff98ac1fddc8cf8724505959a1ded68df24 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 19 Apr 2024 09:12:32 +0200 Subject: [PATCH 44/53] Cater for a timeout response when the services are down --- test/cucumber/features/steps/recipesSteps.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 1c0540eb..6c3afa47 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -40,7 +40,7 @@ let PatientID; Given("I have configured the cdr", async function () { await new Promise((resolve) => { - setTimeout(() => resolve(), 900000) + setTimeout(() => resolve(), 300000) }); const organization = JSON.parse( fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'organization.json')) @@ -99,7 +99,7 @@ Then("I should get a successful everything response", function () { Then("a request to fetch data from the cdr should fail", async function () { await sendRequest(`http://${HOST}:5001/fhir/links/Patient/${PatientID}`).catch(err => { - expect(err.message).to.match(/ECONNREFUSED|socket hang up/); + expect(err.message).to.match(/ECONNREFUSED|socket hang up|ETIMEDOUT/); }); }); From f7bc012d5fee65d72469613658e2b7745901a3a5 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 19 Apr 2024 11:02:39 +0200 Subject: [PATCH 45/53] Open port for testing --- infrastructure/terraform/security.tf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/infrastructure/terraform/security.tf b/infrastructure/terraform/security.tf index 7a6a7ba3..41a1e629 100644 --- a/infrastructure/terraform/security.tf +++ b/infrastructure/terraform/security.tf @@ -36,6 +36,13 @@ resource "aws_security_group" "docker_swarm_sg" { cidr_blocks = [ "0.0.0.0/0"] } + ingress { + from_port = 3447 + to_port = 3447 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } ingress { from_port = 443 to_port = 443 From 65a85e0271f50bdf607974f32544b1ae1b482ae4 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 19 Apr 2024 16:05:35 +0200 Subject: [PATCH 46/53] Open port for testing --- infrastructure/terraform/security.tf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/infrastructure/terraform/security.tf b/infrastructure/terraform/security.tf index 41a1e629..55dcf643 100644 --- a/infrastructure/terraform/security.tf +++ b/infrastructure/terraform/security.tf @@ -36,6 +36,13 @@ resource "aws_security_group" "docker_swarm_sg" { cidr_blocks = [ "0.0.0.0/0"] } + ingress { + from_port = 3033 + to_port = 3033 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } ingress { from_port = 3447 to_port = 3447 From 98dd506227afc111b157c8579dbd0bfeb1c771d4 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Fri, 19 Apr 2024 16:06:07 +0200 Subject: [PATCH 47/53] Increase waiting period before requests to tes are sent --- test/cucumber/features/steps/recipesSteps.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 6c3afa47..0e966664 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -69,7 +69,7 @@ When("I then send a request for all the patient's clinical data", async function When("I wait for the services to start up", async function() { await new Promise((resolve) => { - setTimeout(() => resolve(), 300000); + setTimeout(() => resolve(), 1500000); }); }); From 8ef1633f5f01f1cbcea76c89f6ef4e3e190cef68 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Mon, 22 Apr 2024 08:24:10 +0200 Subject: [PATCH 48/53] Clean up Remove the code that was being used for debugging --- test/cucumber/features/steps/recipesSteps.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/cucumber/features/steps/recipesSteps.js b/test/cucumber/features/steps/recipesSteps.js index 0e966664..9c119150 100644 --- a/test/cucumber/features/steps/recipesSteps.js +++ b/test/cucumber/features/steps/recipesSteps.js @@ -63,8 +63,6 @@ When("I then send a fhir patient summary request", async function () { When("I then send a request for all the patient's clinical data", async function () { this.EverythingResult = await sendRequest(`http://${HOST}:5001/fhir/Patient/${PatientID}/$everything?_mdm=true`, 'GET'); - console.log(this.EverythingResult); - console.log(this.EverythingResult.data) }); When("I wait for the services to start up", async function() { @@ -115,8 +113,6 @@ Then("the data should be stored in clickhouse", async function () { query("observation_example") ).toPromise(); - console.log(patient) - console.log(observation) expect(JSON.parse(patient).rows).to.be.greaterThan(0); expect(JSON.parse(observation).rows).to.be.greaterThan(0); }); From ededfb3f048347fff8ad56fada0ac74845468b0c Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Mon, 22 Apr 2024 08:25:12 +0200 Subject: [PATCH 49/53] Temporarily remove the scenarios that check the system can be restored when it goes down These have been removed because the jempi client registry has a bug where the data is lost when run in clustered mode. THe tests will be brought back once jempi is fixed --- .../cluster-mode/recipe.cluster.feature | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/test/cucumber/features/cluster-mode/recipe.cluster.feature b/test/cucumber/features/cluster-mode/recipe.cluster.feature index 968256c8..aaf78926 100644 --- a/test/cucumber/features/cluster-mode/recipe.cluster.feature +++ b/test/cucumber/features/cluster-mode/recipe.cluster.feature @@ -27,24 +27,6 @@ Scenario: Fetch everything for a patient (all the clinical data) And I then send a request for all the patient's clinical data Then I should get a successful everything response -Scenario: Bring down the servers - Given I use parameters "package down -p cdr-dw --env-file=.env.cluster" - When I launch the platform with params - Then a request to fetch data from the cdr should fail - -Scenario: Bring up the servers and test - Given I use parameters "package up -p cdr-dw --dev --env-file=.env.cluster" - When I launch the platform with params - Then The service "mongo-1" should be started with 1 replica - And The service "openhim-core" should be started with 3 replica - And The service "openhim-console" should be started with 3 replica - And The service "postgres-1" should be started with 1 replica - And The service "hapi-fhir" should be started with 3 replica - And I wait for the services to start up - When I then send a request for all the patient's clinical data - Then I should get a successful everything response - And the data should be stored in clickhouse - Scenario: Destroy the services Given I use parameters "package remove -p cdr-dw --env-file=.env.cluster" When I launch the platform with params From 04664f3280c8e03c3e93c6c148e893a211145bed Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Mon, 22 Apr 2024 13:11:55 +0200 Subject: [PATCH 50/53] Run step for opening up the ports for testing --- .github/workflows/ci-cluster.yml | 1 + .github/workflows/ci.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/ci-cluster.yml b/.github/workflows/ci-cluster.yml index 3cd587e3..f2274d75 100644 --- a/.github/workflows/ci-cluster.yml +++ b/.github/workflows/ci-cluster.yml @@ -35,6 +35,7 @@ jobs: shell: bash env: SSH_KEY: ${{ secrets.DEPLOY_KEY_PUB }} + - run: cp ./testsSecurity.tf ./security.tf - run: terraform init - run: terraform apply -auto-approve - name: Upload terraform state diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 87a1d836..afdd105c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,6 +36,7 @@ jobs: shell: bash env: SSH_KEY: ${{ secrets.DEPLOY_KEY_PUB }} + - run: cp ./testsSecurity.tf ./security.tf - run: terraform init - run: terraform apply -auto-approve - name: Upload terraform state From 0379fccfcba60eec886b45937ee64199c570a65d Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Mon, 22 Apr 2024 13:12:55 +0200 Subject: [PATCH 51/53] Add security group for use in tests where ports are exposed --- infrastructure/terraform/security.tf | 35 --------- infrastructure/terraform/testsSecurity.tf | 93 +++++++++++++++++++++++ 2 files changed, 93 insertions(+), 35 deletions(-) create mode 100644 infrastructure/terraform/testsSecurity.tf diff --git a/infrastructure/terraform/security.tf b/infrastructure/terraform/security.tf index 55dcf643..618ac307 100644 --- a/infrastructure/terraform/security.tf +++ b/infrastructure/terraform/security.tf @@ -15,41 +15,6 @@ resource "aws_security_group" "docker_swarm_sg" { cidr_blocks = [ "0.0.0.0/0"] } - ingress { - from_port = 80 - to_port = 80 - protocol = "tcp" - cidr_blocks = [ - "0.0.0.0/0"] - } - ingress { - from_port = 5001 - to_port = 5001 - protocol = "tcp" - cidr_blocks = [ - "0.0.0.0/0"] - } - ingress { - from_port = 8124 - to_port = 8124 - protocol = "tcp" - cidr_blocks = [ - "0.0.0.0/0"] - } - ingress { - from_port = 3033 - to_port = 3033 - protocol = "tcp" - cidr_blocks = [ - "0.0.0.0/0"] - } - ingress { - from_port = 3447 - to_port = 3447 - protocol = "tcp" - cidr_blocks = [ - "0.0.0.0/0"] - } ingress { from_port = 443 to_port = 443 diff --git a/infrastructure/terraform/testsSecurity.tf b/infrastructure/terraform/testsSecurity.tf new file mode 100644 index 00000000..cb1a8d2e --- /dev/null +++ b/infrastructure/terraform/testsSecurity.tf @@ -0,0 +1,93 @@ +########## Security for platform tests (insecure mode) ########### + +resource "aws_security_group" "docker_swarm_sg" { + vpc_id = "${var.VPC_ID}" + name = "${var.PROJECT_NAME}_sg" + egress { + from_port = 0 + to_port = 0 + protocol = -1 + cidr_blocks = [ + "0.0.0.0/0"] + } + ingress { + from_port = 22 + to_port = 22 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } + ingress { + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } + ingress { + from_port = 5001 + to_port = 5001 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } + ingress { + from_port = 8124 + to_port = 8124 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } + ingress { + from_port = 3033 + to_port = 3033 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } + ingress { + from_port = 3447 + to_port = 3447 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } + ingress { + from_port = 443 + to_port = 443 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } + ingress { + from_port = 2376 + to_port = 2377 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } + ingress { + from_port = 7946 + to_port = 7946 + protocol = "udp" + cidr_blocks = [ + "0.0.0.0/0"] + } + ingress { + from_port = 7946 + to_port = 7946 + protocol = "tcp" + cidr_blocks = [ + "0.0.0.0/0"] + } + ingress { + from_port = 4789 + to_port = 4789 + protocol = "udp" + cidr_blocks = [ + "0.0.0.0/0"] + } + tags = { + Name = "${var.PROJECT_NAME}-docker-swarm-sg" + } +} From fc46bd2e462d2f59e82a425c8b01e0ae40b9fe40 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Mon, 22 Apr 2024 13:20:24 +0200 Subject: [PATCH 52/53] Move tests security to tests folder --- .github/workflows/ci-cluster.yml | 2 +- .github/workflows/ci.yml | 2 +- .../cucumber/features/resources}/testsSecurity.tf | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename {infrastructure/terraform => test/cucumber/features/resources}/testsSecurity.tf (100%) diff --git a/.github/workflows/ci-cluster.yml b/.github/workflows/ci-cluster.yml index f2274d75..f91bbf4b 100644 --- a/.github/workflows/ci-cluster.yml +++ b/.github/workflows/ci-cluster.yml @@ -35,7 +35,7 @@ jobs: shell: bash env: SSH_KEY: ${{ secrets.DEPLOY_KEY_PUB }} - - run: cp ./testsSecurity.tf ./security.tf + - run: cp ../../tests/cucumber/features/resources/testsSecurity.tf ./security.tf - run: terraform init - run: terraform apply -auto-approve - name: Upload terraform state diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index afdd105c..bd061cba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,7 +36,7 @@ jobs: shell: bash env: SSH_KEY: ${{ secrets.DEPLOY_KEY_PUB }} - - run: cp ./testsSecurity.tf ./security.tf + - run: cp ../../tests/cucumber/features/resources/testsSecurity.tf ./security.tf - run: terraform init - run: terraform apply -auto-approve - name: Upload terraform state diff --git a/infrastructure/terraform/testsSecurity.tf b/test/cucumber/features/resources/testsSecurity.tf similarity index 100% rename from infrastructure/terraform/testsSecurity.tf rename to test/cucumber/features/resources/testsSecurity.tf From c4ee1d7fcb8411f80d87c8b75c0f054677ad4a46 Mon Sep 17 00:00:00 2001 From: bradsawadye Date: Mon, 22 Apr 2024 13:26:45 +0200 Subject: [PATCH 53/53] Fix typo --- .github/workflows/ci-cluster.yml | 2 +- .github/workflows/ci.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-cluster.yml b/.github/workflows/ci-cluster.yml index f91bbf4b..6a9c1c04 100644 --- a/.github/workflows/ci-cluster.yml +++ b/.github/workflows/ci-cluster.yml @@ -35,7 +35,7 @@ jobs: shell: bash env: SSH_KEY: ${{ secrets.DEPLOY_KEY_PUB }} - - run: cp ../../tests/cucumber/features/resources/testsSecurity.tf ./security.tf + - run: cp ../../test/cucumber/features/resources/testsSecurity.tf ./security.tf - run: terraform init - run: terraform apply -auto-approve - name: Upload terraform state diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd061cba..eead8635 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,7 +36,7 @@ jobs: shell: bash env: SSH_KEY: ${{ secrets.DEPLOY_KEY_PUB }} - - run: cp ../../tests/cucumber/features/resources/testsSecurity.tf ./security.tf + - run: cp ../../test/cucumber/features/resources/testsSecurity.tf ./security.tf - run: terraform init - run: terraform apply -auto-approve - name: Upload terraform state