From 011243350b08571bedb3b2acfb14b27585ad1b7a Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Fri, 27 Feb 2026 14:44:44 +0000 Subject: [PATCH 1/2] first pass at docs --- adaptors/fhir-eswatini.md | 361 ++++++++++++++++++ static/img/fhir-eswatini-valueset-example.png | Bin 0 -> 38370 bytes 2 files changed, 361 insertions(+) create mode 100644 adaptors/fhir-eswatini.md create mode 100644 static/img/fhir-eswatini-valueset-example.png diff --git a/adaptors/fhir-eswatini.md b/adaptors/fhir-eswatini.md new file mode 100644 index 00000000000..c79644bb5b9 --- /dev/null +++ b/adaptors/fhir-eswatini.md @@ -0,0 +1,361 @@ +--- +title: FHIR Eswatini Adaptor +--- + +Language support for the +[Eswatini National Health Information Exchange](https://hapifhir.eswatinihie.com) +FHIR Implementation Guide. + +This adaptor is generated from the Eswatini FHIR Implementation Guide (IG), +which means it understands Eswatini-specific profiles, extensions, and value +sets. It is designed to make writing FHIR-conformant job code as simple as +possible. + +## About FHIR + +[FHIR](https://www.hl7.org/fhir/overview.html) stands for Fast Healthcare +Interoperability Resources. It is a standard for representing and exchanging +healthcare data electronically. + +Learn more about FHIR and +[FHIR for heath data exchange](/documentation/get-started/standards#fhir-for-health-data-exchange). + +## How This Adaptor Helps + +Writing conformant FHIR resources by hand is verbose. The raw JSON for basic +Patient looks something like this: + +```json +{ + "resourceType": "Patient", + "meta": { + "profile": [ + "https://hapifhir.eswatinihie.com/fhir/StructureDefinition/SzPatient" + ] + }, + "identifier": [ + { + "use": "official", + "type": { + "coding": [ + { + "system": "https://hapifhir.eswatinihie.com/fhir/CodeSystem/SzPersonIdentificationsCS", + "code": "PI", + "display": "Personal ID Number" + } + ] + }, + "system": "http://homeaffairs.sys", + "value": "1999001000000" + } + ], + "name": [{ "family": "Gule", "given": ["Jacob", "Samuel"] }], + "gender": "male", + "birthDate": "1990-01-01", + "extension": [ + { + "url": "https://hapifhir.eswatinihie.com/fhir/StructureDefinition/SzInkhundlaExtension", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://hapifhir.eswatinihie.com/fhir/CodeSystem/SzTinkhundlaCS", + "code": "3", + "display": "LOBAMBA" + } + ], + "text": "LOBAMBA" + } + } + ] +} +``` + +The fhir-eswatini adaptor reduces this to: + +```js +b.patient({ + identifier: { + use: 'official', + type: 'PI', + system: 'http://homeaffairs.sys', + value: '1999001000000', + }, + name: [{ family: 'Gule', given: ['Jacob', 'Samuel'] }], + gender: 'male', + birthDate: '1990-01-01', + inkhundla: '3', +}); +``` + +The "builder function" `b.patient()` handles the profile URL, the full +identifier type coding, and the extension structure automatically. + +This means that workflow code which maps information into fhir resources is +simpler and cleaner. It's easier to write, easier to read, easier to reason +about, and easier to modify. + +## Builder functions + +All builder functions are available on the `b` (short for `builders`) namespac. + +There is a builder for every resource type in the Eswatini IG: `b.patient()`, +`b.encounter()`, `b.observation()`, `b.condition()` and so on. See the +[reference docs](/adaptors/packages/fhir-eswatini-docs) for the full list. + +Pass a plain object with the properties you want: + +```js +const patient = b.patient({ + gender: 'male', + birthDate: '1990-01-01', +}); +``` + +Builders are not operations themselves. Pass them as an argument to an operation +like `create()`, or use them inside a callback: + +```js +fn(state => { + state.patient = b.patient(state.data); + return state; +}); +``` + +### TODO Bundling + +```js +addToBundle( + b.patient({ + gender: 'male', + birthDate: '1990-01-01', + }) +); +``` + +## Value mapping + +The adaptor knows the Eswatini IG's value sets, so short code values are +automatically expanded to full coded concepts. + +For example, an identifier's `type` accepts a short code from the Eswatini +Person Identifications code system: + +```js +b.patient({ + identifier: { + type: 'PI', // expands to a full CodeableConcept + system: 'http://homeaffairs.sys', + value: '1999001000000', + }, +}); +``` + +The same applies to other coded fields. For example, an encounter's `class` +accepts short codes like `OPD`, `IPD`, `CO`, and `SO`: + +```js +b.encounter({ + class: 'OPD', // expands to full coding with system and display + subject: 'Patient/123', +}); +``` + +To know the range of value allowed, follow the links in the docs to the value +set definition (the docs will link you straight into the Implementation Guide). +Any Code value declared on that page is allowed. + +![Example listing of code values from the FHIR IG](/img/fhir-eswatini-valueset-example.png) + +You can also define your own value mappings. This is useful when mapping your +input data into FHIR. Just declare the mappings at the top of your job code with +the correct URL and whatever values you want. + +```js +b.setValues( + // get the value set URL from the docs + 'http://172.209.216.154:3447/fhir/ValueSet/SzTinkhundlaVS', + // Define your own mappings, where the key is the code value passed to + // to the builder, and the value is whatever should be mapped + // In this example, we want to map an inkhundla name to the code + { + mbabane: { + system: 'https://hapifhir.eswatinihie.com/fhir/CodeSystem/SzTinkhundlaCS', + code: '264', + display: 'MBABANE', + }, + } +); +``` + +Custom mappings like this do not override the default system values. In fact, +your custom mappings are expanded first and THEN the system mappings cut in - so +you can declare custom mappings which map right to codings, which will then be +expanded: + +```js +b.setValues( + 'http://172.209.216.154:3447/fhir/ValueSet/SzTinkhundlaVS', + // Map to the code, and let the default mapping expand the full extension + { + mbabane: '264', + } +); +``` + +Now your job code can do: + +```js +b.patient({ + inkundla: 'mbabane', +}); +``` + +If you declare mappings relative to the format your source data, you can declare +the value based on your data without complex mapping code + +```js +b.patient({ + inkundla: $.patient.district, // mapping from a different dataset +}); +``` + +## Extensions as properties + +Eswatini-specific extensions are exposed as simple named properties on the +relevant builders, instead of requiring you to construct extension objects +manually. + +For example, for the Patient resource, supported extension properties are: + +| Property | Extension | +| ------------------ | -------------------- | +| `inkhundla` | SzInkhundlaExtension | +| `chiefdom` | SzChiefdomExtension | +| `registrationDate` | SzRegistrationDate | + +Pass a code value and the builder constructs the full extension: + +```js +b.patient({ + inkhundla: '3', + chiefdom: '7', + registrationDate: '2025-06-01T10:00:00Z', +}); +``` + +```json +{ + "extension": [ + { + "url": "http://172.209.216.154:3447/fhir/StructureDefinition/SzInkhundlaExtension", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://hapifhir.eswatinihie.com/fhir/CodeSystem/SzTinkhundlaCS", + "code": "3", + "display": "LOBAMBA" + } + ], + "text": "LOBAMBA" + } + }, + { + "url": "http://172.209.216.154:3447/fhir/StructureDefinition/SzChiefdomExtension", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://hapifhir.eswatinihie.com/fhir/CodeSystem/SzChiefdomCS", + "code": "7", + "display": "Lobamba" + } + ], + "text": "Lobamba" + } + }, + { + "url": "http://172.209.216.154:3447/fhir/StructureDefinition/SzRegistrationDate", + "valueDateTime": "2025-06-01T10:00:00Z" + } + ] +} +``` + +## Multi-profile resources + +Some FHIR resource types have multiple Eswatini profiles. For these, pass the +profile name as the first argument to the builder. + +### Observation + +The `observation` builder accepts one of `SzCauseOfDeath`, +`SzClinicalObservation`, `SzLabResult`, `SzMannerOfDeath`, or `SzVitalSigns`: + +```js +b.observation('SzVitalSigns', { + status: 'final', + subject: 'Patient/123', +}); +``` + +### ServiceRequest + +The `serviceRequest` builder accepts one of `SzLabRequest` or `SzReferral`: + +```js +b.serviceRequest('SzReferral', { + status: 'active', + intent: 'order', + subject: 'Patient/123', +}); +``` + +## Finding More Examples + +The size and complexity of FHIR implementations can make it hard to document +effectively. + +The design of the builders is to be intuitive: pass any reasonable value to a +key and the builder should do the right thing with it. + +If you're not sure, and the API reference documentation isn't clear, the best +places to get help are: + +1. Look at the + [unit tests](https://github.com/OpenFn/adaptors/tree/main/packages/fhir-eswatini/test/resources) + for the resource you are building. These are hand written and have many + examples of mapping values (the unit tests are how we validate that the + different mappings work!) +1. Look at the + [source code](https://github.com/OpenFn/adaptors/tree/main/packages/fhir-eswatini/src/profiles) + of the builder function you are using. The builders are quite verbose and you + should be able to see how your input data is processed. Check that the key + you want is supported, and check how the value is processed (is it value + mapped? Is it sent to another builder?) + +## Authentication + +See this adaptor's +[Configuration docs](/adaptors/packages/fhir-eswatini-configuration-schema) for +the required authentication parameters. + +See platform docs on +[managing credentials](/documentation/manage-projects/manage-credentials) for +how to configure a credential in OpenFn. If working locally or using a Raw JSON +credential type, your configuration will look something like this: + +```json +{ + "baseUrl": "https://hapifhir.eswatinihie.com", + "apiPath": "fhir" +} +``` + +### I've noticed a problem with this adaptor, or something is out of date, what can I do? + +Thanks for asking! We are a fully Open Source Digital Public Good, and we +welcome contributions from our community. Check out our +[Adaptors Wiki](https://github.com/OpenFn/adaptors/blob/main/wiki/index.md) for +more information on how you can update adaptors! + +Or, you can always reach out to the Community through our +[Community Forum here](https://community.openfn.org/). diff --git a/static/img/fhir-eswatini-valueset-example.png b/static/img/fhir-eswatini-valueset-example.png new file mode 100644 index 0000000000000000000000000000000000000000..757c84a5a58b1d8c854370f9f598df68bcdee97a GIT binary patch literal 38370 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 literal 0 HcmV?d00001 From 68f4f31ce6864dd025e720cfe61c843d209d6afe Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Fri, 27 Feb 2026 14:49:21 +0000 Subject: [PATCH 2/2] note on generation --- adaptors/fhir-eswatini.md | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/adaptors/fhir-eswatini.md b/adaptors/fhir-eswatini.md index c79644bb5b9..a208650b01e 100644 --- a/adaptors/fhir-eswatini.md +++ b/adaptors/fhir-eswatini.md @@ -94,7 +94,9 @@ This means that workflow code which maps information into fhir resources is simpler and cleaner. It's easier to write, easier to read, easier to reason about, and easier to modify. -## Builder functions +## User Guide + +### Builder functions All builder functions are available on the `b` (short for `builders`) namespac. @@ -132,7 +134,7 @@ addToBundle( ); ``` -## Value mapping +### Value mapping The adaptor knows the Eswatini IG's value sets, so short code values are automatically expanded to full coded concepts. @@ -219,7 +221,7 @@ b.patient({ }); ``` -## Extensions as properties +### Extensions as properties Eswatini-specific extensions are exposed as simple named properties on the relevant builders, instead of requiring you to construct extension objects @@ -280,12 +282,12 @@ b.patient({ } ``` -## Multi-profile resources +### Multi-profile resources Some FHIR resource types have multiple Eswatini profiles. For these, pass the profile name as the first argument to the builder. -### Observation +#### Observation The `observation` builder accepts one of `SzCauseOfDeath`, `SzClinicalObservation`, `SzLabResult`, `SzMannerOfDeath`, or `SzVitalSigns`: @@ -297,7 +299,7 @@ b.observation('SzVitalSigns', { }); ``` -### ServiceRequest +#### ServiceRequest The `serviceRequest` builder accepts one of `SzLabRequest` or `SzReferral`: @@ -309,7 +311,7 @@ b.serviceRequest('SzReferral', { }); ``` -## Finding More Examples +### Finding More Examples The size and complexity of FHIR implementations can make it hard to document effectively. @@ -332,6 +334,24 @@ places to get help are: you want is supported, and check how the value is processed (is it value mapped? Is it sent to another builder?) +## Adaptor Implementation + +The `fhir-eswatini` adaptor is automatically generated from an implementation +guide. + +All builder functions, reference documentation and typings are generated from +details in the specification according to specific usage patterns and templates. + +Some parts of the adaptor, like the main operations, core datatype builders, and +unit tests, are hand-written. + +The ability to generate adaptor code means that the adaptor can be updated to +changes in the specification within minutes. It also ensures that the generated +code is comprehensive and accurate. + +But bugs in the generation process can result in errors, and the sheer scale of +code generated means that test coverage can be lacking. + ## Authentication See this adaptor's @@ -350,7 +370,7 @@ credential type, your configuration will look something like this: } ``` -### I've noticed a problem with this adaptor, or something is out of date, what can I do? +## I've noticed a problem with this adaptor, or something is out of date, what can I do? Thanks for asking! We are a fully Open Source Digital Public Good, and we welcome contributions from our community. Check out our