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
package/tx/provider.js ADDED
@@ -0,0 +1,403 @@
1
+ const { CodeSystem } = require("./library/codesystem");
2
+ const {VersionUtilities} = require("../library/version-utilities");
3
+ const { FhirCodeSystemProvider} = require("./cs/cs-cs");
4
+ const {OperationContext, TerminologyError} = require("./operation-context");
5
+ const {validateParameter, validateOptionalParameter, validateArrayParameter} = require("../library/utilities");
6
+ const path = require("path");
7
+ const {PackageContentLoader} = require("../library/package-manager");
8
+ const {PackageValueSetProvider} = require("./vs/vs-package");
9
+ const ValueSet = require("./library/valueset");
10
+ const {PackageConceptMapProvider} = require("./cm/cm-package");
11
+
12
+ /**
13
+ * This class holds what information is in context
14
+ *
15
+ * It is prepared for each operation, and carries 4 sets of information:
16
+ *
17
+ * - The special code system classes supported natively by the system
18
+ * - A list of all the code system resources in scope
19
+ * - a list of value set providers that can provide value set instances
20
+ * - a list of concept map providers that can provide concept map instances
21
+ *
22
+ */
23
+ class Provider {
24
+ i18n;
25
+ fhirVersion;
26
+
27
+ /**
28
+ * {Map<String, CodeSystemFactoryProvider>} A list of code system factories that contains all the preloaded native code systems
29
+ */
30
+ codeSystemFactories;
31
+
32
+ /**
33
+ * {Map<String, CodeSystem>} A list of preloaded FHIR code systems
34
+ */
35
+ codeSystems;
36
+
37
+ /**
38
+ * {List<AbstractValueSetProvider>} A list of value set providers that know how to provide value sets by request
39
+ */
40
+ valueSetProviders;
41
+ /**
42
+ * {List<AbstractConceptMapProvider>} A list of value set providers that know how to provide value sets by request
43
+ */
44
+ conceptMapProviders;
45
+
46
+ contentSources;
47
+
48
+ baseUrl = null;
49
+ path;
50
+ cacheFolder = null;
51
+ startTime = Date.now();
52
+ startMemory = process.memoryUsage();
53
+ lastTime = null;
54
+ requestCount = 0;
55
+ totalDownloaded = 0;
56
+
57
+ /**
58
+ * get a code system provider for a known code system
59
+ *
60
+ * @param {OperationContext} opContext - The code system resource
61
+ * @param {String} system - The URL - might include a |version
62
+ * @param {String} version - The version, if seperate from the system
63
+ * @param {String[]} supplements - Applicable supplements
64
+ * @returns {CodeSystemProvider} Provider instance
65
+ */
66
+ async getCodeSystemProvider(opContext, system, version, supplements) {
67
+ validateParameter(opContext, "opContext", OperationContext);
68
+ validateParameter(system, "system", String);
69
+ validateArrayParameter(supplements, "supplements", CodeSystem);
70
+ validateOptionalParameter(version, "version", String);
71
+
72
+ if (system.includes("|")) {
73
+ const url = system.substring(0, system.indexOf("|"));
74
+ const v = system.substring(system.indexOf("|")+1);
75
+ if (version == null || v === version) {
76
+ version = v;
77
+ } else {
78
+ throw new TerminologyError(`Version inconsistent in ${system}: ${v} vs ${version}`);
79
+ }
80
+ system = url;
81
+ } else if (!version) {
82
+ version = null;
83
+ }
84
+ const vurl = system+(version ? "|"+version : "");
85
+ const vurlMM = VersionUtilities.isSemVer(version) ? system+"|"+VersionUtilities.getMajMin(version) : null;
86
+ let factory = this.codeSystemFactories.get(vurl);
87
+ if (factory == null && vurlMM) {
88
+ factory = this.codeSystemFactories.get(vurlMM);
89
+ }
90
+ if (factory != null) {
91
+ return factory.build(opContext, supplements);
92
+ }
93
+ let cs = this.codeSystems.get(vurl);
94
+ if (cs == null && vurlMM) {
95
+ cs = this.codeSystems.get(vurlMM);
96
+ }
97
+ if (cs != null) {
98
+ return this.createCodeSystemProvider(opContext, cs, supplements);
99
+ }
100
+ return null;
101
+ }
102
+
103
+ /**
104
+ * Create a code system provider from a CodeSystem resource
105
+ * @param {OperationContext} opContext - The code system resource
106
+ * @param {CodeSystem} codeSystem - The code system resource
107
+ * @param {CodeSystem[]} supplements - The code system resource
108
+ * @returns {CodeSystemProvider} Provider instance
109
+ */
110
+ async createCodeSystemProvider(opContext, codeSystem, supplements) {
111
+ validateParameter(opContext, "opContext", OperationContext);
112
+ validateParameter(codeSystem, "codeSystem", CodeSystem);
113
+ validateArrayParameter(supplements, "supplements", CodeSystem);
114
+ return new FhirCodeSystemProvider(opContext, codeSystem, supplements);
115
+ }
116
+
117
+
118
+ async loadNpm(packageManager, cacheFolder, details, isDefault, mode) {
119
+ // Parse packageId and version from details (e.g., "hl7.terminology.r4#6.0.2")
120
+ let packageId = details;
121
+ let version = null;
122
+ if (details.includes('#')) {
123
+ const parts = details.split('#');
124
+ packageId = parts[0];
125
+ version = parts[1];
126
+ }
127
+ const packagePath = await packageManager.fetch(packageId, version);
128
+ if (mode === "fetch" || mode === "cs") {
129
+ return;
130
+ }
131
+ const fullPackagePath = path.join(cacheFolder, packagePath);
132
+ const contentLoader = new PackageContentLoader(fullPackagePath);
133
+ await contentLoader.initialize();
134
+
135
+ const resources = await contentLoader.getResourcesByType("CodeSystem");
136
+ for (const resource of resources) {
137
+ const cs = new CodeSystem(await contentLoader.loadFile(resource, contentLoader.fhirVersion()));
138
+ this.codeSystems.set(cs.url, cs);
139
+ this.codeSystems.set(cs.vurl, cs);
140
+ }
141
+ const vs = new PackageValueSetProvider(contentLoader);
142
+ await vs.initialize();
143
+ this.valueSetProviders.push(vs);
144
+ const cm = new PackageConceptMapProvider(contentLoader);
145
+ await cm.initialize();
146
+ this.conceptMapProviders.push(cm);
147
+ }
148
+
149
+ getCodeSystemById(opContext, id) {
150
+ // Search through codeSystems map for matching id
151
+ for (const cs of this.codeSystems.values()) {
152
+ if (opContext) opContext.deadCheck('getCodeSystemById');
153
+ if (cs.jsonObj.id === id) {
154
+ return cs;
155
+ }
156
+ }
157
+ return undefined;
158
+ }
159
+
160
+ getCodeSystemFactoryById(opContext, id) {
161
+ // Search through codeSystems map for matching id
162
+ for (const cs of this.codeSystemFactories.values()) {
163
+ if (cs.id() == id) {
164
+ return cs;
165
+ }
166
+ }
167
+ return undefined;
168
+ }
169
+
170
+ async getValueSetById(opContext, id) {
171
+ for (const vp of this.valueSetProviders) {
172
+ if (opContext) opContext.deadCheck('getValueSetById');
173
+ let vs = await vp.fetchValueSetById(id);
174
+ if (vs) {
175
+ return vs;
176
+ }
177
+ }
178
+ return null;
179
+ }
180
+
181
+ async findValueSet(opContext, url, version) {
182
+ for (const vp of this.valueSetProviders) {
183
+ if (opContext) opContext.deadCheck('findValueSet');
184
+ let vs = await vp.fetchValueSet(url, version);
185
+ if (vs) {
186
+ return vs;
187
+ }
188
+ }
189
+ let vs = await this.findKnownValueSet(url, version);
190
+ return vs;
191
+ }
192
+
193
+ async getConceptMapById(opContext, id) {
194
+ for (const cmp of this.conceptMapProviders) {
195
+ if (opContext) opContext.deadCheck('getConceptMapById');
196
+ let cm = await cmp.fetchConceptMapById(id);
197
+ if (cm) {
198
+ return cm;
199
+ }
200
+ }
201
+ return null;
202
+ }
203
+
204
+ async findConceptMap(opContext, url, version) {
205
+ for (const cmp of this.conceptMapProviders) {
206
+ if (opContext) opContext.deadCheck('findConceptMap');
207
+ let cm = await cmp.fetchConceptMap(url, version);
208
+ if (cm) {
209
+ return cm;
210
+ }
211
+ }
212
+
213
+ let uris = new Set();
214
+ for (let csp of this.codeSystemFactories.values()) {
215
+ if (!uris.has(csp.system())) {
216
+ uris.add(csp.system());
217
+ await csp.findImplicitConceptMap(url, version);
218
+ }
219
+ }
220
+
221
+ }
222
+
223
+
224
+ async listCodeSystemVersions(url) {
225
+ let result = new Set();
226
+ for (let cs of this.codeSystems.values()) {
227
+ if (cs.url == url) {
228
+ result.add(cs.version);
229
+ }
230
+ }
231
+ for (let cp of this.codeSystemFactories.values()) {
232
+ if (cp.system() == url) {
233
+ result.add(cp.version());
234
+ }
235
+ }
236
+ return result;
237
+ }
238
+
239
+ async findKnownValueSet(url, version) {
240
+ for (let csp of this.codeSystemFactories.values()) {
241
+ let vs = await csp.buildKnownValueSet(url, version);
242
+ if (vs != null) {
243
+ return new ValueSet(vs);
244
+ }
245
+ }
246
+ return null;
247
+ }
248
+
249
+
250
+
251
+ async findConceptMapForTranslation(opContext, conceptMaps, sourceSystem, sourceScope, targetScope, targetSystem) {
252
+ for (let cmp of this.conceptMapProviders) {
253
+ await cmp.findConceptMapForTranslation(opContext, conceptMaps, sourceSystem, sourceScope, targetScope, targetSystem);
254
+ }
255
+ if (sourceSystem && targetSystem) {
256
+ let uris = new Set();
257
+ for (let csp of this.codeSystemFactories.values()) {
258
+ if (!uris.has(csp.system())) {
259
+ uris.add(csp.system());
260
+ await csp.findImplicitConceptMaps(conceptMaps, sourceSystem, targetSystem);
261
+ }
262
+ }
263
+ }
264
+ }
265
+
266
+ getFhirVersion() {
267
+ switch (this.fhirVersion) {
268
+ case 5: return "R5";
269
+ case 4: return "R4";
270
+ case 3: return "R3";
271
+ default: return "R5";
272
+ }
273
+ }
274
+
275
+ async listAllValueSets() {
276
+ let result = [];
277
+ for (let vsp of this.valueSetProviders) {
278
+ result.push(... await vsp.listAllValueSets());
279
+ }
280
+ return result;
281
+
282
+ }
283
+
284
+ async resolveURL(opContext, system, version) {
285
+ validateParameter(opContext, "opContext", OperationContext);
286
+ validateParameter(system, "system", String);
287
+ validateOptionalParameter(version, "version", String);
288
+
289
+ if (system.includes("|")) {
290
+ const url = system.substring(0, system.indexOf("|"));
291
+ const v = system.substring(system.indexOf("|")+1);
292
+ if (version == null || v === version) {
293
+ version = v;
294
+ } else {
295
+ throw new TerminologyError(`Version inconsistent in ${system}: ${v} vs ${version}`);
296
+ }
297
+ system = url;
298
+ } else if (!version) {
299
+ version = null;
300
+ }
301
+ const vurl = system+(version ? "|"+version : "");
302
+ const vurlMM = VersionUtilities.isSemVer(version) ? system+"|"+VersionUtilities.getMajMin(version) : null;
303
+ let factory = this.codeSystemFactories.get(vurl);
304
+ if (factory == null && vurlMM) {
305
+ factory = this.codeSystemFactories.get(vurlMM);
306
+ }
307
+ if (factory != null) {
308
+ return {
309
+ link: this.path+"/CodeSystem/"+factory.id(),
310
+ description: factory.name()+(version ? " v"+version : "")
311
+ };
312
+ }
313
+ let cs = this.codeSystems.get(vurl);
314
+ if (cs == null && vurlMM) {
315
+ cs = this.codeSystems.get(vurlMM);
316
+ }
317
+ if (cs != null) {
318
+ return {
319
+ link: this.path+"/CodeSystem/"+cs.id,
320
+ description: (cs.title ? cs.title : cs.name)+(version ? " v"+version : "")
321
+ };
322
+ }
323
+
324
+ let vs = await this.findValueSet(opContext, system, version);
325
+ if (vs) {
326
+ return {
327
+ link: this.path+"/ValueSet/"+vs.id,
328
+ description: (vs.title ? vs.title : vs.name)+(version ? " v"+version : "")
329
+ };
330
+ }
331
+ let cm = await this.findConceptMap(opContext, system, version);
332
+ if (cm) {
333
+ return {
334
+ link: this.path+"/ConceptMap/"+cm.id,
335
+ description: (cm.title ? cm.title : cm.name)+(version ? " v"+version : "")
336
+ };
337
+ }
338
+ return null;
339
+ }
340
+
341
+ async resolveCode(opContext, system, version, code) {
342
+ validateParameter(opContext, "opContext", OperationContext);
343
+ validateParameter(system, "system", String);
344
+ validateOptionalParameter(version, "version", String);
345
+ validateParameter(code, "code", String);
346
+
347
+ if (system.includes("|")) {
348
+ const url = system.substring(0, system.indexOf("|"));
349
+ const v = system.substring(system.indexOf("|")+1);
350
+ if (version == null || v === version) {
351
+ version = v;
352
+ } else {
353
+ throw new TerminologyError(`Version inconsistent in ${system}: ${v} vs ${version}`);
354
+ }
355
+ system = url;
356
+ } else if (!version) {
357
+ version = null;
358
+ }
359
+ const vurl = system+(version ? "|"+version : "");
360
+ const vurlMM = VersionUtilities.isSemVer(version) ? system+"|"+VersionUtilities.getMajMin(version) : null;
361
+ let factory = this.codeSystemFactories.get(vurl);
362
+ if (factory == null && vurlMM) {
363
+ factory = this.codeSystemFactories.get(vurlMM);
364
+ }
365
+ if (factory != null) {
366
+ const csp = factory.build(opContext, []);
367
+ const c = csp.locate(code);
368
+ if (c) {
369
+ if (factory.iterable()) {
370
+ return {
371
+ link: this.path + "/CodeSystem/x-" + factory.id(),
372
+ description: csp.display(c)
373
+ }
374
+ } else {
375
+ const link = csp.codeLink(c);
376
+ if (link) {
377
+ return {
378
+ link: link,
379
+ description: csp.display(c)
380
+ }
381
+ }
382
+ }
383
+ }
384
+ }
385
+ let cs = this.codeSystems.get(vurl);
386
+ if (cs == null && vurlMM) {
387
+ cs = this.codeSystems.get(vurlMM);
388
+ }
389
+ if (cs != null) {
390
+ const c = cs.codeMap.get(code);
391
+ if (c) {
392
+ return {
393
+ link: this.path + "/CodeSystem/" + cs.id + '#' + code,
394
+ description: c.display
395
+ };
396
+ }
397
+ }
398
+ return null;
399
+ }
400
+
401
+ }
402
+
403
+ module.exports = { Provider };