fhirsmith 0.3.0
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/CHANGELOG.md +42 -0
- package/FHIRsmith.png +0 -0
- package/README.md +277 -0
- package/config-template.json +144 -0
- package/library/folder-setup.js +58 -0
- package/library/html-server.js +166 -0
- package/library/html.js +835 -0
- package/library/i18nsupport.js +259 -0
- package/library/languages.js +779 -0
- package/library/logger-telnet.js +205 -0
- package/library/logger.js +279 -0
- package/library/package-manager.js +876 -0
- package/library/utilities.js +196 -0
- package/library/version-utilities.js +1056 -0
- package/npmprojector/config-example.json +13 -0
- package/npmprojector/indexer.js +394 -0
- package/npmprojector/npmprojector.js +395 -0
- package/npmprojector/readme.md +174 -0
- package/npmprojector/watcher.js +335 -0
- package/package.json +119 -0
- package/packages/package-crawler.js +846 -0
- package/packages/packages-template.html +126 -0
- package/packages/packages.js +2838 -0
- package/passwords.ini +2 -0
- package/publisher/publisher-template.html +208 -0
- package/publisher/publisher.js +2167 -0
- package/publisher/task-draft.js +458 -0
- package/registry/api.js +735 -0
- package/registry/crawler.js +637 -0
- package/registry/model.js +513 -0
- package/registry/readme.md +243 -0
- package/registry/registry-data.json +121015 -0
- package/registry/registry-template.html +126 -0
- package/registry/registry.js +1395 -0
- package/registry/test-runner.js +237 -0
- package/root-template.html +124 -0
- package/server.js +524 -0
- package/shl/private-key.pem +5 -0
- package/shl/public-key.pem +18 -0
- package/shl/shl.js +1125 -0
- package/shl/vhl.js +69 -0
- package/static/FHIRsmith128.png +0 -0
- package/static/FHIRsmith16.png +0 -0
- package/static/FHIRsmith32.png +0 -0
- package/static/FHIRsmith64.png +0 -0
- package/static/assets/css/bootstrap-fhir.css +5302 -0
- package/static/assets/css/bootstrap-glyphicons.css +2 -0
- package/static/assets/css/bootstrap.css +4097 -0
- package/static/assets/css/jquery-ui.css +523 -0
- package/static/assets/css/jquery-ui.structure.css +863 -0
- package/static/assets/css/jquery-ui.structure.min.css +5 -0
- package/static/assets/css/jquery-ui.theme.css +439 -0
- package/static/assets/css/jquery-ui.theme.min.css +5 -0
- package/static/assets/css/jquery.ui.all.css +7 -0
- package/static/assets/css/modules.css +18 -0
- package/static/assets/css/project.css +367 -0
- package/static/assets/css/pygments-manni.css +66 -0
- package/static/assets/css/tags.css +74 -0
- package/static/assets/css/xml.css +2 -0
- package/static/assets/fonts/glyphiconshalflings-regular.eot +0 -0
- package/static/assets/fonts/glyphiconshalflings-regular.otf +0 -0
- package/static/assets/fonts/glyphiconshalflings-regular.svg +175 -0
- package/static/assets/fonts/glyphiconshalflings-regular.ttf +0 -0
- package/static/assets/fonts/glyphiconshalflings-regular.woff +0 -0
- package/static/assets/ico/apple-touch-icon-114-precomposed.png +0 -0
- package/static/assets/ico/apple-touch-icon-144-precomposed.png +0 -0
- package/static/assets/ico/apple-touch-icon-57-precomposed.png +0 -0
- package/static/assets/ico/apple-touch-icon-72-precomposed.png +0 -0
- package/static/assets/ico/favicon.ico +0 -0
- package/static/assets/ico/favicon.png +0 -0
- package/static/assets/images/fhir-logo-www.png +0 -0
- package/static/assets/images/fhir-logo.png +0 -0
- package/static/assets/images/hl7-logo.png +0 -0
- package/static/assets/images/logo_ansinew.jpg +0 -0
- package/static/assets/images/search.png +0 -0
- package/static/assets/images/stripe.png +0 -0
- package/static/assets/images/target.png +0 -0
- package/static/assets/images/tx-registry-root.gif +0 -0
- package/static/assets/images/tx-registry.png +0 -0
- package/static/assets/images/tx-server.png +0 -0
- package/static/assets/images/tx-version.png +0 -0
- package/static/assets/js/bootstrap.min.js +6 -0
- package/static/assets/js/fhir-gw.js +259 -0
- package/static/assets/js/fhir.js +2 -0
- package/static/assets/js/html5shiv.js +8 -0
- package/static/assets/js/jcookie.js +96 -0
- package/static/assets/js/jquery-ui.min.js +6 -0
- package/static/assets/js/jquery.js +10716 -0
- package/static/assets/js/jquery.min.js +2 -0
- package/static/assets/js/jquery.ui.core.js +314 -0
- package/static/assets/js/jquery.ui.draggable.js +825 -0
- package/static/assets/js/jquery.ui.mouse.js +162 -0
- package/static/assets/js/jquery.ui.resizable.js +842 -0
- package/static/assets/js/jquery.ui.widget.js +268 -0
- package/static/assets/js/json2.js +487 -0
- package/static/assets/js/jtip.js +97 -0
- package/static/assets/js/respond.min.js +6 -0
- package/static/assets/js/statuspage.js +70 -0
- package/static/assets/js/xml.js +2 -0
- package/static/dist/js/bootstrap.js +1964 -0
- package/static/favicon.png +0 -0
- package/static/fhir.css +626 -0
- package/static/icon-fhir-16.png +0 -0
- package/static/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- package/static/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- package/static/images/ui-bg_flat_10_000000_40x100.png +0 -0
- package/static/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- package/static/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- package/static/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- package/static/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- package/static/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- package/static/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- package/static/images/ui-icons_222222_256x240.png +0 -0
- package/static/images/ui-icons_228ef1_256x240.png +0 -0
- package/static/images/ui-icons_ef8c08_256x240.png +0 -0
- package/static/images/ui-icons_ffd27a_256x240.png +0 -0
- package/static/images/ui-icons_ffffff_256x240.png +0 -0
- package/static/js/jquery.effects.blind.js +49 -0
- package/static/js/jquery.effects.bounce.js +78 -0
- package/static/js/jquery.effects.clip.js +54 -0
- package/static/js/jquery.effects.core.js +763 -0
- package/static/js/jquery.effects.drop.js +50 -0
- package/static/js/jquery.effects.explode.js +79 -0
- package/static/js/jquery.effects.fade.js +32 -0
- package/static/js/jquery.effects.fold.js +56 -0
- package/static/js/jquery.effects.highlight.js +50 -0
- package/static/js/jquery.effects.pulsate.js +51 -0
- package/static/js/jquery.effects.scale.js +178 -0
- package/static/js/jquery.effects.shake.js +57 -0
- package/static/js/jquery.effects.slide.js +50 -0
- package/static/js/jquery.effects.transfer.js +45 -0
- package/static/js/jquery.ui.accordion.js +611 -0
- package/static/js/jquery.ui.autocomplete.js +612 -0
- package/static/js/jquery.ui.button.js +416 -0
- package/static/js/jquery.ui.datepicker.js +1823 -0
- package/static/js/jquery.ui.dialog.js +878 -0
- package/static/js/jquery.ui.droppable.js +296 -0
- package/static/js/jquery.ui.position.js +252 -0
- package/static/js/jquery.ui.progressbar.js +109 -0
- package/static/js/jquery.ui.selectable.js +266 -0
- package/static/js/jquery.ui.slider.js +666 -0
- package/static/js/jquery.ui.sortable.js +1077 -0
- package/static/js/jquery.ui.tabs.js +758 -0
- package/stats.js +80 -0
- package/test-cache/vsac/vsac-valuesets.db +0 -0
- package/token/nginx_passport_setup.md +383 -0
- package/token/security_guide.md +294 -0
- package/token/token-template.html +330 -0
- package/token/token.js +1300 -0
- package/translations/Messages.properties +1510 -0
- package/translations/Messages_ar.properties +1399 -0
- package/translations/Messages_de.properties +836 -0
- package/translations/Messages_es.properties +737 -0
- package/translations/Messages_fr.properties +1 -0
- package/translations/Messages_ja.properties +893 -0
- package/translations/Messages_nl.properties +1357 -0
- package/translations/Messages_pt.properties +1302 -0
- package/translations/Messages_ru.properties +1 -0
- package/translations/Messages_uz.properties +1 -0
- package/translations/Messages_zh.properties +1 -0
- package/translations/rendering-phrases.properties +1128 -0
- package/translations/rendering-phrases_ar.properties +1091 -0
- package/translations/rendering-phrases_de.properties +6 -0
- package/translations/rendering-phrases_es.properties +6 -0
- package/translations/rendering-phrases_fr.properties +624 -0
- package/translations/rendering-phrases_ja.properties +21 -0
- package/translations/rendering-phrases_nl.properties +970 -0
- package/translations/rendering-phrases_pt.properties +1020 -0
- package/translations/rendering-phrases_ru.properties +1094 -0
- package/translations/rendering-phrases_uz.properties +1 -0
- package/translations/rendering-phrases_zh.properties +1 -0
- package/tx/README.md +418 -0
- package/tx/cm/cm-api.js +110 -0
- package/tx/cm/cm-database.js +735 -0
- package/tx/cm/cm-package.js +325 -0
- package/tx/cs/cs-api.js +789 -0
- package/tx/cs/cs-areacode.js +615 -0
- package/tx/cs/cs-country.js +1110 -0
- package/tx/cs/cs-cpt.js +785 -0
- package/tx/cs/cs-cs.js +1579 -0
- package/tx/cs/cs-currency.js +539 -0
- package/tx/cs/cs-db.js +1321 -0
- package/tx/cs/cs-hgvs.js +329 -0
- package/tx/cs/cs-lang.js +465 -0
- package/tx/cs/cs-loinc.js +1485 -0
- package/tx/cs/cs-mimetypes.js +238 -0
- package/tx/cs/cs-ndc.js +704 -0
- package/tx/cs/cs-omop.js +1025 -0
- package/tx/cs/cs-provider-api.js +43 -0
- package/tx/cs/cs-provider-list.js +37 -0
- package/tx/cs/cs-rxnorm.js +808 -0
- package/tx/cs/cs-snomed.js +1102 -0
- package/tx/cs/cs-ucum.js +514 -0
- package/tx/cs/cs-unii.js +271 -0
- package/tx/cs/cs-uri.js +218 -0
- package/tx/cs/cs-usstates.js +305 -0
- package/tx/dev.fhir.org.yml +14 -0
- package/tx/fixtures/test-cases-setup.json +18 -0
- package/tx/fixtures/test-cases.yml +16 -0
- package/tx/html/codesystem-operations.liquid +25 -0
- package/tx/html/home-metrics.liquid +247 -0
- package/tx/html/operations-form.liquid +148 -0
- package/tx/html/search-form.liquid +62 -0
- package/tx/html/tx-template.html +133 -0
- package/tx/html/valueset-operations.liquid +54 -0
- package/tx/importers/atc-to-fhir.js +316 -0
- package/tx/importers/import-loinc.module.js +1536 -0
- package/tx/importers/import-ndc.module.js +1088 -0
- package/tx/importers/import-rxnorm.module.js +898 -0
- package/tx/importers/import-sct.module.js +2457 -0
- package/tx/importers/import-unii.module.js +601 -0
- package/tx/importers/readme.md +453 -0
- package/tx/importers/subset-loinc.module.js +1081 -0
- package/tx/importers/subset-rxnorm.module.js +938 -0
- package/tx/importers/tx-import-base.js +351 -0
- package/tx/importers/tx-import-settings.js +310 -0
- package/tx/importers/tx-import.js +357 -0
- package/tx/library/canonical-resource.js +88 -0
- package/tx/library/capabilitystatement.js +292 -0
- package/tx/library/codesystem.js +774 -0
- package/tx/library/conceptmap.js +568 -0
- package/tx/library/designations.js +932 -0
- package/tx/library/errors.js +77 -0
- package/tx/library/extensions.js +117 -0
- package/tx/library/namingsystem.js +322 -0
- package/tx/library/operation-outcome.js +127 -0
- package/tx/library/parameters.js +105 -0
- package/tx/library/renderer.js +1559 -0
- package/tx/library/terminologycapabilities.js +418 -0
- package/tx/library/ucum-parsers.js +1029 -0
- package/tx/library/ucum-service.js +370 -0
- package/tx/library/ucum-types.js +1099 -0
- package/tx/library/valueset.js +543 -0
- package/tx/library.js +676 -0
- package/tx/ocl/cm-ocl.js +106 -0
- package/tx/ocl/cs-ocl.js +39 -0
- package/tx/ocl/vs-ocl.js +105 -0
- package/tx/operation-context.js +568 -0
- package/tx/params.js +613 -0
- package/tx/provider.js +403 -0
- package/tx/sct/ecl.js +1560 -0
- package/tx/sct/expressions.js +2077 -0
- package/tx/sct/structures.js +1396 -0
- package/tx/tx-html.js +1063 -0
- package/tx/tx.fhir.org.yml +39 -0
- package/tx/tx.js +927 -0
- package/tx/vs/vs-api.js +112 -0
- package/tx/vs/vs-database.js +786 -0
- package/tx/vs/vs-package.js +358 -0
- package/tx/vs/vs-vsac.js +366 -0
- package/tx/workers/batch-validate.js +129 -0
- package/tx/workers/batch.js +361 -0
- package/tx/workers/closure.js +32 -0
- package/tx/workers/expand.js +1845 -0
- package/tx/workers/lookup.js +407 -0
- package/tx/workers/metadata.js +467 -0
- package/tx/workers/operations.js +34 -0
- package/tx/workers/read.js +164 -0
- package/tx/workers/search.js +384 -0
- package/tx/workers/subsumes.js +334 -0
- package/tx/workers/translate.js +492 -0
- package/tx/workers/validate.js +2504 -0
- package/tx/workers/worker.js +904 -0
- package/tx/xml/capabilitystatement-xml.js +63 -0
- package/tx/xml/codesystem-xml.js +62 -0
- package/tx/xml/conceptmap-xml.js +65 -0
- package/tx/xml/namingsystem-xml.js +65 -0
- package/tx/xml/operationoutcome-xml.js +127 -0
- package/tx/xml/parameters-xml.js +312 -0
- package/tx/xml/terminologycapabilities-xml.js +64 -0
- package/tx/xml/valueset-xml.js +64 -0
- package/tx/xml/xml-base.js +603 -0
- package/vcl/vcl-parser.js +1098 -0
- package/vcl/vcl.js +253 -0
- package/windows-install.js +19 -0
- package/xig/xig-template.html +124 -0
- package/xig/xig.js +3049 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
const {CanonicalResource} = require("./canonical-resource");
|
|
2
|
+
const {VersionUtilities} = require("../../library/version-utilities");
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Represents a FHIR CapabilityStatement resource with version conversion support
|
|
6
|
+
* @class
|
|
7
|
+
*/
|
|
8
|
+
class CapabilityStatement extends CanonicalResource {
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Creates a new CapabilityStatement instance
|
|
12
|
+
* @param {Object} jsonObj - The JSON object containing CapabilityStatement data
|
|
13
|
+
* @param {string} [fhirVersion='R5'] - FHIR version ('R3', 'R4', or 'R5')
|
|
14
|
+
*/
|
|
15
|
+
constructor(jsonObj, fhirVersion = 'R5') {
|
|
16
|
+
super(jsonObj, fhirVersion);
|
|
17
|
+
// Convert to R5 format internally (modifies input for performance)
|
|
18
|
+
this.jsonObj = this._convertToR5(jsonObj, fhirVersion);
|
|
19
|
+
this.validate();
|
|
20
|
+
this.id = this.jsonObj.id;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Static factory method for convenience
|
|
25
|
+
* @param {string} jsonString - JSON string representation of CapabilityStatement
|
|
26
|
+
* @param {string} [version='R5'] - FHIR version ('R3', 'R4', or 'R5')
|
|
27
|
+
* @returns {CapabilityStatement} New CapabilityStatement instance
|
|
28
|
+
*/
|
|
29
|
+
static fromJSON(jsonString, version = 'R5') {
|
|
30
|
+
return new CapabilityStatement(JSON.parse(jsonString), version);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Returns JSON string representation
|
|
35
|
+
* @param {string} [version='R5'] - Target FHIR version ('R3', 'R4', or 'R5')
|
|
36
|
+
* @returns {string} JSON string
|
|
37
|
+
*/
|
|
38
|
+
toJSONString(version = 'R5') {
|
|
39
|
+
const outputObj = this._convertFromR5(this.jsonObj, version);
|
|
40
|
+
return JSON.stringify(outputObj);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Returns JSON object in target version format
|
|
45
|
+
* @param {string} [version='R5'] - Target FHIR version ('R3', 'R4', or 'R5')
|
|
46
|
+
* @returns {Object} JSON object
|
|
47
|
+
*/
|
|
48
|
+
toJSON(version = 'R5') {
|
|
49
|
+
return this._convertFromR5(this.jsonObj, version);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Converts input CapabilityStatement to R5 format (modifies input object for performance)
|
|
54
|
+
* @param {Object} jsonObj - The input CapabilityStatement object
|
|
55
|
+
* @param {string} version - Source FHIR version
|
|
56
|
+
* @returns {Object} The same object, potentially modified to R5 format
|
|
57
|
+
* @private
|
|
58
|
+
*/
|
|
59
|
+
_convertToR5(jsonObj, version) {
|
|
60
|
+
if (version === 'R5') {
|
|
61
|
+
return jsonObj; // Already R5, no conversion needed
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (version === 'R3') {
|
|
65
|
+
// R3: resourceType was "CapabilityStatement" (same as R4/R5)
|
|
66
|
+
// Convert identifier from single object to array if present
|
|
67
|
+
if (jsonObj.identifier && !Array.isArray(jsonObj.identifier)) {
|
|
68
|
+
jsonObj.identifier = [jsonObj.identifier];
|
|
69
|
+
}
|
|
70
|
+
return jsonObj;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (version === 'R4') {
|
|
74
|
+
// R4 to R5: No major structural changes needed
|
|
75
|
+
return jsonObj;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
throw new Error(`Unsupported FHIR version: ${version}`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Converts R5 CapabilityStatement to target version format (clones object first)
|
|
83
|
+
* @param {Object} r5Obj - The R5 format CapabilityStatement object
|
|
84
|
+
* @param {string} targetVersion - Target FHIR version
|
|
85
|
+
* @returns {Object} New object in target version format
|
|
86
|
+
* @private
|
|
87
|
+
*/
|
|
88
|
+
_convertFromR5(r5Obj, targetVersion) {
|
|
89
|
+
if (VersionUtilities.isR5Ver(targetVersion)) {
|
|
90
|
+
return r5Obj; // No conversion needed
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Clone the object to avoid modifying the original
|
|
94
|
+
const cloned = JSON.parse(JSON.stringify(r5Obj));
|
|
95
|
+
|
|
96
|
+
if (VersionUtilities.isR4Ver(targetVersion)) {
|
|
97
|
+
return this._convertR5ToR4(cloned);
|
|
98
|
+
} else if (VersionUtilities.isR3Ver(targetVersion)) {
|
|
99
|
+
return this._convertR5ToR3(cloned);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
throw new Error(`Unsupported target FHIR version: ${targetVersion}`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Converts R5 CapabilityStatement to R4 format
|
|
107
|
+
* @param {Object} r5Obj - Cloned R5 CapabilityStatement object
|
|
108
|
+
* @returns {Object} R4 format CapabilityStatement
|
|
109
|
+
* @private
|
|
110
|
+
*/
|
|
111
|
+
_convertR5ToR4(r5Obj) {
|
|
112
|
+
// Remove R5-specific elements
|
|
113
|
+
if (r5Obj.versionAlgorithmString) {
|
|
114
|
+
delete r5Obj.versionAlgorithmString;
|
|
115
|
+
}
|
|
116
|
+
if (r5Obj.versionAlgorithmCoding) {
|
|
117
|
+
delete r5Obj.versionAlgorithmCoding;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return r5Obj;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Converts R5 CapabilityStatement to R3 format
|
|
125
|
+
* @param {Object} r5Obj - Cloned R5 CapabilityStatement object
|
|
126
|
+
* @returns {Object} R3 format CapabilityStatement
|
|
127
|
+
* @private
|
|
128
|
+
*/
|
|
129
|
+
_convertR5ToR3(r5Obj) {
|
|
130
|
+
// First apply R4 conversions
|
|
131
|
+
const r4Obj = this._convertR5ToR4(r5Obj);
|
|
132
|
+
|
|
133
|
+
// Convert identifier array back to single object
|
|
134
|
+
if (r4Obj.identifier && Array.isArray(r4Obj.identifier)) {
|
|
135
|
+
if (r4Obj.identifier.length > 0) {
|
|
136
|
+
r4Obj.identifier = r4Obj.identifier[0];
|
|
137
|
+
} else {
|
|
138
|
+
delete r4Obj.identifier;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Convert valueCanonical to valueUri throughout the object
|
|
143
|
+
this._convertCanonicalToUri(r5Obj);
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
// Convert rest.operation.definition from canonical string to Reference object
|
|
147
|
+
for (const rest of r4Obj.rest || []) {
|
|
148
|
+
for (const operation of rest.operation || []) {
|
|
149
|
+
if (typeof operation.definition === 'string') {
|
|
150
|
+
operation.definition = {reference: operation.definition};
|
|
151
|
+
}
|
|
152
|
+
for (const resource of rest.resource || []) {
|
|
153
|
+
delete resource.operation;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return r4Obj;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Recursively converts valueCanonical to valueUri in an object
|
|
163
|
+
* R3 doesn't have canonical type, so valueCanonical must become valueUri
|
|
164
|
+
* @param {Object} obj - Object to convert
|
|
165
|
+
* @private
|
|
166
|
+
*/
|
|
167
|
+
_convertCanonicalToUri(obj) {
|
|
168
|
+
if (!obj || typeof obj !== 'object') {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (Array.isArray(obj)) {
|
|
173
|
+
obj.forEach(item => this._convertCanonicalToUri(item));
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Convert valueCanonical to valueUri
|
|
178
|
+
if (obj.valueCanonical !== undefined) {
|
|
179
|
+
obj.valueUri = obj.valueCanonical;
|
|
180
|
+
delete obj.valueCanonical;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Recurse into all properties
|
|
184
|
+
for (const key of Object.keys(obj)) {
|
|
185
|
+
if (typeof obj[key] === 'object') {
|
|
186
|
+
this._convertCanonicalToUri(obj[key]);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Validates that this is a proper CapabilityStatement resource
|
|
193
|
+
* @throws {Error} If validation fails
|
|
194
|
+
*/
|
|
195
|
+
validate() {
|
|
196
|
+
if (!this.jsonObj || typeof this.jsonObj !== 'object') {
|
|
197
|
+
throw new Error('Invalid CapabilityStatement: expected object');
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (this.jsonObj.resourceType !== 'CapabilityStatement') {
|
|
201
|
+
throw new Error(`Invalid CapabilityStatement: resourceType must be "CapabilityStatement", got "${this.jsonObj.resourceType}"`);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (!this.jsonObj.status || typeof this.jsonObj.status !== 'string') {
|
|
205
|
+
throw new Error('Invalid CapabilityStatement: status is required and must be a string');
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const validStatuses = ['draft', 'active', 'retired', 'unknown'];
|
|
209
|
+
if (!validStatuses.includes(this.jsonObj.status)) {
|
|
210
|
+
throw new Error(`Invalid CapabilityStatement: status must be one of ${validStatuses.join(', ')}, got "${this.jsonObj.status}"`);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (!this.jsonObj.kind || typeof this.jsonObj.kind !== 'string') {
|
|
214
|
+
throw new Error('Invalid CapabilityStatement: kind is required and must be a string');
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const validKinds = ['instance', 'capability', 'requirements'];
|
|
218
|
+
if (!validKinds.includes(this.jsonObj.kind)) {
|
|
219
|
+
throw new Error(`Invalid CapabilityStatement: kind must be one of ${validKinds.join(', ')}, got "${this.jsonObj.kind}"`);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (!this.jsonObj.fhirVersion || typeof this.jsonObj.fhirVersion !== 'string') {
|
|
223
|
+
throw new Error('Invalid CapabilityStatement: fhirVersion is required and must be a string');
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (!this.jsonObj.format || !Array.isArray(this.jsonObj.format)) {
|
|
227
|
+
throw new Error('Invalid CapabilityStatement: format is required and must be an array');
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Gets the software information
|
|
233
|
+
* @returns {Object|undefined} Software information object
|
|
234
|
+
*/
|
|
235
|
+
getSoftware() {
|
|
236
|
+
return this.jsonObj.software;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Gets the implementation information
|
|
241
|
+
* @returns {Object|undefined} Implementation information object
|
|
242
|
+
*/
|
|
243
|
+
getImplementation() {
|
|
244
|
+
return this.jsonObj.implementation;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Gets the rest capabilities
|
|
249
|
+
* @returns {Object[]} Array of rest capability objects
|
|
250
|
+
*/
|
|
251
|
+
getRest() {
|
|
252
|
+
return this.jsonObj.rest || [];
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Gets supported formats
|
|
257
|
+
* @returns {string[]} Array of supported mime types
|
|
258
|
+
*/
|
|
259
|
+
getFormats() {
|
|
260
|
+
return this.jsonObj.format || [];
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Gets the FHIR version this capability statement describes
|
|
265
|
+
* @returns {string} FHIR version string
|
|
266
|
+
*/
|
|
267
|
+
getDescribedFhirVersion() {
|
|
268
|
+
return this.jsonObj.fhirVersion;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Gets basic info about this capability statement
|
|
273
|
+
* @returns {Object} Basic information object
|
|
274
|
+
*/
|
|
275
|
+
getInfo() {
|
|
276
|
+
return {
|
|
277
|
+
resourceType: this.jsonObj.resourceType,
|
|
278
|
+
url: this.jsonObj.url,
|
|
279
|
+
version: this.jsonObj.version,
|
|
280
|
+
name: this.jsonObj.name,
|
|
281
|
+
title: this.jsonObj.title,
|
|
282
|
+
status: this.jsonObj.status,
|
|
283
|
+
kind: this.jsonObj.kind,
|
|
284
|
+
fhirVersion: this.jsonObj.fhirVersion,
|
|
285
|
+
formats: this.getFormats(),
|
|
286
|
+
software: this.getSoftware()?.name,
|
|
287
|
+
restModes: this.getRest().map(r => r.mode)
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
module.exports = { CapabilityStatement };
|