fhirsmith 0.18.2 → 1.0.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/ACCESSIBILITY.md +119 -0
- package/CHANGELOG.md +149 -0
- package/CONFIGURATION.md +305 -0
- package/LICENSE +29 -0
- package/README.md +29 -122
- package/cluster.js +1220 -0
- package/cluster.md +707 -0
- package/config-template.json +77 -8
- package/extension-tracker/extension-tracker-template.html +5 -8
- package/extension-tracker/extension-tracker.js +0 -2
- package/folder/folder.js +7 -6
- package/ips/analysis.js +560 -0
- package/ips/ips-template.html +5 -8
- package/ips/ips.js +132 -59
- package/ips/nationality.js +120 -0
- package/ips/pipeline.js +74 -21
- package/ips/presenter.js +1 -1
- package/ips/readme.md +132 -25
- package/ips/render.js +466 -77
- package/ips/store.js +79 -22
- package/ips/structure.js +247 -0
- package/ips/terminology.js +1 -1
- package/library/body-limit.js +22 -0
- package/library/cache-generation.js +15 -0
- package/library/cgroup-memory.js +133 -1
- package/library/cluster-counts.js +121 -0
- package/library/cluster-events.js +153 -0
- package/library/cluster-metrics.js +193 -0
- package/library/cluster-status.js +468 -0
- package/library/config-reader.js +96 -0
- package/library/daily-report.js +100 -2
- package/library/html-server.js +27 -1
- package/library/i18nsupport.js +23 -1
- package/library/keep-alive.js +18 -0
- package/library/languages.js +17 -3
- package/library/logger.js +31 -0
- package/library/memory-guard.js +428 -0
- package/library/native-memory.js +52 -0
- package/library/npm-audit.js +51 -25
- package/library/openapi-doc.js +7 -5
- package/library/package-manager.js +8 -0
- package/library/role.js +197 -0
- package/library/server-credentials.js +169 -0
- package/library/sqlite-utilities.js +59 -0
- package/library/ssrf-guard.js +100 -0
- package/library/static-response-stats.js +16 -0
- package/library/version-utilities.js +50 -0
- package/library/worker-count.js +192 -0
- package/nginx.md +30 -11
- package/npmprojector/indexer.js +18 -10
- package/package.json +11 -8
- package/packages/feed-check-page.js +117 -0
- package/packages/feed-check.js +279 -0
- package/packages/npm-check.js +57 -3
- package/packages/npm-signing.js +219 -0
- package/packages/openapi.yaml +207 -1
- package/packages/package-crawler.js +322 -41
- package/packages/packages-template.html +6 -8
- package/packages/packages.js +604 -57
- package/packages/readme.md +113 -1
- package/publisher/publisher-template.html +2 -5
- package/publisher/publisher.js +121 -110
- package/publisher/readme.md +75 -0
- package/registry/crawler.js +84 -108
- package/registry/documentation/configuration.md +34 -0
- package/registry/registry-template.html +5 -8
- package/registry/registry.js +5 -4
- package/root-bare-template.html +7 -4
- package/root-template.html +5 -8
- package/server.js +398 -198
- package/shl/shl.js +38 -37
- package/static/a11y/a11y-check.js +832 -0
- package/static/a11y/axe.min.js +12 -0
- package/static/assets/css/bootstrap-fhir.css +15 -15
- package/static/assets/images/flags/au.svg +18 -0
- package/static/assets/images/flags/unknown.svg +11 -0
- package/static/assets/images/flags/us.svg +63 -0
- package/static/assets/images/icon_audit.png +0 -0
- package/static/assets/images/icon_clinical.png +0 -0
- package/static/assets/images/icon_document.png +0 -0
- package/static/assets/images/icon_external.png +0 -0
- package/static/assets/images/icon_medication.png +0 -0
- package/static/assets/images/icon_organization.png +0 -0
- package/static/assets/images/icon_other.png +0 -0
- package/static/assets/images/icon_person.png +0 -0
- package/static/assets/images/icon_section.png +0 -0
- package/stats-db.js +45 -0
- package/stats.js +197 -10
- package/testing/testing-template.html +5 -8
- package/token/nginx_passport_setup.md +1 -1
- package/token/security_guide.md +1 -1
- package/token/token-template.html +2 -5
- package/token/token.js +40 -36
- package/translations/Messages.properties +19 -0
- package/tx/README.md +154 -4
- package/tx/closure/closure-store.js +126 -3
- package/tx/cm/cm-database.js +69 -57
- package/tx/cm/cm-package.js +29 -1
- package/tx/cs/cs-api.js +284 -19
- package/tx/cs/cs-api.md +41 -4
- package/tx/cs/cs-areacode.js +1 -1
- package/tx/cs/cs-country.js +17 -5
- package/tx/cs/cs-cpt.js +33 -16
- package/tx/cs/cs-cs.js +148 -14
- package/tx/cs/cs-currency.js +1 -1
- package/tx/cs/cs-icd11.js +21 -13
- package/tx/cs/cs-icf.js +22 -3
- package/tx/cs/cs-lang.js +2 -2
- package/tx/cs/cs-loinc.js +185 -66
- package/tx/cs/cs-mimetypes.js +12 -2
- package/tx/cs/cs-ndc.js +40 -25
- package/tx/cs/cs-omop.js +54 -29
- package/tx/cs/cs-rxnorm.js +300 -196
- package/tx/cs/cs-snomed.js +608 -64
- package/tx/cs/cs-ucum.js +14 -4
- package/tx/cs/cs-unii.js +18 -14
- package/tx/cs/cs-virtual.js +210 -0
- package/tx/ecosystem-resolver.js +413 -0
- package/tx/html/cluster-dash-metrics.liquid +26 -0
- package/tx/html/cluster-home-metrics.liquid +31 -0
- package/tx/html/cluster-metrics-script.liquid +251 -0
- package/tx/html/codesystem-operations.liquid +3 -3
- package/tx/html/ecl-panel.liquid +1 -1
- package/tx/html/external-metrics.liquid +17 -0
- package/tx/html/operations-form.liquid +17 -17
- package/tx/html/search-form.liquid +11 -11
- package/tx/html/status-line.liquid +58 -0
- package/tx/html/status-panel.liquid +140 -0
- package/tx/html/status-tasks.liquid +25 -0
- package/tx/html/tx-template.html +2 -5
- package/tx/importers/atc-to-fhir.js +17 -16
- package/tx/importers/export-icd11-codesystem.js +3 -2
- package/tx/importers/import-icd11.js +4 -3
- package/tx/importers/import-loinc.module.js +118 -56
- package/tx/importers/import-ndc.module.js +56 -44
- package/tx/importers/import-rxnorm.module.js +118 -79
- package/tx/importers/import-sct.module.js +57 -58
- package/tx/importers/import-unii.module.js +37 -36
- package/tx/importers/subset-loinc.module.js +49 -48
- package/tx/importers/subset-rxnorm.module.js +29 -28
- package/tx/importers/terminal.js +18 -0
- package/tx/importers/tx-import-base.js +13 -12
- package/tx/importers/tx-import-settings.js +5 -4
- package/tx/importers/tx-import.js +53 -52
- package/tx/library/canonical-resource.js +49 -0
- package/tx/library/codesystem.js +94 -5
- package/tx/library/designations.js +45 -2
- package/tx/library/extensions.js +13 -7
- package/tx/library/implicit-valuesets.js +66 -0
- package/tx/library/renderer.js +77 -21
- package/tx/library/sqlite-utilities.js +2 -0
- package/tx/library/ucum-parsers.js +11 -1
- package/tx/library/wait-for-cache.js +43 -0
- package/tx/library.js +321 -22
- package/tx/openapi-operations.js +6 -4
- package/tx/operation-context.js +460 -99
- package/tx/params.js +25 -0
- package/tx/problems.js +3 -5
- package/tx/provider.js +278 -42
- package/tx/resource-cache-sqlite.js +1050 -0
- package/tx/sct/ecl.js +47 -6
- package/tx/sct/editions.js +39 -0
- package/tx/sct/expressions.js +10 -1
- package/tx/sct/load-config.js +107 -0
- package/tx/sct/mmap.js +109 -0
- package/tx/sct/structures.js +166 -13
- package/tx/sct/text-index.js +5 -1
- package/tx/syndication/syndication-feed.js +2 -2
- package/tx/tx-html.js +44 -8
- package/tx/tx.fhir.org.yml +8 -8
- package/tx/tx.js +282 -80
- package/tx/usage-tracker.js +39 -11
- package/tx/vs/vs-api.js +19 -0
- package/tx/vs/vs-database.js +386 -62
- package/tx/vs/vs-package.js +27 -4
- package/tx/vs/vs-vsac.js +648 -100
- package/tx/workers/batch-validate.js +37 -10
- package/tx/workers/batch.js +6 -1
- package/tx/workers/cache-control.js +15 -4
- package/tx/workers/closure.js +156 -13
- package/tx/workers/compare.js +8 -5
- package/tx/workers/expand.js +1173 -289
- package/tx/workers/metadata.js +35 -0
- package/tx/workers/search.js +53 -1
- package/tx/workers/supplement-filters.js +145 -0
- package/tx/workers/translate.js +169 -4
- package/tx/workers/validate.js +223 -119
- package/tx/workers/worker.js +123 -31
- package/tx/xversion/xv-valueset.js +7 -4
- package/utilities/submit-test-report.js +3 -1
- package/utilities/tx-stress-test.js +482 -0
- package/vcl/readme.md +37 -0
- package/vcl/vcl-parser.js +15 -0
- package/xig/readme.md +52 -0
- package/xig/xig-template.html +5 -8
- package/xig/xig.js +238 -422
- package/changelog-template.md +0 -22
- package/registry/test-runner.js +0 -237
- package/release.sh +0 -80
- package/test-scripts/repro-re2-wasm-leak.js +0 -34
- package/tsconfig.eslint.json +0 -9
- package/tx/html/dash-metrics.liquid +0 -147
- package/tx/html/home-metrics.liquid +0 -225
package/tx/usage-tracker.js
CHANGED
|
@@ -1,22 +1,46 @@
|
|
|
1
1
|
|
|
2
|
+
const { setImmediate: yieldToEventLoop } = require('timers/promises');
|
|
3
|
+
|
|
4
|
+
// The startup scan reads every value set (thousands with the npm packages, VSAC), about a second
|
|
5
|
+
// of work: give requests a turn every YIELD_INTERVAL_MS of it.
|
|
6
|
+
const YIELD_INTERVAL_MS = 10;
|
|
7
|
+
|
|
2
8
|
class ConceptUsageTracker {
|
|
3
9
|
|
|
4
|
-
|
|
10
|
+
// Defaults for usageTrackerMaxCodes and usageTrackerMaxCodeLength: most codes
|
|
11
|
+
// tracked, 2x the about 500,000 codes the value sets of a full library list, and
|
|
12
|
+
// the longest code, 2.5x the longest of those (40 characters). Codes beyond either
|
|
13
|
+
// limit aren't tracked, so validating made-up codes can't grow the map forever.
|
|
14
|
+
static MAX_CODES = 1000000;
|
|
15
|
+
static MAX_CODE_LENGTH = 100;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @param {number} [maxCodes] - most codes tracked; Infinity = no limit
|
|
19
|
+
* @param {number} [maxCodeLength] - longest code tracked; Infinity = no limit
|
|
20
|
+
*/
|
|
21
|
+
constructor(maxCodes = ConceptUsageTracker.MAX_CODES, maxCodeLength = ConceptUsageTracker.MAX_CODE_LENGTH) {
|
|
5
22
|
this.map = new Map();
|
|
23
|
+
this.codes = 0;
|
|
24
|
+
this.maxCodes = maxCodes;
|
|
25
|
+
this.maxCodeLength = maxCodeLength;
|
|
6
26
|
}
|
|
7
27
|
|
|
8
28
|
async scanValueSets(library) {
|
|
9
29
|
let c = 0;
|
|
30
|
+
let sliceStart = Date.now();
|
|
10
31
|
for (let vsp of library.valueSetProviders) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
32
|
+
await vsp.scanAllValueSets(async (vs) => {
|
|
33
|
+
// in the callback, so it yields however the provider reads its value sets
|
|
34
|
+
if (Date.now() - sliceStart >= YIELD_INTERVAL_MS) {
|
|
35
|
+
await yieldToEventLoop();
|
|
36
|
+
sliceStart = Date.now();
|
|
37
|
+
}
|
|
38
|
+
if (vs.jsonObj.compose) {
|
|
15
39
|
if (await this.scanValueSet(vs.jsonObj.compose)) {
|
|
16
40
|
c++;
|
|
17
41
|
}
|
|
18
42
|
}
|
|
19
|
-
}
|
|
43
|
+
});
|
|
20
44
|
}
|
|
21
45
|
return c;
|
|
22
46
|
}
|
|
@@ -41,14 +65,18 @@ class ConceptUsageTracker {
|
|
|
41
65
|
|
|
42
66
|
seeConcept(system, code) {
|
|
43
67
|
let cs = this.map.get(system);
|
|
44
|
-
|
|
45
|
-
cs = new Map();
|
|
46
|
-
this.map.set(system, cs);
|
|
47
|
-
}
|
|
48
|
-
let ci = cs.get(code);
|
|
68
|
+
let ci = cs ? cs.get(code) : null;
|
|
49
69
|
if (!ci) {
|
|
70
|
+
if (this.codes >= this.maxCodes || code.length > this.maxCodeLength) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (!cs) {
|
|
74
|
+
cs = new Map();
|
|
75
|
+
this.map.set(system, cs);
|
|
76
|
+
}
|
|
50
77
|
ci = { count : 0 }
|
|
51
78
|
cs.set(code, ci);
|
|
79
|
+
this.codes++;
|
|
52
80
|
}
|
|
53
81
|
ci.count++;
|
|
54
82
|
}
|
package/tx/vs/vs-api.js
CHANGED
|
@@ -120,6 +120,25 @@ class AbstractValueSetProvider {
|
|
|
120
120
|
return [];
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
+
/**
|
|
124
|
+
* Call fn once for each url in listAllValueSets(), with the latest version of it (what
|
|
125
|
+
* fetchValueSet(url) returns), for the scans that look at every value set (see
|
|
126
|
+
* usage-tracker.js, problems.js). listAllValueSets() can list a url once per stored version:
|
|
127
|
+
* older versions are not scanned, and the latest is scanned only once, so the usage counts
|
|
128
|
+
* are not inflated by how many versions there are. A provider that doesn't hold its value
|
|
129
|
+
* sets in memory can do this more cheaply than fetching each one.
|
|
130
|
+
*
|
|
131
|
+
* @param {function(ValueSet): Promise<void>} fn
|
|
132
|
+
*/
|
|
133
|
+
async scanAllValueSets(fn) {
|
|
134
|
+
for (const url of new Set(await this.listAllValueSets())) {
|
|
135
|
+
const vs = await this.fetchValueSet(url);
|
|
136
|
+
if (vs) {
|
|
137
|
+
await fn(vs);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
123
142
|
async close() {
|
|
124
143
|
|
|
125
144
|
}
|