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.
Files changed (203) hide show
  1. package/ACCESSIBILITY.md +119 -0
  2. package/CHANGELOG.md +149 -0
  3. package/CONFIGURATION.md +305 -0
  4. package/LICENSE +29 -0
  5. package/README.md +29 -122
  6. package/cluster.js +1220 -0
  7. package/cluster.md +707 -0
  8. package/config-template.json +77 -8
  9. package/extension-tracker/extension-tracker-template.html +5 -8
  10. package/extension-tracker/extension-tracker.js +0 -2
  11. package/folder/folder.js +7 -6
  12. package/ips/analysis.js +560 -0
  13. package/ips/ips-template.html +5 -8
  14. package/ips/ips.js +132 -59
  15. package/ips/nationality.js +120 -0
  16. package/ips/pipeline.js +74 -21
  17. package/ips/presenter.js +1 -1
  18. package/ips/readme.md +132 -25
  19. package/ips/render.js +466 -77
  20. package/ips/store.js +79 -22
  21. package/ips/structure.js +247 -0
  22. package/ips/terminology.js +1 -1
  23. package/library/body-limit.js +22 -0
  24. package/library/cache-generation.js +15 -0
  25. package/library/cgroup-memory.js +133 -1
  26. package/library/cluster-counts.js +121 -0
  27. package/library/cluster-events.js +153 -0
  28. package/library/cluster-metrics.js +193 -0
  29. package/library/cluster-status.js +468 -0
  30. package/library/config-reader.js +96 -0
  31. package/library/daily-report.js +100 -2
  32. package/library/html-server.js +27 -1
  33. package/library/i18nsupport.js +23 -1
  34. package/library/keep-alive.js +18 -0
  35. package/library/languages.js +17 -3
  36. package/library/logger.js +31 -0
  37. package/library/memory-guard.js +428 -0
  38. package/library/native-memory.js +52 -0
  39. package/library/npm-audit.js +51 -25
  40. package/library/openapi-doc.js +7 -5
  41. package/library/package-manager.js +8 -0
  42. package/library/role.js +197 -0
  43. package/library/server-credentials.js +169 -0
  44. package/library/sqlite-utilities.js +59 -0
  45. package/library/ssrf-guard.js +100 -0
  46. package/library/static-response-stats.js +16 -0
  47. package/library/version-utilities.js +50 -0
  48. package/library/worker-count.js +192 -0
  49. package/nginx.md +30 -11
  50. package/npmprojector/indexer.js +18 -10
  51. package/package.json +11 -8
  52. package/packages/feed-check-page.js +117 -0
  53. package/packages/feed-check.js +279 -0
  54. package/packages/npm-check.js +57 -3
  55. package/packages/npm-signing.js +219 -0
  56. package/packages/openapi.yaml +207 -1
  57. package/packages/package-crawler.js +322 -41
  58. package/packages/packages-template.html +6 -8
  59. package/packages/packages.js +604 -57
  60. package/packages/readme.md +113 -1
  61. package/publisher/publisher-template.html +2 -5
  62. package/publisher/publisher.js +121 -110
  63. package/publisher/readme.md +75 -0
  64. package/registry/crawler.js +84 -108
  65. package/registry/documentation/configuration.md +34 -0
  66. package/registry/registry-template.html +5 -8
  67. package/registry/registry.js +5 -4
  68. package/root-bare-template.html +7 -4
  69. package/root-template.html +5 -8
  70. package/server.js +398 -198
  71. package/shl/shl.js +38 -37
  72. package/static/a11y/a11y-check.js +832 -0
  73. package/static/a11y/axe.min.js +12 -0
  74. package/static/assets/css/bootstrap-fhir.css +15 -15
  75. package/static/assets/images/flags/au.svg +18 -0
  76. package/static/assets/images/flags/unknown.svg +11 -0
  77. package/static/assets/images/flags/us.svg +63 -0
  78. package/static/assets/images/icon_audit.png +0 -0
  79. package/static/assets/images/icon_clinical.png +0 -0
  80. package/static/assets/images/icon_document.png +0 -0
  81. package/static/assets/images/icon_external.png +0 -0
  82. package/static/assets/images/icon_medication.png +0 -0
  83. package/static/assets/images/icon_organization.png +0 -0
  84. package/static/assets/images/icon_other.png +0 -0
  85. package/static/assets/images/icon_person.png +0 -0
  86. package/static/assets/images/icon_section.png +0 -0
  87. package/stats-db.js +45 -0
  88. package/stats.js +197 -10
  89. package/testing/testing-template.html +5 -8
  90. package/token/nginx_passport_setup.md +1 -1
  91. package/token/security_guide.md +1 -1
  92. package/token/token-template.html +2 -5
  93. package/token/token.js +40 -36
  94. package/translations/Messages.properties +19 -0
  95. package/tx/README.md +154 -4
  96. package/tx/closure/closure-store.js +126 -3
  97. package/tx/cm/cm-database.js +69 -57
  98. package/tx/cm/cm-package.js +29 -1
  99. package/tx/cs/cs-api.js +284 -19
  100. package/tx/cs/cs-api.md +41 -4
  101. package/tx/cs/cs-areacode.js +1 -1
  102. package/tx/cs/cs-country.js +17 -5
  103. package/tx/cs/cs-cpt.js +33 -16
  104. package/tx/cs/cs-cs.js +148 -14
  105. package/tx/cs/cs-currency.js +1 -1
  106. package/tx/cs/cs-icd11.js +21 -13
  107. package/tx/cs/cs-icf.js +22 -3
  108. package/tx/cs/cs-lang.js +2 -2
  109. package/tx/cs/cs-loinc.js +185 -66
  110. package/tx/cs/cs-mimetypes.js +12 -2
  111. package/tx/cs/cs-ndc.js +40 -25
  112. package/tx/cs/cs-omop.js +54 -29
  113. package/tx/cs/cs-rxnorm.js +300 -196
  114. package/tx/cs/cs-snomed.js +608 -64
  115. package/tx/cs/cs-ucum.js +14 -4
  116. package/tx/cs/cs-unii.js +18 -14
  117. package/tx/cs/cs-virtual.js +210 -0
  118. package/tx/ecosystem-resolver.js +413 -0
  119. package/tx/html/cluster-dash-metrics.liquid +26 -0
  120. package/tx/html/cluster-home-metrics.liquid +31 -0
  121. package/tx/html/cluster-metrics-script.liquid +251 -0
  122. package/tx/html/codesystem-operations.liquid +3 -3
  123. package/tx/html/ecl-panel.liquid +1 -1
  124. package/tx/html/external-metrics.liquid +17 -0
  125. package/tx/html/operations-form.liquid +17 -17
  126. package/tx/html/search-form.liquid +11 -11
  127. package/tx/html/status-line.liquid +58 -0
  128. package/tx/html/status-panel.liquid +140 -0
  129. package/tx/html/status-tasks.liquid +25 -0
  130. package/tx/html/tx-template.html +2 -5
  131. package/tx/importers/atc-to-fhir.js +17 -16
  132. package/tx/importers/export-icd11-codesystem.js +3 -2
  133. package/tx/importers/import-icd11.js +4 -3
  134. package/tx/importers/import-loinc.module.js +118 -56
  135. package/tx/importers/import-ndc.module.js +56 -44
  136. package/tx/importers/import-rxnorm.module.js +118 -79
  137. package/tx/importers/import-sct.module.js +57 -58
  138. package/tx/importers/import-unii.module.js +37 -36
  139. package/tx/importers/subset-loinc.module.js +49 -48
  140. package/tx/importers/subset-rxnorm.module.js +29 -28
  141. package/tx/importers/terminal.js +18 -0
  142. package/tx/importers/tx-import-base.js +13 -12
  143. package/tx/importers/tx-import-settings.js +5 -4
  144. package/tx/importers/tx-import.js +53 -52
  145. package/tx/library/canonical-resource.js +49 -0
  146. package/tx/library/codesystem.js +94 -5
  147. package/tx/library/designations.js +45 -2
  148. package/tx/library/extensions.js +13 -7
  149. package/tx/library/implicit-valuesets.js +66 -0
  150. package/tx/library/renderer.js +77 -21
  151. package/tx/library/sqlite-utilities.js +2 -0
  152. package/tx/library/ucum-parsers.js +11 -1
  153. package/tx/library/wait-for-cache.js +43 -0
  154. package/tx/library.js +321 -22
  155. package/tx/openapi-operations.js +6 -4
  156. package/tx/operation-context.js +460 -99
  157. package/tx/params.js +25 -0
  158. package/tx/problems.js +3 -5
  159. package/tx/provider.js +278 -42
  160. package/tx/resource-cache-sqlite.js +1050 -0
  161. package/tx/sct/ecl.js +47 -6
  162. package/tx/sct/editions.js +39 -0
  163. package/tx/sct/expressions.js +10 -1
  164. package/tx/sct/load-config.js +107 -0
  165. package/tx/sct/mmap.js +109 -0
  166. package/tx/sct/structures.js +166 -13
  167. package/tx/sct/text-index.js +5 -1
  168. package/tx/syndication/syndication-feed.js +2 -2
  169. package/tx/tx-html.js +44 -8
  170. package/tx/tx.fhir.org.yml +8 -8
  171. package/tx/tx.js +282 -80
  172. package/tx/usage-tracker.js +39 -11
  173. package/tx/vs/vs-api.js +19 -0
  174. package/tx/vs/vs-database.js +386 -62
  175. package/tx/vs/vs-package.js +27 -4
  176. package/tx/vs/vs-vsac.js +648 -100
  177. package/tx/workers/batch-validate.js +37 -10
  178. package/tx/workers/batch.js +6 -1
  179. package/tx/workers/cache-control.js +15 -4
  180. package/tx/workers/closure.js +156 -13
  181. package/tx/workers/compare.js +8 -5
  182. package/tx/workers/expand.js +1173 -289
  183. package/tx/workers/metadata.js +35 -0
  184. package/tx/workers/search.js +53 -1
  185. package/tx/workers/supplement-filters.js +145 -0
  186. package/tx/workers/translate.js +169 -4
  187. package/tx/workers/validate.js +223 -119
  188. package/tx/workers/worker.js +123 -31
  189. package/tx/xversion/xv-valueset.js +7 -4
  190. package/utilities/submit-test-report.js +3 -1
  191. package/utilities/tx-stress-test.js +482 -0
  192. package/vcl/readme.md +37 -0
  193. package/vcl/vcl-parser.js +15 -0
  194. package/xig/readme.md +52 -0
  195. package/xig/xig-template.html +5 -8
  196. package/xig/xig.js +238 -422
  197. package/changelog-template.md +0 -22
  198. package/registry/test-runner.js +0 -237
  199. package/release.sh +0 -80
  200. package/test-scripts/repro-re2-wasm-leak.js +0 -34
  201. package/tsconfig.eslint.json +0 -9
  202. package/tx/html/dash-metrics.liquid +0 -147
  203. package/tx/html/home-metrics.liquid +0 -225
package/LICENSE ADDED
@@ -0,0 +1,29 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2025-2026, Health Intersections Pty Ltd and the FHIRsmith contributors
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ 3. Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package/README.md CHANGED
@@ -32,12 +32,19 @@ These are not being actively developed at present.
32
32
  ## Planned
33
33
 
34
34
  * R4/R6 interconverter
35
+ * Full RESTful server implementation
36
+
37
+ ## Open Areas of Work
38
+
39
+ * How to handle expansions and validations of some kinds of invalid value sets
40
+ * more efficient CodeSystem implementations
41
+ * more work on internationalization of IPS documents and the IPS repository generally
35
42
 
36
43
  ## Summary Statement
37
44
 
38
45
  * Maintainers: Grahame Grieve, Italo Macêdo, Josh Mandel, Jose Costa Teixeira
39
46
  * Issues / Discussion: Use github issues
40
- * License: BSD-3
47
+ * License: BSD-3-Clause (see [LICENSE](LICENSE))
41
48
  * Contribution Policy: Make PRs. PRs have to pass all the tests
42
49
  * Security Information: See [security.md](security.md)
43
50
 
@@ -51,23 +58,25 @@ in-build support for SSL, rate limiting etc. See [nginx.md](nginx.md) for how to
51
58
 
52
59
  ## Quick Start
53
60
 
54
- There are 4 executable programs:
61
+ There are 5 executable programs:
55
62
  * the server (`node server`)
63
+ * the cluster server (`node cluster`) - for high performance uses (see [cluster.md](cluster.md))
56
64
  * the terminology importer (`node --max-old-space-size=8192 tx/importers/tx-import XXX`) - see [Doco](tx/importers/readme.md)
57
65
  * the test cases (`npm test`)
58
66
  * the test cases generater (`node tx/tests/testcases-generator.js`)
59
67
 
60
- Unless you're developing, you only need the first two
68
+ Unless you're developing, you only need the first three
61
69
 
62
70
  FHIRsmith is open source - see below, and you're welcome to use it for any kind of use. Note,
63
- though, that if you support FHIRsmith commercially as part of a managed service or product, you
64
- are required to be a Commercial Partner of HL7 - see (link to be provided).
71
+ though, that if you support FHIRsmith commercially as part of a managed service or product,
72
+ and you seek support for your implementation from the project team, you are required to be a
73
+ Commercial Partner of HL7 - consult [The FHIR Product Director](mailto:fhir-director@hl7.org).
65
74
 
66
75
  ### Quick Start
67
76
 
68
77
  * Install FHIRSmith (using docker, or an NPM release, or just get the code by git)
69
78
  * Figure out the data directory
70
- * Provide a configuration to tell the server what to run (see documentation below, or use a [prebuilt configuration]/configurations/readme.md)
79
+ * Provide a configuration to tell the server what to run (see [CONFIGURATION.md](CONFIGURATION.md), or use a [prebuilt configuration](configurations/readme.md))
71
80
  * Run the server
72
81
 
73
82
  For further details of these steps, read on
@@ -116,115 +125,17 @@ npm install
116
125
  mkdir -p data data/logs
117
126
 
118
127
  # Copy example configuration
119
- cp config.example.json data/config.json
128
+ cp config-template.json data/config.json
120
129
 
121
- # Edit configuration as needed
130
+ # Edit configuration: every module is off until you set "enabled": true (comments are allowed)
122
131
  nano data/config.json
123
132
  ```
124
133
 
125
- Each Module has it's own entry in the config, as described by the module
126
-
127
- ### Basic Configuration
128
-
129
- Create a `config.json` file in your data directory (use `config-template.json` as a starting point):
130
-
131
- ```json
132
- {
133
- "hostName" : "[descriptive name for the server]",
134
- "server": {
135
- "port": 3000,
136
- "cors": {
137
- "origin": "*",
138
- "credentials": true
139
- }
140
- },
141
- "modules": {
142
- // per modules...
143
- }
144
- }
145
- ```
146
-
147
- ### Logging Configuration
148
-
149
- Add a `logging` section to `config.json` to control log behaviour. All fields are optional and have sensible defaults:
150
-
151
- ```json
152
- {
153
- "logging": {
154
- "level": "info",
155
- "console": true,
156
- "consoleErrors": false,
157
- "maxFiles": 14,
158
- "maxSize": "50m",
159
- "flushInterval": 2000,
160
- "flushSize": 200
161
- }
162
- }
163
- ```
164
-
165
- | Option | Default | Description |
166
- |---|---|---|
167
- | `level` | `"info"` | Minimum level to log: `error`, `warn`, `info`, `debug`, or `verbose` |
168
- | `console` | `true` | Write log lines to stdout/stderr. Disable when running as a systemd service where console output goes to the journal and is redundant |
169
- | `consoleErrors` | `false` | Whether `error` and `warn` levels appear on the console. When `false`, errors and warnings are written to the log file only |
170
- | `maxFiles` | `14` | Number of daily log files to retain before old ones are deleted |
171
- | `maxSize` | `0` (unlimited) | Maximum size per log file before rotation. Accepts human-readable strings: `"20m"`, `"1g"`, or a raw byte count |
172
- | `flushInterval` | `2000` | Milliseconds between buffered writes to disk. Increase to reduce I/O under heavy load |
173
- | `flushSize` | `200` | Number of buffered log lines that trigger an immediate flush regardless of the timer |
174
-
175
- Log files are written to the `logs/` subdirectory of the data directory as `server-YYYY-MM-DD.log`. A `server.log` symlink always points to the current day's file, so `tail -f data/logs/server.log` tracks the active log without needing to know the date.
176
-
177
- ### Email and the Daily Report
178
-
179
- The server can email a short markdown report on itself once a day. It needs two things in
180
- `config.json`: an SMTP server to send through, and someone to send to:
181
-
182
- ```json
183
- {
184
- "email": {
185
- "host": "smtp.example.org",
186
- "port": 587,
187
- "user": "fhirsmith",
188
- "password": "...",
189
- "from": "FHIRsmith <fhirsmith@example.org>"
190
- },
191
- "dailyReport": {
192
- "to": ["ops@example.org"]
193
- }
194
- }
195
- ```
134
+ ### Configuration
196
135
 
197
- `user`/`password` are optional (an open relay); `secure` defaults to true for port 465 and
198
- to STARTTLS otherwise. Without an `email` block nothing is emailed, and without
199
- `dailyReport.to` there's no report (`dailyReport.enabled: false` turns it off explicitly).
200
-
201
- The report, titled "`{hostName}` daily report", goes out at midnight (the server's local
202
- time), or as soon as the server is up again if it was down at midnight. It has a paragraph
203
- on the server's stability since the last report - how much of the time it was up, restarts,
204
- the longest outage, and any upgrade (from the run history in the statistics database, so
205
- `stats.enabled: false` leaves the uptime unknown); a paragraph from each running module that
206
- has something to report (by default, none do); and a paragraph on the system - version,
207
- Node.js and OS, how long this run has been up, the log files and the free disk space they're
208
- drawing on, plus anything the npm audit check has found (packages with known vulnerabilities and
209
- what to do about them, or a newer FHIRsmith release). If any background task's last run failed, a
210
- final section lists them. When the last report was sent is kept in `daily-report.json` in the data
211
- directory.
212
-
213
- A module takes part by implementing `dailyReport({since, now})`, returning its paragraph as
214
- markdown (or a promise of it); an empty return means it has nothing to say that day. The
215
- request counts a module quotes come from `stats.countsSince(since, now)`, the per-operation
216
- counts in the statistics database for the period. The modules that report:
217
-
218
- | Module | Reports |
219
- |---|---|
220
- | Terminology server | how many of each operation were performed, over all its endpoints |
221
- | Terminology server registry | client requests answered by the API, servers registered, and any server that answered none of the registry's scans in the period |
222
- | Packages | packages served (tarball downloads) and new package versions found by the crawler |
223
- | XIG | pages served, and whether the database could be accessed (and whether the last download failed) |
224
- | Testing | pages served, test reports received, and the number held |
225
- | SMART Health Links | QR codes created (SMART Health Links and Verifiable Health Links), link accesses, and the documents stored to serve them |
226
- | IPS | pages served, IPS documents received, and the number stored |
227
- | Publisher | publication runs started, and how many finished successfully |
136
+ The server reads `config.json` from the data directory. See [CONFIGURATION.md](CONFIGURATION.md)
137
+ for the server settings (port, body size, logging, email and the daily report), the environment
138
+ variables, and where each module's own settings are documented.
228
139
 
229
140
  ### Start the Server
230
141
 
@@ -237,9 +148,10 @@ npm start
237
148
  ```
238
149
 
239
150
  The server will be available at `http://localhost:{port}` using the port specified in the config.
240
- In the production servers listed above, the server always sits behind an NGINX server which manages
151
+ In the production servers listed above, the server should always sit behind an NGINX server which manages
241
152
  SSL, security, rate limiting etc. See [nginx.md](nginx.md) for configuration advice, including
242
- running several servers behind one front door.
153
+ running several servers behind one front door. To use more than one CPU core for terminology on
154
+ one machine, see [cluster.md](cluster.md): a master and several tx workers, behind nginx.
243
155
 
244
156
  ## Testing
245
157
 
@@ -274,6 +186,9 @@ Or run it inline:
274
186
  FHIRSMITH_DATA_DIR=/var/lib/fhirsmith fhirsmith
275
187
  ```
276
188
 
189
+ For cluster mode (a master and tx-workers - see [cluster.md](cluster.md)), run `fhirsmith-cluster`
190
+ instead of `fhirsmith`.
191
+
277
192
  ### Changing the Node.js version
278
193
 
279
194
  Some of FHIRsmith's dependencies (the SQLite drivers) are native modules, built for the
@@ -309,14 +224,6 @@ Available tags:
309
224
  - `vX.Y.Z`: Specific version (e.g., `v1.0.0`)
310
225
  - `cibuild`: Latest build from the main branch
311
226
 
312
- ### Environment Variables
313
-
314
- | Variable | Description | Default |
315
- |---|---|---|
316
- | `FHIRSMITH_DATA_DIR` | Path to the data directory | `./data` |
317
- | `PORT` | Server port (overrides config) | from config.json |
318
- | `NODE_ENV` | Node environment | `production` |
319
-
320
227
  ### Windows Installation
321
228
 
322
229
  You can install as a windows service using [windows-install.js](utilities/windows-install.js). You might need to
@@ -420,7 +327,7 @@ or do it via a PR
420
327
  ./release.sh X.Y.Z
421
328
  ```
422
329
 
423
- `gr.sh` checks that the release is ready - on `main` and pushed, the three versions in
330
+ `release.sh` checks that the release is ready - on `main` and pushed, the three versions in
424
331
  `package.json` and `package-lock.json` match, `CHANGELOG.md` has a dated section with the
425
332
  conformance statement, and `test-cases-report.json` passed, is from this version and is
426
333
  newer than the last code change - then submits the report to
@@ -448,7 +355,7 @@ or do it via a PR
448
355
 
449
356
  ## License
450
357
 
451
- [BSD-3](https://opensource.org/license/bsd-3-clause)
358
+ [BSD-3-Clause](LICENSE) - see also [opensource.org](https://opensource.org/license/bsd-3-clause)
452
359
 
453
360
  ## Contributing
454
361