From 2999bbd73c9036f67e4f89f012df3e63c0b4b868 Mon Sep 17 00:00:00 2001 From: Luke Duncan Date: Fri, 2 Feb 2024 16:12:05 -0800 Subject: [PATCH] Added in preliminary script to create examples to be used to test CQL from a yaml file. This still needs medicationrequests and observations. --- .gitignore | 1 + input/cql/IMMZConcepts.cql | 1 + input/cql/IMMZD2DTPolioBirth.cql | 86 +++++++ input/cql/IMMZD2DTPolioInput.cql | 224 ++++++++++++++++++ .../B0Agt1w/Patient/B0Agt1w.json | 12 + .../B0Alt1w/Patient/B0Alt1w.json | 12 + .../B1/Immunization/polio-B1.json | 28 +++ .../IMMZD2DTPolioBirth/B1/Patient/B1.json | 12 + .../IMMZD2DTPolioBirth/examples.yaml | 29 +++ tools/node/makeExample.js | 155 ++++++++++++ tools/node/package-lock.json | 17 +- tools/node/package.json | 4 +- 12 files changed, 579 insertions(+), 2 deletions(-) create mode 100644 input/cql/IMMZD2DTPolioBirth.cql create mode 100644 input/cql/IMMZD2DTPolioInput.cql create mode 100644 input/tests/plandefinition/IMMZD2DTPolioBirth/B0Agt1w/Patient/B0Agt1w.json create mode 100644 input/tests/plandefinition/IMMZD2DTPolioBirth/B0Alt1w/Patient/B0Alt1w.json create mode 100644 input/tests/plandefinition/IMMZD2DTPolioBirth/B1/Immunization/polio-B1.json create mode 100644 input/tests/plandefinition/IMMZD2DTPolioBirth/B1/Patient/B1.json create mode 100644 input/tests/plandefinition/IMMZD2DTPolioBirth/examples.yaml create mode 100644 tools/node/makeExample.js diff --git a/.gitignore b/.gitignore index 31c2db4935..92b191c35b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ bundles .DS_Store **/tests-*-bundle.json node_modules/ +outputs/* diff --git a/input/cql/IMMZConcepts.cql b/input/cql/IMMZConcepts.cql index ee6500c17b..3134fb5a05 100644 --- a/input/cql/IMMZConcepts.cql +++ b/input/cql/IMMZConcepts.cql @@ -56,5 +56,6 @@ code "Severely immunosuppressed": 'DE165' from "IMMZ.D" display 'Severely immuno code "History of anaphylactic reactions": 'DE166' from "IMMZ.D" display 'History of anaphylactic reactions' code "Severe allergic reactions": 'DE167' from "IMMZ.D" display 'Severe allergic reactions' code "Symptomatic HIV infection": 'DE168' from "IMMZ.D" display 'Symptomatic HIV infection' +code "Immunodeficiency syndromes": 'DE187' from "IMMZ.D" display 'Immunodeficiency syndromes' code "Severely immunocompromised": 'DE200' from "IMMZ.D" display 'Severely immunocompromised' code "Breastfeeding": 'DE191' from "IMMZ.D" display 'Breastfeeding' diff --git a/input/cql/IMMZD2DTPolioBirth.cql b/input/cql/IMMZD2DTPolioBirth.cql new file mode 100644 index 0000000000..6b4ab87294 --- /dev/null +++ b/input/cql/IMMZD2DTPolioBirth.cql @@ -0,0 +1,86 @@ +/* + * Library: IMMZD2DTPolioBirth (IMMZ.D2.DT.Polio.Birth dose) + * Rule: Determine if the client is due for a polio vaccination according to the national immunization protocol + * Decision Table: Birth dose administration as part of "bOPV plus IPV" schedule (In countries that are polio-endemic countries or countries at high risk for importation and subsequent spread of poliovirus, that follow the combined bOPV-IPV schedule) + * Trigger: IMMZ.D2 Determine required vaccination(s) if any + */ +library IMMZD2DTPolioBirth +// Start Skeleton CQL +using FHIR version '4.0.1' +include FHIRHelpers version '4.0.1' +include IMMZCommon called IMMZCom +include IMMZConcepts called IMMZc +include IMMZConfig called IMMZCon +include IMMZVaccineLibrary called IMMZvl +include FHIRCommon called FC +include IMMZD2DTPolioInput called input + +// End Skeleton CQL +context Patient + +/* +@dynamicValue: Due date of the dose +*/ +define "Due date of the dose": + if "Client is due for the bOPV birth dose" then Patient.birthDate + else null + +/* +@dynamicValue: Guidance +*/ +define "Guidance": + case + when "Client is due for the bOPV birth dose" then "Client is due for the bOPV birth dose Guidance" + when "Client is not due for the bOPV birth dose" then "Client is not due for the bOPV birth dose Guidance" + else '' + end + +/* +@output: Client is due for the bOPV birth dose +@pseudocode: "Immunization recommendation status" = 'Due' (where "Type of polio dose" = 'bOPV') +*/ +define "Client is due for the bOPV birth dose": + input."bOPV birth dose (a zero dose) was not administered" + and input."Client's age is less than 1 week" + +/* +@output: Client is due for the bOPV birth dose Guidance +@guidance: Should vaccinate client for bOPV birth dose (a zero dose) as polio birth dose was not administered and client's age is less than 1 week. Check for contraindications. +*/ +define "Client is due for the bOPV birth dose Guidance": + 'Should vaccinate client for bOPV birth dose (a zero dose) as polio birth dose was not administered and client\'s age is less than 1 week. Check for contraindications.' + +/* +@output: Client is not due for the bOPV birth dose Case 1 +@pseudocode: "Immunization recommendation status" = 'Not due' +*/ +define "Client is not due for the bOPV birth dose Case 1": + input."bOPV birth dose (a zero dose) was not administered" + and input."Client's age is more or equal to 1 week" + +/* +@output: Client is not due for the bOPV birth dose Case 2 +@pseudocode: "Immunization recommendation status" = 'Not due' +*/ +define "Client is not due for the bOPV birth dose Case 2": + input."bOPV birth dose (a zero dose) was administered" + +/* +@output: Client is not due for the bOPV birth dose +@pseudocode: "Immunization recommendation status" = 'Not due' +*/ +define "Client is not due for the bOPV birth dose": + "Client is not due for the bOPV birth dose Case 1" + or "Client is not due for the bOPV birth dose Case 2" + +/* +@output: Client is not due for the bOPV birth dose Guidance +@guidance: Should not vaccinate client for bOPV birth dose (a zero dose) as client's age is more than or equal to 1 week. Check for any other vaccines due, and inform the caregiver of when to come back for the next dose. +@guidance: Polio birth dose was already administered. Check polio immunization schedule. +*/ +define "Client is not due for the bOPV birth dose Guidance": + case + when "Client is not due for the bOPV birth dose Case 1" then 'Should not vaccinate client for bOPV birth dose (a zero dose) as client\'s age is more than or equal to 1 week. Check for any other vaccines due, and inform the caregiver of when to come back for the next dose.' + when "Client is not due for the bOPV birth dose Case 2" then 'Polio birth dose was already administered. Check polio immunization schedule.' + else '' + end \ No newline at end of file diff --git a/input/cql/IMMZD2DTPolioInput.cql b/input/cql/IMMZD2DTPolioInput.cql new file mode 100644 index 0000000000..adbb47650e --- /dev/null +++ b/input/cql/IMMZD2DTPolioInput.cql @@ -0,0 +1,224 @@ +/* + * Library: IMMZD2DTPolioInput (IMMZ.D2.DT.PolioInput) + */ +library IMMZD2DTPolioInput +// Start Skeleton CQL +using FHIR version '4.0.1' +include FHIRHelpers version '4.0.1' +include IMMZCommon called IMMZCom +include IMMZConcepts called IMMZc +include IMMZConfig called IMMZCon +include IMMZVaccineLibrary called IMMZvl +include FHIRCommon called FC + +// End Skeleton CQL +context Patient + +/* +@internal: Polio containing Doses Administered to Patient +*/ +define "Polio Doses Administered to Patient": + IMMZCom."Doses Administered to Patient" I + where + I.vaccineCode in IMMZc."Polio Vaccine" +/* +birth - Birth dose administration as part of "bOPV plus IPV" schedule (In countries that are polio-endemic countries + or countries at high risk for importation and subsequent spread of poliovirus, that follow the combined + bOPV-IPV schedule) +bOPVIPV - bOPV plus IPV schedule (applicable for all countries) +sequential - Sequential IPV–bOPV schedule (in countries with high vaccination coverage (e.g. 90–95%) and low importation + risk (where neighbouring countries and/or countries that share substantial population movement have a + similarly high coverage)) +IPVonly - IPV-only (in countries, in polio-free regions, with a very low risk of importation and sustained high routine + immunization coverage (DTP3 >90%) +*/ +/* +@input: bOPV birth dose (a zero dose) was not administered +@pseudocode: Count of vaccines administered (where "Vaccine type" = 'Polio containing vaccines' and "Type of dose" = 'Dose 0' AND "Birth Dose" = TRUE) = 0 +*/ +define "bOPV birth dose (a zero dose) was not administered": + not "bOPV birth dose (a zero dose) was administered" + +/* +@input: bOPV birth dose (a zero dose) was administered +@pseudocode: Count of vaccines administered (where "Vaccine type" = 'Polio containing vaccines' and "Type of dose" = 'Dose 0' AND "Birth Dose" = TRUE) = 1 +*/ +define "bOPV birth dose (a zero dose) was administered": + exists("Polio Doses Administered to Patient" I where I.occurrence before Patient.birthDate + 1 week) + +/* +@input: No polio primary series doses were administered +@pseudocode: Count of vaccines administered (where "Vaccine type" = 'Polio containing vaccines' and "Type of dose" = "Primary series") = 0 +*/ +define "No polio primary series doses were administered": + not exists("Polio Doses Administered to Patient" I where I.occurrence after Patient.birthDate + 6 weeks) + +/* +@input: One polio primary series dose was administered +@pseudocode: Count of vaccines administered (where "Vaccine type" = 'Polio containing vaccines' and "Type of dose" = "Primary series") = 1 +*/ +define "One polio primary series dose was administered": + null + +/* +@input: Two polio primary series doses were administered +@pseudocode: Count of vaccines administered (where "Vaccine type" = 'Polio containing vaccines' and "Type of dose" = "Primary series") = 2 +*/ +define "Two polio primary series doses were administered": + null + + +/* +@input: Three polio primary series doses were administered +@pseudocode: Count of vaccines administered (where "Vaccine type" = 'Polio containing vaccines' and "Type of dose" = "Primary series") = 3 +*/ +define "Three polio primary series doses were administered": + null + + +/* +@input: The polio dose administered is bOPV +@pseudocode: Count of vaccines administered (where "Type of polio dose" = 'bOPV' and "Type of dose" = "Primary series") = 1 +*/ +define "The polio dose administered is bOPV ": + null + + +/* +@input: The polio dose administered is IPV +@pseudocode: Count of vaccines administered (where "Type of polio dose" = 'bOPV' and "Type of dose" = "Primary series") = 0 +*/ +define "The polio dose administered is IPV ": + null + + +/* +@input: The two doses administered are bOPV +@pseudocode: Count of vaccines administered (where "Type of polio dose" = 'bOPV' and "Type of dose" = "Primary series") = 2 +*/ +define "The two doses administered are bOPV": + null + + +/* +@input: From the two doses administered one is bOPV and one is IPV +@pseudocode: Count of vaccines administered (where "Type of polio dose" = 'bOPV' and "Type of dose" = "Primary series") = 1 +*/ +define "From the two doses administered one is bOPV and one is IPV": + null + + +/* +@input: The two doses administered are IPV +@pseudocode: Count of vaccines administered (where "Type of polio dose" = 'bOPV' and "Type of dose" = "Primary series") = 0 +*/ +define "The two doses administered are IPV": + + null + +/* +@input: The three doses administered are bOPV +@pseudocode: Count of vaccines administered (where "Type of polio dose" = 'bOPV' and "Type of dose" = "Primary series") = 3 +*/ +define "The three doses administered are bOPV": + null + + +/* +@input: From the three doses administered one is IPV and two are bOPV +@pseudocode: Count of vaccines administered (where "Type of polio dose" = 'bOPV' and "Type of dose" = "Primary series") = 2 +*/ +define "From the three doses administered one is IPV and two are bOPV": + null + +/* +@input: Client's age is less than 1 week +@pseudocode: Today's date - "Date of birth" < 1 'week' +*/ +define "Client's age is less than 1 week": + IMMZCom."Current Patient Age In Weeks" < 1 + +/* +@input: Client's age is more or equal to 1 week +@pseudocode: Today's date - "Date of birth" ≥ 1 'week' +*/ +define "Client's age is more or equal to 1 week": + not "Client's age is less than 1 week" + +/* +@input: Client's age is less than 6 weeks +@pseudocode: Today's date - "Date of birth" < 6 'week' +*/ +define "Client's age is less than 6 weeks": + null + + +/* +@input: Client's age is between 6 weeks and 3 months +@pseudocode: 6 'week' ≤ Today's date - "Date of birth" ≤ 3 'month' +*/ +define "Client's age is between 6 weeks and 3 months": + null + + +/* +@input: Client's age is more than 3 months +@pseudocode: Today's date - "Date of birth" > 3 'month' +*/ +define "Client's age is more than 3 months": + null + + +/* +@input: Client's age is between 6 weeks and 14 weeks +@pseudocode: 6 'week' '≤ 'Today's date - "Date of birth" < 14 'week' +*/ +define "Client's age is between 6 weeks and 14 weeks": + null + + +/* +@input: Client's age is more than or equal to 14 weeks +@pseudocode: Today's date - "Date of birth" ≥ 14 'week' +*/ +define "Client's age is more than or equal to 14 weeks": + null + +/* +@input: Client's age is less than 14 weeks +@pseudocode: Today's date - "Date of birth" < 14 'week' +*/ +define "Client's age is less than 14 weeks": + null + +/* +@input: The latest bOPV dose was administered less than 4 weeks ago +@pseudocode: Today's date - Latest "Date and time of vaccination" (where "Vaccine type" = 'Polio containing vaccines' and "Type of Polio dose" = 'bOPV') < 4 'week' +*/ +define "The latest bOPV dose was administered less than 4 weeks ago": + null + + +/* +@input: The latest bOPV dose was administered more than 4 weeks ago +@pseudocode: Today's date - Latest "Date and time of vaccination" (where "Vaccine type" = 'Polio containing vaccines' and "Type of Polio dose" = 'bOPV') ≥ 4 'week' +*/ +define "The latest bOPV dose was administered more than 4 weeks ago": + null + + +/* +@input: The latest IPV dose was administered less than 4 months ago +@pseudocode: Today's date - Latest "Date and time of vaccination" (where "Vaccine type" = 'Polio containing vaccines' and "Type of polio dose" = 'IPV') < 4 'month' +*/ +define "The latest IPV dose was administered less than 4 months ago": + null + + +/* +@input: The latest IPV dose was administered more than 4 months ago +@pseudocode: Today's date - Latest "Date and time of vaccination" (where "Vaccine type" = 'Polio containing vaccines' and "Type of polio dose" = 'IPV') ≥ 4 'month' +*/ +define "The latest IPV dose was administered more than 4 months ago": + null + diff --git a/input/tests/plandefinition/IMMZD2DTPolioBirth/B0Agt1w/Patient/B0Agt1w.json b/input/tests/plandefinition/IMMZD2DTPolioBirth/B0Agt1w/Patient/B0Agt1w.json new file mode 100644 index 0000000000..35cf7c1bde --- /dev/null +++ b/input/tests/plandefinition/IMMZD2DTPolioBirth/B0Agt1w/Patient/B0Agt1w.json @@ -0,0 +1,12 @@ +{ + "resourceType": "Patient", + "id": "B0Agt1w", + "name": [ + { + "text": "B0Agt1w", + "use": "official" + } + ], + "birthDate": "2024-01-20", + "gender": "female" +} \ No newline at end of file diff --git a/input/tests/plandefinition/IMMZD2DTPolioBirth/B0Alt1w/Patient/B0Alt1w.json b/input/tests/plandefinition/IMMZD2DTPolioBirth/B0Alt1w/Patient/B0Alt1w.json new file mode 100644 index 0000000000..d3ffebc804 --- /dev/null +++ b/input/tests/plandefinition/IMMZD2DTPolioBirth/B0Alt1w/Patient/B0Alt1w.json @@ -0,0 +1,12 @@ +{ + "resourceType": "Patient", + "id": "B0Alt1w", + "name": [ + { + "text": "B0Alt1w", + "use": "official" + } + ], + "birthDate": "2024-02-02", + "gender": "female" +} \ No newline at end of file diff --git a/input/tests/plandefinition/IMMZD2DTPolioBirth/B1/Immunization/polio-B1.json b/input/tests/plandefinition/IMMZD2DTPolioBirth/B1/Immunization/polio-B1.json new file mode 100644 index 0000000000..a0fc6bd526 --- /dev/null +++ b/input/tests/plandefinition/IMMZD2DTPolioBirth/B1/Immunization/polio-B1.json @@ -0,0 +1,28 @@ +{ + "resourceType": "Immunization", + "id": "polio-B1", + "status": "completed", + "vaccineCode": { + "coding": [ + { + "code": "XM0KZ1", + "system": "http://hl7.org/fhir/sid/icd-11", + "display": "Poliomyelitis oral, trivalent, live attenuated" + } + ] + }, + "expirationDate": "2025-02-03", + "lotNumber": "123", + "patient": { + "reference": "Patient/B1" + }, + "location": { + "display": "Vaccination Site" + }, + "occurrenceDateTime": "2024-02-04", + "protocolApplied": [ + { + "doseNumberString": "birth" + } + ] +} \ No newline at end of file diff --git a/input/tests/plandefinition/IMMZD2DTPolioBirth/B1/Patient/B1.json b/input/tests/plandefinition/IMMZD2DTPolioBirth/B1/Patient/B1.json new file mode 100644 index 0000000000..db63fad24a --- /dev/null +++ b/input/tests/plandefinition/IMMZD2DTPolioBirth/B1/Patient/B1.json @@ -0,0 +1,12 @@ +{ + "resourceType": "Patient", + "id": "B1", + "name": [ + { + "text": "B1", + "use": "official" + } + ], + "birthDate": "2024-02-02", + "gender": "female" +} \ No newline at end of file diff --git a/input/tests/plandefinition/IMMZD2DTPolioBirth/examples.yaml b/input/tests/plandefinition/IMMZD2DTPolioBirth/examples.yaml new file mode 100644 index 0000000000..6ad50a4e5a --- /dev/null +++ b/input/tests/plandefinition/IMMZD2DTPolioBirth/examples.yaml @@ -0,0 +1,29 @@ +--- +id: B0Alt1w +birth: -1d +patient: + fhir: + gender: female +--- +id: B0Agt1w +birth: -2w +patient: + fhir: + gender: female +--- +id: B1 +birth: -1d +patient: + fhir: + gender: female +immunization: + polio: + vaccine: + code: XM0KZ1 + system: "http://hl7.org/fhir/sid/icd-11" + display: "Poliomyelitis oral, trivalent, live attenuated" + fhir: + expirationDate: 1y + occurrenceDateTime: b+1d + protocolApplied: + - doseNumberString: birth diff --git a/tools/node/makeExample.js b/tools/node/makeExample.js new file mode 100644 index 0000000000..975d27c177 --- /dev/null +++ b/tools/node/makeExample.js @@ -0,0 +1,155 @@ +const yaml = require('yaml') +const fs = require('fs') +const Dates = require('date-math') + +const file = fs.readFileSync(process.argv[2]) +const docs = yaml.parseAllDocuments(file.toString()) +let directory = "." +if ( process.argv[3] ) directory = process.argv[3] + +for(let doc of docs) { + let options = doc.toJS() + let now = Dates.day.floor(new Date()) + + options.birth = shiftDate(options.birth) + const topDir = directory + "/" + options.id + fs.mkdirSync(topDir) + + fs.mkdirSync(topDir+"/Patient") + let patient = makePatient( options.id, options.patient, options.birth ) + fs.writeFileSync( topDir + "/Patient/" + options.id +".json", Buffer.from( JSON.stringify(patient,null,2) )) + if ( options.immunization ) { + fs.mkdirSync(topDir+"/Immunization") + for( let immz in options.immunization ) { + let immzr = makeImmunization( immz, options.id, options.immunization[immz] ) + fs.writeFileSync( topDir+"/Immunization/"+immzr.id+".json", Buffer.from( JSON.stringify(immzr,null,2))) + } + } + if ( options.condition ) { + fs.mkdirSync(topDir+"/Condition") + for( let cond in options.condition ) { + let condr = makeCondition( cond, options.id, options.condition[cond] ) + fs.writeFileSync( topDir+"/Condition/"+condr.id+".json", Buffer.from( JSON.stringify(condr,null,2))) + } + } + +} + +function shiftDate( shift, birth ) { + + if ( shift.match(/\d{4,4}-\d{2,2}-\{2,2}/) ) return shift + + let shifted + let start = new Date() + let match = shift.match( /([bn]?)+?(-?\d+)([wdmy])/) + //console.log(match) + if ( match[1] == 'b' ) start = new Date(birth) + switch( match[3] ) { + case 'd': + shifted = Dates.day.shift(start, parseInt(match[2])) + break + case 'w': + shifted = Dates.week.shift(start, parseInt(match[2])) + break + case 'm': + shifted = Dates.month.shift(start, parseInt(match[2])) + break + case 'y': + shifted = Dates.year.shift(start, parseInt(match[2])) + break + } + return shifted.toISOString().replace(/T.+/, '') +} + +function copyFHIR( resource, options ) { + if ( options.fhir ) { + let elements = options.fhir + for( let element in elements ) { + if ( element.endsWith('Date') || element.endsWith('DateTime') ) { + elements[element] = shiftDate( elements[element], options.birth ) + } + resource[element] = elements[element] + } + } +} + +function makePatient ( id, options, birth ) { + + let patient = { + "resourceType": "Patient", + "id": "", + "name": [ + { + "text": "", + "use": "official" + } + ] + } + patient.id = id + if ( options.name ) { + patient.name[0].text = options.name + } else { + patient.name[0].text = id + } + if ( birth ) { + patient.birthDate = birth + } + copyFHIR( patient, options ) + + return patient +} + +function makeImmunization( immz, patient, options ) { + let immunization = { + "resourceType": "Immunization", + "id": "", + "status": "completed", + "vaccineCode": { + "coding": [] + }, + "expirationDate": "2024-12-31", + "lotNumber": "123", + "patient": { + "reference": "Patient/" + }, + "location": { + "display": "Vaccination Site" + }, + "occurrenceDateTime": "2023-12-03" + } + + immunization.id = immz+"-"+patient + immunization.patient.reference = "Patient/"+patient + immunization.vaccineCode.coding[0] = options.vaccine + copyFHIR( immunization, options ) + + return immunization +} + +function makeCondition( cond, patient, options ) { + let condition = { + "resourceType": "Condition", + "id": "", + "clinicalStatus": { + "coding": [ + { + "code": "active" + } + ] + }, + "code": { + "coding": [] + }, + "subject": { + "reference": "Patient/" + }, + "recordedDate": "2023-11-03" + } + + condition.id = cond+"-"+patient + condition.subject.reference = "Patient/"+patient + condition.code.coding[0] = options.code + copyFHIR( condition, options ) + + return condition +} \ No newline at end of file diff --git a/tools/node/package-lock.json b/tools/node/package-lock.json index 2c2bcd4331..998a0e3623 100644 --- a/tools/node/package-lock.json +++ b/tools/node/package-lock.json @@ -6,7 +6,9 @@ "": { "dependencies": { "@fast-csv/parse": "^5.0.0", - "node-xlsx": "^0.23.0" + "date-math": "^0.0.1", + "node-xlsx": "^0.23.0", + "yaml": "^2.3.4" } }, "node_modules/@fast-csv/parse": { @@ -22,6 +24,11 @@ "lodash.uniq": "^4.5.0" } }, + "node_modules/date-math": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/date-math/-/date-math-0.0.1.tgz", + "integrity": "sha512-4TWtdZmmVP86Rg6RSDfxk8R7Sw2ZJmoz/6oDZyv+7se1QjFhCLtn0ti7TJCdJOOQj7k/vGoSDbO1xrWJK2nOYg==" + }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", @@ -77,6 +84,14 @@ "engines": { "node": ">=0.8" } + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "engines": { + "node": ">= 14" + } } } } diff --git a/tools/node/package.json b/tools/node/package.json index baaf83238f..bbd5dd5f28 100644 --- a/tools/node/package.json +++ b/tools/node/package.json @@ -1,6 +1,8 @@ { "dependencies": { "@fast-csv/parse": "^5.0.0", - "node-xlsx": "^0.23.0" + "date-math": "^0.0.1", + "node-xlsx": "^0.23.0", + "yaml": "^2.3.4" } }