@openhi/types 0.0.3 → 0.0.4
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/missing_types.json +1 -0
- package/package.json +3 -3
- package/scripts/generate-fixtures.js +116 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["activitydefinition","activitydefinition_dynamicvalue","activitydefinition_participant","adverseevent","adverseevent_suspectentity","allergyintolerance","allergyintolerance_reaction","appointment","appointment_participant","appointmentresponse","auditevent","auditevent_agent","auditevent_detail","auditevent_entity","auditevent_network","auditevent_source","bodysite","capabilitystatement","capabilitystatement_certificate","capabilitystatement_document","capabilitystatement_endpoint","capabilitystatement_event","capabilitystatement_implementation","capabilitystatement_interaction","capabilitystatement_interaction1","capabilitystatement_messaging","capabilitystatement_operation","capabilitystatement_resource","capabilitystatement_rest","capabilitystatement_searchparam","capabilitystatement_security","capabilitystatement_software","capabilitystatement_supportedmessage","careplan","careplan_activity","careplan_detail","careteam","careteam_participant","chargeitem","chargeitem_participant","claim","claim_accident","claim_careteam","claim_detail","claim_diagnosis","claim_information","claim_insurance","claim_item","claim_payee","claim_procedure","claim_related","claim_subdetail","claimresponse","claimresponse_additem","claimresponse_adjudication","claimresponse_detail","claimresponse_detail1","claimresponse_error","claimresponse_insurance","claimresponse_item","claimresponse_payment","claimresponse_processnote","claimresponse_subdetail","clinicalimpression","clinicalimpression_finding","clinicalimpression_investigation","codesystem","codesystem_concept","codesystem_designation","codesystem_filter","codesystem_property","codesystem_property1","communication","communication_payload","communicationrequest","communicationrequest_payload","communicationrequest_requester","compartmentdefinition","compartmentdefinition_resource","composition","composition_attester","composition_event","composition_relatesto","composition_section","conceptmap","conceptmap_dependson","conceptmap_element","conceptmap_group","conceptmap_target","conceptmap_unmapped","condition_stage","consent","consent_actor","consent_actor1","consent_data","consent_data1","consent_except","consent_policy","contract","contract_agent","contract_agent1","contract_friendly","contract_legal","contract_rule","contract_signer","contract_term","contract_valueditem","contract_valueditem1","coverage","coverage_grouping","dataelement","dataelement_mapping","datarequirement_codefilter","datarequirement_datefilter","detectedissue","detectedissue_mitigation","device_udi","devicecomponent","devicecomponent_productionspecification","devicemetric","devicemetric_calibration","devicerequest","devicerequest_requester","deviceusestatement","diagnosticreport","diagnosticreport_image","diagnosticreport_performer","distance","documentmanifest","documentmanifest_content","documentmanifest_related","documentreference","documentreference_content","documentreference_context","documentreference_related","documentreference_relatesto","elementdefinition","elementdefinition_base","elementdefinition_binding","elementdefinition_constraint","elementdefinition_discriminator","elementdefinition_example","elementdefinition_mapping","elementdefinition_slicing","elementdefinition_type","eligibilityrequest","eligibilityresponse","eligibilityresponse_benefitbalance","eligibilityresponse_error","eligibilityresponse_financial","eligibilityresponse_insurance","encounter_classhistory","encounter_diagnosis","encounter_hospitalization","encounter_participant","encounter_statushistory","endpoint","enrollmentrequest","enrollmentresponse","episodeofcare","episodeofcare_diagnosis","episodeofcare_statushistory","expansionprofile","expansionprofile_designation","expansionprofile_designation1","expansionprofile_designation2","expansionprofile_exclude","expansionprofile_excludedsystem","expansionprofile_fixedversion","expansionprofile_include","explanationofbenefit","explanationofbenefit_accident","explanationofbenefit_additem","explanationofbenefit_adjudication","explanationofbenefit_benefitbalance","explanationofbenefit_careteam","explanationofbenefit_detail","explanationofbenefit_detail1","explanationofbenefit_diagnosis","explanationofbenefit_financial","explanationofbenefit_information","explanationofbenefit_insurance","explanationofbenefit_item","explanationofbenefit_payee","explanationofbenefit_payment","explanationofbenefit_procedure","explanationofbenefit_processnote","explanationofbenefit_related","explanationofbenefit_subdetail","familymemberhistory","familymemberhistory_condition","flag","goal","goal_target","graphdefinition","graphdefinition_compartment","graphdefinition_link","graphdefinition_target","group","group_characteristic","group_member","guidanceresponse","healthcareservice","healthcareservice_availabletime","healthcareservice_notavailable","imagingmanifest","imagingmanifest_instance","imagingmanifest_series","imagingmanifest_study","imagingstudy","imagingstudy_instance","imagingstudy_series","immunization","immunization_explanation","immunization_practitioner","immunization_reaction","immunization_vaccinationprotocol","immunizationrecommendation","immunizationrecommendation_datecriterion","immunizationrecommendation_protocol","immunizationrecommendation_recommendation","implementationguide","implementationguide_dependency","implementationguide_global","implementationguide_package","implementationguide_page","implementationguide_resource","index","library","linkage","linkage_item","location","location_position","measure","measure_group","measure_population","measure_stratifier","measure_supplementaldata","measurereport","measurereport_group","measurereport_population","measurereport_population1","measurereport_stratifier","measurereport_stratum","media","medication","medication_batch","medication_content","medication_ingredient","medication_package","medicationadministration","medicationadministration_dosage","medicationadministration_performer","medicationdispense","medicationdispense_performer","medicationdispense_substitution","medicationrequest","medicationrequest_dispenserequest","medicationrequest_requester","medicationrequest_substitution","medicationstatement","messagedefinition","messagedefinition_allowedresponse","messagedefinition_focus","messageheader","messageheader_destination","messageheader_response","messageheader_source","namingsystem","namingsystem_uniqueid","nutritionorder","nutritionorder_administration","nutritionorder_enteralformula","nutritionorder_nutrient","nutritionorder_oraldiet","nutritionorder_supplement","nutritionorder_texture","observation_related","operationdefinition","operationdefinition_binding","operationdefinition_overload","operationdefinition_parameter","parameterdefinition","paymentnotice","paymentreconciliation","paymentreconciliation_detail","paymentreconciliation_processnote","person","person_link","plandefinition","plandefinition_action","plandefinition_condition","plandefinition_dynamicvalue","plandefinition_goal","plandefinition_participant","plandefinition_relatedaction","plandefinition_target","practitionerrole","practitionerrole_availabletime","practitionerrole_notavailable","procedure","procedure_focaldevice","procedure_performer","procedurerequest","procedurerequest_requester","processrequest","processrequest_item","processresponse","processresponse_processnote","provenance","provenance_agent","provenance_entity","questionnaire","questionnaire_enablewhen","questionnaire_item","questionnaire_option","questionnaireresponse","questionnaireresponse_answer","questionnaireresponse_item","referralrequest","referralrequest_requester","relatedperson","requestgroup","requestgroup_action","requestgroup_condition","requestgroup_relatedaction","researchstudy","researchstudy_arm","researchsubject","riskassessment","riskassessment_prediction","searchparameter","searchparameter_component","sequence","sequence_quality","sequence_referenceseq","sequence_repository","sequence_variant","servicedefinition","specimen","specimen_collection","specimen_container","specimen_processing","structuredefinition","structuredefinition_differential","structuredefinition_mapping","structuredefinition_snapshot","structuremap","structuremap_dependent","structuremap_group","structuremap_input","structuremap_parameter","structuremap_rule","structuremap_source","structuremap_structure","structuremap_target","subscription","subscription_channel","substance","substance_ingredient","substance_instance","supplydelivery","supplydelivery_supplieditem","supplyrequest","supplyrequest_ordereditem","supplyrequest_requester","task","task_input","task_output","task_requester","task_restriction","testreport","testreport_action","testreport_action1","testreport_action2","testreport_assert","testreport_operation","testreport_participant","testreport_setup","testreport_teardown","testreport_test","testscript","testscript_action","testscript_action1","testscript_action2","testscript_assert","testscript_capability","testscript_destination","testscript_fixture","testscript_link","testscript_metadata","testscript_operation","testscript_origin","testscript_param","testscript_param1","testscript_param2","testscript_param3","testscript_requestheader","testscript_rule","testscript_rule1","testscript_rule2","testscript_rule3","testscript_ruleset","testscript_ruleset1","testscript_setup","testscript_teardown","testscript_test","testscript_variable","valueset","valueset_compose","valueset_concept","valueset_contains","valueset_designation","valueset_expansion","valueset_filter","valueset_include","valueset_parameter","visionprescription","visionprescription_dispense"]
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openhi/types",
|
|
3
3
|
"devDependencies": {
|
|
4
|
-
"@swc/core": "^1.15.
|
|
4
|
+
"@swc/core": "^1.15.17",
|
|
5
5
|
"@swc/jest": "^0.2.39",
|
|
6
6
|
"@types/jest": "^30.0.0",
|
|
7
|
-
"@types/node": "^22.19.
|
|
7
|
+
"@types/node": "^22.19.13",
|
|
8
8
|
"@typescript-eslint/eslint-plugin": "^8",
|
|
9
9
|
"@typescript-eslint/parser": "^8",
|
|
10
10
|
"commit-and-tag-version": "^12",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"publishConfig": {
|
|
24
24
|
"access": "public"
|
|
25
25
|
},
|
|
26
|
-
"version": "0.0.
|
|
26
|
+
"version": "0.0.4",
|
|
27
27
|
"types": "lib/index.d.ts",
|
|
28
28
|
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".",
|
|
29
29
|
"scripts": {
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Generate valid.minimal.json and valid.full.json for types in missing_types.json.
|
|
4
|
+
* Usage: node scripts/generate-fixtures.js <batchStart> <batchEnd>
|
|
5
|
+
* e.g. node scripts/generate-fixtures.js 6 21
|
|
6
|
+
* Batch 1 = indices 0-19, batch 6 = 100-119, batch 21 = 400-418.
|
|
7
|
+
*/
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
const ROOT = path.resolve(__dirname, '..');
|
|
12
|
+
const SRC = path.join(ROOT, 'src');
|
|
13
|
+
const FIXTURES = path.join(ROOT, '__fixtures__');
|
|
14
|
+
const MISSING_PATH = path.join(ROOT, 'missing_types.json');
|
|
15
|
+
|
|
16
|
+
const missing = JSON.parse(fs.readFileSync(MISSING_PATH, 'utf8'));
|
|
17
|
+
|
|
18
|
+
function parseRequiredFields(typeName) {
|
|
19
|
+
const tsPath = path.join(SRC, typeName + '.ts');
|
|
20
|
+
if (!fs.existsSync(tsPath)) return { resourceType: null, required: {} };
|
|
21
|
+
const content = fs.readFileSync(tsPath, 'utf8');
|
|
22
|
+
const required = {};
|
|
23
|
+
let resourceType = null;
|
|
24
|
+
// resourceType: "X"
|
|
25
|
+
const rtMatch = content.match(/resourceType:\s*"([^"]+)"/);
|
|
26
|
+
if (rtMatch) resourceType = rtMatch[1];
|
|
27
|
+
// Required: " name: Type" (no ? after name)
|
|
28
|
+
const lineRe = /^\s{2}([a-zA-Z_][a-zA-Z0-9_]*)(\??)\s*:\s*(.+?);?\s*$/gm;
|
|
29
|
+
let m;
|
|
30
|
+
while ((m = lineRe.exec(content)) !== null) {
|
|
31
|
+
const name = m[1];
|
|
32
|
+
const optional = m[2];
|
|
33
|
+
const type = m[3];
|
|
34
|
+
if (name === 'resourceType') continue;
|
|
35
|
+
if (optional === '?') continue; // optional
|
|
36
|
+
if (type.startsWith('Array<')) {
|
|
37
|
+
required[name] = 'array';
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (type === 'string') required[name] = 'string';
|
|
41
|
+
else if (type === 'number') required[name] = 'number';
|
|
42
|
+
else if (type === 'boolean') required[name] = 'boolean';
|
|
43
|
+
else if (type.includes('Reference')) required[name] = 'Reference';
|
|
44
|
+
else if (type.includes('CodeableConcept')) required[name] = 'CodeableConcept';
|
|
45
|
+
else if (type.includes('Identifier')) required[name] = 'Identifier';
|
|
46
|
+
else if (type.includes('Coding')) required[name] = 'Coding';
|
|
47
|
+
else if (type.includes('Period')) required[name] = 'Period';
|
|
48
|
+
else if (type.includes('Narrative')) required[name] = 'Narrative';
|
|
49
|
+
else required[name] = 'object';
|
|
50
|
+
}
|
|
51
|
+
return { resourceType, required };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function sampleValue(type) {
|
|
55
|
+
if (type === 'Reference') return { reference: 'Patient/example' };
|
|
56
|
+
if (type === 'CodeableConcept') return { coding: [{ system: 'http://example.org', code: 'example', display: 'Example' }] };
|
|
57
|
+
if (type === 'Coding') return { system: 'http://example.org', code: 'example', display: 'Example' };
|
|
58
|
+
if (type === 'Identifier') return { value: 'example-id' };
|
|
59
|
+
if (type === 'Period') return { start: '2024-01-15', end: '2024-01-15' };
|
|
60
|
+
if (type === 'Narrative') return { status: 'generated', div: '<div>Narrative</div>' };
|
|
61
|
+
if (type === 'string') return 'example';
|
|
62
|
+
if (type === 'number') return 1;
|
|
63
|
+
if (type === 'boolean') return true;
|
|
64
|
+
if (type === 'array') return [];
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function buildMinimal(resourceType, required) {
|
|
69
|
+
const o = {};
|
|
70
|
+
if (resourceType) o.resourceType = resourceType;
|
|
71
|
+
for (const [name, type] of Object.entries(required)) {
|
|
72
|
+
if (type === 'array') o[name] = [];
|
|
73
|
+
else o[name] = sampleValue(type);
|
|
74
|
+
}
|
|
75
|
+
return o;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function buildFull(resourceType, required) {
|
|
79
|
+
const o = buildMinimal(resourceType, required);
|
|
80
|
+
if (resourceType) {
|
|
81
|
+
if (!o.id) o.id = 'example-1';
|
|
82
|
+
if (resourceType !== 'Claim' && resourceType !== 'ClaimResponse') {
|
|
83
|
+
if (['Patient', 'Observation', 'Encounter', 'Condition', 'Composition', 'Consent', 'ClinicalImpression'].includes(resourceType))
|
|
84
|
+
o.subject = o.subject || { reference: 'Patient/example' };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return o;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function processType(typeName) {
|
|
91
|
+
const { resourceType, required } = parseRequiredFields(typeName);
|
|
92
|
+
const minimal = Object.keys(required).length === 0 && !resourceType ? {} : buildMinimal(resourceType, required);
|
|
93
|
+
const full = Object.keys(required).length === 0 && !resourceType ? { "comment": "optional only" } : buildFull(resourceType, required);
|
|
94
|
+
const dir = path.join(FIXTURES, typeName);
|
|
95
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
96
|
+
fs.writeFileSync(path.join(dir, 'valid.minimal.json'), JSON.stringify(minimal, null, 2));
|
|
97
|
+
fs.writeFileSync(path.join(dir, 'valid.full.json'), JSON.stringify(full, null, 2));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const batchStart = parseInt(process.argv[2], 10) || 1;
|
|
101
|
+
const batchEnd = parseInt(process.argv[3], 10) || 21;
|
|
102
|
+
const size = 20;
|
|
103
|
+
for (let b = batchStart; b <= batchEnd; b++) {
|
|
104
|
+
const start = (b - 1) * size;
|
|
105
|
+
const end = b === 21 ? Math.min(419, start + 19) : start + size;
|
|
106
|
+
for (let i = start; i < end && i < missing.length; i++) {
|
|
107
|
+
const typeName = missing[i];
|
|
108
|
+
try {
|
|
109
|
+
processType(typeName);
|
|
110
|
+
console.log(typeName);
|
|
111
|
+
} catch (e) {
|
|
112
|
+
console.error(typeName, e.message);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
console.log('Done batches', batchStart, '-', batchEnd);
|