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,305 @@
1
+ const { CodeSystemProvider, CodeSystemFactoryProvider} = require('./cs-api');
2
+ const assert = require('assert');
3
+ const { CodeSystem } = require("../library/codesystem");
4
+
5
+ class USStateConcept {
6
+ constructor(code, display) {
7
+ this.code = code;
8
+ this.display = display;
9
+ }
10
+ }
11
+
12
+ class USStateServices extends CodeSystemProvider {
13
+ constructor(opContext, supplements, codes, codeMap) {
14
+ super(opContext, supplements);
15
+ this.codes = codes || [];
16
+ this.codeMap = codeMap || new Map();
17
+ }
18
+
19
+ // Metadata methods
20
+ system() {
21
+ return 'https://www.usps.com/';
22
+ }
23
+
24
+ version() {
25
+ return null; // No version specified
26
+ }
27
+
28
+ description() {
29
+ return 'US State Codes';
30
+ }
31
+
32
+ name() {
33
+ return 'US State Codes';
34
+ }
35
+
36
+ totalCount() {
37
+ return this.codes.length;
38
+ }
39
+
40
+ hasParents() {
41
+ return false; // No hierarchical relationships
42
+ }
43
+
44
+ hasAnyDisplays(languages) {
45
+ const langs = this._ensureLanguages(languages);
46
+ if (this._hasAnySupplementDisplays(langs)) {
47
+ return true;
48
+ }
49
+ return super.hasAnyDisplays(langs);
50
+ }
51
+
52
+ // Core concept methods
53
+ async code(code) {
54
+
55
+ const ctxt = await this.#ensureContext(code);
56
+ return ctxt ? ctxt.code : null;
57
+ }
58
+
59
+ async display(code) {
60
+
61
+ const ctxt = await this.#ensureContext(code);
62
+ if (!ctxt) {
63
+ return null;
64
+ }
65
+ if (ctxt.display && this.opContext.langs.isEnglishOrNothing()) {
66
+ return ctxt.display.trim();
67
+ }
68
+ let disp = this._displayFromSupplements(ctxt.code);
69
+ if (disp) {
70
+ return disp;
71
+ }
72
+ return ctxt.display ? ctxt.display.trim() : '';
73
+ }
74
+
75
+ async definition(code) {
76
+
77
+ await this.#ensureContext(code);
78
+ return null; // No definitions provided
79
+ }
80
+
81
+ async isAbstract(code) {
82
+
83
+ await this.#ensureContext(code);
84
+ return false; // No abstract concepts
85
+ }
86
+
87
+ async isInactive(code) {
88
+
89
+ await this.#ensureContext(code);
90
+ return false; // No inactive concepts
91
+ }
92
+
93
+ async isDeprecated(code) {
94
+
95
+ await this.#ensureContext(code);
96
+ return false; // No deprecated concepts
97
+ }
98
+
99
+ async designations(code, displays) {
100
+
101
+ const ctxt = await this.#ensureContext(code);
102
+ if (ctxt != null) {
103
+ displays.addDesignation(true, 'active', 'en', CodeSystem.makeUseForDisplay(), ctxt.display);
104
+ this._listSupplementDesignations(ctxt.code, displays);
105
+ }
106
+ }
107
+
108
+ async #ensureContext(code) {
109
+ if (!code) {
110
+ return code;
111
+ }
112
+ if (typeof code === 'string') {
113
+ const ctxt = await this.locate(code);
114
+ if (!ctxt.context) {
115
+ throw new Error(ctxt.message ? ctxt.message : `US State Code '${code}' not found`);
116
+ } else {
117
+ return ctxt.context;
118
+ }
119
+ }
120
+ if (code instanceof USStateConcept) {
121
+ return code;
122
+ }
123
+ throw new Error("Unknown Type at #ensureContext: " + (typeof code));
124
+ }
125
+
126
+ // Lookup methods
127
+ async locate(code) {
128
+
129
+ assert(!code || typeof code === 'string', 'code must be string');
130
+ if (!code) return { context: null, message: 'Empty code' };
131
+
132
+ const concept = this.codeMap.get(code);
133
+ if (concept) {
134
+ return { context: concept, message: null };
135
+ }
136
+ return { context: null, message: undefined };
137
+ }
138
+
139
+ // Iterator methods
140
+ async iterator(code) {
141
+
142
+ const ctxt = await this.#ensureContext(code);
143
+ if (!ctxt) {
144
+ return { index: 0, total: this.totalCount() };
145
+ }
146
+ return null; // No child iteration
147
+ }
148
+
149
+ async nextContext(iteratorContext) {
150
+
151
+ assert(iteratorContext, 'iteratorContext must be provided');
152
+ if (iteratorContext && iteratorContext.index < iteratorContext.total) {
153
+ const concept = this.codes[iteratorContext.index];
154
+ iteratorContext.index++;
155
+ return concept;
156
+ }
157
+ return null;
158
+ }
159
+
160
+ // Subsumption
161
+ async subsumesTest(codeA, codeB) {
162
+ await this.#ensureContext(codeA);
163
+ await this.#ensureContext(codeB);
164
+ return 'not-subsumed'; // No subsumption relationships
165
+ }
166
+
167
+ versionAlgorithm() {
168
+ return null; // none
169
+ }
170
+ }
171
+
172
+ class USStateFactoryProvider extends CodeSystemFactoryProvider {
173
+ constructor(i18n) {
174
+ super(i18n);
175
+ this.uses = 0;
176
+ this.codes = null;
177
+ this.codeMap = null;
178
+ }
179
+
180
+ defaultVersion() {
181
+ return null; // No versioning for US states
182
+ }
183
+
184
+ build(opContext, supplements) {
185
+ this.uses++;
186
+ return new USStateServices(opContext, supplements, this.codes, this.codeMap);
187
+ }
188
+
189
+ useCount() {
190
+ return this.uses;
191
+ }
192
+
193
+ recordUse() {
194
+ this.uses++;
195
+ }
196
+
197
+
198
+ system() {
199
+ return 'https://www.usps.com/';
200
+ }
201
+
202
+ version() {
203
+ return null; // No version specified
204
+ }
205
+
206
+ // eslint-disable-next-line no-unused-vars
207
+ async buildKnownValueSet(url, version) {
208
+ return null;
209
+ }
210
+
211
+ async load() {
212
+ this.codes = [];
213
+ this.codeMap = new Map();
214
+
215
+ const data = [
216
+ ['AL', 'Alabama'],
217
+ ['AK', 'Alaska'],
218
+ ['AS', 'American Samoa'],
219
+ ['AZ', 'Arizona'],
220
+ ['AR', 'Arkansas'],
221
+ ['CA', 'California'],
222
+ ['CO', 'Colorado'],
223
+ ['CT', 'Connecticut'],
224
+ ['DE', 'Delaware'],
225
+ ['DC', 'District of Columbia'],
226
+ ['FM', 'Federated States of Micronesia'],
227
+ ['FL', 'Florida'],
228
+ ['GA', 'Georgia'],
229
+ ['GU', 'Guam'],
230
+ ['HI', 'Hawaii'],
231
+ ['ID', 'Idaho'],
232
+ ['IL', 'Illinois'],
233
+ ['IN', 'Indiana'],
234
+ ['IA', 'Iowa'],
235
+ ['KS', 'Kansas'],
236
+ ['KY', 'Kentucky'],
237
+ ['LA', 'Louisiana'],
238
+ ['ME', 'Maine'],
239
+ ['MH', 'Marshall Islands'],
240
+ ['MD', 'Maryland'],
241
+ ['MA', 'Massachusetts'],
242
+ ['MI', 'Michigan'],
243
+ ['MN', 'Minnesota'],
244
+ ['MS', 'Mississippi'],
245
+ ['MO', 'Missouri'],
246
+ ['MT', 'Montana'],
247
+ ['NE', 'Nebraska'],
248
+ ['NV', 'Nevada'],
249
+ ['NH', 'New Hampshire'],
250
+ ['NJ', 'New Jersey'],
251
+ ['NM', 'New Mexico'],
252
+ ['NY', 'New York'],
253
+ ['NC', 'North Carolina'],
254
+ ['ND', 'North Dakota'],
255
+ ['MP', 'Northern Mariana Islands'],
256
+ ['OH', 'Ohio'],
257
+ ['OK', 'Oklahoma'],
258
+ ['OR', 'Oregon'],
259
+ ['PW', 'Palau'],
260
+ ['PA', 'Pennsylvania'],
261
+ ['PR', 'Puerto Rico'],
262
+ ['RI', 'Rhode Island'],
263
+ ['SC', 'South Carolina'],
264
+ ['SD', 'South Dakota'],
265
+ ['TN', 'Tennessee'],
266
+ ['TX', 'Texas'],
267
+ ['UT', 'Utah'],
268
+ ['VT', 'Vermont'],
269
+ ['VI', 'Virgin Islands'],
270
+ ['VA', 'Virginia'],
271
+ ['WA', 'Washington'],
272
+ ['WV', 'West Virginia'],
273
+ ['WI', 'Wisconsin'],
274
+ ['WY', 'Wyoming'],
275
+ ['AE', 'Armed Forces Europe, the Middle East, and Canada'],
276
+ ['AP', 'Armed Forces Pacific'],
277
+ ['AA', 'Armed Forces Americas (except Canada)']
278
+ ];
279
+
280
+ // Load concepts into arrays and map
281
+ for (const [code, display] of data) {
282
+ const concept = new USStateConcept(code, display);
283
+ this.codes.push(concept);
284
+ this.codeMap.set(code, concept);
285
+ }
286
+ }
287
+
288
+ name() {
289
+ return 'US State Codes';
290
+ }
291
+
292
+ id() {
293
+ return "us-states";
294
+ }
295
+
296
+ iteratable() {
297
+ return true;
298
+ }
299
+ }
300
+
301
+ module.exports = {
302
+ USStateServices,
303
+ USStateFactoryProvider,
304
+ USStateConcept
305
+ };
@@ -0,0 +1,14 @@
1
+ base:
2
+ url: https://storage.googleapis.com/tx-fhir-org
3
+
4
+ sources:
5
+ - internal:lang
6
+ - internal:country
7
+ - internal:currency
8
+ - internal:areacode
9
+ - internal:mimetypes
10
+ - internal:usstates
11
+ - internal:hgvs
12
+ - ucum:tx/data/ucum-essence.xml
13
+ - npm:hl7.terminology
14
+ - npm:fhir.tx.support.r4
@@ -0,0 +1,18 @@
1
+ {
2
+ "enabled": true,
3
+ "consoleErrors": false,
4
+ "host" : "local.host",
5
+ "librarySource": "tx/fixtures/test-cases.yml",
6
+ "endpoints": [
7
+ {
8
+ "path": "/r5",
9
+ "fhirVersion": "5.0",
10
+ "context": null
11
+ },
12
+ {
13
+ "path": "/r4",
14
+ "fhirVersion": "4.0",
15
+ "context": null
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,16 @@
1
+ base:
2
+ url: https://storage.googleapis.com/tx-fhir-org
3
+
4
+ sources:
5
+ - internal:lang
6
+ - internal:country
7
+ - internal:currency
8
+ - internal:areacode
9
+ - internal:mimetypes
10
+ - internal:usstates
11
+ - ucum:tx/data/ucum-essence.xml
12
+ - loinc:loinc-2.81-b.db
13
+ - snomed!:sct_intl_20250201.cache
14
+ - snomed:sct_test_20250814.cache
15
+ - omop:omop_v20250227.db
16
+ - npm:hl7.terminology
@@ -0,0 +1,25 @@
1
+ <div class="operations" style="margin-top: 20px;">
2
+ <button type="button" class="btn btn-sm btn-outline-secondary" onclick="toggleOperations('{{ opsId }}')">Show Operations</button>
3
+ <div id="{{ opsId }}" style="display: none; margin-top: 10px;">
4
+
5
+ <div class="operation-form" style="margin-bottom: 15px;">
6
+ <strong>Lookup</strong>
7
+ <form method="get" action="$lookup" style="display: inline-block; margin-left: 10px;">
8
+ <input type="hidden" name="system" value="{{ url }}"/>
9
+ <input type="text" name="code" placeholder="Code" required size="20"/>
10
+ <button type="submit" class="btn btn-sm btn-primary">Lookup</button>
11
+ </form>
12
+ </div>
13
+
14
+ <div class="operation-form" style="margin-bottom: 15px;">
15
+ <strong>Subsumes</strong>
16
+ <form method="get" action="$subsumes" style="display: inline-block; margin-left: 10px;">
17
+ <input type="hidden" name="system" value="{{ url }}"/>
18
+ <input type="text" name="codeA" placeholder="Code A" required size="15"/>
19
+ <input type="text" name="codeB" placeholder="Code B" required size="15"/>
20
+ <button type="submit" class="btn btn-sm btn-primary">Subsumes</button>
21
+ </form>
22
+ </div>
23
+
24
+ </div>
25
+ </div>
@@ -0,0 +1,247 @@
1
+ <div style="display: flex; gap: 20px; margin-bottom: 20px;">
2
+ <div style="flex: 1;">
3
+ <h6>Memory Usage (Heap Used)</h6>
4
+ <canvas id="memoryChart" height="200"></canvas>
5
+ </div>
6
+ <div style="flex: 1;">
7
+ <h6>Cache</h6>
8
+ <canvas id="cacheChart" height="200"></canvas>
9
+ </div>
10
+ <div style="flex: 1;">
11
+ <h6>Turnaround Time</h6>
12
+ <canvas id="tatChart" height="200"></canvas>
13
+ </div>
14
+ </div>
15
+ <div style="display: flex; gap: 20px; margin-bottom: 20px;">
16
+ <div style="flex: 1;">
17
+ <h6>Requests per Minute</h6>
18
+ <canvas id="requestChart" height="200"></canvas>
19
+ </div>
20
+ <div style="flex: 1;">
21
+ <h6>CPU Usage (%)</h6>
22
+ <canvas id="cpuChart" height="200"></canvas>
23
+ </div>
24
+ <div style="flex: 1;">
25
+ <h6>Node Blocking</h6>
26
+ <canvas id="blockChart" height="200"></canvas>
27
+ </div>
28
+ </div>
29
+
30
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
31
+ <script>
32
+ (function() {
33
+ const historyData = {{ historyJson }};
34
+ const startTime = {{ startTime }};
35
+
36
+ function formatTime(timestamp) {
37
+ const d = new Date(timestamp);
38
+ return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
39
+ }
40
+
41
+ function formatMB(bytes) {
42
+ return (bytes / 1024 / 1024).toFixed(1);
43
+ }
44
+
45
+ function formatDuration(ms) {
46
+ const hours = ms / 3600000;
47
+ if (hours < 1) {
48
+ return Math.round(ms / 60000) + 'm ago';
49
+ }
50
+ return hours.toFixed(1) + 'h ago';
51
+ }
52
+
53
+ const chartOptions = {
54
+ responsive: false,
55
+ maintainAspectRatio: false,
56
+ scales: {
57
+ x: {
58
+ ticks: {
59
+ maxTicksAuto: 6
60
+ }
61
+ },
62
+ y: {
63
+ beginAtZero: true
64
+ }
65
+ },
66
+ plugins: {
67
+ legend: {
68
+ display: false
69
+ }
70
+ }
71
+ };
72
+
73
+ // Memory chart
74
+ new Chart(document.getElementById('memoryChart'), {
75
+ type: 'line',
76
+ data: {
77
+ labels: historyData.map(d => formatTime(d.time)),
78
+ datasets: [{
79
+ data: historyData.map(d => parseFloat(formatMB(d.mem))),
80
+ borderColor: '#007bff',
81
+ backgroundColor: 'rgba(0, 123, 255, 0.1)',
82
+ fill: true,
83
+ tension: 0.3,
84
+ pointRadius: 2
85
+ }]
86
+ },
87
+ options: {
88
+ ...chartOptions,
89
+ scales: {
90
+ ...chartOptions.scales,
91
+ y: {
92
+ ...chartOptions.scales.y,
93
+ title: {
94
+ display: true,
95
+ text: 'MB (𝚫 from start)'
96
+ }
97
+ }
98
+ }
99
+ }
100
+ });
101
+
102
+ // Cache chart
103
+ new Chart(document.getElementById('cacheChart'), {
104
+ type: 'line',
105
+ data: {
106
+ labels: historyData.map(d => formatTime(d.time)),
107
+ datasets: [{
108
+ data: historyData.map(d => d.cache),
109
+ borderColor: '#7b7b7b',
110
+ backgroundColor: 'rgba(123, 123, 123, 0.1)',
111
+ fill: true,
112
+ tension: 0.3,
113
+ pointRadius: 2
114
+ }]
115
+ },
116
+ options: {
117
+ ...chartOptions,
118
+ scales: {
119
+ ...chartOptions.scales,
120
+ y: {
121
+ ...chartOptions.scales.y,
122
+ title: {
123
+ display: true,
124
+ text: '# cached items'
125
+ }
126
+ }
127
+ }
128
+ }
129
+ });
130
+
131
+
132
+ // Tat chart
133
+ new Chart(document.getElementById('tatChart'), {
134
+ type: 'line',
135
+ data: {
136
+ labels: historyData.map(d => formatTime(d.time)),
137
+ datasets: [{
138
+ data: historyData.map(d => d.tat),
139
+ borderColor: '#7b7b7b',
140
+ backgroundColor: 'rgba(123, 123, 123, 0.1)',
141
+ fill: true,
142
+ tension: 0.3,
143
+ pointRadius: 2
144
+ }]
145
+ },
146
+ options: {
147
+ ...chartOptions,
148
+ scales: {
149
+ ...chartOptions.scales,
150
+ y: {
151
+ ...chartOptions.scales.y,
152
+ title: {
153
+ display: true,
154
+ text: 'ms'
155
+ }
156
+ }
157
+ }
158
+ }
159
+ });
160
+
161
+ // CPU chart
162
+ new Chart(document.getElementById('cpuChart'), {
163
+ type: 'line',
164
+ data: {
165
+ labels: historyData.map(d => formatTime(d.time)),
166
+ datasets: [{
167
+ data: historyData.map(d => parseFloat(formatMB(d.cpu))),
168
+ borderColor: '#ff7b00',
169
+ backgroundColor: 'rgba(255, 123, 0, 0.1)',
170
+ fill: true,
171
+ tension: 0.3,
172
+ pointRadius: 2
173
+ }]
174
+ },
175
+ options: {
176
+ ...chartOptions,
177
+ scales: {
178
+ ...chartOptions.scales,
179
+ y: {
180
+ ...chartOptions.scales.y,
181
+ title: {
182
+ display: true,
183
+ text: '%'
184
+ }
185
+ }
186
+ }
187
+ }
188
+ });
189
+
190
+ // Requests chart
191
+ new Chart(document.getElementById('requestChart'), {
192
+ type: 'line',
193
+ data: {
194
+ labels: historyData.map(d => formatTime(d.time)),
195
+ datasets: [{
196
+ data: historyData.map(d => d.rpm.toFixed(2)),
197
+ borderColor: '#28a745',
198
+ backgroundColor: 'rgba(40, 167, 69, 0.1)',
199
+ fill: true,
200
+ tension: 0.3,
201
+ pointRadius: 2
202
+ }]
203
+ },
204
+ options: {
205
+ ...chartOptions,
206
+ scales: {
207
+ ...chartOptions.scales,
208
+ y: {
209
+ ...chartOptions.scales.y,
210
+ title: {
211
+ display: true,
212
+ text: 'req/min'
213
+ }
214
+ }
215
+ }
216
+ }
217
+ });
218
+ // Blocking chart
219
+ new Chart(document.getElementById('blockChart'), {
220
+ type: 'line',
221
+ data: {
222
+ labels: historyData.map(d => formatTime(d.time)),
223
+ datasets: [{
224
+ data: historyData.map(d => d.block),
225
+ borderColor: '#2845a7',
226
+ backgroundColor: 'rgba(40, 69, 167, 0.1)',
227
+ fill: true,
228
+ tension: 0.3,
229
+ pointRadius: 2
230
+ }]
231
+ },
232
+ options: {
233
+ ...chartOptions,
234
+ scales: {
235
+ ...chartOptions.scales,
236
+ y: {
237
+ ...chartOptions.scales.y,
238
+ title: {
239
+ display: true,
240
+ text: 'points'
241
+ }
242
+ }
243
+ }
244
+ }
245
+ });
246
+ })();
247
+ </script>