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.
Files changed (277) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/FHIRsmith.png +0 -0
  3. package/README.md +277 -0
  4. package/config-template.json +144 -0
  5. package/library/folder-setup.js +58 -0
  6. package/library/html-server.js +166 -0
  7. package/library/html.js +835 -0
  8. package/library/i18nsupport.js +259 -0
  9. package/library/languages.js +779 -0
  10. package/library/logger-telnet.js +205 -0
  11. package/library/logger.js +279 -0
  12. package/library/package-manager.js +876 -0
  13. package/library/utilities.js +196 -0
  14. package/library/version-utilities.js +1056 -0
  15. package/npmprojector/config-example.json +13 -0
  16. package/npmprojector/indexer.js +394 -0
  17. package/npmprojector/npmprojector.js +395 -0
  18. package/npmprojector/readme.md +174 -0
  19. package/npmprojector/watcher.js +335 -0
  20. package/package.json +119 -0
  21. package/packages/package-crawler.js +846 -0
  22. package/packages/packages-template.html +126 -0
  23. package/packages/packages.js +2838 -0
  24. package/passwords.ini +2 -0
  25. package/publisher/publisher-template.html +208 -0
  26. package/publisher/publisher.js +2167 -0
  27. package/publisher/task-draft.js +458 -0
  28. package/registry/api.js +735 -0
  29. package/registry/crawler.js +637 -0
  30. package/registry/model.js +513 -0
  31. package/registry/readme.md +243 -0
  32. package/registry/registry-data.json +121015 -0
  33. package/registry/registry-template.html +126 -0
  34. package/registry/registry.js +1395 -0
  35. package/registry/test-runner.js +237 -0
  36. package/root-template.html +124 -0
  37. package/server.js +524 -0
  38. package/shl/private-key.pem +5 -0
  39. package/shl/public-key.pem +18 -0
  40. package/shl/shl.js +1125 -0
  41. package/shl/vhl.js +69 -0
  42. package/static/FHIRsmith128.png +0 -0
  43. package/static/FHIRsmith16.png +0 -0
  44. package/static/FHIRsmith32.png +0 -0
  45. package/static/FHIRsmith64.png +0 -0
  46. package/static/assets/css/bootstrap-fhir.css +5302 -0
  47. package/static/assets/css/bootstrap-glyphicons.css +2 -0
  48. package/static/assets/css/bootstrap.css +4097 -0
  49. package/static/assets/css/jquery-ui.css +523 -0
  50. package/static/assets/css/jquery-ui.structure.css +863 -0
  51. package/static/assets/css/jquery-ui.structure.min.css +5 -0
  52. package/static/assets/css/jquery-ui.theme.css +439 -0
  53. package/static/assets/css/jquery-ui.theme.min.css +5 -0
  54. package/static/assets/css/jquery.ui.all.css +7 -0
  55. package/static/assets/css/modules.css +18 -0
  56. package/static/assets/css/project.css +367 -0
  57. package/static/assets/css/pygments-manni.css +66 -0
  58. package/static/assets/css/tags.css +74 -0
  59. package/static/assets/css/xml.css +2 -0
  60. package/static/assets/fonts/glyphiconshalflings-regular.eot +0 -0
  61. package/static/assets/fonts/glyphiconshalflings-regular.otf +0 -0
  62. package/static/assets/fonts/glyphiconshalflings-regular.svg +175 -0
  63. package/static/assets/fonts/glyphiconshalflings-regular.ttf +0 -0
  64. package/static/assets/fonts/glyphiconshalflings-regular.woff +0 -0
  65. package/static/assets/ico/apple-touch-icon-114-precomposed.png +0 -0
  66. package/static/assets/ico/apple-touch-icon-144-precomposed.png +0 -0
  67. package/static/assets/ico/apple-touch-icon-57-precomposed.png +0 -0
  68. package/static/assets/ico/apple-touch-icon-72-precomposed.png +0 -0
  69. package/static/assets/ico/favicon.ico +0 -0
  70. package/static/assets/ico/favicon.png +0 -0
  71. package/static/assets/images/fhir-logo-www.png +0 -0
  72. package/static/assets/images/fhir-logo.png +0 -0
  73. package/static/assets/images/hl7-logo.png +0 -0
  74. package/static/assets/images/logo_ansinew.jpg +0 -0
  75. package/static/assets/images/search.png +0 -0
  76. package/static/assets/images/stripe.png +0 -0
  77. package/static/assets/images/target.png +0 -0
  78. package/static/assets/images/tx-registry-root.gif +0 -0
  79. package/static/assets/images/tx-registry.png +0 -0
  80. package/static/assets/images/tx-server.png +0 -0
  81. package/static/assets/images/tx-version.png +0 -0
  82. package/static/assets/js/bootstrap.min.js +6 -0
  83. package/static/assets/js/fhir-gw.js +259 -0
  84. package/static/assets/js/fhir.js +2 -0
  85. package/static/assets/js/html5shiv.js +8 -0
  86. package/static/assets/js/jcookie.js +96 -0
  87. package/static/assets/js/jquery-ui.min.js +6 -0
  88. package/static/assets/js/jquery.js +10716 -0
  89. package/static/assets/js/jquery.min.js +2 -0
  90. package/static/assets/js/jquery.ui.core.js +314 -0
  91. package/static/assets/js/jquery.ui.draggable.js +825 -0
  92. package/static/assets/js/jquery.ui.mouse.js +162 -0
  93. package/static/assets/js/jquery.ui.resizable.js +842 -0
  94. package/static/assets/js/jquery.ui.widget.js +268 -0
  95. package/static/assets/js/json2.js +487 -0
  96. package/static/assets/js/jtip.js +97 -0
  97. package/static/assets/js/respond.min.js +6 -0
  98. package/static/assets/js/statuspage.js +70 -0
  99. package/static/assets/js/xml.js +2 -0
  100. package/static/dist/js/bootstrap.js +1964 -0
  101. package/static/favicon.png +0 -0
  102. package/static/fhir.css +626 -0
  103. package/static/icon-fhir-16.png +0 -0
  104. package/static/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  105. package/static/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  106. package/static/images/ui-bg_flat_10_000000_40x100.png +0 -0
  107. package/static/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  108. package/static/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  109. package/static/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  110. package/static/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  111. package/static/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  112. package/static/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  113. package/static/images/ui-icons_222222_256x240.png +0 -0
  114. package/static/images/ui-icons_228ef1_256x240.png +0 -0
  115. package/static/images/ui-icons_ef8c08_256x240.png +0 -0
  116. package/static/images/ui-icons_ffd27a_256x240.png +0 -0
  117. package/static/images/ui-icons_ffffff_256x240.png +0 -0
  118. package/static/js/jquery.effects.blind.js +49 -0
  119. package/static/js/jquery.effects.bounce.js +78 -0
  120. package/static/js/jquery.effects.clip.js +54 -0
  121. package/static/js/jquery.effects.core.js +763 -0
  122. package/static/js/jquery.effects.drop.js +50 -0
  123. package/static/js/jquery.effects.explode.js +79 -0
  124. package/static/js/jquery.effects.fade.js +32 -0
  125. package/static/js/jquery.effects.fold.js +56 -0
  126. package/static/js/jquery.effects.highlight.js +50 -0
  127. package/static/js/jquery.effects.pulsate.js +51 -0
  128. package/static/js/jquery.effects.scale.js +178 -0
  129. package/static/js/jquery.effects.shake.js +57 -0
  130. package/static/js/jquery.effects.slide.js +50 -0
  131. package/static/js/jquery.effects.transfer.js +45 -0
  132. package/static/js/jquery.ui.accordion.js +611 -0
  133. package/static/js/jquery.ui.autocomplete.js +612 -0
  134. package/static/js/jquery.ui.button.js +416 -0
  135. package/static/js/jquery.ui.datepicker.js +1823 -0
  136. package/static/js/jquery.ui.dialog.js +878 -0
  137. package/static/js/jquery.ui.droppable.js +296 -0
  138. package/static/js/jquery.ui.position.js +252 -0
  139. package/static/js/jquery.ui.progressbar.js +109 -0
  140. package/static/js/jquery.ui.selectable.js +266 -0
  141. package/static/js/jquery.ui.slider.js +666 -0
  142. package/static/js/jquery.ui.sortable.js +1077 -0
  143. package/static/js/jquery.ui.tabs.js +758 -0
  144. package/stats.js +80 -0
  145. package/test-cache/vsac/vsac-valuesets.db +0 -0
  146. package/token/nginx_passport_setup.md +383 -0
  147. package/token/security_guide.md +294 -0
  148. package/token/token-template.html +330 -0
  149. package/token/token.js +1300 -0
  150. package/translations/Messages.properties +1510 -0
  151. package/translations/Messages_ar.properties +1399 -0
  152. package/translations/Messages_de.properties +836 -0
  153. package/translations/Messages_es.properties +737 -0
  154. package/translations/Messages_fr.properties +1 -0
  155. package/translations/Messages_ja.properties +893 -0
  156. package/translations/Messages_nl.properties +1357 -0
  157. package/translations/Messages_pt.properties +1302 -0
  158. package/translations/Messages_ru.properties +1 -0
  159. package/translations/Messages_uz.properties +1 -0
  160. package/translations/Messages_zh.properties +1 -0
  161. package/translations/rendering-phrases.properties +1128 -0
  162. package/translations/rendering-phrases_ar.properties +1091 -0
  163. package/translations/rendering-phrases_de.properties +6 -0
  164. package/translations/rendering-phrases_es.properties +6 -0
  165. package/translations/rendering-phrases_fr.properties +624 -0
  166. package/translations/rendering-phrases_ja.properties +21 -0
  167. package/translations/rendering-phrases_nl.properties +970 -0
  168. package/translations/rendering-phrases_pt.properties +1020 -0
  169. package/translations/rendering-phrases_ru.properties +1094 -0
  170. package/translations/rendering-phrases_uz.properties +1 -0
  171. package/translations/rendering-phrases_zh.properties +1 -0
  172. package/tx/README.md +418 -0
  173. package/tx/cm/cm-api.js +110 -0
  174. package/tx/cm/cm-database.js +735 -0
  175. package/tx/cm/cm-package.js +325 -0
  176. package/tx/cs/cs-api.js +789 -0
  177. package/tx/cs/cs-areacode.js +615 -0
  178. package/tx/cs/cs-country.js +1110 -0
  179. package/tx/cs/cs-cpt.js +785 -0
  180. package/tx/cs/cs-cs.js +1579 -0
  181. package/tx/cs/cs-currency.js +539 -0
  182. package/tx/cs/cs-db.js +1321 -0
  183. package/tx/cs/cs-hgvs.js +329 -0
  184. package/tx/cs/cs-lang.js +465 -0
  185. package/tx/cs/cs-loinc.js +1485 -0
  186. package/tx/cs/cs-mimetypes.js +238 -0
  187. package/tx/cs/cs-ndc.js +704 -0
  188. package/tx/cs/cs-omop.js +1025 -0
  189. package/tx/cs/cs-provider-api.js +43 -0
  190. package/tx/cs/cs-provider-list.js +37 -0
  191. package/tx/cs/cs-rxnorm.js +808 -0
  192. package/tx/cs/cs-snomed.js +1102 -0
  193. package/tx/cs/cs-ucum.js +514 -0
  194. package/tx/cs/cs-unii.js +271 -0
  195. package/tx/cs/cs-uri.js +218 -0
  196. package/tx/cs/cs-usstates.js +305 -0
  197. package/tx/dev.fhir.org.yml +14 -0
  198. package/tx/fixtures/test-cases-setup.json +18 -0
  199. package/tx/fixtures/test-cases.yml +16 -0
  200. package/tx/html/codesystem-operations.liquid +25 -0
  201. package/tx/html/home-metrics.liquid +247 -0
  202. package/tx/html/operations-form.liquid +148 -0
  203. package/tx/html/search-form.liquid +62 -0
  204. package/tx/html/tx-template.html +133 -0
  205. package/tx/html/valueset-operations.liquid +54 -0
  206. package/tx/importers/atc-to-fhir.js +316 -0
  207. package/tx/importers/import-loinc.module.js +1536 -0
  208. package/tx/importers/import-ndc.module.js +1088 -0
  209. package/tx/importers/import-rxnorm.module.js +898 -0
  210. package/tx/importers/import-sct.module.js +2457 -0
  211. package/tx/importers/import-unii.module.js +601 -0
  212. package/tx/importers/readme.md +453 -0
  213. package/tx/importers/subset-loinc.module.js +1081 -0
  214. package/tx/importers/subset-rxnorm.module.js +938 -0
  215. package/tx/importers/tx-import-base.js +351 -0
  216. package/tx/importers/tx-import-settings.js +310 -0
  217. package/tx/importers/tx-import.js +357 -0
  218. package/tx/library/canonical-resource.js +88 -0
  219. package/tx/library/capabilitystatement.js +292 -0
  220. package/tx/library/codesystem.js +774 -0
  221. package/tx/library/conceptmap.js +568 -0
  222. package/tx/library/designations.js +932 -0
  223. package/tx/library/errors.js +77 -0
  224. package/tx/library/extensions.js +117 -0
  225. package/tx/library/namingsystem.js +322 -0
  226. package/tx/library/operation-outcome.js +127 -0
  227. package/tx/library/parameters.js +105 -0
  228. package/tx/library/renderer.js +1559 -0
  229. package/tx/library/terminologycapabilities.js +418 -0
  230. package/tx/library/ucum-parsers.js +1029 -0
  231. package/tx/library/ucum-service.js +370 -0
  232. package/tx/library/ucum-types.js +1099 -0
  233. package/tx/library/valueset.js +543 -0
  234. package/tx/library.js +676 -0
  235. package/tx/ocl/cm-ocl.js +106 -0
  236. package/tx/ocl/cs-ocl.js +39 -0
  237. package/tx/ocl/vs-ocl.js +105 -0
  238. package/tx/operation-context.js +568 -0
  239. package/tx/params.js +613 -0
  240. package/tx/provider.js +403 -0
  241. package/tx/sct/ecl.js +1560 -0
  242. package/tx/sct/expressions.js +2077 -0
  243. package/tx/sct/structures.js +1396 -0
  244. package/tx/tx-html.js +1063 -0
  245. package/tx/tx.fhir.org.yml +39 -0
  246. package/tx/tx.js +927 -0
  247. package/tx/vs/vs-api.js +112 -0
  248. package/tx/vs/vs-database.js +786 -0
  249. package/tx/vs/vs-package.js +358 -0
  250. package/tx/vs/vs-vsac.js +366 -0
  251. package/tx/workers/batch-validate.js +129 -0
  252. package/tx/workers/batch.js +361 -0
  253. package/tx/workers/closure.js +32 -0
  254. package/tx/workers/expand.js +1845 -0
  255. package/tx/workers/lookup.js +407 -0
  256. package/tx/workers/metadata.js +467 -0
  257. package/tx/workers/operations.js +34 -0
  258. package/tx/workers/read.js +164 -0
  259. package/tx/workers/search.js +384 -0
  260. package/tx/workers/subsumes.js +334 -0
  261. package/tx/workers/translate.js +492 -0
  262. package/tx/workers/validate.js +2504 -0
  263. package/tx/workers/worker.js +904 -0
  264. package/tx/xml/capabilitystatement-xml.js +63 -0
  265. package/tx/xml/codesystem-xml.js +62 -0
  266. package/tx/xml/conceptmap-xml.js +65 -0
  267. package/tx/xml/namingsystem-xml.js +65 -0
  268. package/tx/xml/operationoutcome-xml.js +127 -0
  269. package/tx/xml/parameters-xml.js +312 -0
  270. package/tx/xml/terminologycapabilities-xml.js +64 -0
  271. package/tx/xml/valueset-xml.js +64 -0
  272. package/tx/xml/xml-base.js +603 -0
  273. package/vcl/vcl-parser.js +1098 -0
  274. package/vcl/vcl.js +253 -0
  275. package/windows-install.js +19 -0
  276. package/xig/xig-template.html +124 -0
  277. 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 };