adding medical record wizard for lab results. (#350)

This commit is contained in:
Jason Kulatunga 2023-12-08 13:14:02 -08:00 committed by GitHub
parent 82fd5d103a
commit eac07d01e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 679 additions and 24 deletions

View File

@ -35,6 +35,41 @@
"glob": "**/*",
"input": "./node_modules/dwv/decoders/",
"output": "/assets/dwv/decoders/"
},
{
"glob": "**/*.js",
"input": "./node_modules/lforms/dist/lforms/webcomponent/",
"output": "/assets/js/lforms/"
},
{
"glob": "**/*.js.map",
"input": "./node_modules/lforms/dist/lforms/webcomponent/",
"output": "/assets/js/lforms/"
},
{
"glob": "**/*.js",
"input": "./node_modules/lforms/dist/lforms/fhir/",
"output": "/assets/js/lforms/fhir/"
},
{
"glob": "**/*.js.map",
"input": "./node_modules/lforms/dist/lforms/fhir/",
"output": "/assets/js/lforms/fhir/"
},
{
"glob": "**/*.js",
"input": "./node_modules/@webcomponents/webcomponentsjs",
"output": "/assets/js/webcomponents/"
},
{
"glob": "**/*.css",
"input": "./node_modules/lforms/dist/lforms/webcomponent/",
"output": "/assets/css/lforms/"
},
{
"glob": "**/*.png",
"input": "./node_modules/lforms/dist/lforms/webcomponent/",
"output": "/assets/css/lforms/"
}
],
"styles": [

View File

@ -36,6 +36,7 @@
"@panva/oauth4webapi": "1.2.0",
"@swimlane/ngx-datatable": "^20.0.0",
"@types/fhir": "^0.0.35",
"@webcomponents/webcomponentsjs": "^2.8.0",
"asmcrypto.js": "^2.3.2",
"bootstrap": "^4.4.1",
"chart.js": "^4.0.1",
@ -45,6 +46,7 @@
"humanize-duration": "^3.27.3",
"idb": "^7.1.0",
"jose": "^4.10.4",
"lforms": "34.0.0",
"moment": "^2.29.4",
"ng2-charts": "^4.1.1",
"ngx-dropzone": "^3.1.0",

View File

@ -1,5 +1,5 @@
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import {HttpClientModule, HTTP_INTERCEPTORS, HttpClient} from '@angular/common/http';
@ -105,7 +105,8 @@ import {FhirDatatableModule} from './components/fhir-datatable/fhir-datatable.mo
}
],
exports: [],
bootstrap: [AppComponent]
bootstrap: [AppComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA] //required for lhncbc/lforms (webcomponent)
})
export class AppModule {
constructor(library: FaIconLibrary) {

View File

@ -68,6 +68,7 @@
class="mr-auto"
[collectionSize]="metaData.length"
[(page)]="tagsPage"
[maxSize]="15"
[pageSize]="tagsPageSize"
(pageChange)="refreshTags()"
>

View File

@ -137,10 +137,13 @@ export class ObservationComponent implements OnInit {
//populate chart data
this.barChartLabels.push(
formatDate(this.displayModel?.effective_date, "mediumDate", "en-US", undefined)
)
if(this.displayModel?.effective_date) {
this.barChartLabels.push(
formatDate(this.displayModel?.effective_date, "mediumDate", "en-US", undefined)
)
} else {
this.barChartLabels.push("")
}
this.barChartData[0].data = [[this.displayModel?.reference_range?.[0]?.low?.value, this.displayModel?.reference_range?.[0]?.high?.value]]
this.barChartData[1].data = [[this.displayModel?.value_quantity_value as number, this.displayModel?.value_quantity_value as number]]

View File

@ -0,0 +1,38 @@
<div class="modal-header">
<h4 class="modal-title" id="modal-attachment">Lab Results</h4>
<button type="button" class="close" aria-label="Close" (click)="activeModal.dismiss()"><span aria-hidden="true">×</span></button>
</div>
<div class="modal-body">
<div *ngIf="debugMode" class="alert alert-warning">
<!-- <pre><code [highlight]="newAttachmentForm.getRawValue() | json"></code></pre>-->
<!-- <strong>New Attachment Form Status: {{ newAttachmentForm.status }}</strong>-->
</div>
<div class="row mg-b-15">
<div class="col-md-12">
<p class="mg-b-10">Lab Panel Name<span ngbTooltip="required" class="text-danger">*</span></p>
<form [formGroup]="newLabPanelTypeaheadForm">
<app-nlm-typeahead formControlName="data" searchType="LabPanels" [debugMode]="debugMode"></app-nlm-typeahead>
</form>
</div>
</div>
<div *ngIf="questionnaire" class="row">
<wc-lhc-form
#lhcForm
[(questionnaire)]="questionnaire"
[options]="options"
[fhirVersion]="format"
(onFormReady)="onFormReady($event)"
(onError)="onError($event)"
></wc-lhc-form>
</div>
<app-loading-spinner *ngIf="loading"></app-loading-spinner>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-az-primary" (click)="submit()">Create Lab Results</button>
</div>

View File

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MedicalRecordWizardAddLabResultsComponent } from './medical-record-wizard-add-lab-results.component';
describe('MedicalRecordWizardAddLabResultsComponent', () => {
let component: MedicalRecordWizardAddLabResultsComponent;
let fixture: ComponentFixture<MedicalRecordWizardAddLabResultsComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ MedicalRecordWizardAddLabResultsComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(MedicalRecordWizardAddLabResultsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,46 @@
import type { Meta, StoryObj } from '@storybook/angular';
import {MedicalRecordWizardAddLabResultsComponent} from './medical-record-wizard-add-lab-results.component';
import {applicationConfig} from '@storybook/angular';
import {NgbActiveModal} from '@ng-bootstrap/ng-bootstrap';
import {HTTP_CLIENT_TOKEN} from '../../dependency-injection';
import {HttpClient} from '@angular/common/http';
import {HttpClientTestingModule} from '@angular/common/http/testing';
import {importProvidersFrom} from '@angular/core';
// More on how to set up stories at: https://storybook.js.org/docs/angular/writing-stories/introduction
const meta: Meta<MedicalRecordWizardAddLabResultsComponent> = {
title: 'Components/MedicalRecordWizardAddLabResults',
component: MedicalRecordWizardAddLabResultsComponent,
decorators: [
applicationConfig({
providers: [
importProvidersFrom(HttpClientTestingModule),
NgbActiveModal,
{
provide: HttpClient,
useClass: HttpClient
},
{
provide: HTTP_CLIENT_TOKEN,
useClass: HttpClient,
}
]
}),
],
tags: ['autodocs'],
render: (args: MedicalRecordWizardAddLabResultsComponent) => ({
props: {
backgroundColor: null,
...args,
},
}),
argTypes: {
},
};
export default meta;
type Story = StoryObj<MedicalRecordWizardAddLabResultsComponent>;
// More on writing stories with args: https://storybook.js.org/docs/angular/writing-stories/args
export const Primary: Story = {};

View File

@ -328,13 +328,29 @@
</p>
</div>
<fhir-card *ngFor="let diagnosticReport of existingEncounter?.related_resources?.['DiagnosticReport']" [showDetails]="false" [displayModel]="diagnosticReport" [isCollapsed]="true"></fhir-card>
<div class="alert alert-warning" role="alert">
<strong>Under Construction</strong> Fasten does not currently support adding lab results manually. <br/>This feature is expected to be available in the next release.
<ng-container formArrayName="labresults">
<ng-container *ngFor="let labresultsGroup of labresults.controls; let i = index">
<div *ngIf="debugMode" class="alert alert-warning">
<strong>Lab Results Status: {{labresultsGroup.status}}</strong>
</div>
<fhir-diagnostic-report class="fhir-card-callout-warning" [formGroup]="labresultsGroup" [showDetails]="false" [displayModel]="labresultsGroup.controls.data.value?.entry?.[0]?.resource | fastenDisplayModel" [isCollapsed]="true">
<div header>
<span class="cursor-pointer float-right" (click)="deleteLabResults(i)" aria-hidden="true"><i class="fas fa-trash"></i></span>
</div>
</fhir-diagnostic-report>
</ng-container>
</ng-container>
<div class="row pt-2">
<div class="col-lg-4 col-md-3">
<button type="button" (click)="openLabResultsModal()" class="btn btn-outline-indigo btn-block">Create Lab Result</button>
</div>
</div>
</ng-template>
</ng-container>
<ng-container ngbNavItem="attachments" [disabled]="!existingEncounter">

View File

@ -38,9 +38,13 @@ import {
import {generateReferenceUriFromResourceOrReference, internalResourceReferenceUri} from '../../../lib/utils/bundle_references';
import {
Bundle,
FhirResource,
List, Reference
} from 'fhir/r4';
import {
MedicalRecordWizardAddLabResultsComponent
} from '../medical-record-wizard-add-lab-results/medical-record-wizard-add-lab-results.component';
@Component({
standalone: true,
@ -91,6 +95,7 @@ export class MedicalRecordWizardComponent implements OnInit {
procedures: new FormArray([]),
practitioners: new FormArray([]),
organizations: new FormArray([]),
labresults: new FormArray([]),
attachments: new FormArray([]),
});
@ -112,6 +117,9 @@ export class MedicalRecordWizardComponent implements OnInit {
get organizations(): FormArray<FormGroup> {
return this.form.controls["organizations"] as FormArray;
}
get labresults(): FormArray<FormGroup> {
return this.form.controls["labresults"] as FormArray;
}
get attachments(): FormArray<FormGroup> {
return this.form.controls["attachments"] as FormArray;
}
@ -130,6 +138,9 @@ export class MedicalRecordWizardComponent implements OnInit {
deleteOrganization(index: number) {
this.organizations.removeAt(index);
}
deleteLabResults(index: number) {
this.labresults.removeAt(index);
}
deleteAttachment(index: number) {
this.attachments.removeAt(index);
}
@ -209,6 +220,14 @@ export class MedicalRecordWizardComponent implements OnInit {
this.attachments.push(attachmentGroup);
}
addLabResultsBundle(diagnosticReportBundle: WizardFhirResourceWrapper<Bundle>){
const diagnosticReportGroup = new FormGroup({
data: new FormControl(diagnosticReportBundle.data),
action: new FormControl(diagnosticReportBundle.action),
});
this.labresults.push(diagnosticReportGroup);
}
//</editor-fold>
//<editor-fold desc="Open Modals">
@ -287,6 +306,23 @@ export class MedicalRecordWizardComponent implements OnInit {
},
);
}
openLabResultsModal() {
let modalRef = this.modalService.open(MedicalRecordWizardAddLabResultsComponent, {
ariaLabelledBy: 'modal-labresults',
size: 'lg'
})
modalRef.componentInstance.debugMode = this.debugMode;
modalRef.result.then(
(result) => {
console.log('Closing, saving form', result);
//add this to the list of organization
this.addLabResultsBundle(result);
},
(err) => {
console.log('Closed without saving', err);
},
);
}
openAttachmentModal(formGroup?: AbstractControl, controlName?: string) {
let modalRef = this.modalService.open(MedicalRecordWizardAddAttachmentComponent, {

View File

@ -13,7 +13,7 @@ import {
Resource,
Bundle,
Organization,
Practitioner, MedicationRequest, Patient, Encounter, DocumentReference, Media, DiagnosticReport, Reference, Binary, HumanName
Practitioner, MedicationRequest, Patient, Encounter, DocumentReference, Media, DiagnosticReport, Reference, Binary, HumanName, Observation
} from 'fhir/r4';
import {uuidV4} from '../../../lib/utils/uuid';
import {OrganizationModel} from '../../../lib/models/resources/organization-model';
@ -24,14 +24,14 @@ import {FastenDisplayModel} from '../../../lib/models/fasten/fasten-display-mode
import {generateReferenceUriFromResourceOrReference} from '../../../lib/utils/bundle_references';
import {HumanNameModel} from '../../../lib/models/datatypes/human-name-model';
export interface WizardFhirResourceWrapper<T extends OrganizationModel | PractitionerModel | EncounterModel> {
export interface WizardFhirResourceWrapper<T extends OrganizationModel | PractitionerModel | EncounterModel | Bundle> {
data: T,
action: 'find'|'create'
}
interface ResourceStorage {
[resourceType: string]: {
[resourceId: string]: Condition | Patient | MedicationRequest | Organization | FhirLocation | Practitioner | Procedure | Encounter | DocumentReference | Media | DiagnosticReport | Binary | Reference
[resourceId: string]: Condition | Patient | MedicationRequest | Organization | FhirLocation | Practitioner | Procedure | Encounter | DocumentReference | Media | DiagnosticReport | Binary | Observation | Reference
}
}
@ -72,6 +72,9 @@ export function GenerateR4ResourceLookup(resourceCreate: MedicalRecordWizardForm
//DocumentReference -> (Optional) Binary
//DiagnosticReport -> Media
for(let labresult of resourceCreate.labresults) {
resourceStorage = resourceCreateLabResultsToR4DiagnosticReports(resourceStorage, labresult)
}
//ImagingStudy
//ImagingSelection
@ -436,6 +439,24 @@ function resourceAttachmentToR4DiagnosticReport(resourceStorage: ResourceStorage
return resourceStorage
}
function resourceCreateLabResultsToR4DiagnosticReports(resourceStorage: ResourceStorage, resourceLabResult: WizardFhirResourceWrapper<Bundle>): ResourceStorage {
resourceLabResult.data.entry.forEach((entry) => {
if (entry.resource.resourceType === 'Observation') {
resourceStorage['Observation'] = resourceStorage['Observation'] || {}
let resource = entry.resource as Observation
resourceStorage['Observation'][resource.id] = resource
} else if (entry.resource.resourceType === 'DiagnosticReport') {
resourceStorage['DiagnosticReport'] = resourceStorage['DiagnosticReport'] || {}
let resource = entry.resource as DiagnosticReport
resourceStorage['DiagnosticReport'][resource.id] = resource
} else {
console.log('Unknown resource type: ', entry.resource.resourceType)
}
})
return resourceStorage
}
function findEncounter(resourceStorage: ResourceStorage): Encounter | Reference {
let [encounterId] = Object.keys(resourceStorage['Encounter'])

View File

@ -22,6 +22,7 @@ export enum NlmSearchType {
MedicationWhyStopped = 'MedicationWhyStopped',
Procedure = 'Procedure',
Vaccine = 'Vaccine',
LabPanels = 'LabPanels',
Countries = 'Countries',
AttachmentFileType = 'AttachmentFileType',
@ -146,6 +147,10 @@ export class NlmTypeaheadComponent implements ControlValueAccessor {
case NlmSearchType.Procedure:
searchOpFn = this.nlmClinicalTableSearchService.searchProcedure
break
case NlmSearchType.LabPanels:
searchOpFn = this.nlmClinicalTableSearchService.searchLabPanels
this.editable = false
break
case NlmSearchType.Vaccine:
searchOpFn = this.nlmClinicalTableSearchService.searchVaccine
this.openOnFocus = true

View File

@ -35,6 +35,7 @@ import { MedicalRecordWizardAddAttachmentComponent } from './medical-record-wiza
import {FhirCardModule} from './fhir-card/fhir-card.module';
import {FhirDatatableModule} from './fhir-datatable/fhir-datatable.module';
import { MedicalRecordWizardAddEncounterComponent } from './medical-record-wizard-add-encounter/medical-record-wizard-add-encounter.component';
import { MedicalRecordWizardAddLabResultsComponent } from './medical-record-wizard-add-lab-results/medical-record-wizard-add-lab-results.component';
@NgModule({
imports: [
@ -68,6 +69,7 @@ import { MedicalRecordWizardAddEncounterComponent } from './medical-record-wizar
MedicalRecordWizardAddOrganizationComponent,
MedicalRecordWizardAddAttachmentComponent,
MedicalRecordWizardAddEncounterComponent,
MedicalRecordWizardAddLabResultsComponent,
],
declarations: [
@ -111,6 +113,7 @@ import { MedicalRecordWizardAddEncounterComponent } from './medical-record-wizar
MedicalRecordWizardAddOrganizationComponent,
MedicalRecordWizardAddPractitionerComponent,
MedicalRecordWizardComponent,
MedicalRecordWizardAddLabResultsComponent,
MedicalSourcesCategoryLookupPipe,
NlmTypeaheadComponent,
]

View File

@ -0,0 +1,11 @@
export interface LabresultsQuestionnaire {
type: string
code: string
name: string
codingInstructions: any
copyrightNotice: any
items: any[]
lformsVersion: string
codeSystem: string
}

View File

@ -5,6 +5,7 @@ import {WizardFhirResourceWrapper} from '../../components/medical-record-wizard/
import {EncounterModel} from '../../../lib/models/resources/encounter-model';
import {PractitionerModel} from '../../../lib/models/resources/practitioner-model';
import {OrganizationModel} from '../../../lib/models/resources/organization-model';
import {Bundle} from 'fhir/r4';
//
@ -134,6 +135,7 @@ export interface MedicalRecordWizardFormCreate {
"procedures": ResourceCreateProcedure[],
"practitioners": WizardFhirResourceWrapper<PractitionerModel>[],
"organizations": WizardFhirResourceWrapper<OrganizationModel>[],
"labresults": WizardFhirResourceWrapper<Bundle>[],
"attachments": ResourceCreateAttachment[],
}

View File

@ -47,6 +47,7 @@
[collectionSize]="allEncountersIds.length"
[(page)]="currentPage"
[pageSize]="pageSize"
[maxSize]="15"
(pageChange)="pageChange()"
>
</ngb-pagination>

View File

@ -71,6 +71,7 @@
<div class="col-12 d-flex justify-content-center flex-nowrap">
<ngb-pagination
[collectionSize]="allObservationGroups.length"
[maxSize]="15"
[(page)]="currentPage"
[pageSize]="pageSize"
(pageChange)="populateObservationsForCurrentPage()"

View File

@ -0,0 +1,8 @@
import { FastenDisplayModelPipe } from './fasten-display-model.pipe';
describe('FastenDisplayModelPipe', () => {
it('create an instance', () => {
const pipe = new FastenDisplayModelPipe();
expect(pipe).toBeTruthy();
});
});

View File

@ -0,0 +1,30 @@
import { Pipe, PipeTransform } from '@angular/core';
import {DomainResource} from 'fhir/r4';
import {ResourceFhir} from '../models/fasten/resource_fhir';
import {FastenDisplayModel} from '../../lib/models/fasten/fasten-display-model';
import {fhirModelFactory, wrapFhirModel} from '../../lib/models/factory';
import {ResourceType} from '../../lib/models/constants';
@Pipe({
name: 'fastenDisplayModel'
})
export class FastenDisplayModelPipe implements PipeTransform {
transform(fhirResourceOrWrapper: any, ...args: unknown[]): FastenDisplayModel | any {
if(!fhirResourceOrWrapper) {
throw new Error("resource data cannot be empty")
}
if((fhirResourceOrWrapper as DomainResource).resourceType && (fhirResourceOrWrapper as DomainResource).id) {
//wrap
fhirResourceOrWrapper = wrapFhirModel(fhirResourceOrWrapper as DomainResource)
}
if((fhirResourceOrWrapper as ResourceFhir).resource_raw) {
return fhirModelFactory((fhirResourceOrWrapper as ResourceFhir).source_resource_type as ResourceType, fhirResourceOrWrapper as ResourceFhir)
} else {
throw new Error("resource data must be a valid wrapped FHIR resource")
}
}
}

View File

@ -8,6 +8,7 @@ import { ShortDomainPipe } from './short-domain.pipe';
import { DatasetLatestEntryPipe } from './dataset-latest-entry.pipe';
import { HumanNamePipe } from './human-name.pipe';
import { ReferenceUriPipe } from './reference-uri.pipe';
import { FastenDisplayModelPipe } from './fasten-display-model.pipe';
@NgModule({
declarations: [
@ -18,6 +19,7 @@ import { ReferenceUriPipe } from './reference-uri.pipe';
DatasetLatestEntryPipe,
HumanNamePipe,
ReferenceUriPipe,
FastenDisplayModelPipe,
],
imports: [
@ -28,7 +30,8 @@ import { ReferenceUriPipe } from './reference-uri.pipe';
ShortDomainPipe,
DatasetLatestEntryPipe,
HumanNamePipe,
ReferenceUriPipe
ReferenceUriPipe,
FastenDisplayModelPipe
]
})
export class PipesModule {}

View File

@ -4,6 +4,7 @@ import {map} from 'rxjs/operators';
import {Observable, of} from 'rxjs';
import {CodingModel} from '../../lib/models/datatypes/coding-model';
import {HTTP_CLIENT_TOKEN} from "../dependency-injection";
import {LabresultsQuestionnaire} from '../models/fasten/labresults-questionnaire';
export interface NlmSearchResults {
id: string
@ -689,6 +690,44 @@ export class NlmClinicalTableSearchService {
)
}
//https://lforms-service.nlm.nih.gov/api/loinc_items/v3/search?type=form&available=true&terms=Diabetes
searchLabPanels(searchTerm: string): Observable<NlmSearchResults[]> {
let queryParams = {
'type':'form',
'available':'true',
'terms':searchTerm
}
return this._httpClient.get<any>(`https://lforms-service.nlm.nih.gov/api/loinc_items/v3/search`, {params: queryParams})
.pipe(
map((response) => {
return response[3].map((panelName, ndx):NlmSearchResults => {
return {
id: response[1][ndx],
text: panelName,
identifier: [{
system: 'http://loinc.org',
code: response[1][ndx],
display: panelName
}]
}
})
})
)
}
searchLabPanelQuestionnaire(panelLoincCode: string): Observable<LabresultsQuestionnaire> {
let queryParams = {
'loinc_num': panelLoincCode,
}
return this._httpClient.get<any>(`https://lforms-service.nlm.nih.gov/loinc_form_definitions`, {params: queryParams})
.pipe(
map((response: LabresultsQuestionnaire) => {
return response
})
);
}
//see https://lhcforms.nlm.nih.gov/phr.json
//see https://build.fhir.org/valueset-provider-taxonomy.html
// ideally we'd use http://www.hl7.org/fhir/valueset-performer-role.html

View File

@ -300,3 +300,26 @@ app-medical-sources-filter > .az-content-left-components:hover{
.fhir-card-callout-warning .card, .bd-callout-warning { @include bs-callout-variant($yellow); }
.fhir-card-callout-danger .card, .bd-callout-danger { @include bs-callout-variant($red); }
// lhc-autocomplete fixes - if we dont set this z-index, the autocomplete results are hidden behind the modal
#searchResults {
z-index: 9999 !important;
}
// LHC Forms
.lhc-form-title {
border-radius: inherit;
background-color: $indigo;
}
.lhc-item.lhc-tree-line::before {
border-top: 2px solid $indigo;
}
.lhc-item.lhc-tree-line::after {
border-left: 2px solid $indigo;
}
.lhc-item-question.lhc-active-row {
background-color: $primary;
}

View File

@ -12,6 +12,8 @@
<!-- Fonts and icons -->
<link href="https://fonts.googleapis.com/css?family=Poppins:200,300,400,600,700,800" rel="stylesheet"/>
<link href="https://use.fontawesome.com/releases/v5.15.4/css/all.css" rel="stylesheet"/>
<!-- TODO: figure out why we cant use the built-in styles <link href="./assets/lforms/styles.css" rel="stylesheet">-->
<link href="https://clinicaltables.nlm.nih.gov/lforms-versions/34.0.0/webcomponent/styles.css" media="screen" rel="stylesheet" />
<script src="./assets/js/asmcrypto-2.3.2.all.es5.min.js"></script>
<script>
var baseHref = "/"
@ -28,8 +30,20 @@
}
document.write(`<base href="${baseHref}"/>`); </script>
<!-- required for lhncbc/lforms -->
<script src="./assets/js/webcomponents/webcomponents-loader.js"></script>
<script>
if (!window.customElements) {
document.write('<!--');
}
</script>
<!-- ! DO NOT REMOVE THIS COMMENT, WE NEED ITS CLOSING MARKER -->
</head>
<body>
<app-root></app-root>
<script src="./assets/js/lforms/assets/lib/zone.min.js"></script>
<script src="./assets/js/lforms/lhc-forms.js"></script>
<script src="./assets/js/lforms/fhir/lformsFHIRAll.min.js"></script>
</body>
</html>

View File

@ -31,13 +31,34 @@ import {ExplanationOfBenefitModel} from './resources/explanation-of-benefit-mode
// import {BinaryModel} from './resources/binary-model';
export function wrapFhirModel(fhirResource): any {
if(!fhirResource) {
throw new Error("resource data cannot be empty")
}
//determine if valid FhirResource
if(!fhirResource.resourceType || !fhirResource.id) {
throw new Error("resource data must be a valid FHIR resource")
}
//wrap
return {
resource_raw: fhirResource,
source_resource_id: fhirResource.id,
source_resource_type: fhirResource.resourceType,
}
}
export function fhirModelFactory(
modelResourceType: ResourceType,
fhirResourceWrapper: any, //this is a ResourceFhir object (database structure)
fhirResourceWrapper: any, //this is a ResourceFhir object (database structure) or a FhirEntity (fhir structure)
fhirVersion: fhirVersions = fhirVersions.R4,
fastenOptions?: FastenOptions
): FastenDisplayModel {
if(!fhirResourceWrapper) {
throw new Error("resource data cannot be empty")
}
let resourceModel: FastenDisplayModel
switch (modelResourceType) {
case ResourceType.AdverseEvent:

View File

@ -78,6 +78,32 @@ declare global {
CallByID: (methodID, ...args) => Promise<any>
CallByName: (name, ...args) => Promise<any>
}
//see https://lhncbc.github.io/lforms/ for definitions
let LForms: {
Util: {
addFormToPage(formDefinition: any, formElement: HTMLElement | string, options?: any): any
// Retrieving User-Entered Data
// The utility method LForms.Util.getFormData() will return both the user data and the complete form definition data together in a way that can be fed back to LHC-Forms to display the form with the data. This is useful when you want to allow the user to save the form so it can be redisplayed later for completion or editing.
getFormData: (formElement: HTMLElement, noEmptyValue: boolean, noDisabledItem: boolean) => any
// To get a compact structure with just the user-entered data and minimal form definition data, you can call LForms.Util.getUserData(formElement, true, true, true). The parameters are:
getFormHL7Data(element?: HTMLElement): any
// Prior to submitting the form, the form can be checked to make sure required fields are filled in and that the values have the correct format, by using the following function:
checkValidity(formElement?: HTMLElement): any[] | null
// The form definition and user-entered data can be retrieved as FHIR resources, using the following utility method:
getFormFHIRData(
resourceType: 'DiagnosticReport' | 'Questionnaire' | 'QuestionnaireResponse',
fhirVersion: 'STU3' | 'R4',
formDataSource?: HTMLElement | any,
options?: {bundleType: 'transaction' | 'collection'}
): any
}
}
}
//required for PouchDB

View File

@ -159,14 +159,14 @@
ora "5.4.1"
rxjs "6.6.7"
"@angular/animations@^14.1.3":
"@angular/animations@^14.1.3", "@angular/animations@~14.2.12":
version "14.2.12"
resolved "https://registry.npmjs.org/@angular/animations/-/animations-14.2.12.tgz#9ff16bad809d3ff7526f8359ef214e63e8236f9f"
integrity sha512-gwdnFZkvVUr+enUNfhfCGRGGqNHn1+vTA81apLfHYhJxgjiLUtETc4KTOrQevtDm022pEd+LSrvr8r+7ag+jkw==
dependencies:
tslib "^2.3.0"
"@angular/cdk@^14.1.3":
"@angular/cdk@^14.1.0", "@angular/cdk@^14.1.3":
version "14.2.7"
resolved "https://registry.npmjs.org/@angular/cdk/-/cdk-14.2.7.tgz#65eb6fbbeed6120fad4e3913aa66f8b74c853ac3"
integrity sha512-/tEsYaUbDSnfEmKVvAMramIptmhI67O+9STjOV0i+74XR2NospeK0fkbywIANu1n3w6AHGMotvRWJrjmbCElFg==
@ -201,7 +201,7 @@
uuid "8.3.2"
yargs "17.5.1"
"@angular/common@^14.1.3":
"@angular/common@^14.1.3", "@angular/common@~14.2.12":
version "14.2.12"
resolved "https://registry.npmjs.org/@angular/common/-/common-14.2.12.tgz#b608ff629a635f323b297000f53f976f71ae3c80"
integrity sha512-oZunh9wfInFWhNO1P8uoEs/o4u8kerKMhw8GruywKm1TV7gHDP2Fi5WHGjFqq3XYptgBTPCTSEfyLX6Cwq1PUw==
@ -224,21 +224,28 @@
tslib "^2.3.0"
yargs "^17.2.1"
"@angular/compiler@^14.1.3":
"@angular/compiler@^14.1.3", "@angular/compiler@~14.2.12":
version "14.2.12"
resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-14.2.12.tgz#2b17667acfb2cda1521de102246b178845838812"
integrity sha512-u2MH9+NRwbbFDRNiPWPexed9CnCq9+pGHLuyACSP2uR6Ik68cE6cayeZbIeoEV5vWpda/XsLmJgPJysw7dAZLQ==
dependencies:
tslib "^2.3.0"
"@angular/core@^14.1.3":
"@angular/core@^14.1.3", "@angular/core@~14.2.12":
version "14.2.12"
resolved "https://registry.npmjs.org/@angular/core/-/core-14.2.12.tgz#118467ec4e8ea082931a84e8cefe722a0e110dc9"
integrity sha512-sGQxU5u4uawwvJa6jOTmGoisJiQ5HIN/RoBw99CmoqZIVyUSg9IRJJC1KVdH8gbpWBNLkElZv21lwJTL/msWyg==
dependencies:
tslib "^2.3.0"
"@angular/forms@^14.1.3":
"@angular/elements@^14.2.12":
version "14.3.0"
resolved "https://registry.npmjs.org/@angular/elements/-/elements-14.3.0.tgz#f4ce07241d5b05c8c843465cf564f3519ed8d5d5"
integrity sha512-fIg8IOD2R36v3SZ8yQEwTC8T71Hk0lbJFJXaOUZDZ6MfwdT8mMkFCujPRXOF0+p/ZnOiq2EhBwuPdjmKTf7XHA==
dependencies:
tslib "^2.3.0"
"@angular/forms@^14.1.3", "@angular/forms@~14.2.12":
version "14.2.12"
resolved "https://registry.npmjs.org/@angular/forms/-/forms-14.2.12.tgz#2174e4e3b87390b0f1ebde0b3fc6c4d2ae793a1a"
integrity sha512-7abYlGIT2JnAtutQUlH3fQS6QEpbfftgvsVcZJCyvX0rXL3u2w2vUQkDHJH4YJJp3AHFVCH4/l7R4VcaPnrwvA==
@ -259,27 +266,42 @@
glob "8.0.3"
yargs "^17.2.1"
"@angular/platform-browser-dynamic@^14.1.3":
"@angular/platform-browser-dynamic@^14.1.3", "@angular/platform-browser-dynamic@~14.2.12":
version "14.2.12"
resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.12.tgz#d4dac4a488c804ea07213a98450efa124a15d70a"
integrity sha512-oZhNJeaBmgw8+KBSYpKz2RYqEDyETC+HJXH8dwIFcP6BqqwL2NE70FdSR7EnOa5c41MEtTmMCGhrJSFR60x5/w==
dependencies:
tslib "^2.3.0"
"@angular/platform-browser@^14.1.3":
"@angular/platform-browser@^14.1.3", "@angular/platform-browser@~14.2.12":
version "14.2.12"
resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.12.tgz#24fe6bc87d056fc8b91924091da712fef7c66457"
integrity sha512-vOarWym8ucl1gjYWCzdwyBha+MTvL381mvTTUu8aUx6nVhHFjv4bvpjlZnZgojecqUPyxOwmPLLHvCZPJVHZYg==
dependencies:
tslib "^2.3.0"
"@angular/router@^14.1.3":
"@angular/router@^14.1.3", "@angular/router@~14.2.12":
version "14.2.12"
resolved "https://registry.npmjs.org/@angular/router/-/router-14.2.12.tgz#f5b2c9ced3337e4a7af1905b861b114ac80a8482"
integrity sha512-r5tVus5RJDNc4U2v0jMtjPiAS1xDsVsJ70lS313DgZmBDHIVZP1cWIehdxwgNlGwQQtAA36eG7toBwqUU3gb/A==
dependencies:
tslib "^2.3.0"
"@ant-design/colors@^5.0.0":
version "5.1.1"
resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-5.1.1.tgz#800b2186b1e27e66432e67d03ed96af3e21d8940"
integrity sha512-Txy4KpHrp3q4XZdfgOBqLl+lkQIc3tEvHXOimRN1giX1AEC7mGtyrO9p8iRGJ3FLuVMGa2gNEzQyghVymLttKQ==
dependencies:
"@ctrl/tinycolor" "^3.3.1"
"@ant-design/icons-angular@^14.1.0":
version "14.1.0"
resolved "https://registry.npmjs.org/@ant-design/icons-angular/-/icons-angular-14.1.0.tgz#7612507aae28872ce3ccd139857452426cc30be3"
integrity sha512-SvWi8p4L+cCfTGtezeUq1s8kahZEO1UVf7ZR615Fix3c2l9OnAJi+niDkq2fZHjpiarFrt8HoZ2EhMAMN7jfbg==
dependencies:
"@ant-design/colors" "^5.0.0"
tslib "^2.0.0"
"@assemblyscript/loader@^0.10.1":
version "0.10.1"
resolved "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06"
@ -1679,6 +1701,13 @@
dependencies:
regenerator-runtime "^0.13.11"
"@babel/runtime@^7.21.0":
version "7.23.5"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz#11edb98f8aeec529b82b211028177679144242db"
integrity sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==
dependencies:
regenerator-runtime "^0.14.0"
"@babel/runtime@^7.8.4":
version "7.20.13"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
@ -1953,6 +1982,11 @@
resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.0.tgz#923ebf8ba47e854863ae72510d9cbf7b44d525ea"
integrity sha512-zJ6hb3FDgBbO8d2e83vg6zq7tNvDqSq9RwdwfzJ8tdm9JHNvANq2fqwyRn6mlpUb7CwTs5ILdUrGwi9Gk4vY5w==
"@ctrl/tinycolor@^3.3.1":
version "3.6.1"
resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31"
integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==
"@discoveryjs/json-ext@0.5.7", "@discoveryjs/json-ext@^0.5.3":
version "0.5.7"
resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
@ -2315,6 +2349,22 @@
string-to-stream "^1.1.0"
xmldoc "^0.4.0"
"@lhncbc/ucum-lhc@^4.1.6":
version "4.2.0"
resolved "https://registry.npmjs.org/@lhncbc/ucum-lhc/-/ucum-lhc-4.2.0.tgz#522cc16fe37739d7da16c27c8b9ad039ee39c2d7"
integrity sha512-OEiWX7IHFHLTFs7+w5EvGtI5dhXhhL0341LqZ9WEBWErtoY0/9xl/vn+wwT9vnBHnjQ7Ux0o7iEUXvN8uVn4xg==
dependencies:
coffeescript "^2.7.0"
csv-parse "^4.4.6"
csv-stringify "^1.0.4"
escape-html "^1.0.3"
is-integer "^1.0.6"
jsonfile "^2.2.3"
stream "0.0.2"
stream-transform "^0.1.1"
string-to-stream "^1.1.0"
xmldoc "^0.4.0"
"@mdx-js/react@^2.1.5":
version "2.3.0"
resolved "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz#4208bd6d70f0d0831def28ef28c26149b03180b3"
@ -3555,6 +3605,13 @@
dependencies:
"@types/jasmine" "*"
"@types/jquery@^3.5.14":
version "3.5.29"
resolved "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.29.tgz#3c06a1f519cd5fc3a7a108971436c00685b5dcea"
integrity sha512-oXQQC9X9MOPRrMhPHHOsXqeQDnWeCDT3PelUIg/Oy8FAbzSZtFHRjc7IpbfFVmpLtJ+UOoywpRsuO5Jxjybyeg==
dependencies:
"@types/sizzle" "*"
"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
version "7.0.11"
resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
@ -3721,6 +3778,11 @@
"@types/mime" "*"
"@types/node" "*"
"@types/sizzle@*":
version "2.3.8"
resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627"
integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==
"@types/sockjs@^0.3.33":
version "0.3.33"
resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f"
@ -3885,6 +3947,11 @@
"@webassemblyjs/ast" "1.11.1"
"@xtuc/long" "4.2.2"
"@webcomponents/webcomponentsjs@^2.8.0":
version "2.8.0"
resolved "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.8.0.tgz#ab21f027594fa827c1889e8b646da7be27c7908a"
integrity sha512-loGD63sacRzOzSJgQnB9ZAhaQGkN7wl2Zuw7tsphI5Isa0irijrRo6EnJii/GgjGefIFO8AIO7UivzRhFaEk9w==
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
@ -4359,6 +4426,11 @@ at-least-node@^1.0.0:
resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
autocomplete-lhc@^18.6.3:
version "18.6.3"
resolved "https://registry.npmjs.org/autocomplete-lhc/-/autocomplete-lhc-18.6.3.tgz#73217169e58581dfa3f4cd800d8225fcd79aefc2"
integrity sha512-1bkfn4RY4bk67O1PzN8Jr6H2APbrYN4RDofqputmmZ/Qe6cw6Dg1TkoqqP/2Y0lyApd/ctWcPpkbsVEnIDp9vQ==
autoprefixer@^10.4.8:
version "10.4.13"
resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8"
@ -5501,6 +5573,13 @@ date-fns@^1.30.1:
resolved "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
date-fns@^2.16.1:
version "2.30.0"
resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0"
integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==
dependencies:
"@babel/runtime" "^7.21.0"
date-format@^4.0.14:
version "4.0.14"
resolved "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400"
@ -6569,6 +6648,11 @@ fancy-log@^2.0.0:
dependencies:
color-support "^1.1.3"
fast-copy@^2.1.7:
version "2.1.7"
resolved "https://registry.npmjs.org/fast-copy/-/fast-copy-2.1.7.tgz#affc9475cb4b555fb488572b2a44231d0c9fa39e"
integrity sha512-ozrGwyuCTAy7YgFCua8rmqmytECYk/JYAMXcswOcm0qvGoE3tPb7ivBeIHTOK2DiapBhDZgacIhzhQIKU5TCfA==
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@ -6633,6 +6717,17 @@ fetch-retry@^5.0.2:
resolved "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.4.tgz#06e8e4533030bf6faa00ffbb9450cb9264c23c12"
integrity sha512-LXcdgpdcVedccGg0AZqg+S8lX/FCdwXD92WNZ5k5qsb0irRhSFsBOpcJt7oevyqT2/C2nEE0zSFNdBEpj3YOSw==
fhirpath@3.2.0:
version "3.2.0"
resolved "https://registry.npmjs.org/fhirpath/-/fhirpath-3.2.0.tgz#1c70cfdf6f22edf3a6d79b157a10b19bca6039e4"
integrity sha512-T6j53O5MVd2DkJ+PXHN9cceNdhOFLZ1f5mKOBhuv1NKZ++yKW+6qyUM+YPGvU3ugEM2dERj6Hz4xhPlWaaQH0A==
dependencies:
"@lhncbc/ucum-lhc" "^4.1.3"
antlr4 "~4.9.3"
commander "^2.18.0"
date-fns "^1.30.1"
js-yaml "^3.13.1"
fhirpath@^3.3.0:
version "3.3.1"
resolved "https://registry.npmjs.org/fhirpath/-/fhirpath-3.3.1.tgz#cda17acd62243e3dac24e4b54f65dd5a37fee937"
@ -8147,6 +8242,11 @@ jose@^4.10.4:
resolved "https://registry.npmjs.org/jose/-/jose-4.11.2.tgz#d9699307c02e18ff56825843ba90e2fae9f09e23"
integrity sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A==
jquery@^3.6.1:
version "3.7.1"
resolved "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@ -8450,6 +8550,33 @@ levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
lforms@34.0.0:
version "34.0.0"
resolved "https://registry.npmjs.org/lforms/-/lforms-34.0.0.tgz#301a77247fd3e4839901d2f2dff8fcbd4770b58b"
integrity sha512-rfl0vtu1WsE09xNERx9Ie8YsH7J3DoVe3gDmRZiV/meRZg2sVaHx03fEbawYmcHTn6YhpSsHtEfJ1yLRrcISmQ==
dependencies:
"@angular/animations" "~14.2.12"
"@angular/common" "~14.2.12"
"@angular/compiler" "~14.2.12"
"@angular/core" "~14.2.12"
"@angular/elements" "^14.2.12"
"@angular/forms" "~14.2.12"
"@angular/platform-browser" "~14.2.12"
"@angular/platform-browser-dynamic" "~14.2.12"
"@angular/router" "~14.2.12"
"@lhncbc/ucum-lhc" "^4.1.6"
"@types/jquery" "^3.5.14"
autocomplete-lhc "^18.6.3"
deep-equal "^2.0.5"
fast-copy "^2.1.7"
fhirpath "3.2.0"
jquery "^3.6.1"
moment "^2.29.4"
ng-zorro-antd "^14.1.1"
rxjs "~6.6.7"
tslib "^2.4.1"
zone.js "~0.11.8"
license-webpack-plugin@4.0.2:
version "4.0.2"
resolved "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz#1e18442ed20b754b82f1adeff42249b81d11aec6"
@ -9036,6 +9163,16 @@ next-tick@^1.1.0:
resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
ng-zorro-antd@^14.1.1:
version "14.3.0"
resolved "https://registry.npmjs.org/ng-zorro-antd/-/ng-zorro-antd-14.3.0.tgz#0cc5a406b62f4dcbcda2eea4d8d654c27c323dae"
integrity sha512-mGVok0DggrvVYTYWpbJJVekBs6j19kAkxB7PdZp0bvYRedpOVWKSEDX1Cigy7txnGw5UsSuzRSn3h6oZcBUmTA==
dependencies:
"@angular/cdk" "^14.1.0"
"@ant-design/icons-angular" "^14.1.0"
date-fns "^2.16.1"
tslib "^2.3.0"
ng2-charts@^4.1.1:
version "4.1.1"
resolved "https://registry.npmjs.org/ng2-charts/-/ng2-charts-4.1.1.tgz#699bee539030b093caf54ab6111c6dea9e8e7ed3"
@ -10612,6 +10749,11 @@ regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4:
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
regenerator-runtime@^0.14.0:
version "0.14.0"
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
regenerator-transform@^0.15.1:
version "0.15.1"
resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56"
@ -10851,7 +10993,7 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
rxjs@6.6.7:
rxjs@6.6.7, rxjs@~6.6.7:
version "6.6.7"
resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
@ -11898,6 +12040,11 @@ tslib@^2.0.1, tslib@^2.0.3, tslib@^2.3.1:
resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
tslib@^2.4.1:
version "2.6.2"
resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
tslint@~6.1.0:
version "6.1.3"
resolved "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904"