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/cs/cs-unii.js
ADDED
|
@@ -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
|
+
};
|
package/tx/cs/cs-uri.js
ADDED
|
@@ -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
|
+
};
|