sdc-qrf 0.1.3 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components.d.ts +3 -3
- package/lib/components.js +12 -12
- package/lib/components.js.map +1 -1
- package/lib/context.d.ts +0 -1
- package/lib/converter/extensions.d.ts +35 -0
- package/lib/converter/extensions.js +128 -0
- package/lib/converter/extensions.js.map +1 -0
- package/lib/converter/fceToFhir/index.d.ts +4 -0
- package/lib/converter/fceToFhir/index.js +15 -0
- package/lib/converter/fceToFhir/index.js.map +1 -0
- package/lib/converter/fceToFhir/questionnaire/index.d.ts +3 -0
- package/lib/converter/fceToFhir/questionnaire/index.js +17 -0
- package/lib/converter/fceToFhir/questionnaire/index.js.map +1 -0
- package/lib/converter/fceToFhir/questionnaire/processExtensions.d.ts +3 -0
- package/lib/converter/fceToFhir/questionnaire/processExtensions.js +61 -0
- package/lib/converter/fceToFhir/questionnaire/processExtensions.js.map +1 -0
- package/lib/converter/fceToFhir/questionnaire/processItems.d.ts +3 -0
- package/lib/converter/fceToFhir/questionnaire/processItems.js +144 -0
- package/lib/converter/fceToFhir/questionnaire/processItems.js.map +1 -0
- package/lib/converter/fceToFhir/questionnaire/processMeta.d.ts +3 -0
- package/lib/converter/fceToFhir/questionnaire/processMeta.js +20 -0
- package/lib/converter/fceToFhir/questionnaire/processMeta.js.map +1 -0
- package/lib/converter/fceToFhir/questionnaireResponse/index.d.ts +3 -0
- package/lib/converter/fceToFhir/questionnaireResponse/index.js +20 -0
- package/lib/converter/fceToFhir/questionnaireResponse/index.js.map +1 -0
- package/lib/converter/fceToFhir/questionnaireResponse/processAnswers.d.ts +2 -0
- package/lib/converter/fceToFhir/questionnaireResponse/processAnswers.js +48 -0
- package/lib/converter/fceToFhir/questionnaireResponse/processAnswers.js.map +1 -0
- package/lib/converter/fceToFhir/questionnaireResponse/processMeta.d.ts +3 -0
- package/lib/converter/fceToFhir/questionnaireResponse/processMeta.js +18 -0
- package/lib/converter/fceToFhir/questionnaireResponse/processMeta.js.map +1 -0
- package/lib/converter/fceToFhir/questionnaireResponse/processReference.d.ts +3 -0
- package/lib/converter/fceToFhir/questionnaireResponse/processReference.js +19 -0
- package/lib/converter/fceToFhir/questionnaireResponse/processReference.js.map +1 -0
- package/lib/converter/fhirToFce/index.d.ts +4 -0
- package/lib/converter/fhirToFce/index.js +15 -0
- package/lib/converter/fhirToFce/index.js.map +1 -0
- package/lib/converter/fhirToFce/questionnaire/index.d.ts +3 -0
- package/lib/converter/fhirToFce/questionnaire/index.js +21 -0
- package/lib/converter/fhirToFce/questionnaire/index.js.map +1 -0
- package/lib/converter/fhirToFce/questionnaire/processExtensions.d.ts +8 -0
- package/lib/converter/fhirToFce/questionnaire/processExtensions.js +89 -0
- package/lib/converter/fhirToFce/questionnaire/processExtensions.js.map +1 -0
- package/lib/converter/fhirToFce/questionnaire/processItems.d.ts +3 -0
- package/lib/converter/fhirToFce/questionnaire/processItems.js +131 -0
- package/lib/converter/fhirToFce/questionnaire/processItems.js.map +1 -0
- package/lib/converter/fhirToFce/questionnaire/processMeta.d.ts +32 -0
- package/lib/converter/fhirToFce/questionnaire/processMeta.js +14 -0
- package/lib/converter/fhirToFce/questionnaire/processMeta.js.map +1 -0
- package/lib/converter/fhirToFce/questionnaireResponse/index.d.ts +3 -0
- package/lib/converter/fhirToFce/questionnaireResponse/index.js +20 -0
- package/lib/converter/fhirToFce/questionnaireResponse/index.js.map +1 -0
- package/lib/converter/fhirToFce/questionnaireResponse/processAnswers.d.ts +2 -0
- package/lib/converter/fhirToFce/questionnaireResponse/processAnswers.js +46 -0
- package/lib/converter/fhirToFce/questionnaireResponse/processAnswers.js.map +1 -0
- package/lib/converter/fhirToFce/questionnaireResponse/processMeta.d.ts +3 -0
- package/lib/converter/fhirToFce/questionnaireResponse/processMeta.js +15 -0
- package/lib/converter/fhirToFce/questionnaireResponse/processMeta.js.map +1 -0
- package/lib/converter/fhirToFce/questionnaireResponse/processReference.d.ts +3 -0
- package/lib/converter/fhirToFce/questionnaireResponse/processReference.js +18 -0
- package/lib/converter/fhirToFce/questionnaireResponse/processReference.js.map +1 -0
- package/lib/converter/fhirToFce/utils.d.ts +3 -0
- package/lib/converter/fhirToFce/utils.js +37 -0
- package/lib/converter/fhirToFce/utils.js.map +1 -0
- package/lib/converter/index.d.ts +12 -0
- package/lib/converter/index.js +84 -0
- package/lib/converter/index.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/setupTests.d.ts +1 -0
- package/lib/setupTests.js +4 -0
- package/lib/setupTests.js.map +1 -0
- package/lib/types.d.ts +10 -10
- package/lib/utils.d.ts +4 -1
- package/lib/utils.js +9 -2
- package/lib/utils.js.map +1 -1
- package/package.json +4 -5
- package/src/components.tsx +12 -12
- package/src/converter/__tests__/fce.test.ts +224 -0
- package/src/converter/__tests__/resources/questionnaire_fce/allergies.json +405 -0
- package/src/converter/__tests__/resources/questionnaire_fce/beverages.json +72 -0
- package/src/converter/__tests__/resources/questionnaire_fce/choice_answer_option.json +53 -0
- package/src/converter/__tests__/resources/questionnaire_fce/consent.json +86 -0
- package/src/converter/__tests__/resources/questionnaire_fce/enable_when.json +103 -0
- package/src/converter/__tests__/resources/questionnaire_fce/encounter_create.json +126 -0
- package/src/converter/__tests__/resources/questionnaire_fce/gad_7.json +459 -0
- package/src/converter/__tests__/resources/questionnaire_fce/immunization.json +182 -0
- package/src/converter/__tests__/resources/questionnaire_fce/medication.json +189 -0
- package/src/converter/__tests__/resources/questionnaire_fce/multiple_type_launch_context.json +406 -0
- package/src/converter/__tests__/resources/questionnaire_fce/patient_create.json +84 -0
- package/src/converter/__tests__/resources/questionnaire_fce/patient_edit.json +125 -0
- package/src/converter/__tests__/resources/questionnaire_fce/phq_2_phq_9.json +552 -0
- package/src/converter/__tests__/resources/questionnaire_fce/physicalexam.json +385 -0
- package/src/converter/__tests__/resources/questionnaire_fce/practitioner_create.json +90 -0
- package/src/converter/__tests__/resources/questionnaire_fce/practitioner_create_structure_map.json +91 -0
- package/src/converter/__tests__/resources/questionnaire_fce/practitioner_edit.json +144 -0
- package/src/converter/__tests__/resources/questionnaire_fce/practitioner_role_create.json +37 -0
- package/src/converter/__tests__/resources/questionnaire_fce/public_appointment.json +91 -0
- package/src/converter/__tests__/resources/questionnaire_fce/review_of_systems.json +389 -0
- package/src/converter/__tests__/resources/questionnaire_fce/source_queries.json +34 -0
- package/src/converter/__tests__/resources/questionnaire_fce/vitals.json +234 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/allergies.json +433 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/beverages.json +99 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/choice_answer_option.json +49 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/consent.json +119 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/enable_when.json +87 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/encounter_create.json +171 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/gad_7.json +489 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/immunization.json +215 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/medication.json +226 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/multiple_type_launch_context.json +416 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/patient_create.json +97 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/patient_edit.json +183 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/phq_2_phq_9.json +580 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/physicalexam.json +544 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/practitioner_create.json +87 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/practitioner_create_structure_map.json +91 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/practitioner_edit.json +193 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/practitioner_role_create.json +44 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/public_appointment.json +116 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/review_of_systems.json +368 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/source_queries.json +37 -0
- package/src/converter/__tests__/resources/questionnaire_fhir/vitals.json +317 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/allergies_inprogress.json +78 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/cardiology.json +96 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/few_answers.json +48 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/gad_7.json +165 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/immunization.json +86 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/medication.json +116 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/new_appointment.json +96 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/patient.json +87 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/phq_2_phq_9.json +193 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/physicalexam.json +187 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/practitioner.json +57 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/reference_answer_with_assoc.json +147 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/review_of_systems.json +129 -0
- package/src/converter/__tests__/resources/questionnaire_response_fce/vitals.json +168 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/allergies_inprogress.json +73 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/cardiology.json +87 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/few_answers.json +46 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/gad_7.json +146 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/immunization.json +77 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/medication.json +101 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/new_appointment.json +86 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/patient.json +78 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/phq_2_phq_9.json +170 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/physicalexam.json +158 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/practitioner.json +54 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/reference_answer_with_assoc.json +86 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/review_of_systems.json +118 -0
- package/src/converter/__tests__/resources/questionnaire_response_fhir/vitals.json +145 -0
- package/src/converter/extensions.ts +149 -0
- package/src/converter/fceToFhir/index.ts +27 -0
- package/src/converter/fceToFhir/questionnaire/index.ts +15 -0
- package/src/converter/fceToFhir/questionnaire/processExtensions.ts +75 -0
- package/src/converter/fceToFhir/questionnaire/processItems.ts +194 -0
- package/src/converter/fceToFhir/questionnaire/processMeta.ts +19 -0
- package/src/converter/fceToFhir/questionnaireResponse/index.ts +21 -0
- package/src/converter/fceToFhir/questionnaireResponse/processAnswers.ts +53 -0
- package/src/converter/fceToFhir/questionnaireResponse/processMeta.ts +16 -0
- package/src/converter/fceToFhir/questionnaireResponse/processReference.ts +24 -0
- package/src/converter/fhirToFce/index.ts +27 -0
- package/src/converter/fhirToFce/questionnaire/index.ts +25 -0
- package/src/converter/fhirToFce/questionnaire/processExtensions.ts +113 -0
- package/src/converter/fhirToFce/questionnaire/processItems.ts +159 -0
- package/src/converter/fhirToFce/questionnaire/processMeta.ts +17 -0
- package/src/converter/fhirToFce/questionnaireResponse/index.ts +21 -0
- package/src/converter/fhirToFce/questionnaireResponse/processAnswers.ts +53 -0
- package/src/converter/fhirToFce/questionnaireResponse/processMeta.ts +14 -0
- package/src/converter/fhirToFce/questionnaireResponse/processReference.ts +20 -0
- package/src/converter/fhirToFce/utils.ts +36 -0
- package/src/converter/index.ts +106 -0
- package/src/index.ts +1 -0
- package/src/setupTests.ts +1 -0
- package/src/utils.ts +13 -2
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { QuestionnaireResponse as FHIRQuestionnaireResponse } from 'fhir/r4b';
|
|
2
|
+
import cloneDeep from 'lodash/cloneDeep';
|
|
3
|
+
|
|
4
|
+
import { QuestionnaireResponse as FCEQuestionnaireResponse } from 'shared/src/contrib/aidbox';
|
|
5
|
+
|
|
6
|
+
import { processAnswers } from './processAnswers';
|
|
7
|
+
import { processMeta } from './processMeta';
|
|
8
|
+
import { processReference } from './processReference';
|
|
9
|
+
|
|
10
|
+
export function convertQuestionnaireResponse(
|
|
11
|
+
questionnaireResponse: FHIRQuestionnaireResponse,
|
|
12
|
+
): FCEQuestionnaireResponse {
|
|
13
|
+
questionnaireResponse = cloneDeep(questionnaireResponse);
|
|
14
|
+
if (questionnaireResponse.item) {
|
|
15
|
+
processAnswers(questionnaireResponse.item);
|
|
16
|
+
}
|
|
17
|
+
if (questionnaireResponse.meta) {
|
|
18
|
+
questionnaireResponse.meta = processMeta(questionnaireResponse.meta);
|
|
19
|
+
}
|
|
20
|
+
return processReference(questionnaireResponse);
|
|
21
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Coding as FHIRCoding,
|
|
3
|
+
QuestionnaireResponseItem as FHIRQuestionnaireResponseItem,
|
|
4
|
+
QuestionnaireResponseItemAnswer as FHIRQuestionnaireResponseItemAnswer,
|
|
5
|
+
Reference as FHIRReference,
|
|
6
|
+
} from 'fhir/r4b';
|
|
7
|
+
import isEmpty from 'lodash/isEmpty';
|
|
8
|
+
|
|
9
|
+
import { QuestionnaireResponseItemAnswer as FCEQuestionnaireResponseItemAnswer } from 'shared/src/contrib/aidbox';
|
|
10
|
+
|
|
11
|
+
import { fromFHIRReference } from '../../../converter';
|
|
12
|
+
|
|
13
|
+
export function processAnswers(items: FHIRQuestionnaireResponseItem[]) {
|
|
14
|
+
if (!items) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
for (const item of items) {
|
|
18
|
+
if (item.answer) {
|
|
19
|
+
item.answer = item.answer.map(processAnswer).filter((answer) => !isEmpty(answer));
|
|
20
|
+
}
|
|
21
|
+
if (item.item) {
|
|
22
|
+
processAnswers(item.item);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function processAnswer(
|
|
28
|
+
answer: FHIRQuestionnaireResponseItemAnswer,
|
|
29
|
+
): FCEQuestionnaireResponseItemAnswer {
|
|
30
|
+
const fceAnswer: FCEQuestionnaireResponseItemAnswer = { ...answer };
|
|
31
|
+
const valueHandlers = {
|
|
32
|
+
valueString: (value: string) => ({ string: value }),
|
|
33
|
+
valueInteger: (value: number) => ({ integer: value }),
|
|
34
|
+
valueDecimal: (value: number) => ({ decimal: value }),
|
|
35
|
+
valueBoolean: (value: boolean) => ({ boolean: value }),
|
|
36
|
+
valueCoding: (value: FHIRCoding) => ({ Coding: value }),
|
|
37
|
+
valueDate: (value: string) => ({ date: value }),
|
|
38
|
+
valueDateTime: (value: string) => ({ dateTime: value }),
|
|
39
|
+
valueReference: (value: FHIRReference) => ({
|
|
40
|
+
Reference: fromFHIRReference(value),
|
|
41
|
+
}),
|
|
42
|
+
valueTime: (value: string) => ({ time: value }),
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
for (const key in valueHandlers) {
|
|
46
|
+
if (key in fceAnswer) {
|
|
47
|
+
const value = fceAnswer[key];
|
|
48
|
+
delete fceAnswer[key];
|
|
49
|
+
fceAnswer.value = valueHandlers[key]?.(value);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return fceAnswer;
|
|
53
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Meta as FHIRMeta } from 'fhir/r4b';
|
|
2
|
+
|
|
3
|
+
import { Meta as FCEMeta } from 'shared/src/contrib/aidbox';
|
|
4
|
+
|
|
5
|
+
import { extractExtension } from '../../../converter';
|
|
6
|
+
|
|
7
|
+
export function processMeta(meta: FHIRMeta): FCEMeta {
|
|
8
|
+
const { extension, ...commonMeta } = meta;
|
|
9
|
+
const fceMeta: FCEMeta = { ...commonMeta };
|
|
10
|
+
if (extension) {
|
|
11
|
+
fceMeta.createdAt = extractExtension(extension, 'ex:createdAt');
|
|
12
|
+
}
|
|
13
|
+
return fceMeta;
|
|
14
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { QuestionnaireResponse as FHIRQuestionnaireResponse } from 'fhir/r4b';
|
|
2
|
+
|
|
3
|
+
import { QuestionnaireResponse as FCEQuestionnaireResponse } from 'shared/src/contrib/aidbox';
|
|
4
|
+
|
|
5
|
+
import { fromFHIRReference } from '../../../converter';
|
|
6
|
+
|
|
7
|
+
export function processReference(
|
|
8
|
+
fhirQuestionnaireResponse: FHIRQuestionnaireResponse,
|
|
9
|
+
): FCEQuestionnaireResponse {
|
|
10
|
+
const { encounter, source, ...commonProperties } = fhirQuestionnaireResponse;
|
|
11
|
+
const fceQuestionnaireResponse: FCEQuestionnaireResponse =
|
|
12
|
+
commonProperties as FCEQuestionnaireResponse;
|
|
13
|
+
if (encounter?.reference) {
|
|
14
|
+
fceQuestionnaireResponse.encounter = fromFHIRReference(encounter);
|
|
15
|
+
}
|
|
16
|
+
if (source?.reference) {
|
|
17
|
+
fceQuestionnaireResponse.source = fromFHIRReference(source);
|
|
18
|
+
}
|
|
19
|
+
return fceQuestionnaireResponse;
|
|
20
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Questionnaire as FHIRQuestionnaire } from 'fhir/r4b';
|
|
2
|
+
|
|
3
|
+
export function checkFhirQuestionnaireProfile(fhirQuestionnaire: FHIRQuestionnaire): void {
|
|
4
|
+
if (
|
|
5
|
+
!(
|
|
6
|
+
(fhirQuestionnaire.meta?.profile?.length ?? 0) === 1 &&
|
|
7
|
+
fhirQuestionnaire.meta?.profile?.[0] === 'https://beda.software/beda-emr-questionnaire'
|
|
8
|
+
)
|
|
9
|
+
) {
|
|
10
|
+
throw new Error('Only beda emr questionanire supported');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function trimUndefined(e: any) {
|
|
15
|
+
for (const prop in e) {
|
|
16
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
17
|
+
if (e.hasOwnProperty(prop)) {
|
|
18
|
+
const val = e[prop];
|
|
19
|
+
if (val === undefined) {
|
|
20
|
+
delete e[prop];
|
|
21
|
+
} else if (typeof val === 'object') {
|
|
22
|
+
if (Array.isArray(val)) {
|
|
23
|
+
for (let i = 0; i < val.length; i++) {
|
|
24
|
+
if (typeof val[i] === 'object') {
|
|
25
|
+
trimUndefined(val[i]);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
} else {
|
|
29
|
+
trimUndefined(val);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return e;
|
|
36
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Reference as FHIRReference,
|
|
3
|
+
Extension as FHIRExtension,
|
|
4
|
+
QuestionnaireItem as FHIRQuestionnaireItem,
|
|
5
|
+
} from 'fhir/r4b';
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
Extension as FCEExtension,
|
|
9
|
+
QuestionnaireItem as FCEQuestionnaireItem,
|
|
10
|
+
InternalReference,
|
|
11
|
+
} from 'shared/src/contrib/aidbox';
|
|
12
|
+
|
|
13
|
+
import { ExtensionIdentifier, extensionTransformers } from './extensions';
|
|
14
|
+
import { fromFirstClassExtension } from './fceToFhir';
|
|
15
|
+
import { toFirstClassExtension } from './fhirToFce';
|
|
16
|
+
import { processLaunchContext as processLaunchContextToFce } from './fhirToFce/questionnaire/processExtensions';
|
|
17
|
+
|
|
18
|
+
export function convertFromFHIRExtension(
|
|
19
|
+
extension: FHIRExtension,
|
|
20
|
+
): Partial<FCEQuestionnaireItem> | undefined {
|
|
21
|
+
const identifier = extension.url;
|
|
22
|
+
const transformer = extensionTransformers[identifier as ExtensionIdentifier];
|
|
23
|
+
if (transformer !== undefined) {
|
|
24
|
+
if ('transform' in transformer) {
|
|
25
|
+
return transformer.transform.fromExtension(extension);
|
|
26
|
+
} else {
|
|
27
|
+
return { [transformer.path.questionnaire]: extension[transformer.path.extension] };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function convertToFHIRExtension(item: FCEQuestionnaireItem): FHIRExtension[] {
|
|
33
|
+
const extensions: FHIRExtension[] = [];
|
|
34
|
+
for (const identifer in ExtensionIdentifier) {
|
|
35
|
+
const transformer =
|
|
36
|
+
extensionTransformers[ExtensionIdentifier[identifer] as ExtensionIdentifier];
|
|
37
|
+
if ('transform' in transformer) {
|
|
38
|
+
const extension = transformer.transform.toExtension(item);
|
|
39
|
+
if (extension !== undefined) {
|
|
40
|
+
extensions.push(extension);
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
const extensionValue = item[transformer.path.questionnaire];
|
|
44
|
+
if (extensionValue !== undefined) {
|
|
45
|
+
const extension: FHIRExtension = {
|
|
46
|
+
[transformer.path.extension]: extensionValue,
|
|
47
|
+
url: ExtensionIdentifier[identifer],
|
|
48
|
+
};
|
|
49
|
+
extensions.push(extension);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return extensions;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function extractExtension(extension: FCEExtension[] | undefined, url: 'ex:createdAt') {
|
|
57
|
+
return extension?.find((e) => e.url === url)?.valueInstant;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function findExtension(item: FHIRQuestionnaireItem, url: string) {
|
|
61
|
+
return item.extension?.find((ext) => ext.url === url);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function fromFHIRReference(r?: FHIRReference): InternalReference | undefined {
|
|
65
|
+
if (!r || !r.reference) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const { reference: literalReference, ...commonReferenceProperties } = r;
|
|
70
|
+
const isHistoryVersionLink = r.reference.split('/').slice(-2, -1)[0] === '_history';
|
|
71
|
+
|
|
72
|
+
if (isHistoryVersionLink) {
|
|
73
|
+
const [, , id, resourceType] = r.reference.split('/').reverse();
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
...commonReferenceProperties,
|
|
77
|
+
id: id!,
|
|
78
|
+
resourceType,
|
|
79
|
+
};
|
|
80
|
+
} else {
|
|
81
|
+
const [id, resourceType] = r.reference.split('/').reverse();
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
...commonReferenceProperties,
|
|
85
|
+
id: id!,
|
|
86
|
+
resourceType,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function toFHIRReference(r?: InternalReference): FHIRReference | undefined {
|
|
92
|
+
if (!r) {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const { id, resourceType, ...commonReferenceProperties } = r;
|
|
97
|
+
|
|
98
|
+
delete commonReferenceProperties.resource;
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
...commonReferenceProperties,
|
|
102
|
+
reference: `${resourceType}/${id}`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { toFirstClassExtension, fromFirstClassExtension, processLaunchContextToFce };
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@testing-library/jest-dom/extend-expect';
|
package/src/utils.ts
CHANGED
|
@@ -319,7 +319,7 @@ export function mapResponseToForm(resource: QuestionnaireResponse, questionnaire
|
|
|
319
319
|
}
|
|
320
320
|
|
|
321
321
|
function initialToQuestionnaireResponseItemAnswer(initial: QuestionnaireItemInitial[] | undefined) {
|
|
322
|
-
return (initial ?? []).map(({ value }) => ({ value } as QuestionnaireResponseItemAnswer)
|
|
322
|
+
return (initial ?? []).map(({ value }) => ({ value }) as QuestionnaireResponseItemAnswer);
|
|
323
323
|
}
|
|
324
324
|
|
|
325
325
|
export function findAnswersForQuestionsRecursive(linkId: string, values?: FormItems): any | null {
|
|
@@ -433,7 +433,8 @@ export function getChecker(
|
|
|
433
433
|
return (values, answerValue) => {
|
|
434
434
|
const answersLength = _.reject(
|
|
435
435
|
values,
|
|
436
|
-
(value) =>
|
|
436
|
+
(value) =>
|
|
437
|
+
isValueEmpty(value.value) || _.every(_.mapValues(value.value, isValueEmpty)),
|
|
437
438
|
).length;
|
|
438
439
|
const answer = answerValue?.boolean ?? true;
|
|
439
440
|
return answersLength > 0 === answer;
|
|
@@ -738,3 +739,13 @@ export function parseFhirQueryExpression(expression: string, context: ItemContex
|
|
|
738
739
|
|
|
739
740
|
return [resourceType, searchParams];
|
|
740
741
|
}
|
|
742
|
+
|
|
743
|
+
export function isValueEmpty(value: any) {
|
|
744
|
+
if (_.isNaN(value)) {
|
|
745
|
+
console.warn(
|
|
746
|
+
'Please be aware that a NaN value has been detected. In the context of an "exist" operator, a NaN value is interpreted as a non-existent value. This may lead to unexpected behavior in your code. Ensure to handle or correct this to maintain the integrity of your application.',
|
|
747
|
+
);
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
return _.isFinite(value) || _.isBoolean(value) ? false : _.isEmpty(value);
|
|
751
|
+
}
|