joi-fhir
v0.0.5
Published
Validate FHIR data with Joi
Downloads
5
Readme
joi-fhir -- Work in progress
Node.js utility for validating FHIR resources.
Quick start
Prerequisites
- Node.js 6+
- npm
- Publish permission to
joi-fhir
on NPM (Only for deployment)
Installing
npm install --save joi-fhir
Examples
const validateFhir = require('joi-fhir');
const Encounter = {
resourceType: 'Encounter',
id: 'ENC001',
...
}
// Validate any generic FHIR resource
validateFhir(Encounter)
.then((validated) => console.log('Validated encounter', validated))
.catch((error) => console.log('Error validating encounter', error));
// Ensure FHIR resource matches a certain type
validateFhir(Encounter, { resourceType: 'Encounter' })
.then((validated) => console.log('Validated encounter', validated))
.catch((error) => console.log('Error validating encounter', error));
API
This module exports a single Function
that accepts a FHIR resource and an options
object. The function validates the FHIR resource matches the spec and returns a promise with either the validated/formatted FHIR resource or an error detailing the malformed data.
Definition
validateFhir(resource);
Parameters
| Parameter | Type | Description |
| :-------- | :--- | :---------- |
| resource
| Object
| A FHIR resource |
options
| Parameter | Type | Description | Default |
| :-------- | :------- | :---------- | :----- |
| resourceType
| String
| If provided, ensure the resource is of this type. Otherwise, allow any FHIR resource | none |
Examples
Input
encounterA
Data about an encounter.
{
"resourceType": "Encounter",
"status": "in-progress",
"subject": {
"reference": "Patient/P01"
},
"reason": [
{
"text": "Laceration to leg"
}
]
}
Invocation
const validateFhir = require('@agilemd/joi-fhir');
return validateFhir(encounter)
.then((validated) => {
...
})
.catch((err) => {
// Handle error
})
Output
validated/formatted Encounter
{
"id": "31a49ff9-2d10-481c-8720-a1a3e61fa981",
"resourceType": "Encounter",
"status": "in-progress",
"subject": {
"reference": "Patient/P01"
},
"reason": [
{
"text": "Laceration to leg"
}
]
}
Development
Install
Clone the source repository, cd
into the joi-fhir
directory, and install dependencies:
git clone [email protected]:agilemd/joi-fhir.git
cd joi-fhir
npm install
Tests
To run the unit tests:
npm test
Changes must not reduce coverage of statements, branches, and functions. To determine unit test coverage:
npm run coverage
Debug
The debug module is used for runtime logging. Omit the DEBUG
environment variable to squelch all logging. Set DEBUG
to the desired level (e.g. DEBUG=@agilemd/joi-fhir:SUBMODULE
) to restrict logging to a desired service. Or, use DEBUG=*
to get all debug output from everywhere, including dependencies.
DEBUG=@agilemd/joi-fhir* npm test
Workflow
- Feature development and bug fixing MUST occur on a non-master branch.
- All changes SHOULD be submitted to master via a Pull Request.
- Pull Requests SHOULD be merged via a merge commit. Local "in-process" commits may be squashed prior to pushing to the remote feature branch.
To enable a git hook that runs npm test
prior to pushing, cd
into the project repo and run:
touch .git/hooks/pre-push
chmod +x .git/hooks/pre-push
echo "npm test" > .git/hooks/pre-push
Build
This project follows semantic versioning. After committing the latest code to GitHub master, update the version:
npm version [major/minor/patch]
Then push the tag to GitHub and publish this package to npm:
git push origin --tags
npm publish
References
- https://www.hl7.org/fhir/resourcelist.html
Implementation checklist
This project is a work in progress. Any defined FHIR resource will pass validation; however, only certain resources are fully validated. The table below describes which resources have complete validation and which are in progress
Support legend
| Icon | Description | | :----------------- | :---------- | | :white_check_mark: | Completely implemented | | :o: | Partially implemented | | :no_entry_sign: | Not yet implemented |
| Resource Type | Support | | :---------------------------------------------------------------------- | :-------------- | | Account | :no_entry_sign: | | ActivityDefinition | :no_entry_sign: | | AllergyIntolerance | :no_entry_sign: | | AdverseEvent | :no_entry_sign: | | Appointment | :no_entry_sign: | | AppointmentResponse| :no_entry_sign: | | AuditEvent | :no_entry_sign: | | Basic | :no_entry_sign: | | Binary | :no_entry_sign: | | BodySite | :no_entry_sign: | | Bundle | :no_entry_sign: | | CapabilityStatement| :no_entry_sign: | | CarePlan | :no_entry_sign: | | CareTeam | :no_entry_sign: | | ChargeItem | :no_entry_sign: | | Claim | :no_entry_sign: | | ClaimResponse | :no_entry_sign: | | ClinicalImpression | :no_entry_sign: | | CodeSystem | :no_entry_sign: | | Communication | :no_entry_sign: | | CommunicationRequest| :no_entry_sign: | | CompartmentDefinition| :no_entry_sign: | | Composition | :no_entry_sign: | | ConceptMap | :no_entry_sign: | | Condition | :no_entry_sign: | | Consent | :no_entry_sign: | | Contract | :no_entry_sign: | | Coverage | :no_entry_sign: | | DataElement | :no_entry_sign: | | DetectedIssue | :no_entry_sign: | | Device | :no_entry_sign: | | DeviceComponent | :no_entry_sign: | | DeviceMetric | :no_entry_sign: | | DeviceRequest | :no_entry_sign: | | DeviceUseStatement | :no_entry_sign: | | DiagnosticReport | :no_entry_sign: | | DocumentManifest | :no_entry_sign: | | DocumentReference | :no_entry_sign: | | EligibilityRequest | :no_entry_sign: | | EligibilityResponse| :no_entry_sign: | | Encounter | :no_entry_sign: | | Endpoint | :no_entry_sign: | | EnrollmentRequest | :no_entry_sign: | | EnrollmentResponse | :no_entry_sign: | | EpisodeOfCare | :no_entry_sign: | | ExpansionProfile | :no_entry_sign: | | ExplanationOfBenefit| :no_entry_sign: | | FamilyMemberHistory| :no_entry_sign: | | Flag | :no_entry_sign: | | Goal | :no_entry_sign: | | GraphDefinition | :no_entry_sign: | | Group | :no_entry_sign: | | GuidanceResponse | :no_entry_sign: | | HealthcareService | :no_entry_sign: | | ImagingManifest | :no_entry_sign: | | ImagingStudy | :no_entry_sign: | | Immunization | :no_entry_sign: | | ImmunizationRecommendation| :no_entry_sign: | | ImplementationGuide| :no_entry_sign: | | Library | :no_entry_sign: | | Linkage | :no_entry_sign: | | List | :no_entry_sign: | | Location | :no_entry_sign: | | Measure | :no_entry_sign: | | MeasureReport | :no_entry_sign: | | Media | :no_entry_sign: | | Medication | :no_entry_sign: | | MedicationAdministration| :no_entry_sign: | | MedicationDispense | :no_entry_sign: | | MedicationStatement| :no_entry_sign: | | MessageDefinition | :no_entry_sign: | | MessageHeader | :no_entry_sign: | | NamingSystem | :no_entry_sign: | | NutritionOrder | :no_entry_sign: | | Observation | :no_entry_sign: | | OperationDefinition| :no_entry_sign: | | OperationOutcome | :no_entry_sign: | | Organization | :no_entry_sign: | | Parameters | :no_entry_sign: | | Patient | :no_entry_sign: | | PaymentNotice | :no_entry_sign: | | PaymentReconciliation| :no_entry_sign: | | Person | :no_entry_sign: | | PlanDefinition | :no_entry_sign: | | Practitioner | :no_entry_sign: | | PractitionerRole | :no_entry_sign: | | Procedure | :no_entry_sign: | | ProcedureRequest | :no_entry_sign: | | ProcessRequest | :no_entry_sign: | | ProcessResponse | :no_entry_sign: | | Provenance | :no_entry_sign: | | Questionnaire | :no_entry_sign: | | QuestionnaireResponse| :no_entry_sign: | | ReferralRequest | :no_entry_sign: | | RelatedPerson | :no_entry_sign: | | RequestGroup | :no_entry_sign: | | ResearchStudy | :no_entry_sign: | | ResearchSubject | :no_entry_sign: | | RiskAssessment | :no_entry_sign: | | Schedule | :no_entry_sign: | | SearchParameter | :no_entry_sign: | | Sequence | :no_entry_sign: | | ServiceDefinition | :no_entry_sign: | | Slot | :no_entry_sign: | | Specimen | :no_entry_sign: | | StructureDefinition| :no_entry_sign: | | StructureMap | :no_entry_sign: | | Subscription | :no_entry_sign: | | Substance | :no_entry_sign: | | SupplyDelivery | :no_entry_sign: | | SupplyRequest | :no_entry_sign: | | Task | :no_entry_sign: | | TestScript | :no_entry_sign: | | TestReport | :no_entry_sign: | | ValueSet | :no_entry_sign: | | VisionPrescription | :no_entry_sign: |