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.
- package/CHANGELOG.md +42 -0
- package/FHIRsmith.png +0 -0
- package/README.md +277 -0
- package/config-template.json +144 -0
- package/library/folder-setup.js +58 -0
- package/library/html-server.js +166 -0
- package/library/html.js +835 -0
- package/library/i18nsupport.js +259 -0
- package/library/languages.js +779 -0
- package/library/logger-telnet.js +205 -0
- package/library/logger.js +279 -0
- package/library/package-manager.js +876 -0
- package/library/utilities.js +196 -0
- package/library/version-utilities.js +1056 -0
- package/npmprojector/config-example.json +13 -0
- package/npmprojector/indexer.js +394 -0
- package/npmprojector/npmprojector.js +395 -0
- package/npmprojector/readme.md +174 -0
- package/npmprojector/watcher.js +335 -0
- package/package.json +119 -0
- package/packages/package-crawler.js +846 -0
- package/packages/packages-template.html +126 -0
- package/packages/packages.js +2838 -0
- package/passwords.ini +2 -0
- package/publisher/publisher-template.html +208 -0
- package/publisher/publisher.js +2167 -0
- package/publisher/task-draft.js +458 -0
- package/registry/api.js +735 -0
- package/registry/crawler.js +637 -0
- package/registry/model.js +513 -0
- package/registry/readme.md +243 -0
- package/registry/registry-data.json +121015 -0
- package/registry/registry-template.html +126 -0
- package/registry/registry.js +1395 -0
- package/registry/test-runner.js +237 -0
- package/root-template.html +124 -0
- package/server.js +524 -0
- package/shl/private-key.pem +5 -0
- package/shl/public-key.pem +18 -0
- package/shl/shl.js +1125 -0
- package/shl/vhl.js +69 -0
- package/static/FHIRsmith128.png +0 -0
- package/static/FHIRsmith16.png +0 -0
- package/static/FHIRsmith32.png +0 -0
- package/static/FHIRsmith64.png +0 -0
- package/static/assets/css/bootstrap-fhir.css +5302 -0
- package/static/assets/css/bootstrap-glyphicons.css +2 -0
- package/static/assets/css/bootstrap.css +4097 -0
- package/static/assets/css/jquery-ui.css +523 -0
- package/static/assets/css/jquery-ui.structure.css +863 -0
- package/static/assets/css/jquery-ui.structure.min.css +5 -0
- package/static/assets/css/jquery-ui.theme.css +439 -0
- package/static/assets/css/jquery-ui.theme.min.css +5 -0
- package/static/assets/css/jquery.ui.all.css +7 -0
- package/static/assets/css/modules.css +18 -0
- package/static/assets/css/project.css +367 -0
- package/static/assets/css/pygments-manni.css +66 -0
- package/static/assets/css/tags.css +74 -0
- package/static/assets/css/xml.css +2 -0
- package/static/assets/fonts/glyphiconshalflings-regular.eot +0 -0
- package/static/assets/fonts/glyphiconshalflings-regular.otf +0 -0
- package/static/assets/fonts/glyphiconshalflings-regular.svg +175 -0
- package/static/assets/fonts/glyphiconshalflings-regular.ttf +0 -0
- package/static/assets/fonts/glyphiconshalflings-regular.woff +0 -0
- package/static/assets/ico/apple-touch-icon-114-precomposed.png +0 -0
- package/static/assets/ico/apple-touch-icon-144-precomposed.png +0 -0
- package/static/assets/ico/apple-touch-icon-57-precomposed.png +0 -0
- package/static/assets/ico/apple-touch-icon-72-precomposed.png +0 -0
- package/static/assets/ico/favicon.ico +0 -0
- package/static/assets/ico/favicon.png +0 -0
- package/static/assets/images/fhir-logo-www.png +0 -0
- package/static/assets/images/fhir-logo.png +0 -0
- package/static/assets/images/hl7-logo.png +0 -0
- package/static/assets/images/logo_ansinew.jpg +0 -0
- package/static/assets/images/search.png +0 -0
- package/static/assets/images/stripe.png +0 -0
- package/static/assets/images/target.png +0 -0
- package/static/assets/images/tx-registry-root.gif +0 -0
- package/static/assets/images/tx-registry.png +0 -0
- package/static/assets/images/tx-server.png +0 -0
- package/static/assets/images/tx-version.png +0 -0
- package/static/assets/js/bootstrap.min.js +6 -0
- package/static/assets/js/fhir-gw.js +259 -0
- package/static/assets/js/fhir.js +2 -0
- package/static/assets/js/html5shiv.js +8 -0
- package/static/assets/js/jcookie.js +96 -0
- package/static/assets/js/jquery-ui.min.js +6 -0
- package/static/assets/js/jquery.js +10716 -0
- package/static/assets/js/jquery.min.js +2 -0
- package/static/assets/js/jquery.ui.core.js +314 -0
- package/static/assets/js/jquery.ui.draggable.js +825 -0
- package/static/assets/js/jquery.ui.mouse.js +162 -0
- package/static/assets/js/jquery.ui.resizable.js +842 -0
- package/static/assets/js/jquery.ui.widget.js +268 -0
- package/static/assets/js/json2.js +487 -0
- package/static/assets/js/jtip.js +97 -0
- package/static/assets/js/respond.min.js +6 -0
- package/static/assets/js/statuspage.js +70 -0
- package/static/assets/js/xml.js +2 -0
- package/static/dist/js/bootstrap.js +1964 -0
- package/static/favicon.png +0 -0
- package/static/fhir.css +626 -0
- package/static/icon-fhir-16.png +0 -0
- package/static/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- package/static/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- package/static/images/ui-bg_flat_10_000000_40x100.png +0 -0
- package/static/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- package/static/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- package/static/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- package/static/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- package/static/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- package/static/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- package/static/images/ui-icons_222222_256x240.png +0 -0
- package/static/images/ui-icons_228ef1_256x240.png +0 -0
- package/static/images/ui-icons_ef8c08_256x240.png +0 -0
- package/static/images/ui-icons_ffd27a_256x240.png +0 -0
- package/static/images/ui-icons_ffffff_256x240.png +0 -0
- package/static/js/jquery.effects.blind.js +49 -0
- package/static/js/jquery.effects.bounce.js +78 -0
- package/static/js/jquery.effects.clip.js +54 -0
- package/static/js/jquery.effects.core.js +763 -0
- package/static/js/jquery.effects.drop.js +50 -0
- package/static/js/jquery.effects.explode.js +79 -0
- package/static/js/jquery.effects.fade.js +32 -0
- package/static/js/jquery.effects.fold.js +56 -0
- package/static/js/jquery.effects.highlight.js +50 -0
- package/static/js/jquery.effects.pulsate.js +51 -0
- package/static/js/jquery.effects.scale.js +178 -0
- package/static/js/jquery.effects.shake.js +57 -0
- package/static/js/jquery.effects.slide.js +50 -0
- package/static/js/jquery.effects.transfer.js +45 -0
- package/static/js/jquery.ui.accordion.js +611 -0
- package/static/js/jquery.ui.autocomplete.js +612 -0
- package/static/js/jquery.ui.button.js +416 -0
- package/static/js/jquery.ui.datepicker.js +1823 -0
- package/static/js/jquery.ui.dialog.js +878 -0
- package/static/js/jquery.ui.droppable.js +296 -0
- package/static/js/jquery.ui.position.js +252 -0
- package/static/js/jquery.ui.progressbar.js +109 -0
- package/static/js/jquery.ui.selectable.js +266 -0
- package/static/js/jquery.ui.slider.js +666 -0
- package/static/js/jquery.ui.sortable.js +1077 -0
- package/static/js/jquery.ui.tabs.js +758 -0
- package/stats.js +80 -0
- package/test-cache/vsac/vsac-valuesets.db +0 -0
- package/token/nginx_passport_setup.md +383 -0
- package/token/security_guide.md +294 -0
- package/token/token-template.html +330 -0
- package/token/token.js +1300 -0
- package/translations/Messages.properties +1510 -0
- package/translations/Messages_ar.properties +1399 -0
- package/translations/Messages_de.properties +836 -0
- package/translations/Messages_es.properties +737 -0
- package/translations/Messages_fr.properties +1 -0
- package/translations/Messages_ja.properties +893 -0
- package/translations/Messages_nl.properties +1357 -0
- package/translations/Messages_pt.properties +1302 -0
- package/translations/Messages_ru.properties +1 -0
- package/translations/Messages_uz.properties +1 -0
- package/translations/Messages_zh.properties +1 -0
- package/translations/rendering-phrases.properties +1128 -0
- package/translations/rendering-phrases_ar.properties +1091 -0
- package/translations/rendering-phrases_de.properties +6 -0
- package/translations/rendering-phrases_es.properties +6 -0
- package/translations/rendering-phrases_fr.properties +624 -0
- package/translations/rendering-phrases_ja.properties +21 -0
- package/translations/rendering-phrases_nl.properties +970 -0
- package/translations/rendering-phrases_pt.properties +1020 -0
- package/translations/rendering-phrases_ru.properties +1094 -0
- package/translations/rendering-phrases_uz.properties +1 -0
- package/translations/rendering-phrases_zh.properties +1 -0
- package/tx/README.md +418 -0
- package/tx/cm/cm-api.js +110 -0
- package/tx/cm/cm-database.js +735 -0
- package/tx/cm/cm-package.js +325 -0
- package/tx/cs/cs-api.js +789 -0
- package/tx/cs/cs-areacode.js +615 -0
- package/tx/cs/cs-country.js +1110 -0
- package/tx/cs/cs-cpt.js +785 -0
- package/tx/cs/cs-cs.js +1579 -0
- package/tx/cs/cs-currency.js +539 -0
- package/tx/cs/cs-db.js +1321 -0
- package/tx/cs/cs-hgvs.js +329 -0
- package/tx/cs/cs-lang.js +465 -0
- package/tx/cs/cs-loinc.js +1485 -0
- package/tx/cs/cs-mimetypes.js +238 -0
- package/tx/cs/cs-ndc.js +704 -0
- package/tx/cs/cs-omop.js +1025 -0
- package/tx/cs/cs-provider-api.js +43 -0
- package/tx/cs/cs-provider-list.js +37 -0
- package/tx/cs/cs-rxnorm.js +808 -0
- package/tx/cs/cs-snomed.js +1102 -0
- package/tx/cs/cs-ucum.js +514 -0
- package/tx/cs/cs-unii.js +271 -0
- package/tx/cs/cs-uri.js +218 -0
- package/tx/cs/cs-usstates.js +305 -0
- package/tx/dev.fhir.org.yml +14 -0
- package/tx/fixtures/test-cases-setup.json +18 -0
- package/tx/fixtures/test-cases.yml +16 -0
- package/tx/html/codesystem-operations.liquid +25 -0
- package/tx/html/home-metrics.liquid +247 -0
- package/tx/html/operations-form.liquid +148 -0
- package/tx/html/search-form.liquid +62 -0
- package/tx/html/tx-template.html +133 -0
- package/tx/html/valueset-operations.liquid +54 -0
- package/tx/importers/atc-to-fhir.js +316 -0
- package/tx/importers/import-loinc.module.js +1536 -0
- package/tx/importers/import-ndc.module.js +1088 -0
- package/tx/importers/import-rxnorm.module.js +898 -0
- package/tx/importers/import-sct.module.js +2457 -0
- package/tx/importers/import-unii.module.js +601 -0
- package/tx/importers/readme.md +453 -0
- package/tx/importers/subset-loinc.module.js +1081 -0
- package/tx/importers/subset-rxnorm.module.js +938 -0
- package/tx/importers/tx-import-base.js +351 -0
- package/tx/importers/tx-import-settings.js +310 -0
- package/tx/importers/tx-import.js +357 -0
- package/tx/library/canonical-resource.js +88 -0
- package/tx/library/capabilitystatement.js +292 -0
- package/tx/library/codesystem.js +774 -0
- package/tx/library/conceptmap.js +568 -0
- package/tx/library/designations.js +932 -0
- package/tx/library/errors.js +77 -0
- package/tx/library/extensions.js +117 -0
- package/tx/library/namingsystem.js +322 -0
- package/tx/library/operation-outcome.js +127 -0
- package/tx/library/parameters.js +105 -0
- package/tx/library/renderer.js +1559 -0
- package/tx/library/terminologycapabilities.js +418 -0
- package/tx/library/ucum-parsers.js +1029 -0
- package/tx/library/ucum-service.js +370 -0
- package/tx/library/ucum-types.js +1099 -0
- package/tx/library/valueset.js +543 -0
- package/tx/library.js +676 -0
- package/tx/ocl/cm-ocl.js +106 -0
- package/tx/ocl/cs-ocl.js +39 -0
- package/tx/ocl/vs-ocl.js +105 -0
- package/tx/operation-context.js +568 -0
- package/tx/params.js +613 -0
- package/tx/provider.js +403 -0
- package/tx/sct/ecl.js +1560 -0
- package/tx/sct/expressions.js +2077 -0
- package/tx/sct/structures.js +1396 -0
- package/tx/tx-html.js +1063 -0
- package/tx/tx.fhir.org.yml +39 -0
- package/tx/tx.js +927 -0
- package/tx/vs/vs-api.js +112 -0
- package/tx/vs/vs-database.js +786 -0
- package/tx/vs/vs-package.js +358 -0
- package/tx/vs/vs-vsac.js +366 -0
- package/tx/workers/batch-validate.js +129 -0
- package/tx/workers/batch.js +361 -0
- package/tx/workers/closure.js +32 -0
- package/tx/workers/expand.js +1845 -0
- package/tx/workers/lookup.js +407 -0
- package/tx/workers/metadata.js +467 -0
- package/tx/workers/operations.js +34 -0
- package/tx/workers/read.js +164 -0
- package/tx/workers/search.js +384 -0
- package/tx/workers/subsumes.js +334 -0
- package/tx/workers/translate.js +492 -0
- package/tx/workers/validate.js +2504 -0
- package/tx/workers/worker.js +904 -0
- package/tx/xml/capabilitystatement-xml.js +63 -0
- package/tx/xml/codesystem-xml.js +62 -0
- package/tx/xml/conceptmap-xml.js +65 -0
- package/tx/xml/namingsystem-xml.js +65 -0
- package/tx/xml/operationoutcome-xml.js +127 -0
- package/tx/xml/parameters-xml.js +312 -0
- package/tx/xml/terminologycapabilities-xml.js +64 -0
- package/tx/xml/valueset-xml.js +64 -0
- package/tx/xml/xml-base.js +603 -0
- package/vcl/vcl-parser.js +1098 -0
- package/vcl/vcl.js +253 -0
- package/windows-install.js +19 -0
- package/xig/xig-template.html +124 -0
- 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 };
|