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,539 @@
1
+ const { CodeSystemProvider, FilterExecutionContext, CodeSystemFactoryProvider} = require('./cs-api');
2
+ const assert = require('assert');
3
+ const { CodeSystem } = require("../library/codesystem");
4
+
5
+ class CurrencyConcept {
6
+ constructor(code, display, decimals, symbol) {
7
+ this.code = code;
8
+ this.display = display;
9
+ this.decimals = decimals;
10
+ this.symbol = symbol;
11
+ }
12
+ }
13
+
14
+ class CurrencyConceptFilter {
15
+ constructor() {
16
+ this.list = [];
17
+ this.cursor = -1;
18
+ }
19
+ }
20
+
21
+ class Iso4217Services extends CodeSystemProvider {
22
+ constructor(opContext, supplements, codes, codeMap) {
23
+ super(opContext, supplements);
24
+ this.codes = codes || [];
25
+ this.codeMap = codeMap || new Map();
26
+ }
27
+
28
+ // Metadata methods
29
+ system() {
30
+ return 'urn:iso:std:iso:4217';
31
+ }
32
+
33
+ version() {
34
+ return null; // No version specified
35
+ }
36
+
37
+ description() {
38
+ return 'Currencies';
39
+ }
40
+
41
+ name() {
42
+ return 'Currencies';
43
+ }
44
+
45
+ totalCount() {
46
+ return this.codes.length;
47
+ }
48
+
49
+ hasParents() {
50
+ return false; // No hierarchical relationships
51
+ }
52
+
53
+ hasAnyDisplays(languages) {
54
+ const langs = this._ensureLanguages(languages);
55
+ if (this._hasAnySupplementDisplays(langs)) {
56
+ return true;
57
+ }
58
+ return super.hasAnyDisplays(langs);
59
+ }
60
+
61
+ // Core concept methods
62
+ async code(code) {
63
+
64
+ const ctxt = await this.#ensureContext(code);
65
+ return ctxt ? ctxt.code : null;
66
+ }
67
+
68
+ async display(code) {
69
+
70
+ const ctxt = await this.#ensureContext(code);
71
+ if (!ctxt) {
72
+ return null;
73
+ }
74
+ if (ctxt.display && this.opContext.langs.isEnglishOrNothing()) {
75
+ return ctxt.display.trim();
76
+ }
77
+ let disp = this._displayFromSupplements(ctxt.code);
78
+ if (disp) {
79
+ return disp;
80
+ }
81
+ return ctxt.display ? ctxt.display.trim() : '';
82
+ }
83
+
84
+ async definition(code) {
85
+
86
+ await this.#ensureContext(code);
87
+ return null; // No definitions provided
88
+ }
89
+
90
+ async isAbstract(code) {
91
+
92
+ await this.#ensureContext(code);
93
+ return false; // No abstract concepts
94
+ }
95
+
96
+ async isInactive(code) {
97
+
98
+ await this.#ensureContext(code);
99
+ return false; // No inactive concepts
100
+ }
101
+
102
+ async isDeprecated(code) {
103
+
104
+ await this.#ensureContext(code);
105
+ return false; // No deprecated concepts
106
+ }
107
+
108
+ async designations(code, displays) {
109
+
110
+ const ctxt = await this.#ensureContext(code);
111
+ if (ctxt != null) {
112
+ displays.addDesignation(true, 'active', 'en', CodeSystem.makeUseForDisplay(), ctxt.display);
113
+ this._listSupplementDesignations(ctxt.code, displays);
114
+ }
115
+ }
116
+
117
+ async #ensureContext(code) {
118
+ if (!code) {
119
+ return code;
120
+ }
121
+ if (typeof code === 'string') {
122
+ const ctxt = await this.locate(code);
123
+ if (!ctxt.context) {
124
+ throw new Error(ctxt.message ? ctxt.message : `Currency Code '${code}' not found`);
125
+ } else {
126
+ return ctxt.context;
127
+ }
128
+ }
129
+ if (code instanceof CurrencyConcept) {
130
+ return code;
131
+ }
132
+ throw new Error("Unknown Type at #ensureContext: " + (typeof code));
133
+ }
134
+
135
+ // Lookup methods
136
+ async locate(code) {
137
+
138
+ assert(!code || typeof code === 'string', 'code must be string');
139
+ if (!code) return { context: null, message: 'Empty code' };
140
+
141
+ const concept = this.codeMap.get(code);
142
+ if (concept) {
143
+ return { context: concept, message: null };
144
+ }
145
+ return { context: null, message: undefined };
146
+ }
147
+
148
+ // Iterator methods
149
+ async iterator(code) {
150
+
151
+ const ctxt = await this.#ensureContext(code);
152
+ if (!ctxt) {
153
+ return { index: 0, total: this.totalCount() };
154
+ }
155
+ return null; // No child iteration
156
+ }
157
+
158
+ async nextContext(iteratorContext) {
159
+
160
+ assert(iteratorContext, 'iteratorContext must be provided');
161
+ if (iteratorContext && iteratorContext.index < iteratorContext.total) {
162
+ const concept = this.codes[iteratorContext.index];
163
+ iteratorContext.index++;
164
+ return concept;
165
+ }
166
+ return null;
167
+ }
168
+
169
+ // Filtering methods
170
+ async doesFilter(prop, op, value) {
171
+
172
+ assert(prop != null && typeof prop === 'string', 'prop must be a non-null string');
173
+ assert(op != null && typeof op === 'string', 'op must be a non-null string');
174
+ assert(value != null && typeof value === 'string', 'value must be a non-null string');
175
+
176
+ return prop === 'decimals' && op === 'equals';
177
+ }
178
+
179
+ async searchFilter(filterContext, filter, sort) {
180
+
181
+ assert(filterContext && filterContext instanceof FilterExecutionContext, 'filterContext must be a FilterExecutionContext');
182
+ assert(filter && typeof filter === 'string', 'filter must be a non-null string');
183
+ assert(typeof sort === 'boolean', 'sort must be a boolean');
184
+
185
+ throw new Error('Search filter not implemented for ISO 4217');
186
+ }
187
+
188
+ async filter(filterContext, prop, op, value) {
189
+
190
+ assert(filterContext && filterContext instanceof FilterExecutionContext, 'filterContext must be a FilterExecutionContext');
191
+ assert(prop != null && typeof prop === 'string', 'prop must be a non-null string');
192
+ assert(op != null && typeof op === 'string', 'op must be a non-null string');
193
+ assert(value != null && typeof value === 'string', 'value must be a non-null string');
194
+
195
+ if (prop === 'decimals' && op === 'equals') {
196
+ const result = new CurrencyConceptFilter();
197
+
198
+ for (const concept of this.codes) {
199
+ if (concept.decimals.toString() === value) {
200
+ result.list.push(concept);
201
+ }
202
+ }
203
+ filterContext.filters.push(result);
204
+ } else {
205
+ throw new Error(`The filter ${prop} ${op} = ${value} is not supported for ${this.system()}`);
206
+ }
207
+ }
208
+
209
+ async executeFilters(filterContext) {
210
+
211
+ assert(filterContext && filterContext instanceof FilterExecutionContext, 'filterContext must be a FilterExecutionContext');
212
+ return filterContext.filters;
213
+ }
214
+
215
+ async filterSize(filterContext, set) {
216
+
217
+ assert(filterContext && filterContext instanceof FilterExecutionContext, 'filterContext must be a FilterExecutionContext');
218
+ assert(set && set instanceof CurrencyConceptFilter, 'set must be a CurrencyConceptFilter');
219
+ return set.list.length;
220
+ }
221
+
222
+ async filtersNotClosed(filterContext) {
223
+
224
+ assert(filterContext && filterContext instanceof FilterExecutionContext, 'filterContext must be a FilterExecutionContext');
225
+ return false; // Finite set
226
+ }
227
+
228
+ async filterMore(filterContext, set) {
229
+
230
+ assert(filterContext && filterContext instanceof FilterExecutionContext, 'filterContext must be a FilterExecutionContext');
231
+ assert(set && set instanceof CurrencyConceptFilter, 'set must be a CurrencyConceptFilter');
232
+ set.cursor++;
233
+ return set.cursor < set.list.length;
234
+ }
235
+
236
+ async filterConcept(filterContext, set) {
237
+
238
+ assert(filterContext && filterContext instanceof FilterExecutionContext, 'filterContext must be a FilterExecutionContext');
239
+ assert(set && set instanceof CurrencyConceptFilter, 'set must be a CurrencyConceptFilter');
240
+ if (set.cursor >= 0 && set.cursor < set.list.length) {
241
+ return set.list[set.cursor];
242
+ }
243
+ return null;
244
+ }
245
+
246
+ async filterLocate(filterContext, set, code) {
247
+
248
+ assert(filterContext && filterContext instanceof FilterExecutionContext, 'filterContext must be a FilterExecutionContext');
249
+ assert(set && set instanceof CurrencyConceptFilter, 'set must be a CurrencyConceptFilter');
250
+ assert(typeof code === 'string', 'code must be non-null string');
251
+
252
+ for (const concept of set.list) {
253
+ if (concept.code === code) {
254
+ return concept;
255
+ }
256
+ }
257
+ return `Code '${code}' not found in filter set`;
258
+ }
259
+
260
+ async filterCheck(filterContext, set, concept) {
261
+
262
+ assert(filterContext && filterContext instanceof FilterExecutionContext, 'filterContext must be a FilterExecutionContext');
263
+ assert(set && set instanceof CurrencyConceptFilter, 'set must be a CurrencyConceptFilter');
264
+ const ctxt = await this.#ensureContext(concept);
265
+ return set.list.includes(ctxt);
266
+ }
267
+
268
+
269
+ // Subsumption
270
+ async subsumesTest(codeA, codeB) {
271
+ await this.#ensureContext(codeA);
272
+ await this.#ensureContext(codeB);
273
+ return 'not-subsumed'; // No subsumption relationships
274
+ }
275
+
276
+ async locateIsA(code, parent) {
277
+ await this.#ensureContext(code);
278
+ await this.#ensureContext(parent);
279
+ return { context: null, message: 'Subsumption not supported for ISO 4217' };
280
+ }
281
+
282
+
283
+ versionAlgorithm() {
284
+ return null;
285
+ }
286
+ }
287
+
288
+ class Iso4217FactoryProvider extends CodeSystemFactoryProvider {
289
+ constructor(i18n) {
290
+ super(i18n);
291
+ this.uses = 0;
292
+ this.codes = null;
293
+ this.codeMap = null;
294
+ }
295
+
296
+ defaultVersion() {
297
+ return null; // No versioning for ISO 4217
298
+ }
299
+
300
+ // Metadata methods
301
+ system() {
302
+ return 'urn:iso:std:iso:4217';
303
+ }
304
+
305
+ version() {
306
+ return null; // No version specified
307
+ }
308
+
309
+ build(opContext, supplements) {
310
+ this.uses++;
311
+ return new Iso4217Services(opContext, supplements, this.codes, this.codeMap);
312
+ }
313
+
314
+ useCount() {
315
+ return this.uses;
316
+ }
317
+
318
+ // eslint-disable-next-line no-unused-vars
319
+ async buildKnownValueSet(url, version) {
320
+ return null;
321
+ }
322
+
323
+ recordUse() {
324
+ this.uses++;
325
+ }
326
+
327
+ async load() {
328
+ this.codes = [];
329
+ this.codeMap = new Map();
330
+
331
+ // Currency data: [code, decimals, symbol, display]
332
+ const data = [
333
+ ['AED', 2, 'DH', 'United Arab Emirates dirham'],
334
+ ['AFN', 2, '؋', 'Afghan afghani'],
335
+ ['ALL', 2, 'Lek', 'Albanian lek'],
336
+ ['AMD', 2, '', 'Armenian dram'],
337
+ ['ANG', 2, 'ƒ', 'Netherlands Antillean guilder'],
338
+ ['AOA', 2, 'Kz', 'Angolan kwanza'],
339
+ ['ARS', 2, '$', 'Argentine peso'],
340
+ ['AUD', 2, '$', 'Australian dollar'],
341
+ ['AWG', 2, 'ƒ', 'Aruban florin'],
342
+ ['AZN', 2, '₼', 'Azerbaijani manat'],
343
+ ['BAM', 2, 'KM', 'Bosnia and Herzegovina convertible mark'],
344
+ ['BBD', 2, '$', 'Barbados dollar'],
345
+ ['BDT', 2, '', 'Bangladeshi taka'],
346
+ ['BGN', 2, 'лв', 'Bulgarian lev'],
347
+ ['BHD', 3, '', 'Bahraini dinar'],
348
+ ['BIF', 0, '', 'Burundian franc'],
349
+ ['BMD', 2, '', 'Bermudian dollar'],
350
+ ['BND', 2, '$', 'Brunei dollar'],
351
+ ['BOB', 2, '', 'Boliviano'],
352
+ ['BOV', 2, '', 'Bolivian Mvdol (funds code)'],
353
+ ['BRL', 2, 'R$', 'Brazilian real'],
354
+ ['BSD', 2, '', 'Bahamian dollar'],
355
+ ['BTN', 2, '', 'Bhutanese ngultrum'],
356
+ ['BWP', 2, '', 'Botswana pula'],
357
+ ['BYN', 2, '', 'Belarusian ruble'],
358
+ ['BZD', 2, '', 'Belize dollar'],
359
+ ['CAD', 2, '$', 'Canadian dollar'],
360
+ ['CDF', 2, '', 'Congolese franc'],
361
+ ['CHE', 2, '', 'WIR Euro (complementary currency)'],
362
+ ['CHF', 2, 'CHF', 'Swiss franc'],
363
+ ['CHW', 2, '', 'WIR Franc (complementary currency)'],
364
+ ['CLF', 4, '', 'Unidad de Fomento (funds code)'],
365
+ ['CLP', 0, '$', 'Chilean peso'],
366
+ ['CNY', 2, '¥', 'Renminbi (Chinese) yuan'],
367
+ ['COP', 2, '$', 'Colombian peso'],
368
+ ['COU', 2, '', 'Unidad de Valor Real (UVR) (funds code)'],
369
+ ['CRC', 2, '₡', 'Costa Rican colon'],
370
+ ['CUC', 2, '', 'Cuban convertible peso'],
371
+ ['CUP', 2, '₱', 'Cuban peso'],
372
+ ['CVE', 0, '', 'Cape Verde escudo'],
373
+ ['CZK', 2, 'Kč', 'Czech koruna'],
374
+ ['DJF', 0, '', 'Djiboutian franc'],
375
+ ['DKK', 2, 'kr', 'Danish krone'],
376
+ ['DOP', 2, 'RD$', 'Dominican peso'],
377
+ ['DZD', 2, '', 'Algerian dinar'],
378
+ ['EGP', 2, '£', 'Egyptian pound'],
379
+ ['ERN', 2, '', 'Eritrean nakfa'],
380
+ ['ETB', 2, '', 'Ethiopian birr'],
381
+ ['EUR', 2, '€', 'Euro'],
382
+ ['FJD', 2, '$', 'Fiji dollar'],
383
+ ['FKP', 2, '£', 'Falkland Islands pound'],
384
+ ['GBP', 2, '£', 'Pound sterling'],
385
+ ['GEL', 2, '', 'Georgian lari'],
386
+ ['GGP', 2, '£', 'Guernsey Pound'],
387
+ ['GHS', 2, '¢', 'Ghanaian cedi'],
388
+ ['GIP', 2, '£', 'Gibraltar pound'],
389
+ ['GMD', 2, '', 'Gambian dalasi'],
390
+ ['GNF', 0, '', 'Guinean franc'],
391
+ ['GTQ', 2, 'Q', 'Guatemalan quetzal'],
392
+ ['GYD', 2, '$', 'Guyanese dollar'],
393
+ ['HKD', 2, '$', 'Hong Kong dollar'],
394
+ ['HNL', 2, 'L', 'Honduran lempira'],
395
+ ['HRK', 2, 'kn', 'Croatian kuna'],
396
+ ['HTG', 2, '', 'Haitian gourde'],
397
+ ['HUF', 2, 'Ft', 'Hungarian forint'],
398
+ ['IDR', 2, 'Rp', 'Indonesian rupiah'],
399
+ ['ILS', 2, '₪', 'Israeli new shekel'],
400
+ ['IMP', 2, '£', 'Isle of Man Pound'],
401
+ ['INR', 2, '', 'Indian rupee'],
402
+ ['IQD', 3, '', 'Iraqi dinar'],
403
+ ['IRR', 2, '﷼', 'Iranian rial'],
404
+ ['ISK', 0, 'kr', 'Icelandic króna'],
405
+ ['JEP', 2, '£', 'Jersey Pound'],
406
+ ['JMD', 2, 'J$', 'Jamaican dollar'],
407
+ ['JOD', 3, '', 'Jordanian dinar'],
408
+ ['JPY', 0, '¥', 'Japanese yen'],
409
+ ['KES', 2, '', 'Kenyan shilling'],
410
+ ['KGS', 2, 'лв', 'Kyrgyzstani som'],
411
+ ['KHR', 2, '៛', 'Cambodian riel'],
412
+ ['KMF', 0, '', 'Comoro franc'],
413
+ ['KPW', 2, '₩', 'North Korean won'],
414
+ ['KRW', 0, '₩', 'South Korean won'],
415
+ ['KWD', 3, '', 'Kuwaiti dinar'],
416
+ ['KYD', 2, '$', 'Cayman Islands dollar'],
417
+ ['KZT', 2, 'лв', 'Kazakhstani tenge'],
418
+ ['LAK', 2, '₭', 'Lao kip'],
419
+ ['LBP', 2, '£', 'Lebanese pound'],
420
+ ['LKR', 2, '₨', 'Sri Lankan rupee'],
421
+ ['LRD', 2, '$', 'Liberian dollar'],
422
+ ['LSL', 2, '', 'Lesotho loti'],
423
+ ['LYD', 3, '', 'Libyan dinar'],
424
+ ['MAD', 2, '', 'Moroccan dirham'],
425
+ ['MDL', 2, '', 'Moldovan leu'],
426
+ ['MGA', 1, '', 'Malagasy ariary'],
427
+ ['MKD', 2, 'ден', 'Macedonian denar'],
428
+ ['MMK', 2, '', 'Myanmar kyat'],
429
+ ['MNT', 2, '₮', 'Mongolian tögrög'],
430
+ ['MOP', 2, '', 'Macanese pataca'],
431
+ ['MRU', 1, '', 'Mauritanian ouguiya'],
432
+ ['MUR', 2, '₨', 'Mauritian rupee'],
433
+ ['MVR', 2, '', 'Maldivian rufiyaa'],
434
+ ['MWK', 2, '', 'Malawian kwacha'],
435
+ ['MXN', 2, '$', 'Mexican peso'],
436
+ ['MXV', 2, '', 'Mexican Unidad de Inversion (UDI) (funds code)'],
437
+ ['MYR', 2, 'RM', 'Malaysian ringgit'],
438
+ ['MZN', 2, 'MT', 'Mozambican metical'],
439
+ ['NAD', 2, '$', 'Namibian dollar'],
440
+ ['NGN', 2, '₦', 'Nigerian naira'],
441
+ ['NIO', 2, 'C$', 'Nicaraguan córdoba'],
442
+ ['NOK', 2, 'kr', 'Norwegian krone'],
443
+ ['NPR', 2, '₨', 'Nepalese rupee'],
444
+ ['NZD', 2, '$', 'New Zealand dollar'],
445
+ ['OMR', 3, '﷼', 'Omani rial'],
446
+ ['PAB', 2, 'B/.', 'Panamanian balboa'],
447
+ ['PEN', 2, 'S/.', 'Peruvian Sol'],
448
+ ['PGK', 2, '', 'Papua New Guinean kina'],
449
+ ['PHP', 2, '₱', 'Philippine piso'],
450
+ ['PKR', 2, '₨', 'Pakistani rupee'],
451
+ ['PLN', 2, 'zł', 'Polish złoty'],
452
+ ['PYG', 0, 'Gs', 'Paraguayan guaraní'],
453
+ ['QAR', 2, '﷼', 'Qatari riyal'],
454
+ ['RON', 2, 'lei', 'Romanian leu'],
455
+ ['RSD', 2, 'Дин.', 'Serbian dinar'],
456
+ ['RUB', 2, '₽', 'Russian ruble'],
457
+ ['RWF', 0, '', 'Rwandan franc'],
458
+ ['SAR', 2, '﷼', 'Saudi riyal'],
459
+ ['SBD', 2, '$', 'Solomon Islands dollar'],
460
+ ['SCR', 2, '₨', 'Seychelles rupee'],
461
+ ['SDG', 2, '', 'Sudanese pound'],
462
+ ['SEK', 2, 'kr', 'Swedish krona/kronor'],
463
+ ['SGD', 2, '$', 'Singapore dollar'],
464
+ ['SHP', 2, '£', 'Saint Helena pound'],
465
+ ['SLL', 2, '', 'Sierra Leonean leone'],
466
+ ['SOS', 2, 'S', 'Somali shilling'],
467
+ ['SRD', 2, '$', 'Surinamese dollar'],
468
+ ['SSP', 2, '', 'South Sudanese pound'],
469
+ ['STN', 2, '', 'São Tomé and Príncipe dobra'],
470
+ ['SVC', 2, '$', 'Salvadoran colón'],
471
+ ['SYP', 2, '£', 'Syrian pound'],
472
+ ['SZL', 2, '', 'Swazi lilangeni'],
473
+ ['THB', 2, '฿', 'Thai baht'],
474
+ ['TJS', 2, '', 'Tajikistani somoni'],
475
+ ['TMT', 2, '', 'Turkmenistan manat'],
476
+ ['TND', 3, '', 'Tunisian dinar'],
477
+ ['TOP', 2, '', 'Tongan paʻanga'],
478
+ ['TRY', 2, '', 'Turkish lira'],
479
+ ['TTD', 2, 'TT$', 'Trinidad and Tobago dollar'],
480
+ ['TVD', 2, '$', 'Tuvalu Dollar'],
481
+ ['TWD', 2, 'NT$', 'New Taiwan dollar'],
482
+ ['TZS', 2, '', 'Tanzanian shilling'],
483
+ ['UAH', 2, '₴', 'Ukrainian hryvnia'],
484
+ ['UGX', 0, '', 'Ugandan shilling'],
485
+ ['USD', 2, '$', 'United States dollar'],
486
+ ['USN', 2, '', 'United States dollar (next day) (funds code)'],
487
+ ['UYI', 0, '$U', 'Uruguay Peso en Unidades Indexadas (URUIURUI) (funds code)'],
488
+ ['UYU', 2, '', 'Uruguayan peso'],
489
+ ['UZS', 2, 'лв', 'Uzbekistan som'],
490
+ ['VEF', 2, 'Bs', 'Venezuelan bolívar'],
491
+ ['VND', 0, '₫', 'Vietnamese đồng'],
492
+ ['VUV', 0, '', 'Vanuatu vatu'],
493
+ ['WST', 2, '', 'Samoan tala'],
494
+ ['XAF', 0, '', 'CFA franc BEAC'],
495
+ ['XAG', -1, '', 'Silver (one troy ounce)'],
496
+ ['XAU', -1, '', 'Gold (one troy ounce)'],
497
+ ['XBA', -1, '', 'European Composite Unit (EURCO) (bond market unit)'],
498
+ ['XBB', -1, '', 'European Monetary Unit (E.M.U.-6) (bond market unit)'],
499
+ ['XBC', -1, '', 'European Unit of Account 9 (E.U.A.-9) (bond market unit)'],
500
+ ['XBD', -1, '', 'European Unit of Account 17 (E.U.A.-17) (bond market unit)'],
501
+ ['XCD', 2, '$', 'East Caribbean dollar'],
502
+ ['XDR', -1, '', 'Special drawing rights'],
503
+ ['XOF', 0, '', 'CFA franc BCEAO'],
504
+ ['XPD', -1, '', 'Palladium (one troy ounce)'],
505
+ ['XPF', 0, '', 'CFP franc (franc Pacifique)'],
506
+ ['XPT', -1, '', 'Platinum (one troy ounce)'],
507
+ ['XSU', -1, '', 'SUCRE'],
508
+ ['XTS', -1, '', 'Code reserved for testing purposes'],
509
+ ['XUA', -1, '', 'ADB Unit of Account'],
510
+ ['XXX', -1, '', 'No currency'],
511
+ ['YER', 2, '﷼', 'Yemeni rial'],
512
+ ['ZAR', 2, 'R', 'South African rand'],
513
+ ['ZMW', 2, '', 'Zambian kwacha'],
514
+ ['ZWL', 2, 'Z$', 'Zimbabwean dollar A/10']
515
+ ];
516
+
517
+ // Load concepts into arrays and map
518
+ for (const [code, decimals, symbol, display] of data) {
519
+ const concept = new CurrencyConcept(code, display, decimals, symbol);
520
+ this.codes.push(concept);
521
+ this.codeMap.set(code, concept);
522
+ }
523
+ }
524
+ name() {
525
+ return 'Currencies';
526
+ }
527
+
528
+ id() {
529
+ return "currencies";
530
+ }
531
+
532
+ }
533
+
534
+ module.exports = {
535
+ Iso4217Services,
536
+ Iso4217FactoryProvider,
537
+ CurrencyConcept,
538
+ CurrencyConceptFilter
539
+ };