Skip to content

Commit b192a5f

Browse files
author
records-bot
committed
sync: monorepo @ validator 0.1.11 / validation-types 0.1.4
Snapshot of medvertical/records monorepo state, exported via oss:export-validator. Tracks the npm publication of: @records-fhir/validator@0.1.11 @records-fhir/validation-types@0.1.4 Run npm i @records-fhir/validator@0.1.11 for the matching distribution. The conformance evidence in conformance-results/ matches the published tarball.
1 parent ba5bf18 commit b192a5f

76 files changed

Lines changed: 3604 additions & 1651 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ jobs:
4545
For production CI, pin an immutable patch tag:
4646
4747
```yaml
48-
- uses: medvertical/records-fhir-validator@v0.1.9
48+
- uses: medvertical/records-fhir-validator@v0.1.11
4949
with:
5050
paths: resources/**/*.json
5151
profile-url: http://hl7.org/fhir/StructureDefinition/Patient
@@ -58,7 +58,7 @@ Action pinning:
5858
| Goal | Pin in `uses:` | Notes |
5959
|---|---|---|
6060
| Latest stable in current major | `medvertical/records-fhir-validator@v0` | Floating tag, force-moved on stable releases only |
61-
| Exact released version | `medvertical/records-fhir-validator@v0.1.9` | Immutable consumer tag |
61+
| Exact released version | `medvertical/records-fhir-validator@v0.1.11` | Immutable consumer tag |
6262
| Bit-exact reproducibility | `medvertical/records-fhir-validator@<commit-sha>` | Best for audit and forensics |
6363

6464
The `validator-v<semver>` tag is the npm mirror/release-page tag. Use
@@ -67,7 +67,7 @@ The `validator-v<semver>` tag is the npm mirror/release-page tag. Use
6767
### npm Package
6868

6969
```sh
70-
npm install @records-fhir/validator@0.1.9 @records-fhir/validation-types@0.1.3
70+
npm install @records-fhir/validator@0.1.11 @records-fhir/validation-types@0.1.4
7171
```
7272

7373
Validate a resource from Node.js:
@@ -88,8 +88,8 @@ artifacts until their upstream licenses and notices have been reviewed.
8888

8989
## What Is Included
9090

91-
- `@records-fhir/validator` 0.1.9 - Apache-2.0 validation engine.
92-
- `@records-fhir/validation-types` 0.1.3 - Apache-2.0 validation-domain types.
91+
- `@records-fhir/validator` 0.1.11 - Apache-2.0 validation engine.
92+
- `@records-fhir/validation-types` 0.1.4 - Apache-2.0 validation-domain types.
9393
- Composite GitHub Action at repository root.
9494
- Standalone examples under `packages/validator/examples/`.
9595
- Boundary audit and smoke-test scripts.

packages/validation-types/CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,19 @@ captures changes that affect type-package consumers directly.
1111

1212
## [Unreleased]
1313

14+
## [0.1.4] — 2026-05-28
15+
16+
Released alongside `@records-fhir/validator` 0.1.10.
17+
18+
### Surface
19+
20+
- Normalized profile source settings and defaults used by the validator runtime
21+
and UI settings snapshots.
22+
- Kept the current EPS preview package visible in the default package source
23+
set while preserving the canonical xTeHR reference.
24+
- Updated schema coverage so downstream consumers can validate the same
25+
settings shape used by the restored HL7 and MII parity gates.
26+
1427
## [0.1.3] — 2026-05-26
1528

1629
Released alongside `@records-fhir/validator` 0.1.9.

packages/validation-types/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@records-fhir/validation-types",
3-
"version": "0.1.3",
3+
"version": "0.1.4",
44
"description": "Validation-domain TypeScript types for the Records FHIR validator: ValidationIssue, ValidationSettings, ValidationResult, advisor rules, fix suggestions. No runtime code, no DB coupling.",
55
"type": "module",
66
"license": "Apache-2.0",

packages/validation-types/src/fix-suggestions.ts

Lines changed: 19 additions & 1461 deletions
Large diffs are not rendered by default.

packages/validation-types/src/fix-suggestions/catalog-core.ts

Lines changed: 419 additions & 0 deletions
Large diffs are not rendered by default.

packages/validation-types/src/fix-suggestions/catalog-invariants.ts

Lines changed: 307 additions & 0 deletions
Large diffs are not rendered by default.

packages/validation-types/src/fix-suggestions/catalog-misc.ts

Lines changed: 398 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
import type { FixSuggestion } from './types';
2+
3+
export const CATALOG_REFERENCE_PROFILE: Record<string, FixSuggestion> = {
4+
// -------------------------------------------------------------------------
5+
// Reference
6+
// -------------------------------------------------------------------------
7+
'reference-not-found': {
8+
why: 'References should point to existing resources for data integrity.',
9+
fix: 'Verify the referenced resource exists, or create it before referencing.',
10+
example: 'subject: { reference: "Patient/123" }',
11+
},
12+
'reference-type-mismatch': {
13+
why: 'Reference constraints specify which resource types can be referenced.',
14+
fix: 'Change the reference to point to an allowed resource type.',
15+
example: 'Observation.subject should reference Patient, not Practitioner',
16+
patch: { action: 'replace', path: '{{fieldPath}}.reference', value: '"{{allowed}}/id"' },
17+
},
18+
'reference-invalid-format': {
19+
why: 'FHIR references follow specific formats for routing and resolution.',
20+
fix: 'Use format: "ResourceType/id" for relative, or full URL for absolute.',
21+
example: 'reference: "Patient/123" or "https://example.org/fhir/Patient/123"',
22+
patch: { action: 'replace', path: '{{fieldPath}}.reference', value: '"ResourceType/id"' },
23+
},
24+
'reference-empty': {
25+
why: 'A reference element exists but has no value.',
26+
fix: 'Add a reference value, or remove the empty reference element.',
27+
},
28+
'reference-contained-not-found': {
29+
why: 'The #id reference points to a contained resource that doesn\'t exist.',
30+
fix: 'Add the resource to the contained array with matching id.',
31+
example: 'contained: [{ "resourceType": "Organization", "id": "org1", ... }]',
32+
},
33+
'reference-bundle-unresolved': {
34+
why: 'Reference within bundle cannot be resolved to any entry.',
35+
fix: 'Add an entry with matching fullUrl, or use a urn:uuid for temporary IDs.',
36+
},
37+
'reference-bundle-fullurl-mismatch': {
38+
why: 'The entry\'s fullUrl doesn\'t match the resource\'s id.',
39+
fix: 'Ensure fullUrl ends with ResourceType/id matching the resource.',
40+
},
41+
'reference-bundle-missing-entries': {
42+
why: 'Bundle requires an entry array.',
43+
fix: 'Add the entry array with at least one entry.',
44+
},
45+
'reference-bundle-request-missing-method': {
46+
why: 'Transaction/batch entries need a request method.',
47+
fix: 'Add method: "POST" (create), "PUT" (update), "DELETE" (delete), or "GET" (read).',
48+
},
49+
'reference-bundle-request-missing-url': {
50+
why: 'Transaction/batch entries need a request URL.',
51+
fix: 'Add url with the resource path (e.g., "Patient" for POST, "Patient/123" for PUT).',
52+
},
53+
'reference-invalid-url': {
54+
why: 'The reference URL is malformed or invalid.',
55+
fix: 'Use a valid URL format: absolute URL or relative ResourceType/id.',
56+
},
57+
'reference-invalid-contained': {
58+
why: 'Contained reference should use #id format.',
59+
fix: 'Use format: { "reference": "#contained-id" }',
60+
},
61+
'reference-type-unknown': {
62+
why: 'Cannot determine the resource type from the reference.',
63+
fix: 'Include ResourceType in reference (e.g., "Patient/123") or add type field.',
64+
},
65+
'reference-contained-type-mismatch': {
66+
why: 'The contained resource type doesn\'t match allowed types.',
67+
fix: 'Ensure the contained resource type is allowed for this reference.',
68+
},
69+
'reference-bundle-invalid-entries': {
70+
why: 'Bundle entries are malformed or missing required fields.',
71+
fix: 'Each entry needs: resource (for non-DELETE) and request (for transaction/batch).',
72+
},
73+
'reference-validation-error': {
74+
why: 'Reference validation failed for an unspecified reason.',
75+
fix: 'Check reference format, target existence, and type constraints.',
76+
},
77+
'reference-circular': {
78+
why: 'A circular reference chain was detected (A → B → A).',
79+
fix: 'Break the cycle by removing one of the bidirectional references or using a contained resource.',
80+
},
81+
'reference-recursive-timeout': {
82+
why: 'Reference resolution was aborted because the chain is too deep.',
83+
fix: 'Simplify the reference graph. Deep chains often indicate a modelling issue.',
84+
},
85+
'reference-target-type-invalid': {
86+
why: 'The referenced resource type is not allowed for this reference element.',
87+
fix: 'Change the reference to one of the allowed target types defined in the element.',
88+
},
89+
'reference-unresolved': {
90+
why: 'The reference could not be resolved to any known resource.',
91+
fix: 'Ensure the target resource exists, or use a contained/bundled resource.',
92+
},
93+
'reference-bundle-missing-type': {
94+
why: 'Bundle.type determines processing rules (transaction, batch, document, etc.).',
95+
fix: 'Add a type from: document | message | transaction | batch | searchset | collection | history',
96+
example: '{ "resourceType": "Bundle", "type": "collection", ... }',
97+
specUrl: 'https://www.hl7.org/fhir/bundle.html#type',
98+
patch: { action: 'add', path: 'Bundle.type', value: '"collection"' },
99+
},
100+
'reference-bundle-entry-missing-request': {
101+
why: 'Transaction and batch Bundles require request element for processing instructions.',
102+
fix: 'Add request with method (GET/POST/PUT/DELETE) and url.',
103+
example: 'request: { method: "POST", url: "Patient" }',
104+
patch: { action: 'add', path: '{{fieldPath}}.request', value: '{ "method": "POST", "url": "{{resourceType}}" }' },
105+
},
106+
'reference-bundle-duplicate-fullurl': {
107+
why: 'fullUrl must be unique within a Bundle for unambiguous reference resolution.',
108+
fix: 'Ensure each entry has a unique fullUrl, or use urn:uuid for temporary IDs.',
109+
},
110+
111+
// -------------------------------------------------------------------------
112+
// Profile
113+
// -------------------------------------------------------------------------
114+
'profile-constraint-violation': {
115+
why: 'Profile constraints define additional rules beyond the base FHIR specification. In document Bundles this can also mean a referenced child resource failed targetProfile matching.',
116+
fix: 'Review the path and details. For targetProfile failures, fix the referenced resource so it conforms to one of the allowed targetProfiles, then revalidate the Bundle.',
117+
patch: { action: 'replace', path: '{{fieldPath}}', value: '(satisfy constraint {{key}}: {{message}})' },
118+
},
119+
'profile-mustsupport-missing': {
120+
why: 'MustSupport elements should be populated when data is available.',
121+
fix: 'Add the element if you have the data. If not available, document why.',
122+
specUrl: 'https://www.hl7.org/fhir/conformance-rules.html#mustSupport',
123+
},
124+
'profile-slice-min-cardinality': {
125+
why: 'The profile requires at least one item matching this slice discriminator. For document Bundles, the missing slice may be caused by an entry that exists but does not conform to the required profile.',
126+
fix: 'Add or repair the element matching the slice. For Bundle.entry:composition, fix the Composition entry and any child targetProfile errors first.',
127+
example: 'For Bundle.entry:composition: include a Composition entry that conforms to the document profile.',
128+
patch: { action: 'add', path: '{{fieldPath}}', value: '(add entry matching slice "{{sliceName}}", min={{min}})' },
129+
},
130+
'profile-slice-max-cardinality': {
131+
why: 'The profile limits how many items can match this slice.',
132+
fix: 'Remove excess elements or verify discriminator values.',
133+
},
134+
'profile-slice-closed-unmatched': {
135+
why: 'Closed slicing rejects elements that don\'t match any defined slice.',
136+
fix: 'Either match an existing slice discriminator, or request the profile be updated.',
137+
specUrl: 'https://www.hl7.org/fhir/profiling.html#slicing',
138+
},
139+
'profile-extension-url-missing': {
140+
why: 'Every extension must have a URL identifying its definition.',
141+
fix: 'Add the url property with the extension\'s canonical URL.',
142+
example: '{ "url": "http://example.org/fhir/StructureDefinition/my-extension", "valueString": "..." }',
143+
patch: { action: 'add', path: '{{fieldPath}}.url', value: '"http://example.org/fhir/StructureDefinition/..."' },
144+
},
145+
'profile-extension-not-in-profile': {
146+
why: 'This extension is not defined in the declared profile.',
147+
fix: 'Remove the extension, or add its definition to the profile.',
148+
},
149+
'profile-extension-no-value': {
150+
why: 'Extensions must have either a value[x] or nested extensions, not neither.',
151+
fix: 'Add a value using the appropriate type (valueString, valueCode, etc.).',
152+
},
153+
'profile-extension-missing': {
154+
why: 'The profile requires this extension to be present.',
155+
fix: 'Add the extension with its required URL and value.',
156+
},
157+
'profile-not-found': {
158+
why: 'The profile could not be loaded from the package registry.',
159+
fix: 'Install the package containing this profile, or verify the canonical URL.',
160+
},
161+
'profile-download-failed': {
162+
why: 'Network or registry error while downloading the profile.',
163+
fix: 'Check network connectivity and try again. Verify the profile URL is correct.',
164+
},
165+
'profile-extension-invalid': {
166+
why: 'The extension structure is malformed or incomplete.',
167+
fix: 'Ensure the extension has url and either value[x] or nested extension elements.',
168+
},
169+
'profile-extension-modifier-mismatch': {
170+
why: 'Modifier extensions must use modifierExtension, not extension.',
171+
fix: 'Move this to modifierExtension array, or use a non-modifier extension definition.',
172+
specUrl: 'https://www.hl7.org/fhir/extensibility.html#modifierExtension',
173+
},
174+
'profile-extension-value-and-nested': {
175+
why: 'Extensions cannot have both a value[x] and nested extensions.',
176+
fix: 'Choose either a direct value OR nested extensions, not both.',
177+
},
178+
'profile-extension-invalid-value-type': {
179+
why: 'The extension\'s value type doesn\'t match its definition.',
180+
fix: 'Use the value type specified in the extension definition (e.g., valueString, valueCode).',
181+
},
182+
'profile-extension-max-depth': {
183+
why: 'Nested extensions exceed the validator\'s maximum traversal depth. This usually indicates a deeply recursive or cyclic extension tree.',
184+
fix: 'Flatten the extension hierarchy or split the data across multiple siblings. The default limit is 5 levels of nesting.',
185+
},
186+
'profile-extension-min-cardinality': {
187+
why: 'This extension requires a minimum number of occurrences.',
188+
fix: 'Add additional instances of the extension to meet minimum cardinality.',
189+
},
190+
'profile-extension-max-cardinality': {
191+
why: 'Too many instances of this extension are present.',
192+
fix: 'Remove excess extension instances to stay within maximum cardinality.',
193+
},
194+
'profile-slicing-violation': {
195+
why: 'The element violates slicing rules defined in the profile.',
196+
fix: 'Check the slice discriminator and ensure elements match defined slices.',
197+
specUrl: 'https://www.hl7.org/fhir/profiling.html#slicing',
198+
},
199+
'profile-load-error': {
200+
why: 'The profile could not be loaded or parsed.',
201+
fix: 'Verify the package is installed. Check for JSON syntax errors if local.',
202+
},
203+
204+
};

0 commit comments

Comments
 (0)