@arkhn/fhir.ts
Advanced tools
Comparing version 2.0.1 to 3.0.0
@@ -11,9 +11,9 @@ import { AttributeDefinition } from './types'; | ||
types: string[]; | ||
isArray: boolean; | ||
isSlice: boolean; | ||
isItem: boolean; | ||
isRequired: boolean; | ||
isPrimitive: boolean; | ||
index?: number; | ||
constructor(definition: AttributeDefinition); | ||
get isRequired(): boolean; | ||
get isArray(): boolean; | ||
get isReferenceType(): boolean; | ||
@@ -26,3 +26,3 @@ get tail(): string; | ||
addSlice(slice: Attribute): void; | ||
addItem(item: Attribute, index?: number): void; | ||
addItem(index?: number): Attribute; | ||
removeItem(item: Attribute): void; | ||
@@ -29,0 +29,0 @@ toJSON(): this & { |
@@ -45,9 +45,7 @@ "use strict"; | ||
this.items = []; | ||
this.definition = definition; | ||
this.definition = JSON.parse(JSON.stringify(definition)); | ||
this.id = definition.id.split('.').pop(); | ||
this.name = definition.path.split('.').pop(); | ||
this.isArray = definition.max === '*' || Number(definition.max) > 1; | ||
this.isSlice = !!definition.sliceName; | ||
this.isItem = false; | ||
this.isRequired = definition.min > 0; | ||
this.types = definition.type | ||
@@ -63,2 +61,16 @@ ? definition.type.map(function (type) { return type.code; }) | ||
} | ||
Object.defineProperty(Attribute.prototype, "isRequired", { | ||
get: function () { | ||
return this.definition.min > 0; | ||
}, | ||
enumerable: true, | ||
configurable: true | ||
}); | ||
Object.defineProperty(Attribute.prototype, "isArray", { | ||
get: function () { | ||
return this.definition.max === '*' || Number(this.definition.max) > 1; | ||
}, | ||
enumerable: true, | ||
configurable: true | ||
}); | ||
Object.defineProperty(Attribute.prototype, "isReferenceType", { | ||
@@ -104,14 +116,9 @@ get: function () { | ||
var attr = new Attribute(serialized.definition); | ||
for (var _i = 0, _a = serialized.children; _i < _a.length; _i++) { | ||
var child = _a[_i]; | ||
attr.addChild(Attribute.from(child)); | ||
} | ||
for (var _b = 0, _c = serialized.slices; _b < _c.length; _b++) { | ||
var slice = _c[_b]; | ||
attr.addSlice(Attribute.from(slice)); | ||
} | ||
for (var _d = 0, _e = serialized.items; _d < _e.length; _d++) { | ||
var item = _e[_d]; | ||
attr.addItem(Attribute.from(item)); | ||
} | ||
serialized.children.forEach(function (child) { | ||
return attr.addChild(Attribute.from(child)); | ||
}); | ||
serialized.slices.forEach(function (slice) { | ||
return attr.addSlice(Attribute.from(slice)); | ||
}); | ||
serialized.items.forEach(function () { return attr.addItem(); }); | ||
return attr; | ||
@@ -153,3 +160,3 @@ }; | ||
// If the added item has slices, we must pass along the item's index. | ||
Attribute.prototype.addItem = function (item, index) { | ||
Attribute.prototype.addItem = function (index) { | ||
var _this = this; | ||
@@ -169,2 +176,7 @@ var computeIndex = function () { | ||
}; | ||
if (!this.isArray) { | ||
throw new Error("trying to add an item to a non-array attribute"); | ||
} | ||
var item = Attribute.from(this); | ||
item.definition.max = '1'; | ||
item.parent = this.parent; | ||
@@ -178,2 +190,3 @@ item.isItem = true; | ||
this.items.push(item); | ||
return item; | ||
}; | ||
@@ -180,0 +193,0 @@ // removeItem simply removes an attribute from the list of items. |
{ | ||
"name": "@arkhn/fhir.ts", | ||
"private": false, | ||
"version": "2.0.1", | ||
"version": "3.0.0", | ||
"description": "Open source typescript library providing FHIR utilities", | ||
@@ -6,0 +6,0 @@ "main": "lib/index.js", |
import { Attribute } from 'attribute' | ||
import { AttributeDefinition } from 'types' | ||
import { notDeepEqual } from 'assert' | ||
const observationIdentifierDefinition: AttributeDefinition = { | ||
id: 'Observation.identifier', | ||
path: 'Observation.identifier', | ||
definition: 'identifier', | ||
min: 0, | ||
max: '*', | ||
base: { | ||
path: 'Observation.identifier', | ||
}, | ||
type: [ | ||
{ | ||
code: 'string', | ||
}, | ||
], | ||
} | ||
const observationCodeDefinition: AttributeDefinition = { | ||
@@ -19,12 +34,2 @@ id: 'Observation.code', | ||
], | ||
constraint: [ | ||
{ | ||
key: 'ele-1', | ||
severity: 'error', | ||
human: 'All FHIR elements must have a @value or children', | ||
expression: 'hasValue() or (children().count() > id.count())', | ||
xpath: '@value|f:*|h:div', | ||
source: 'http://hl7.org/fhir/StructureDefinition/Element', | ||
}, | ||
], | ||
} | ||
@@ -105,12 +110,2 @@ | ||
}, | ||
"constraint": Array [ | ||
Object { | ||
"expression": "hasValue() or (children().count() > id.count())", | ||
"human": "All FHIR elements must have a @value or children", | ||
"key": "ele-1", | ||
"severity": "error", | ||
"source": "http://hl7.org/fhir/StructureDefinition/Element", | ||
"xpath": "@value|f:*|h:div", | ||
}, | ||
], | ||
"definition": "Heart Rate.", | ||
@@ -128,6 +123,4 @@ "id": "Observation.code", | ||
"id": "code", | ||
"isArray": false, | ||
"isItem": false, | ||
"isPrimitive": false, | ||
"isRequired": true, | ||
"isSlice": false, | ||
@@ -164,7 +157,4 @@ "items": Array [], | ||
const child2 = new Attribute(observationIdDefinition) | ||
const child3 = new Attribute(observationIdDefinition) | ||
const child3 = new Attribute(observationIdentifierDefinition) | ||
const item1 = new Attribute(observationIdDefinition) | ||
const item2 = new Attribute(observationIdDefinition) | ||
const slice = new Attribute(observationCategorySliceDefinition) | ||
@@ -184,4 +174,4 @@ const sliceChild1 = new Attribute(observationIdDefinition) | ||
child3.addSlice(slice) | ||
child3.addItem(item1) | ||
child3.addItem(item2) | ||
child3.addItem() | ||
child3.addItem() | ||
@@ -200,6 +190,6 @@ const copied = Attribute.from(parent) | ||
it('adds an index when attribute is an array item', () => { | ||
const parent = new Attribute(observationCodeDefinition) | ||
const attr = new Attribute(observationIdDefinition) | ||
parent.addItem(attr) | ||
expect(attr.tail).toEqual('id[0]') | ||
const array = new Attribute(observationIdentifierDefinition) | ||
const item = array.addItem() | ||
expect(item.tail).toEqual('identifier[0]') | ||
}) | ||
@@ -213,6 +203,6 @@ | ||
it('handles slice array item', () => { | ||
const parent = new Attribute(observationCodeDefinition) | ||
const item = new Attribute(observationCodeDefinition) | ||
const array = new Attribute(observationIdentifierDefinition) | ||
const slice = new Attribute(observationCategorySliceDefinition) | ||
parent.addItem(item) | ||
const item = array.addItem() | ||
item.addSlice(slice) | ||
@@ -301,6 +291,5 @@ expect(slice.tail).toEqual('category[0]') | ||
it('handles slice items', () => { | ||
const array = new Attribute(observationCodeDefinition) | ||
const item = new Attribute(observationIdDefinition) | ||
const array = new Attribute(observationIdentifierDefinition) | ||
const slice = new Attribute(observationValueSliceDefinition) | ||
array.addItem(item) | ||
const item = array.addItem() | ||
item.addSlice(slice) | ||
@@ -316,6 +305,12 @@ | ||
describe('addItem', () => { | ||
it('throws if the attribute is not an array', () => { | ||
const notArray = new Attribute(observationCodeDefinition) | ||
expect(() => notArray.addItem()).toThrowError( | ||
'trying to add an item to a non-array attribute', | ||
) | ||
}) | ||
it('adds an item with and index and update the parent', () => { | ||
const array = new Attribute(observationCodeDefinition) | ||
const item = new Attribute(observationIdDefinition) | ||
array.addItem(item) | ||
const array = new Attribute(observationIdentifierDefinition) | ||
const item = array.addItem() | ||
@@ -328,11 +323,10 @@ expect(array.items).toEqual([item]) | ||
it('forwards the index to the slices if any', () => { | ||
const array = new Attribute(observationCodeDefinition) | ||
const item = new Attribute(observationIdDefinition) | ||
const array = new Attribute(observationIdentifierDefinition) | ||
const slice1 = new Attribute(observationValueSliceDefinition) | ||
const slice2 = new Attribute(observationValueSliceDefinition) | ||
const item = array.addItem() | ||
item.addSlice(slice1) | ||
item.addSlice(slice2) | ||
array.addItem(item) | ||
expect(slice1.isItem).toBe(true) | ||
@@ -345,6 +339,5 @@ expect(slice1.index).toEqual(item.index) | ||
it('accepts an optional index', () => { | ||
const array = new Attribute(observationCodeDefinition) | ||
const item = new Attribute(observationIdDefinition) | ||
const array = new Attribute(observationIdentifierDefinition) | ||
const item = array.addItem(42) | ||
array.addItem(item, 42) | ||
expect(item.isItem).toBe(true) | ||
@@ -355,12 +348,8 @@ expect(item.index).toEqual(42) | ||
it('computes the index', () => { | ||
const array = new Attribute(observationCodeDefinition) | ||
const item1 = new Attribute(observationIdDefinition) | ||
const item2 = new Attribute(observationIdDefinition) | ||
const item3 = new Attribute(observationIdDefinition) | ||
const item4 = new Attribute(observationIdDefinition) | ||
const array = new Attribute(observationIdentifierDefinition) | ||
const item1 = array.addItem(42) | ||
const item2 = array.addItem(1) | ||
const item3 = array.addItem() | ||
const item4 = array.addItem() | ||
array.addItem(item1, 42) | ||
array.addItem(item2, 1) | ||
array.addItem(item3) | ||
array.addItem(item4) | ||
expect(item1.index).toEqual(42) | ||
@@ -371,3 +360,3 @@ expect(item2.index).toEqual(1) | ||
expect(() => array.addItem(item1, 1)).toThrowError( | ||
expect(() => array.addItem(1)).toThrowError( | ||
'item with index 1 already exists', | ||
@@ -380,11 +369,7 @@ ) | ||
it('removes an item from the array', () => { | ||
const array = new Attribute(observationCodeDefinition) | ||
const item1 = new Attribute(observationIdDefinition) | ||
const item2 = new Attribute(observationIdDefinition) | ||
const item3 = new Attribute(observationIdDefinition) | ||
const array = new Attribute(observationIdentifierDefinition) | ||
const item1 = array.addItem() | ||
const item2 = array.addItem() | ||
const item3 = array.addItem() | ||
array.addItem(item1) | ||
array.addItem(item2) | ||
array.addItem(item3) | ||
array.removeItem(item2) | ||
@@ -391,0 +376,0 @@ |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
423913
5570