@smile-cdr/fhirts 2.1.1 → 2.2.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/.github/workflows/npm-publish.yml +1 -1
- package/CHANGELOG.md +9 -0
- package/dist/FHIR-DSTU2.d.ts +22 -22
- package/dist/FHIR-R3.d.ts +21 -22
- package/dist/FHIR-R4/classes/extension.d.ts +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -1
- package/dist/library/QueryBuilder/QueryBuilder.d.ts +59 -0
- package/dist/library/QueryBuilder/QueryBuilder.js +112 -0
- package/dist/library/QueryBuilder/QueryBuilder.spec.d.ts +1 -0
- package/dist/library/QueryBuilder/QueryBuilder.spec.js +135 -0
- package/dist/library/ResourceUtils/ResourceUtils.d.ts +4 -3
- package/dist/library/ResourceUtils/ResourceUtils.spec.js +10 -7
- package/dist/library/constants.d.ts +4 -0
- package/dist/library/constants.js +8 -0
- package/dist/library/dataTypes.d.ts +10 -0
- package/dist/library/dataTypes.js +2 -0
- package/package.json +4 -6
- package/src/FHIR-DSTU2.ts +23 -23
- package/src/FHIR-R3.ts +58 -59
- package/src/FHIR-R4/classes/extension.ts +2 -2
- package/src/index.ts +2 -1
- package/src/library/QueryBuilder/QueryBuilder.spec.ts +149 -0
- package/src/library/QueryBuilder/QueryBuilder.ts +119 -0
- package/src/library/ResourceUtils/ResourceUtils.spec.ts +13 -11
- package/src/library/ResourceUtils/ResourceUtils.ts +25 -23
- package/src/library/constants.ts +4 -0
- package/src/library/dataTypes.ts +10 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.2.0
|
|
4
|
+
|
|
5
|
+
* Update `ResourceUtils` with strong typing to catch incorrect input data types for all FHIR versions.
|
|
6
|
+
* Update some cardinalities for base data types and structures
|
|
7
|
+
|
|
8
|
+
## 2.1.2
|
|
9
|
+
|
|
10
|
+
* Add `QueryBuilder` for ease of generating queries.
|
|
11
|
+
|
|
3
12
|
## 2.1.1
|
|
4
13
|
|
|
5
14
|
* Fix issue with `BundleUtils.getResourceFromBundle` not being able get the values inside nested array under array of objects.
|
package/dist/FHIR-DSTU2.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare class FHIRElement {
|
|
2
|
-
id
|
|
3
|
-
extension
|
|
2
|
+
id?: string;
|
|
3
|
+
extension?: Extension[];
|
|
4
4
|
}
|
|
5
5
|
export declare class BackboneElement extends FHIRElement {
|
|
6
6
|
modifierExtension: any;
|
|
@@ -38,12 +38,12 @@ export declare class CodeableConcept extends FHIRElement {
|
|
|
38
38
|
text: string;
|
|
39
39
|
}
|
|
40
40
|
export declare class Identifier extends FHIRElement {
|
|
41
|
-
use
|
|
42
|
-
type
|
|
43
|
-
system
|
|
44
|
-
value
|
|
45
|
-
period
|
|
46
|
-
assigner
|
|
41
|
+
use?: string;
|
|
42
|
+
type?: CodeableConcept;
|
|
43
|
+
system?: string;
|
|
44
|
+
value?: string;
|
|
45
|
+
period?: Period;
|
|
46
|
+
assigner?: Reference;
|
|
47
47
|
}
|
|
48
48
|
export declare class Reference extends FHIRElement {
|
|
49
49
|
reference: string;
|
|
@@ -61,24 +61,24 @@ export declare class HumanName extends FHIRElement {
|
|
|
61
61
|
}
|
|
62
62
|
export declare class Extension {
|
|
63
63
|
url: string;
|
|
64
|
-
valueString
|
|
65
|
-
valueCode
|
|
66
|
-
valueAddress
|
|
64
|
+
valueString?: string;
|
|
65
|
+
valueCode?: string;
|
|
66
|
+
valueAddress?: Address;
|
|
67
67
|
valueBoolean?: boolean;
|
|
68
|
-
valueHumanName
|
|
69
|
-
valueReference
|
|
70
|
-
valueDate
|
|
71
|
-
valueIdentifier
|
|
68
|
+
valueHumanName?: HumanName;
|
|
69
|
+
valueReference?: Reference;
|
|
70
|
+
valueDate?: Date;
|
|
71
|
+
valueIdentifier?: string;
|
|
72
72
|
valueDecimal?: number;
|
|
73
|
-
valueInteger
|
|
74
|
-
valuePeriod
|
|
73
|
+
valueInteger?: number;
|
|
74
|
+
valuePeriod?: Period;
|
|
75
75
|
}
|
|
76
76
|
export declare class Coding extends FHIRElement {
|
|
77
|
-
system
|
|
78
|
-
version
|
|
79
|
-
code
|
|
80
|
-
display
|
|
81
|
-
userSelected
|
|
77
|
+
system?: string;
|
|
78
|
+
version?: string;
|
|
79
|
+
code?: string;
|
|
80
|
+
display?: string;
|
|
81
|
+
userSelected?: boolean;
|
|
82
82
|
}
|
|
83
83
|
export declare class Period extends FHIRElement {
|
|
84
84
|
start: string;
|
package/dist/FHIR-R3.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare class FHIRElement {
|
|
2
|
-
id
|
|
3
|
-
extension
|
|
2
|
+
id?: string;
|
|
3
|
+
extension?: Extension[];
|
|
4
4
|
}
|
|
5
5
|
export declare class BackboneElement extends FHIRElement {
|
|
6
6
|
modifierExtension: any;
|
|
@@ -32,12 +32,11 @@ export declare class Code extends FHIRElement {
|
|
|
32
32
|
toString(): string;
|
|
33
33
|
}
|
|
34
34
|
export declare class Coding extends FHIRElement {
|
|
35
|
-
system
|
|
36
|
-
version
|
|
37
|
-
code
|
|
38
|
-
display
|
|
39
|
-
userSelected
|
|
40
|
-
value: string;
|
|
35
|
+
system?: string;
|
|
36
|
+
version?: string;
|
|
37
|
+
code?: string;
|
|
38
|
+
display?: string;
|
|
39
|
+
userSelected?: boolean;
|
|
41
40
|
}
|
|
42
41
|
export declare class DoseCoding extends FHIRElement {
|
|
43
42
|
system: string;
|
|
@@ -55,16 +54,16 @@ export declare class HumanName extends FHIRElement {
|
|
|
55
54
|
}
|
|
56
55
|
export declare class Extension {
|
|
57
56
|
url: string;
|
|
58
|
-
valueString
|
|
59
|
-
valueCode
|
|
60
|
-
valueAddress
|
|
57
|
+
valueString?: string;
|
|
58
|
+
valueCode?: string;
|
|
59
|
+
valueAddress?: Address;
|
|
61
60
|
valueBoolean?: boolean;
|
|
62
|
-
valueHumanName
|
|
63
|
-
valueReference
|
|
64
|
-
valueDate
|
|
65
|
-
valueIdentifier
|
|
61
|
+
valueHumanName?: HumanName;
|
|
62
|
+
valueReference?: Reference;
|
|
63
|
+
valueDate?: Date;
|
|
64
|
+
valueIdentifier?: string;
|
|
66
65
|
valueDecimal?: number;
|
|
67
|
-
valueInteger
|
|
66
|
+
valueInteger?: number;
|
|
68
67
|
}
|
|
69
68
|
export declare class Address extends FHIRElement {
|
|
70
69
|
use: Code;
|
|
@@ -188,12 +187,12 @@ export declare class Reference extends FHIRElement {
|
|
|
188
187
|
display: string;
|
|
189
188
|
}
|
|
190
189
|
export declare class Identifier extends FHIRElement {
|
|
191
|
-
use
|
|
192
|
-
type
|
|
193
|
-
system
|
|
194
|
-
value
|
|
195
|
-
period
|
|
196
|
-
assigner
|
|
190
|
+
use?: string;
|
|
191
|
+
type?: CodeableConcept;
|
|
192
|
+
system?: string;
|
|
193
|
+
value?: string;
|
|
194
|
+
period?: Period;
|
|
195
|
+
assigner?: Reference;
|
|
197
196
|
}
|
|
198
197
|
export declare class Payload extends BackboneElement {
|
|
199
198
|
contentString: string;
|
|
@@ -55,7 +55,7 @@ export declare class Extension {
|
|
|
55
55
|
/**
|
|
56
56
|
* Source of the definition for the extension code - a logical name or a URL.
|
|
57
57
|
*/
|
|
58
|
-
url
|
|
58
|
+
url: Uri;
|
|
59
59
|
/**
|
|
60
60
|
* Value of extension - must be one of a constrained set of the data types (see [Extensibility](extensibility.html) for a list).
|
|
61
61
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -4,4 +4,5 @@ import * as fhirR3 from './FHIR-R3';
|
|
|
4
4
|
import * as dstu2 from './FHIR-DSTU2';
|
|
5
5
|
import { ResourceUtils } from './library/ResourceUtils/ResourceUtils';
|
|
6
6
|
import { BundleUtils } from './library/BundleUtils/BundleUtils';
|
|
7
|
-
|
|
7
|
+
import { QueryBuilder } from './library/QueryBuilder/QueryBuilder';
|
|
8
|
+
export { fhirR4, fhirR3, IfhirR4, dstu2, ResourceUtils, BundleUtils, QueryBuilder };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BundleUtils = exports.ResourceUtils = exports.dstu2 = exports.IfhirR4 = exports.fhirR3 = exports.fhirR4 = void 0;
|
|
3
|
+
exports.QueryBuilder = exports.BundleUtils = exports.ResourceUtils = exports.dstu2 = exports.IfhirR4 = exports.fhirR3 = exports.fhirR4 = void 0;
|
|
4
4
|
const fhirR4 = require("./FHIR-R4/classes/models-r4");
|
|
5
5
|
exports.fhirR4 = fhirR4;
|
|
6
6
|
const IfhirR4 = require("./FHIR-R4/interfaces/IModel");
|
|
@@ -13,3 +13,5 @@ const ResourceUtils_1 = require("./library/ResourceUtils/ResourceUtils");
|
|
|
13
13
|
Object.defineProperty(exports, "ResourceUtils", { enumerable: true, get: function () { return ResourceUtils_1.ResourceUtils; } });
|
|
14
14
|
const BundleUtils_1 = require("./library/BundleUtils/BundleUtils");
|
|
15
15
|
Object.defineProperty(exports, "BundleUtils", { enumerable: true, get: function () { return BundleUtils_1.BundleUtils; } });
|
|
16
|
+
const QueryBuilder_1 = require("./library/QueryBuilder/QueryBuilder");
|
|
17
|
+
Object.defineProperty(exports, "QueryBuilder", { enumerable: true, get: function () { return QueryBuilder_1.QueryBuilder; } });
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { SORT_ORDER } from "../constants";
|
|
2
|
+
export declare class QueryBuilder {
|
|
3
|
+
readonly REV_INCLUDE_KEYWORD = "_revinclude";
|
|
4
|
+
readonly INCLUDE_KEYWORD = "_include";
|
|
5
|
+
readonly SORT_KEYWORD = "_sort";
|
|
6
|
+
readonly WILDCARD_ASTERIK = "*";
|
|
7
|
+
readonly EQUALS = "=";
|
|
8
|
+
readonly COLON = ":";
|
|
9
|
+
readonly QUERY_DELIMETER = "&";
|
|
10
|
+
readonly COMMA = ",";
|
|
11
|
+
private baseResource;
|
|
12
|
+
private singularQueries;
|
|
13
|
+
private sortQueries;
|
|
14
|
+
/**
|
|
15
|
+
* @returns base resource for the query
|
|
16
|
+
*/
|
|
17
|
+
getBaseResource(): String;
|
|
18
|
+
/**
|
|
19
|
+
* @param resourceType Base ResourceType for the query
|
|
20
|
+
* sets base resource type for the query
|
|
21
|
+
* i.e. which resource the query will performed for
|
|
22
|
+
*/
|
|
23
|
+
setBaseResource(resourceType: String): this;
|
|
24
|
+
/**
|
|
25
|
+
* @param searchParameter SearchParameter reference to targeted resource
|
|
26
|
+
*/
|
|
27
|
+
include(searchParameter: String): this;
|
|
28
|
+
/**
|
|
29
|
+
* @param resourceType Source ResourceType
|
|
30
|
+
* @param searchParameter SearchParameter reference from target resource to baseResource
|
|
31
|
+
*/
|
|
32
|
+
revinclude(resourceType: String, searchParameter: String): this;
|
|
33
|
+
/**
|
|
34
|
+
* _include all references in query
|
|
35
|
+
*/
|
|
36
|
+
includeAll(): this;
|
|
37
|
+
/**
|
|
38
|
+
* _revinclude all references in query
|
|
39
|
+
*/
|
|
40
|
+
revincludeAll(): this;
|
|
41
|
+
/**
|
|
42
|
+
* @param searchParameter search parameter for the element to sort on
|
|
43
|
+
* @param sortOrder ASCENDING or DESCENDING
|
|
44
|
+
*/
|
|
45
|
+
sort(searchParameter: String, sortOrder: SORT_ORDER): this;
|
|
46
|
+
/**
|
|
47
|
+
* Resets queries to it empty state
|
|
48
|
+
*/
|
|
49
|
+
resetQuery(): this;
|
|
50
|
+
/**
|
|
51
|
+
* @returns complete generated query with encoded parameter values
|
|
52
|
+
*/
|
|
53
|
+
getCompleteUrl(): String;
|
|
54
|
+
/**
|
|
55
|
+
* @returns complete generated query with decoded parameter values
|
|
56
|
+
*/
|
|
57
|
+
getCompleteUrlDecoded(): String;
|
|
58
|
+
private createSortQuery;
|
|
59
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueryBuilder = void 0;
|
|
4
|
+
const constants_1 = require("../constants");
|
|
5
|
+
class QueryBuilder {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.REV_INCLUDE_KEYWORD = "_revinclude";
|
|
8
|
+
this.INCLUDE_KEYWORD = "_include";
|
|
9
|
+
this.SORT_KEYWORD = "_sort";
|
|
10
|
+
this.WILDCARD_ASTERIK = "*";
|
|
11
|
+
this.EQUALS = "=";
|
|
12
|
+
this.COLON = ":";
|
|
13
|
+
this.QUERY_DELIMETER = "&";
|
|
14
|
+
this.COMMA = ",";
|
|
15
|
+
this.baseResource = "";
|
|
16
|
+
this.singularQueries = [];
|
|
17
|
+
this.sortQueries = [];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @returns base resource for the query
|
|
21
|
+
*/
|
|
22
|
+
getBaseResource() {
|
|
23
|
+
return this.baseResource;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* @param resourceType Base ResourceType for the query
|
|
27
|
+
* sets base resource type for the query
|
|
28
|
+
* i.e. which resource the query will performed for
|
|
29
|
+
*/
|
|
30
|
+
setBaseResource(resourceType) {
|
|
31
|
+
this.baseResource = resourceType;
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* @param searchParameter SearchParameter reference to targeted resource
|
|
36
|
+
*/
|
|
37
|
+
include(searchParameter) {
|
|
38
|
+
this.singularQueries.push(this.INCLUDE_KEYWORD + this.EQUALS + encodeURIComponent(this.baseResource + this.COLON + searchParameter));
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @param resourceType Source ResourceType
|
|
43
|
+
* @param searchParameter SearchParameter reference from target resource to baseResource
|
|
44
|
+
*/
|
|
45
|
+
revinclude(resourceType, searchParameter) {
|
|
46
|
+
this.singularQueries.push(this.REV_INCLUDE_KEYWORD + this.EQUALS + encodeURIComponent(resourceType + this.COLON + searchParameter));
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* _include all references in query
|
|
51
|
+
*/
|
|
52
|
+
includeAll() {
|
|
53
|
+
this.singularQueries.push(this.INCLUDE_KEYWORD + this.EQUALS + this.WILDCARD_ASTERIK);
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* _revinclude all references in query
|
|
58
|
+
*/
|
|
59
|
+
revincludeAll() {
|
|
60
|
+
this.singularQueries.push(this.REV_INCLUDE_KEYWORD + this.EQUALS + this.WILDCARD_ASTERIK);
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* @param searchParameter search parameter for the element to sort on
|
|
65
|
+
* @param sortOrder ASCENDING or DESCENDING
|
|
66
|
+
*/
|
|
67
|
+
sort(searchParameter, sortOrder) {
|
|
68
|
+
if (sortOrder === constants_1.SORT_ORDER.ASCENDING) {
|
|
69
|
+
this.sortQueries.push(searchParameter);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
this.sortQueries.push("-" + searchParameter);
|
|
73
|
+
}
|
|
74
|
+
return this;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resets queries to it empty state
|
|
78
|
+
*/
|
|
79
|
+
resetQuery() {
|
|
80
|
+
this.sortQueries = [];
|
|
81
|
+
this.singularQueries = [];
|
|
82
|
+
this.baseResource = "";
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* @returns complete generated query with encoded parameter values
|
|
87
|
+
*/
|
|
88
|
+
getCompleteUrl() {
|
|
89
|
+
let completeUrl = this.baseResource + "?";
|
|
90
|
+
const singularQueriesLength = this.singularQueries.length;
|
|
91
|
+
if (singularQueriesLength > 0) {
|
|
92
|
+
completeUrl += this.singularQueries.join(this.QUERY_DELIMETER);
|
|
93
|
+
}
|
|
94
|
+
completeUrl += this.createSortQuery(singularQueriesLength);
|
|
95
|
+
return completeUrl;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* @returns complete generated query with decoded parameter values
|
|
99
|
+
*/
|
|
100
|
+
getCompleteUrlDecoded() {
|
|
101
|
+
return decodeURIComponent(this.getCompleteUrl().toString());
|
|
102
|
+
}
|
|
103
|
+
createSortQuery(singularQueriesLength) {
|
|
104
|
+
let sortQuery = "";
|
|
105
|
+
const sortDelimeter = singularQueriesLength > 0 ? this.QUERY_DELIMETER : "";
|
|
106
|
+
if (this.sortQueries.length > 0) {
|
|
107
|
+
sortQuery += sortDelimeter + this.SORT_KEYWORD + this.EQUALS + encodeURIComponent(this.sortQueries.join(this.COMMA));
|
|
108
|
+
}
|
|
109
|
+
return sortQuery;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.QueryBuilder = QueryBuilder;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const constants_1 = require("../constants");
|
|
4
|
+
const QueryBuilder_1 = require("./QueryBuilder");
|
|
5
|
+
describe("QueryBuilder", () => {
|
|
6
|
+
let queryBuilder;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
queryBuilder = new QueryBuilder_1.QueryBuilder();
|
|
9
|
+
});
|
|
10
|
+
it('setBaseResource() should set base resource and getBaseResource() should return correct base resource', () => {
|
|
11
|
+
// setup
|
|
12
|
+
const expected = "Patient";
|
|
13
|
+
// execute
|
|
14
|
+
queryBuilder.setBaseResource(expected);
|
|
15
|
+
// validate
|
|
16
|
+
expect(queryBuilder.getBaseResource()).toEqual(expected);
|
|
17
|
+
});
|
|
18
|
+
it('include() should make query for _include', () => {
|
|
19
|
+
// setup
|
|
20
|
+
const expected = "Patient?_include=Patient%3Aorganization";
|
|
21
|
+
// execute
|
|
22
|
+
queryBuilder.setBaseResource("Patient").include("organization");
|
|
23
|
+
// validate
|
|
24
|
+
expect(queryBuilder.getCompleteUrl()).toEqual(expected);
|
|
25
|
+
});
|
|
26
|
+
it('include() should make query for multiple _include', () => {
|
|
27
|
+
// setup
|
|
28
|
+
const expected = "Patient?_include=Patient%3Aorganization&_include=Patient%3Alink";
|
|
29
|
+
// execute
|
|
30
|
+
queryBuilder.setBaseResource("Patient")
|
|
31
|
+
.include("organization")
|
|
32
|
+
.include("link");
|
|
33
|
+
// validate
|
|
34
|
+
expect(queryBuilder.getCompleteUrl()).toEqual(expected);
|
|
35
|
+
});
|
|
36
|
+
it('revinclude() should make query for _revinclude', () => {
|
|
37
|
+
// setup
|
|
38
|
+
const expected = "MedicationRequest?_revinclude=CarePlan%3Aactivity-reference";
|
|
39
|
+
// execute
|
|
40
|
+
queryBuilder.setBaseResource("MedicationRequest")
|
|
41
|
+
.revinclude("CarePlan", "activity-reference");
|
|
42
|
+
// validate
|
|
43
|
+
expect(queryBuilder.getCompleteUrl()).toEqual(expected);
|
|
44
|
+
});
|
|
45
|
+
it('revinclude() should make query for multiple _revinclude', () => {
|
|
46
|
+
// setup
|
|
47
|
+
const expected = "MedicationRequest?_revinclude=CarePlan%3Aactivity-reference&_revinclude=Observation%3Abased-on";
|
|
48
|
+
// execute
|
|
49
|
+
queryBuilder.setBaseResource("MedicationRequest")
|
|
50
|
+
.revinclude("CarePlan", "activity-reference")
|
|
51
|
+
.revinclude("Observation", "based-on");
|
|
52
|
+
// validate
|
|
53
|
+
expect(queryBuilder.getCompleteUrl()).toEqual(expected);
|
|
54
|
+
});
|
|
55
|
+
it('include() and revinclude() should make query for _include & _revinclude', () => {
|
|
56
|
+
// setup
|
|
57
|
+
const expected = "MedicationRequest?_revinclude=CarePlan%3Aactivity-reference&_include=MedicationRequest%3Aencounter";
|
|
58
|
+
// execute
|
|
59
|
+
queryBuilder.setBaseResource("MedicationRequest")
|
|
60
|
+
.revinclude("CarePlan", "activity-reference")
|
|
61
|
+
.include("encounter");
|
|
62
|
+
// validate
|
|
63
|
+
expect(queryBuilder.getCompleteUrl()).toEqual(expected);
|
|
64
|
+
});
|
|
65
|
+
it('includeAll() should make query for _include all', () => {
|
|
66
|
+
// setup
|
|
67
|
+
const expected = "MedicationRequest?_include=*";
|
|
68
|
+
// execute
|
|
69
|
+
queryBuilder.setBaseResource("MedicationRequest").includeAll();
|
|
70
|
+
// validate
|
|
71
|
+
expect(queryBuilder.getCompleteUrl()).toEqual(expected);
|
|
72
|
+
});
|
|
73
|
+
it('revincludeAll() should make query for _revinclude all', () => {
|
|
74
|
+
// setup
|
|
75
|
+
const expected = "MedicationRequest?_revinclude=*";
|
|
76
|
+
// execute
|
|
77
|
+
queryBuilder.setBaseResource("MedicationRequest").revincludeAll();
|
|
78
|
+
// validate
|
|
79
|
+
expect(queryBuilder.getCompleteUrl()).toEqual(expected);
|
|
80
|
+
});
|
|
81
|
+
it('includeAll() & revincludeAll() should make query for _include all & _revinclude all', () => {
|
|
82
|
+
// setup
|
|
83
|
+
const expected = "MedicationRequest?_revinclude=*&_include=*";
|
|
84
|
+
// execute
|
|
85
|
+
queryBuilder.setBaseResource("MedicationRequest")
|
|
86
|
+
.revincludeAll()
|
|
87
|
+
.includeAll();
|
|
88
|
+
// validate
|
|
89
|
+
expect(queryBuilder.getCompleteUrl()).toEqual(expected);
|
|
90
|
+
});
|
|
91
|
+
it('sort() should make query for _sort', () => {
|
|
92
|
+
// setup
|
|
93
|
+
const expected = "Observation?_sort=status%2C-date";
|
|
94
|
+
// execute
|
|
95
|
+
queryBuilder.setBaseResource("Observation")
|
|
96
|
+
.sort("status", constants_1.SORT_ORDER.ASCENDING)
|
|
97
|
+
.sort("date", constants_1.SORT_ORDER.DESCENDING);
|
|
98
|
+
// validate
|
|
99
|
+
expect(queryBuilder.getCompleteUrl()).toEqual(expected);
|
|
100
|
+
});
|
|
101
|
+
it('sort(), include() and revincludeAll() should make query for _sort, _include & _revinclude', () => {
|
|
102
|
+
// setup
|
|
103
|
+
const expected = "Observation?_revinclude=*&_include=Observation%3Abased-on&_sort=status";
|
|
104
|
+
// execute
|
|
105
|
+
queryBuilder.setBaseResource("Observation")
|
|
106
|
+
.revincludeAll()
|
|
107
|
+
.include("based-on")
|
|
108
|
+
.sort("status", constants_1.SORT_ORDER.ASCENDING);
|
|
109
|
+
// validate
|
|
110
|
+
expect(queryBuilder.getCompleteUrl()).toEqual(expected);
|
|
111
|
+
});
|
|
112
|
+
it('resetQuery() should reset query', () => {
|
|
113
|
+
// setup
|
|
114
|
+
const expected = "";
|
|
115
|
+
queryBuilder.setBaseResource("Observation")
|
|
116
|
+
.revincludeAll()
|
|
117
|
+
.include("based-on")
|
|
118
|
+
.sort("status", constants_1.SORT_ORDER.ASCENDING);
|
|
119
|
+
// execute
|
|
120
|
+
queryBuilder.resetQuery();
|
|
121
|
+
// validate
|
|
122
|
+
expect(queryBuilder.getBaseResource()).toEqual(expected);
|
|
123
|
+
});
|
|
124
|
+
it('getCompleteUrlDecoded() should get uri decoded query', () => {
|
|
125
|
+
// setup
|
|
126
|
+
const expected = "Observation?_revinclude=*&_include=Observation:based-on&_sort=status";
|
|
127
|
+
// execute
|
|
128
|
+
queryBuilder.setBaseResource("Observation")
|
|
129
|
+
.revincludeAll()
|
|
130
|
+
.include("based-on")
|
|
131
|
+
.sort("status", constants_1.SORT_ORDER.ASCENDING);
|
|
132
|
+
// validate
|
|
133
|
+
expect(queryBuilder.getCompleteUrlDecoded()).toEqual(expected);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Coding, CodingKeys, Extension, Identifier, IdentifierKeys } from "../dataTypes";
|
|
1
2
|
export declare class ResourceUtils {
|
|
2
3
|
/**
|
|
3
4
|
*
|
|
@@ -15,14 +16,14 @@ export declare class ResourceUtils {
|
|
|
15
16
|
* @returns array of matches
|
|
16
17
|
* @limitations currently does not work with identifier.type, identifier.period & identifier.assigner
|
|
17
18
|
*/
|
|
18
|
-
getIdentifiersByProperty(identifierList:
|
|
19
|
+
getIdentifiersByProperty(identifierList: Identifier[], propertyToCompare: IdentifierKeys, propertyValue: Identifier[IdentifierKeys]): Identifier[];
|
|
19
20
|
/**
|
|
20
21
|
*
|
|
21
22
|
* @param extensionList list of extensions
|
|
22
23
|
* @param extensionUrl Extension.url to compare
|
|
23
24
|
* @returns array of matches
|
|
24
25
|
*/
|
|
25
|
-
getExtensionsByUrl(extensionList:
|
|
26
|
+
getExtensionsByUrl(extensionList: Extension[], extensionUrl: string): Extension[];
|
|
26
27
|
/**
|
|
27
28
|
*
|
|
28
29
|
* @param codingList list of codings
|
|
@@ -30,7 +31,7 @@ export declare class ResourceUtils {
|
|
|
30
31
|
* @param propertyValue value we want to compare against string or boolean
|
|
31
32
|
* @returns array of matches
|
|
32
33
|
*/
|
|
33
|
-
getCodingsByProperty(codingList:
|
|
34
|
+
getCodingsByProperty(codingList: Coding[], propertyToCompare: CodingKeys, propertyValue: Coding[CodingKeys]): Coding[];
|
|
34
35
|
/**
|
|
35
36
|
*
|
|
36
37
|
* @param resource resource for which path needs to be validated
|
|
@@ -42,9 +42,9 @@ describe("ResourceUtils", () => {
|
|
|
42
42
|
];
|
|
43
43
|
it("should return empty array if null is passed as identifier list", () => {
|
|
44
44
|
// setup
|
|
45
|
-
const value = "
|
|
45
|
+
const value = "shouldBeIgnored";
|
|
46
46
|
// execute
|
|
47
|
-
const actual = resourceUtils.getIdentifiersByProperty(null, "
|
|
47
|
+
const actual = resourceUtils.getIdentifiersByProperty(null, "id", value);
|
|
48
48
|
// validate
|
|
49
49
|
expect(actual.length).toEqual(0);
|
|
50
50
|
});
|
|
@@ -52,7 +52,8 @@ describe("ResourceUtils", () => {
|
|
|
52
52
|
// setup
|
|
53
53
|
const value = "abc";
|
|
54
54
|
// execute
|
|
55
|
-
const actual = resourceUtils.getIdentifiersByProperty(identifierList, "
|
|
55
|
+
const actual = resourceUtils.getIdentifiersByProperty(identifierList, "extension", // no extensions in test data
|
|
56
|
+
value);
|
|
56
57
|
// validate
|
|
57
58
|
expect(actual.length).toEqual(0);
|
|
58
59
|
});
|
|
@@ -94,11 +95,12 @@ describe("ResourceUtils", () => {
|
|
|
94
95
|
// setup
|
|
95
96
|
const extensionListInvalid = [
|
|
96
97
|
{
|
|
98
|
+
// @ts-ignore
|
|
97
99
|
use: "temp",
|
|
98
100
|
system: "http://hl7.org/fhir/sid/us-ssn",
|
|
99
101
|
value: "abc",
|
|
100
102
|
},
|
|
101
|
-
];
|
|
103
|
+
]; // disabling compiler warning for the test
|
|
102
104
|
const url = "http://ns.electronichealth.net.au/id/hi/ihi/1.0";
|
|
103
105
|
// execute
|
|
104
106
|
const actual = resourceUtils.getExtensionsByUrl(extensionListInvalid, url);
|
|
@@ -140,9 +142,9 @@ describe("ResourceUtils", () => {
|
|
|
140
142
|
];
|
|
141
143
|
it("should return empty array if null is passed as coding list", () => {
|
|
142
144
|
// setup
|
|
143
|
-
const value = "
|
|
145
|
+
const value = "shouldBeIgnored";
|
|
144
146
|
// execute
|
|
145
|
-
const actual = resourceUtils.getCodingsByProperty(null, "
|
|
147
|
+
const actual = resourceUtils.getCodingsByProperty(null, "extension", value);
|
|
146
148
|
// validate
|
|
147
149
|
expect(actual.length).toEqual(0);
|
|
148
150
|
});
|
|
@@ -150,7 +152,8 @@ describe("ResourceUtils", () => {
|
|
|
150
152
|
// setup
|
|
151
153
|
const value = "abc";
|
|
152
154
|
// execute
|
|
153
|
-
const actual = resourceUtils.getCodingsByProperty(codingList, "
|
|
155
|
+
const actual = resourceUtils.getCodingsByProperty(codingList, "id", // expect no ID in codingList
|
|
156
|
+
value);
|
|
154
157
|
// validate
|
|
155
158
|
expect(actual.length).toEqual(0);
|
|
156
159
|
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SORT_ORDER = void 0;
|
|
4
|
+
var SORT_ORDER;
|
|
5
|
+
(function (SORT_ORDER) {
|
|
6
|
+
SORT_ORDER[SORT_ORDER["ASCENDING"] = 0] = "ASCENDING";
|
|
7
|
+
SORT_ORDER[SORT_ORDER["DESCENDING"] = 1] = "DESCENDING";
|
|
8
|
+
})(SORT_ORDER = exports.SORT_ORDER || (exports.SORT_ORDER = {}));
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as DSTU2 from "../FHIR-DSTU2";
|
|
2
|
+
import * as R3 from "../FHIR-R3";
|
|
3
|
+
import { Coding as r4Coding } from "../FHIR-R4/classes/coding";
|
|
4
|
+
import { Extension as r4Extension } from "../FHIR-R4/classes/extension";
|
|
5
|
+
import { Identifier as r4Identifier } from "../FHIR-R4/classes/identifier";
|
|
6
|
+
export type Identifier = r4Identifier & R3.Identifier & DSTU2.Identifier;
|
|
7
|
+
export type IdentifierKeys = keyof Identifier;
|
|
8
|
+
export type Extension = r4Extension & R3.Extension & DSTU2.Extension;
|
|
9
|
+
export type Coding = r4Coding & R3.Coding & DSTU2.Coding;
|
|
10
|
+
export type CodingKeys = keyof Coding;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smile-cdr/fhirts",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Fhir ts/js library for frontend apps",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -14,13 +14,11 @@
|
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
16
|
"@types/jasmine": "^4.3.1",
|
|
17
|
+
"@types/node": "^20.12.12",
|
|
18
|
+
"better-npm-audit": "^3.7.3",
|
|
17
19
|
"jasmine": "^4.5.0",
|
|
20
|
+
"nyc": "^15.1.0",
|
|
18
21
|
"ts-node": "^10.9.1",
|
|
19
22
|
"typescript": "^4.0.2"
|
|
20
|
-
},
|
|
21
|
-
"dependencies": {
|
|
22
|
-
"@types/node": "^18.11.15",
|
|
23
|
-
"better-npm-audit": "^3.7.3",
|
|
24
|
-
"nyc": "^15.1.0"
|
|
25
23
|
}
|
|
26
24
|
}
|