@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.
@@ -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.13",
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.12",
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.3",
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);