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,271 @@
1
+ const sqlite3 = require('sqlite3').verbose();
2
+ const assert = require('assert');
3
+ const { CodeSystem } = require('../library/codesystem');
4
+ const { CodeSystemProvider, CodeSystemFactoryProvider} = require('./cs-api');
5
+
6
+ class UniiConcept {
7
+ constructor(code, display) {
8
+ this.code = code;
9
+ this.display = display;
10
+ this.others = []; // Array of other descriptions from UniiDesc table
11
+ }
12
+ }
13
+
14
+ class UniiServices extends CodeSystemProvider {
15
+ constructor(opContext, supplements, db, version) {
16
+ super(opContext, supplements);
17
+ this.db = db;
18
+ this._version = version;
19
+ }
20
+
21
+ // Clean up database connection when provider is destroyed
22
+ close() {
23
+ if (this.db) {
24
+ this.db.close();
25
+ this.db = null;
26
+ }
27
+ }
28
+
29
+ // Metadata methods
30
+ system() {
31
+ return 'http://fdasis.nlm.nih.gov'; // UNII system URI
32
+ }
33
+
34
+ version() {
35
+ return this._version;
36
+ }
37
+
38
+ description() {
39
+ return 'UNII Codes';
40
+ }
41
+
42
+ name() {
43
+ return 'UNII Codes';
44
+ }
45
+
46
+ totalCount() {
47
+ return -1; // Database-driven, use count query if needed
48
+ }
49
+
50
+ hasParents() {
51
+ return false; // No hierarchical relationships
52
+ }
53
+
54
+ hasAnyDisplays(languages) {
55
+ const langs = this._ensureLanguages(languages);
56
+ if (this._hasAnySupplementDisplays(langs)) {
57
+ return true;
58
+ }
59
+ return super.hasAnyDisplays(langs);
60
+ }
61
+
62
+ // Core concept methods
63
+ async code(code) {
64
+
65
+ const ctxt = await this.#ensureContext(code);
66
+ return ctxt ? ctxt.code : null;
67
+ }
68
+
69
+ async display(code) {
70
+
71
+ const ctxt = await this.#ensureContext(code);
72
+ if (!ctxt) {
73
+ return null;
74
+ }
75
+ if (ctxt.display && this.opContext.langs.isEnglishOrNothing()) {
76
+ return ctxt.display.trim();
77
+ }
78
+ let disp = this._displayFromSupplements(ctxt.code);
79
+ if (disp) {
80
+ return disp;
81
+ }
82
+ return ctxt.display ? ctxt.display.trim() : '';
83
+ }
84
+
85
+ async definition(code) {
86
+
87
+ await this.#ensureContext(code);
88
+ return null; // No definitions provided
89
+ }
90
+
91
+ async isAbstract(code) {
92
+ await this.#ensureContext(code);
93
+ return false; // No abstract concepts
94
+ }
95
+
96
+ async isInactive(code) {
97
+ await this.#ensureContext(code);
98
+ return false; // No inactive concepts
99
+ }
100
+
101
+ async isDeprecated(code) {
102
+ await this.#ensureContext(code);
103
+ return false; // No deprecated concepts
104
+ }
105
+
106
+ async designations(code, displays) {
107
+
108
+ const ctxt = await this.#ensureContext(code);
109
+ if (ctxt != null) {
110
+ // Add main display
111
+ if (ctxt.display) {
112
+ displays.addDesignation(true, 'active', 'en', CodeSystem.makeUseForDisplay(), ctxt.display.trim());
113
+ }
114
+ // Add other descriptions
115
+ ctxt.others.forEach(other => {
116
+ if (other && other.trim()) {
117
+ displays.addDesignation(false, 'active', 'en', CodeSystem.makeUseForDisplay(), other.trim());
118
+ }
119
+ });
120
+ this._listSupplementDesignations(ctxt.code, displays);
121
+ }
122
+ }
123
+
124
+ async #ensureContext(code) {
125
+ if (!code) {
126
+ return code;
127
+ }
128
+ if (typeof code === 'string') {
129
+ const ctxt = await this.locate(code);
130
+ if (!ctxt.context) {
131
+ throw new Error(ctxt.message);
132
+ } else {
133
+ return ctxt.context;
134
+ }
135
+ }
136
+ if (code instanceof UniiConcept) {
137
+ return code;
138
+ }
139
+ throw new Error("Unknown Type at #ensureContext: " + (typeof code));
140
+ }
141
+
142
+ // Database helper methods
143
+ async #getVersion() {
144
+ return new Promise((resolve, reject) => {
145
+ this.db.get('SELECT Version FROM UniiVersion', (err, row) => {
146
+ if (err) reject(err);
147
+ else resolve(row ? row.Version : 'unknown');
148
+ });
149
+ });
150
+ }
151
+
152
+ async #getTotalCount() {
153
+ return new Promise((resolve, reject) => {
154
+ this.db.get('SELECT COUNT(*) as count FROM Unii', (err, row) => {
155
+ if (err) reject(err);
156
+ else resolve(row.count);
157
+ });
158
+ });
159
+ }
160
+
161
+ // Lookup methods
162
+ async locate(code) {
163
+
164
+ assert(!code || typeof code === 'string', 'code must be string');
165
+ if (!code) return { context: null, message: 'Empty code' };
166
+
167
+ return new Promise((resolve, reject) => {
168
+ // First query: get main concept
169
+ this.db.get('SELECT UniiKey, Display FROM Unii WHERE Code = ?', [code], (err, row) => {
170
+ if (err) {
171
+ return reject(err);
172
+ }
173
+
174
+ if (!row) {
175
+ return resolve({ context: null, message: `UNII Code '${code}' not found` });
176
+ }
177
+
178
+ const concept = new UniiConcept(code, row.Display);
179
+ const uniiKey = row.UniiKey;
180
+
181
+ // Second query: get all descriptions
182
+ this.db.all('SELECT Display FROM UniiDesc WHERE UniiKey = ?', [uniiKey], (err, rows) => {
183
+ if (err) return reject(err);
184
+
185
+ // Add unique descriptions to others array
186
+ rows.forEach(descRow => {
187
+ const desc = descRow.Display;
188
+ if (desc && desc.trim() && !concept.others.includes(desc.trim())) {
189
+ concept.others.push(desc.trim());
190
+ }
191
+ });
192
+
193
+ resolve({ context: concept, message: undefined });
194
+ });
195
+ });
196
+ });
197
+ }
198
+
199
+ versionAlgorithm() {
200
+ return 'date';
201
+ }
202
+ }
203
+
204
+ class UniiServicesFactory extends CodeSystemFactoryProvider {
205
+ constructor(i18n, dbPath) {
206
+ super(i18n);
207
+ this.dbPath = dbPath;
208
+ this.uses = 0;
209
+ this._version = null;
210
+ }
211
+
212
+ async load() {
213
+ let db = new sqlite3.Database(this.dbPath);
214
+
215
+ return new Promise((resolve, reject) => {
216
+ db.get('SELECT Version FROM UniiVersion', (err, row) => {
217
+ if (err) {
218
+ reject(new Error(err));
219
+ } else {
220
+ this._version = row ? row.Version : 'unknown';
221
+ resolve(); // This resolves the Promise
222
+ }
223
+ });
224
+ });
225
+ }
226
+
227
+ defaultVersion() {
228
+ return 'unknown';
229
+ }
230
+
231
+ system() {
232
+ return 'http://fdasis.nlm.nih.gov'; // UNII system URI
233
+ }
234
+
235
+ version() {
236
+ return this._version;
237
+ }
238
+
239
+ build(opContext, supplements) {
240
+ this.uses++;
241
+
242
+ return new UniiServices(opContext, supplements, new sqlite3.Database(this.dbPath), this._version);
243
+ }
244
+
245
+ // eslint-disable-next-line no-unused-vars
246
+ async buildKnownValueSet(url, version) {
247
+ return null;
248
+ }
249
+
250
+ useCount() {
251
+ return this.uses;
252
+ }
253
+
254
+ recordUse() {
255
+ this.uses++;
256
+ }
257
+ name() {
258
+ return 'UNII Codes';
259
+ }
260
+
261
+ id() {
262
+ return "unii";
263
+ }
264
+
265
+ }
266
+
267
+ module.exports = {
268
+ UniiServices,
269
+ UniiServicesFactory,
270
+ UniiConcept
271
+ };
@@ -0,0 +1,218 @@
1
+ const { CodeSystemProvider, CodeSystemFactoryProvider} = require('./cs-api');
2
+ const assert = require('assert');
3
+
4
+ /**
5
+ * Code system provider for URIs
6
+ * This is a simple provider that treats any URI as a valid code
7
+ * Uses strings directly as context since URIs have no additional metadata
8
+ * Enhanced to support supplements for display and definition lookup
9
+ */
10
+ class UriServices extends CodeSystemProvider {
11
+ constructor(opContext, supplements) {
12
+ super(opContext, supplements);
13
+ }
14
+
15
+ // ============================================================================
16
+ // Metadata for the code system
17
+ // ============================================================================
18
+
19
+ system() {
20
+ return 'urn:ietf:rfc:3986'; // URI_URIs constant equivalent
21
+ }
22
+
23
+ version() {
24
+ return 'n/a';
25
+ }
26
+
27
+ description() {
28
+ return 'URIs';
29
+ }
30
+
31
+ totalCount() {
32
+ return -1; // Infinite/unknown count
33
+ }
34
+
35
+ name() {
36
+ return 'Internal URI services';
37
+ }
38
+
39
+ defLang() {
40
+ return 'en';
41
+ }
42
+
43
+ hasAnyDisplays(languages) {
44
+ const langs = this._ensureLanguages(languages);
45
+ if (this._hasAnySupplementDisplays(langs)) {
46
+ return true;
47
+ } else {
48
+ return false; // URIs don't have displays by default
49
+ }
50
+ }
51
+
52
+ hasParents() {
53
+ return false; // URIs don't have hierarchy
54
+ }
55
+
56
+ // ============================================================================
57
+ // Getting Information about concepts
58
+ // ============================================================================
59
+
60
+ async code(code) {
61
+
62
+ await this.#ensureContext(code);
63
+ return code; // For URIs, the code is the context
64
+ }
65
+
66
+ async display(code) {
67
+
68
+ const ctxt = await this.#ensureContext(code);
69
+ return this._displayFromSupplements(ctxt);
70
+ }
71
+
72
+ async definition(code) {
73
+
74
+ await this.#ensureContext(code);
75
+ return null; // URIs don't have definitions by default
76
+ }
77
+
78
+ async isAbstract(code) {
79
+
80
+ await this.#ensureContext(code);
81
+ return false; // URIs are not abstract
82
+ }
83
+
84
+ async isInactive(code) {
85
+
86
+ await this.#ensureContext(code);
87
+ return false; // URIs are not inactive
88
+ }
89
+
90
+ async isDeprecated(code) {
91
+
92
+ await this.#ensureContext(code);
93
+ return false; // URIs are not deprecated
94
+ }
95
+
96
+ async designations(code, displays) {
97
+
98
+ const ctxt = await this.#ensureContext(code);
99
+ if (ctxt != null) {
100
+ this._listSupplementDesignations(ctxt, displays);
101
+ }
102
+ }
103
+
104
+ async properties(code) {
105
+
106
+ const ctxt = await this.#ensureContext(code);
107
+ // Collect properties from all supplements
108
+ let allProperties = [];
109
+
110
+ if (this.supplements) {
111
+ for (const supplement of this.supplements) {
112
+ const concept = supplement.getConceptByCode(ctxt); // ← Uses CodeSystem API
113
+ if (concept && concept.property) {
114
+ // Add all properties from this concept
115
+ allProperties = allProperties.concat(concept.property);
116
+ }
117
+ }
118
+ }
119
+
120
+ return allProperties;
121
+ }
122
+
123
+ async sameConcept(a, b) {
124
+
125
+ await this.#ensureContext(a);
126
+ await this.#ensureContext(b);
127
+ return a === b; // For URIs, direct string comparison
128
+ }
129
+
130
+
131
+ async #ensureContext(code) {
132
+ if (!code || typeof code === 'string') {
133
+ return code;
134
+ }
135
+ throw new Error("Unknown Type at #ensureContext: "+ (typeof code));
136
+ }
137
+
138
+ // ============================================================================
139
+ // Finding concepts
140
+ // ============================================================================
141
+
142
+ async locate(code) {
143
+
144
+ assert(!code || typeof code === 'string', 'code must be string');
145
+ if (!code) return { context: null, message: 'Empty code' };
146
+
147
+ // For URIs, any string is potentially valid
148
+ // But we can check if it exists in supplements for better validation
149
+ // but it doesn't make any difference...
150
+
151
+ return {
152
+ context: code, // Use the string directly as context
153
+ message: null
154
+ };
155
+ }
156
+
157
+ versionAlgorithm() {
158
+ return null;
159
+ }
160
+
161
+ isNotClosed() {
162
+ return true;
163
+ }
164
+
165
+ // ============================================================================
166
+ // Filtering (not supported for URIs)
167
+ // ============================================================================
168
+
169
+ // nothing to declare
170
+
171
+ // ============================================================================
172
+ // Translations and concept maps
173
+ // ============================================================================
174
+ }
175
+
176
+ /**
177
+ * Factory for creating URI code system providers
178
+ */
179
+ class UriServicesFactory extends CodeSystemFactoryProvider {
180
+ constructor(i18n) {
181
+ super(i18n);
182
+ }
183
+
184
+ defaultVersion() {
185
+ return 'n/a';
186
+ }
187
+
188
+ system() {
189
+ return 'urn:ietf:rfc:3986'; // URI_URIs constant equivalent
190
+ }
191
+
192
+ version() {
193
+ return 'n/a';
194
+ }
195
+
196
+ // eslint-disable-next-line no-unused-vars
197
+ async buildKnownValueSet(url, version) {
198
+ return null;
199
+ }
200
+
201
+ async build(opContext, supplements) {
202
+ this.recordUse();
203
+ return new UriServices(opContext, supplements);
204
+ }
205
+ name() {
206
+ return 'URI services';
207
+ }
208
+
209
+
210
+ id() {
211
+ return "urls";
212
+ }
213
+ }
214
+
215
+ module.exports = {
216
+ UriServices,
217
+ UriServicesFactory
218
+ };