@haste-health/fhir-validation 0.14.3

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 (59) hide show
  1. package/README.md +4 -0
  2. package/lib/elements/conformance.d.ts +9 -0
  3. package/lib/elements/conformance.js +40 -0
  4. package/lib/elements/conformance.js.map +1 -0
  5. package/lib/elements/primitive.d.ts +5 -0
  6. package/lib/elements/primitive.js +102 -0
  7. package/lib/elements/primitive.js.map +1 -0
  8. package/lib/elements/validators/cardinality.d.ts +3 -0
  9. package/lib/elements/validators/cardinality.js +57 -0
  10. package/lib/elements/validators/cardinality.js.map +1 -0
  11. package/lib/elements/validators/fixedValue.d.ts +4 -0
  12. package/lib/elements/validators/fixedValue.js +20 -0
  13. package/lib/elements/validators/fixedValue.js.map +1 -0
  14. package/lib/elements/validators/pattern.d.ts +11 -0
  15. package/lib/elements/validators/pattern.js +53 -0
  16. package/lib/elements/validators/pattern.js.map +1 -0
  17. package/lib/elements/validators/value.d.ts +10 -0
  18. package/lib/elements/validators/value.js +18 -0
  19. package/lib/elements/validators/value.js.map +1 -0
  20. package/lib/elements/validators.d.ts +8 -0
  21. package/lib/elements/validators.js +37 -0
  22. package/lib/elements/validators.js.map +1 -0
  23. package/lib/index.d.ts +4 -0
  24. package/lib/index.js +13 -0
  25. package/lib/index.js.map +1 -0
  26. package/lib/profile/element.d.ts +40 -0
  27. package/lib/profile/element.js +180 -0
  28. package/lib/profile/element.js.map +1 -0
  29. package/lib/profile/index.d.ts +20 -0
  30. package/lib/profile/index.js +45 -0
  31. package/lib/profile/index.js.map +1 -0
  32. package/lib/profile/slicing/index.d.ts +24 -0
  33. package/lib/profile/slicing/index.js +247 -0
  34. package/lib/profile/slicing/index.js.map +1 -0
  35. package/lib/profile/slicing.d.ts +47 -0
  36. package/lib/profile/slicing.js +195 -0
  37. package/lib/profile/slicing.js.map +1 -0
  38. package/lib/profile/utilities.d.ts +14 -0
  39. package/lib/profile/utilities.js +32 -0
  40. package/lib/profile/utilities.js.map +1 -0
  41. package/lib/profile/validators.d.ts +8 -0
  42. package/lib/profile/validators.js +37 -0
  43. package/lib/profile/validators.js.map +1 -0
  44. package/lib/slicing/index.d.ts +47 -0
  45. package/lib/slicing/index.js +197 -0
  46. package/lib/slicing/index.js.map +1 -0
  47. package/lib/structural/index.d.ts +4 -0
  48. package/lib/structural/index.js +296 -0
  49. package/lib/structural/index.js.map +1 -0
  50. package/lib/structural/validate-primitive.d.ts +11 -0
  51. package/lib/structural/validate-primitive.js +102 -0
  52. package/lib/structural/validate-primitive.js.map +1 -0
  53. package/lib/types.d.ts +10 -0
  54. package/lib/types.js +2 -0
  55. package/lib/types.js.map +1 -0
  56. package/lib/utilities.d.ts +34 -0
  57. package/lib/utilities.js +114 -0
  58. package/lib/utilities.js.map +1 -0
  59. package/package.json +50 -0
@@ -0,0 +1,195 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { eleIndexToChildIndices } from "@iguhealth/codegen/traversal/structure-definition";
3
+ import * as fp from "@iguhealth/fhirpath";
4
+ import { convertPathToElementPointer, removeTypeOnPath, } from "./utilities.js";
5
+ import { issueError, OperationError, outcomeError, outcomeFatal, } from "@iguhealth/operation-outcomes";
6
+ import { fieldName } from "../utilities.js";
7
+ import { conformsToPattern } from "../elements/validators.js";
8
+ import { descend, get, pointer } from "@iguhealth/fhir-pointer";
9
+ import { metaValue } from "@iguhealth/meta-value/v2";
10
+ import { R4 } from "@iguhealth/fhir-types/versions";
11
+ import { validateSingular } from "../structural/index.js";
12
+ function isSliced(element) {
13
+ return element.slicing !== undefined;
14
+ }
15
+ /**
16
+ * Filter elements for discriminator slice + slicing elements.
17
+ * @param elements
18
+ */
19
+ export function getSliceIndices(elements, index) {
20
+ const children = eleIndexToChildIndices(elements, index);
21
+ const slices = [];
22
+ let i = 0;
23
+ while (i < children.length) {
24
+ const childIndex = children[i++];
25
+ if (isSliced(elements[childIndex])) {
26
+ const discriminatorIndex = childIndex;
27
+ const sliceIndexes = [];
28
+ while (i < children.length && elements[children[i]].sliceName) {
29
+ sliceIndexes.push(children[i]);
30
+ i++;
31
+ }
32
+ slices.push({
33
+ discriminator: discriminatorIndex,
34
+ slices: sliceIndexes,
35
+ });
36
+ }
37
+ }
38
+ return slices;
39
+ }
40
+ /**
41
+ * Returns the elementDefinition associated with the given discriminator. This is used to extract the value the slice is expecting.
42
+ * @param discriminator The discriminator to use to distinguish slices.
43
+ * @param elements The elements to search for the slice value.
44
+ * @param currentIndex The current index to search for the slice value.
45
+ * @returns The index of elementdefinition to use to slice the value for the discriminator.
46
+ */
47
+ function findElementDefinitionForSliceDiscriminator(discriminatorElementPath, elements, currentIndex) {
48
+ const element = elements[currentIndex];
49
+ const typelessPath = removeTypeOnPath(element.path);
50
+ if (discriminatorElementPath === typelessPath) {
51
+ return currentIndex;
52
+ }
53
+ if (discriminatorElementPath.startsWith(typelessPath)) {
54
+ const childIndexes = eleIndexToChildIndices(elements, currentIndex);
55
+ for (const childIndex of childIndexes) {
56
+ const foundIndex = findElementDefinitionForSliceDiscriminator(discriminatorElementPath, elements, childIndex);
57
+ if (foundIndex) {
58
+ return foundIndex;
59
+ }
60
+ }
61
+ }
62
+ return undefined;
63
+ }
64
+ async function isConformantToSlicesDiscriminator(discriminator, sliceValueElementDefinition, root, locs) {
65
+ switch (discriminator.type) {
66
+ case "value": {
67
+ const expectedValue = (await fp.evaluate("$this.fixed", sliceValueElementDefinition))[0];
68
+ const conformantLocs = [];
69
+ for (const loc of locs) {
70
+ const value = get(loc, root);
71
+ const evaluation = await fp.evaluate(discriminator.path, value);
72
+ if (evaluation.find((v) => JSON.stringify(v) === JSON.stringify(expectedValue)) !== undefined) {
73
+ conformantLocs.push(loc);
74
+ }
75
+ }
76
+ return conformantLocs;
77
+ }
78
+ case "exists":
79
+ case "pattern": {
80
+ const pattern = (await fp.evaluate("$this.pattern", metaValue({ type: "ElementDefinition", fhirVersion: R4 }, sliceValueElementDefinition)))[0];
81
+ if (!pattern) {
82
+ throw new OperationError(outcomeError("not-found", "Could not find a pattern for slice."));
83
+ }
84
+ const conformantLocs = [];
85
+ for (const loc of locs) {
86
+ const value = get(loc, root);
87
+ const evaluation = await fp.evaluate(discriminator.path, value);
88
+ if (evaluation.find((v) => conformsToPattern(pattern, v))) {
89
+ conformantLocs.push(loc);
90
+ }
91
+ }
92
+ return conformantLocs;
93
+ }
94
+ case "type":
95
+ case "profile": {
96
+ throw new Error("Not supported");
97
+ }
98
+ }
99
+ throw new Error("invalid");
100
+ }
101
+ export async function validateSlice(elements, sliceIndex, root, sliceValueLocs) {
102
+ for (const sliceValueLoc of sliceValueLocs) {
103
+ const sliceElement = elements[sliceIndex];
104
+ const patternCheck = await fp.evaluate("$this.pattern", sliceElement);
105
+ const sliceValue = get(sliceValueLoc, root);
106
+ const fixedValueCheck = await fp.evaluate("$this.fixed", sliceElement);
107
+ if (patternCheck && !conformsToPattern(patternCheck[0], sliceValue)) {
108
+ throw new OperationError(outcomeError("exception", "pattern mismatch"));
109
+ }
110
+ if (fixedValueCheck) {
111
+ if (JSON.stringify(fixedValueCheck[0]) !== JSON.stringify(sliceValue)) {
112
+ throw new OperationError(outcomeError("exception", "fixed value mismatch"));
113
+ }
114
+ const childrenIndices = eleIndexToChildIndices(elements, sliceIndex);
115
+ for (const child of childrenIndices) {
116
+ const field = fieldName(elements[child]);
117
+ const fieldLoc = descend(sliceValueLoc, field);
118
+ validateSlice(elements, child, root, [fieldLoc]);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ export async function splitSlicing(elements, sliceDescriptor, root, loc) {
124
+ const sliceSplit = sliceDescriptor.slices.reduce((acc, sliceIndex) => {
125
+ acc[sliceIndex] = [];
126
+ return acc;
127
+ }, {});
128
+ const values = get(loc, root);
129
+ if (!Array.isArray(values)) {
130
+ throw new OperationError(outcomeFatal("not-supported", "Cannot slice non array."));
131
+ }
132
+ let locsToCheck = values.map((_v, i) => descend(loc, i));
133
+ // A couple of notes we will determine per discriminator the element path that should be expected.
134
+ // Using that we will loop over the slices and determine if value conforms to slice element using discriminator.
135
+ // [Serialized as a group] The entries must be adjacent for a given slice.
136
+ const discriminatorElement = elements[sliceDescriptor.discriminator];
137
+ const discriminators = discriminatorElement.slicing?.discriminator ?? [];
138
+ const discriminatorElementPaths = discriminators.map((d) => convertPathToElementPointer(discriminatorElement, d));
139
+ for (const sliceIndex of sliceDescriptor.slices) {
140
+ let sliceValueLocs = locsToCheck;
141
+ for (let d = 0; d < discriminators.length; d++) {
142
+ const discriminator = discriminators[d];
143
+ const sliceElementIndex = findElementDefinitionForSliceDiscriminator(discriminatorElementPaths[d], elements, sliceIndex);
144
+ if (!sliceElementIndex)
145
+ throw new OperationError(outcomeError("invalid", "could not find element definition for slice"));
146
+ const sliceElement = elements[sliceElementIndex];
147
+ sliceValueLocs = await isConformantToSlicesDiscriminator(discriminator, sliceElement, root, locsToCheck);
148
+ }
149
+ locsToCheck = locsToCheck.filter((l) => !sliceValueLocs.includes(l));
150
+ sliceSplit[sliceIndex] = sliceValueLocs;
151
+ }
152
+ return sliceSplit;
153
+ }
154
+ function validateSliceCardinality(sliceElement, paths) {
155
+ const issues = [];
156
+ if (paths.length < (sliceElement.min ?? 0)) {
157
+ issues.push(issueError("structure", `Slice '${sliceElement.sliceName}' does not have the minimum number of values.`));
158
+ }
159
+ if (!isNaN(parseInt(sliceElement.max ?? "1"))) {
160
+ const max = parseInt(sliceElement.max ?? "1");
161
+ if (paths.length > max) {
162
+ issues.push(issueError("structure", `Slice '${sliceElement.sliceName}' has more than the maximum number of values.`));
163
+ }
164
+ }
165
+ return issues;
166
+ }
167
+ export async function validateSliceDescriptor(ctx, profile, sliceDescriptor, root, loc) {
168
+ const differential = profile.differential?.element ?? [];
169
+ const discriminatorElement = differential[sliceDescriptor.discriminator];
170
+ const sliceLoc = descend(loc, fieldName(discriminatorElement));
171
+ const slices = await splitSlicing(differential, sliceDescriptor, root, sliceLoc);
172
+ let issues = [];
173
+ const profileLoc = pointer("StructureDefinition", profile.id);
174
+ for (const slice of sliceDescriptor.slices) {
175
+ const sliceLoc = descend(descend(descend(profileLoc, "differential"), "element"), slice);
176
+ const sliceElement = get(sliceLoc, profile);
177
+ if (!sliceElement) {
178
+ throw new OperationError(outcomeError("not-found", `Slice element not found at '${sliceLoc}'`));
179
+ }
180
+ const type = sliceElement.type ?? [];
181
+ issues = issues.concat(validateSliceCardinality(sliceElement, slices[slice]));
182
+ for (const path of slices[slice]) {
183
+ if (type.length !== 1) {
184
+ throw new OperationError(outcomeError("not-supported", "typechoices not supported for slicing."));
185
+ }
186
+ issues = issues.concat(await validateSingular(ctx, profile, sliceLoc, root, path, type[0].code));
187
+ }
188
+ }
189
+ return issues;
190
+ }
191
+ export default async function validateAllSlicesAtLocation(ctx, profile, elementIndex, root, loc) {
192
+ const sliceIndices = getSliceIndices(profile.differential?.element ?? [], elementIndex);
193
+ return (await Promise.all(sliceIndices.map((sliceIndex) => validateSliceDescriptor(ctx, profile, sliceIndex, root, loc)))).flat();
194
+ }
195
+ //# sourceMappingURL=slicing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slicing.js","sourceRoot":"","sources":["../../src/profile/slicing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { ElementDefinition } from "@haste-health/fhir-types/lib/generated/r4/types";
2
+ /**
3
+ * Removes the type from the path.
4
+ * @param path The ElementDefinition path to remove the type from.
5
+ */
6
+ export declare function removeTypeOnPath(path: string): string;
7
+ export declare function joinPaths(...paths: string[]): string;
8
+ export type Discriminator = NonNullable<NonNullable<ElementDefinition["slicing"]>["discriminator"]>[number];
9
+ /**
10
+ *
11
+ * @param discriminator the discrimator to convert to an ElementDefinition path.
12
+ * @returns the path of the discriminator as an ElementDefinition path.
13
+ */
14
+ export declare function convertPathToElementPointer(discriminatorElement: ElementDefinition, discriminator: Discriminator): string;
@@ -0,0 +1,32 @@
1
+ import { OperationError, outcomeFatal } from "@haste-health/operation-outcomes";
2
+ /**
3
+ * Removes the type from the path.
4
+ * @param path The ElementDefinition path to remove the type from.
5
+ */
6
+ export function removeTypeOnPath(path) {
7
+ const firstDot = path.indexOf(".");
8
+ // If first element this would be the entire path as no subfield.
9
+ return path.substring(firstDot !== -1 ? path.indexOf(".") + 1 : path.length);
10
+ }
11
+ export function joinPaths(...paths) {
12
+ return paths.filter((p) => p !== "").join(".");
13
+ }
14
+ /**
15
+ *
16
+ * @param discriminator the discrimator to convert to an ElementDefinition path.
17
+ * @returns the path of the discriminator as an ElementDefinition path.
18
+ */
19
+ export function convertPathToElementPointer(discriminatorElement, discriminator) {
20
+ if (discriminator.path.includes("ofType(") ||
21
+ discriminator.path.includes("resolve()") ||
22
+ discriminator.path.includes("extension(")) {
23
+ throw new OperationError(outcomeFatal("not-supported", `Discriminator path '${discriminator.path}' is not supported`));
24
+ }
25
+ const parentPath = removeTypeOnPath(discriminatorElement.path);
26
+ const path = discriminator.path.replace("$this", "");
27
+ if (path === "") {
28
+ return parentPath;
29
+ }
30
+ return `${parentPath}.${path}`;
31
+ }
32
+ //# sourceMappingURL=utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../src/profile/utilities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAEhF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,iEAAiE;IACjE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAG,KAAe;IAC1C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC;AAMD;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CACzC,oBAAuC,EACvC,aAA4B;IAE5B,IACE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QACxC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EACzC,CAAC;QACD,MAAM,IAAI,cAAc,CACtB,YAAY,CACV,eAAe,EACf,uBAAuB,aAAa,CAAC,IAAI,oBAAoB,CAC9D,CACF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAErD,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * If primitive: it must match exactly the pattern value
3
+ * If a complex object: it must match (recursively) the pattern value
4
+ * If an array: it must match (recursively) the pattern value.
5
+ * @param pattern
6
+ * @param value
7
+ */
8
+ export declare function conformsToPattern(pattern: unknown, value: unknown): boolean;
@@ -0,0 +1,37 @@
1
+ import { isObject } from "@iguhealth/meta-value/utilities";
2
+ /**
3
+ * If primitive: it must match exactly the pattern value
4
+ * If a complex object: it must match (recursively) the pattern value
5
+ * If an array: it must match (recursively) the pattern value.
6
+ * @param pattern
7
+ * @param value
8
+ */
9
+ export function conformsToPattern(pattern, value) {
10
+ if (isObject(pattern)) {
11
+ if (!isObject(value))
12
+ return false;
13
+ if (Array.isArray(pattern)) {
14
+ if (!Array.isArray(value))
15
+ return false;
16
+ for (let i = 0; i < pattern.length; i++) {
17
+ const valueExists = value.filter((v) => conformsToPattern(pattern[i], v));
18
+ // Per spec as long as a single value matches in the pattern then it's truthy
19
+ if (valueExists.length === 0)
20
+ return false;
21
+ }
22
+ return true;
23
+ }
24
+ else {
25
+ const patternKeys = Object.keys(pattern);
26
+ for (const key of patternKeys) {
27
+ if (!conformsToPattern(pattern[key], value[key]))
28
+ return false;
29
+ }
30
+ return true;
31
+ }
32
+ }
33
+ else {
34
+ return pattern === value;
35
+ }
36
+ }
37
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/profile/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB,EAAE,KAAc;IAChE,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACrC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CACjC,CAAC;gBACF,6EAA6E;gBAC7E,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAC;YAC7C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;gBAC9B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAC;YACjE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,OAAO,KAAK,KAAK,CAAC;IAC3B,CAAC;AACH,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { Loc } from "@oxidized-health/fhir-pointer";
2
+ import {
3
+ ElementDefinition,
4
+ OperationOutcome,
5
+ OperationOutcomeIssue,
6
+ } from "@oxidized-health/fhir-types/r4/types";
7
+ import { FHIR_VERSION, Resource } from "@oxidized-health/fhir-types/versions";
8
+ import { ValidationCTX } from "../types.js";
9
+ type SlicingDescriptor = {
10
+ discriminator: number;
11
+ slices: number[];
12
+ };
13
+ /**
14
+ * Filter elements for discriminator slice + slicing elements.
15
+ * @param elements
16
+ */
17
+ export declare function getSliceIndices(
18
+ elements: ElementDefinition[],
19
+ index: number
20
+ ): SlicingDescriptor[];
21
+ export declare function validateSlice(
22
+ elements: ElementDefinition[],
23
+ sliceIndex: number,
24
+ root: object,
25
+ sliceValueLocs: Loc<any, any, any>[]
26
+ ): Promise<void>;
27
+ export declare function splitSlicing(
28
+ elements: ElementDefinition[],
29
+ sliceDescriptor: SlicingDescriptor,
30
+ root: object,
31
+ loc: Loc<any, any, any>
32
+ ): Promise<Record<number, Loc<any, any, any>[]>>;
33
+ export declare function validateSliceDescriptor(
34
+ ctx: ValidationCTX,
35
+ profile: Resource<FHIR_VERSION, "StructureDefinition">,
36
+ sliceDescriptor: SlicingDescriptor,
37
+ root: object,
38
+ loc: Loc<any, any, any>
39
+ ): Promise<OperationOutcome["issue"]>;
40
+ export default function validateAllSlicesAtLocation(
41
+ ctx: ValidationCTX,
42
+ profile: Resource<FHIR_VERSION, "StructureDefinition">,
43
+ elementIndex: number,
44
+ root: object,
45
+ loc: Loc<any, any, any>
46
+ ): Promise<OperationOutcomeIssue[]>;
47
+ export {};
@@ -0,0 +1,197 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { eleIndexToChildIndices } from "@iguhealth/codegen/traversal/structure-definition";
3
+ import { descend, get, pointer } from "@iguhealth/fhir-pointer";
4
+ import { R4 } from "@iguhealth/fhir-types/versions";
5
+ import * as fp from "@iguhealth/fhirpath";
6
+ import { metaValue } from "@iguhealth/meta-value/v2";
7
+ import { OperationError, issueError, outcomeError, outcomeFatal, } from "@iguhealth/operation-outcomes";
8
+ import { conformsToPattern, conformsToValue } from "../elements/conformance.js";
9
+ import { convertPathToElementPointer, removeTypeOnPath, } from "../profile/utilities.js";
10
+ import { validateElementSingular } from "../structural/index.js";
11
+ import { fieldName } from "../utilities.js";
12
+ function isSliced(element) {
13
+ return element.slicing !== undefined;
14
+ }
15
+ /**
16
+ * Filter elements for discriminator slice + slicing elements.
17
+ * @param elements
18
+ */
19
+ export function getSliceIndices(elements, index) {
20
+ const children = eleIndexToChildIndices(elements, index);
21
+ const slices = [];
22
+ let i = 0;
23
+ while (i < children.length) {
24
+ const childIndex = children[i++];
25
+ if (isSliced(elements[childIndex])) {
26
+ const discriminatorIndex = childIndex;
27
+ const sliceIndexes = [];
28
+ while (i < children.length && elements[children[i]].sliceName) {
29
+ sliceIndexes.push(children[i]);
30
+ i++;
31
+ }
32
+ slices.push({
33
+ discriminator: discriminatorIndex,
34
+ slices: sliceIndexes,
35
+ });
36
+ }
37
+ }
38
+ return slices;
39
+ }
40
+ /**
41
+ * Returns the elementDefinition associated with the given discriminator. This is used to extract the value the slice is expecting.
42
+ * @param discriminator The discriminator to use to distinguish slices.
43
+ * @param elements The elements to search for the slice value.
44
+ * @param currentIndex The current index to search for the slice value.
45
+ * @returns The index of elementdefinition to use to slice the value for the discriminator.
46
+ */
47
+ function findElementDefinitionForSliceDiscriminator(discriminatorElementPath, elements, currentIndex) {
48
+ const element = elements[currentIndex];
49
+ const typelessPath = removeTypeOnPath(element.path);
50
+ if (discriminatorElementPath === typelessPath) {
51
+ return currentIndex;
52
+ }
53
+ if (discriminatorElementPath.startsWith(typelessPath)) {
54
+ const childIndexes = eleIndexToChildIndices(elements, currentIndex);
55
+ for (const childIndex of childIndexes) {
56
+ const foundIndex = findElementDefinitionForSliceDiscriminator(discriminatorElementPath, elements, childIndex);
57
+ if (foundIndex) {
58
+ return foundIndex;
59
+ }
60
+ }
61
+ }
62
+ return undefined;
63
+ }
64
+ async function isConformantToSlicesDiscriminator(discriminator, sliceValueElementDefinition, root, locs) {
65
+ switch (discriminator.type) {
66
+ case "value": {
67
+ const expectedValue = (await fp.evaluate("$this.fixed", sliceValueElementDefinition))[0];
68
+ const conformantLocs = [];
69
+ for (const loc of locs) {
70
+ const value = get(loc, root);
71
+ const evaluation = await fp.evaluate(discriminator.path, value);
72
+ if (evaluation.find((v) => conformsToValue(expectedValue, v)) !==
73
+ undefined) {
74
+ conformantLocs.push(loc);
75
+ }
76
+ }
77
+ return conformantLocs;
78
+ }
79
+ case "exists":
80
+ case "pattern": {
81
+ const pattern = (await fp.evaluate("$this.pattern", metaValue({ type: "ElementDefinition", fhirVersion: R4 }, sliceValueElementDefinition)))[0];
82
+ if (!pattern) {
83
+ throw new OperationError(outcomeError("not-found", "Could not find a pattern for slice."));
84
+ }
85
+ const conformantLocs = [];
86
+ for (const loc of locs) {
87
+ const value = get(loc, root);
88
+ const evaluation = await fp.evaluate(discriminator.path, value);
89
+ if (evaluation.find((v) => conformsToPattern(pattern, v))) {
90
+ conformantLocs.push(loc);
91
+ }
92
+ }
93
+ return conformantLocs;
94
+ }
95
+ case "type":
96
+ case "profile": {
97
+ throw new Error("Not supported");
98
+ }
99
+ }
100
+ throw new Error("invalid");
101
+ }
102
+ export async function validateSlice(elements, sliceIndex, root, sliceValueLocs) {
103
+ for (const sliceValueLoc of sliceValueLocs) {
104
+ const sliceElement = elements[sliceIndex];
105
+ const patternCheck = await fp.evaluate("$this.pattern", sliceElement);
106
+ const sliceValue = get(sliceValueLoc, root);
107
+ const fixedValueCheck = await fp.evaluate("$this.fixed", sliceElement);
108
+ if (patternCheck && !conformsToPattern(patternCheck[0], sliceValue)) {
109
+ throw new OperationError(outcomeError("exception", "pattern mismatch"));
110
+ }
111
+ if (fixedValueCheck) {
112
+ if (JSON.stringify(fixedValueCheck[0]) !== JSON.stringify(sliceValue)) {
113
+ throw new OperationError(outcomeError("exception", "fixed value mismatch"));
114
+ }
115
+ const childrenIndices = eleIndexToChildIndices(elements, sliceIndex);
116
+ for (const child of childrenIndices) {
117
+ const field = fieldName(elements[child]);
118
+ const fieldLoc = descend(sliceValueLoc, field);
119
+ validateSlice(elements, child, root, [fieldLoc]);
120
+ }
121
+ }
122
+ }
123
+ }
124
+ export async function splitSlicing(elements, sliceDescriptor, root, loc) {
125
+ const sliceSplit = sliceDescriptor.slices.reduce((acc, sliceIndex) => {
126
+ acc[sliceIndex] = [];
127
+ return acc;
128
+ }, {});
129
+ const values = get(loc, root);
130
+ if (!Array.isArray(values)) {
131
+ throw new OperationError(outcomeFatal("not-supported", "Cannot slice non array."));
132
+ }
133
+ let locsToCheck = values.map((_v, i) => descend(loc, i));
134
+ // A couple of notes we will determine per discriminator the element path that should be expected.
135
+ // Using that we will loop over the slices and determine if value conforms to slice element using discriminator.
136
+ // [Serialized as a group] The entries must be adjacent for a given slice.
137
+ const discriminatorElement = elements[sliceDescriptor.discriminator];
138
+ const discriminators = discriminatorElement.slicing?.discriminator ?? [];
139
+ const discriminatorElementPaths = discriminators.map((d) => convertPathToElementPointer(discriminatorElement, d));
140
+ for (const sliceIndex of sliceDescriptor.slices) {
141
+ let sliceValueLocs = locsToCheck;
142
+ for (let d = 0; d < discriminators.length; d++) {
143
+ const discriminator = discriminators[d];
144
+ const sliceElementIndex = findElementDefinitionForSliceDiscriminator(discriminatorElementPaths[d], elements, sliceIndex);
145
+ if (!sliceElementIndex)
146
+ throw new OperationError(outcomeError("invalid", "could not find element definition for slice"));
147
+ const sliceElement = elements[sliceElementIndex];
148
+ sliceValueLocs = await isConformantToSlicesDiscriminator(discriminator, sliceElement, root, locsToCheck);
149
+ }
150
+ locsToCheck = locsToCheck.filter((l) => !sliceValueLocs.includes(l));
151
+ sliceSplit[sliceIndex] = sliceValueLocs;
152
+ }
153
+ return sliceSplit;
154
+ }
155
+ function validateSliceCardinality(sliceElement, paths) {
156
+ const issues = [];
157
+ if (paths.length < (sliceElement.min ?? 0)) {
158
+ issues.push(issueError("structure", `Slice '${sliceElement.sliceName}' does not have the minimum number of values.`));
159
+ }
160
+ if (!isNaN(parseInt(sliceElement.max ?? "1"))) {
161
+ const max = parseInt(sliceElement.max ?? "1");
162
+ if (paths.length > max) {
163
+ issues.push(issueError("structure", `Slice '${sliceElement.sliceName}' has more than the maximum number of values.`));
164
+ }
165
+ }
166
+ return issues;
167
+ }
168
+ export async function validateSliceDescriptor(ctx, profile, sliceDescriptor, root, loc) {
169
+ const differential = profile.differential?.element ?? [];
170
+ const discriminatorElement = differential[sliceDescriptor.discriminator];
171
+ const sliceLoc = descend(loc, fieldName(discriminatorElement));
172
+ const slices = await splitSlicing(differential, sliceDescriptor, root, sliceLoc);
173
+ let issues = [];
174
+ const snapshotLoc = descend(descend(pointer("StructureDefinition", profile.id), "snapshot"), "element");
175
+ for (const slice of sliceDescriptor.slices) {
176
+ const idx = (profile?.snapshot?.element ?? []).findIndex((e) => e.id === differential[slice].id);
177
+ const sliceLoc = descend(snapshotLoc, idx);
178
+ const sliceElement = get(sliceLoc, profile);
179
+ if (!sliceElement) {
180
+ throw new OperationError(outcomeError("not-found", `Slice element not found at '${sliceLoc}'`));
181
+ }
182
+ const type = sliceElement.type ?? [];
183
+ issues = issues.concat(validateSliceCardinality(sliceElement, slices[slice]));
184
+ if (type.length > 1) {
185
+ throw new OperationError(outcomeError("not-supported", "typechoices not supported for slicing."));
186
+ }
187
+ for (const path of slices[slice]) {
188
+ issues = issues.concat(await validateElementSingular(ctx, profile, sliceLoc, root, path, type[0].code));
189
+ }
190
+ }
191
+ return issues;
192
+ }
193
+ export default async function validateAllSlicesAtLocation(ctx, profile, elementIndex, root, loc) {
194
+ const sliceIndices = getSliceIndices(profile.differential?.element ?? [], elementIndex);
195
+ return (await Promise.all(sliceIndices.map((sliceIndex) => validateSliceDescriptor(ctx, profile, sliceIndex, root, loc)))).flat();
196
+ }
197
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/slicing/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Loc } from "@haste-health/fhir-pointer";
2
+ import { OperationOutcome, uri } from "@haste-health/fhir-types/r4/types";
3
+ import { ValidationCTX } from "../types.js";
4
+ export default function validate(ctx: ValidationCTX, type: uri, root: unknown, path_?: Loc<any, any, any>): Promise<OperationOutcome["issue"]>;