import {z} from 'zod' export type IndicatorEnum = 'info' | 'warning' | 'critical'; export type BodyDefinitionsGetPageCaregapsApiQualityProgramDefinitionGet = {definition_id?: Array | undefined, closing_code?: Array | undefined}; export type GetApiCaregapsApiQualityProgramDefinitionArgs = {quality_program: string, page_size?: number | undefined, page_num?: number | undefined, closing_code?: Array | undefined, definition_id?: Array | undefined, external_id?: string | undefined, cursor?: string | undefined, name?: string | undefined, indicator?: IndicatorEnum | undefined, body: BodyDefinitionsGetPageCaregapsApiQualityProgramDefinitionGet}; export type GetApiCaregapsApiQualityProgramDefinitionOptions = {baseUrl?: string | undefined, OAuth2PasswordBearer?: string | undefined, fetch?: typeof fetch | undefined}; export const indicatorEnum = z.enum(["info", "warning", "critical"]); export const targetEnum = z.enum(["problem-list-item", "encounter-diagnosis"]); export const codingContext = z.object({target: targetEnum.optional()}); export const coding = z.object({code: z.string().optional(), display: z.string().optional(), system: z.string().optional(), context: codingContext.optional()}); export const source = z.object({label: z.string(), url: z.string().optional(), icon: z.string().optional(), topic: coding.optional()}); export const selectionBehaviorEnum = z.enum(["any", "at-most-one"]); export const link = z.object({label: z.string(), url: z.string(), type: z.string(), app_context: z.string().optional()}); export const sectionType = z.enum(["text", "footer", "subsection"]); export const subSection = z.object({label: z.string(), text: z.string()}); export const docSection = z.object({type: sectionType, paragraphs: z.array(z.string()).optional(), subsections: z.array(subSection).optional(), subtitle: z.string()}); export const actionEnum = z.enum(["create", "update", "delete"]); export const valueSet = z.object({resource_type: z.string().optional(), fhir_comments: z.union([z.string(), z.array(z.string())]).optional(), id: z.string().min(1).max(64).optional(), _id: z.string().optional(), implicitRules: z.string().optional(), _implicitRules: z.string().optional(), language: z.string().optional(), _language: z.string().optional(), meta: z.string().optional(), contained: z.array(z.string()).optional(), extension: z.array(z.string()).optional(), modifierExtension: z.array(z.string()).optional(), text: z.string().optional(), compose: z.string().optional(), contact: z.array(z.string()).optional(), copyright: z.string().optional(), _copyright: z.string().optional(), date: z.string().optional(), _date: z.string().optional(), description: z.string().optional(), _description: z.string().optional(), expansion: z.string().optional(), experimental: z.boolean().optional(), _experimental: z.string().optional(), identifier: z.array(z.number().int()).optional(), immutable: z.boolean().optional(), _immutable: z.string().optional(), jurisdiction: z.array(z.string()).optional(), name: z.string().optional(), _name: z.string().optional(), publisher: z.string().optional(), _publisher: z.string().optional(), purpose: z.string().optional(), _purpose: z.string().optional(), status: z.string().optional(), _status: z.string().optional(), title: z.string().optional(), _title: z.string().optional(), url: z.string().optional(), _url: z.string().optional(), useContext: z.array(z.string()).optional(), version: z.string().optional(), _version: z.string().optional()}); export const observation = z.object({resource_type: z.string().optional(), fhir_comments: z.union([z.string(), z.array(z.string())]).optional(), id: z.string().min(1).max(64).optional(), _id: z.string().optional(), implicitRules: z.string().optional(), _implicitRules: z.string().optional(), language: z.string().optional(), _language: z.string().optional(), meta: z.string().optional(), contained: z.array(z.string()).optional(), extension: z.array(z.string()).optional(), modifierExtension: z.array(z.string()).optional(), text: z.string().optional(), basedOn: z.array(z.string()).optional(), bodySite: z.string().optional(), category: z.array(z.string()).optional(), code: z.string(), component: z.array(z.string()).optional(), dataAbsentReason: z.string().optional(), derivedFrom: z.array(z.string()).optional(), device: z.string().optional(), effectiveDateTime: z.string().optional(), _effectiveDateTime: z.string().optional(), effectiveInstant: z.string().optional(), _effectiveInstant: z.string().optional(), effectivePeriod: z.string().optional(), effectiveTiming: z.string().optional(), encounter: z.string().optional(), focus: z.array(z.string()).optional(), hasMember: z.array(z.string()).optional(), identifier: z.array(z.number().int()).optional(), interpretation: z.array(z.string()).optional(), issued: z.string().optional(), _issued: z.string().optional(), method: z.string().optional(), note: z.array(z.string()).optional(), partOf: z.array(z.string()).optional(), performer: z.array(z.string()).optional(), referenceRange: z.array(z.string()).optional(), specimen: z.string().optional(), status: z.string().optional(), _status: z.string().optional(), subject: z.string().optional(), valueBoolean: z.boolean().optional(), _valueBoolean: z.string().optional(), valueCodeableConcept: z.string().optional(), valueDateTime: z.string().optional(), _valueDateTime: z.string().optional(), valueInteger: z.number().int().optional(), _valueInteger: z.string().optional(), valuePeriod: z.string().optional(), valueQuantity: z.number().int().optional(), valueRange: z.number().int().optional(), valueRatio: z.string().optional(), valueSampledData: z.string().optional(), valueString: z.string().optional(), _valueString: z.string().optional(), valueTime: z.string().optional(), _valueTime: z.string().optional()}); export const condition = z.object({resource_type: z.string().optional(), fhir_comments: z.union([z.string(), z.array(z.string())]).optional(), id: z.string().min(1).max(64).optional(), _id: z.string().optional(), implicitRules: z.string().optional(), _implicitRules: z.string().optional(), language: z.string().optional(), _language: z.string().optional(), meta: z.string().optional(), contained: z.array(z.string()).optional(), extension: z.array(z.string()).optional(), modifierExtension: z.array(z.string()).optional(), text: z.string().optional(), abatementAge: z.number().int().optional(), abatementDateTime: z.string().optional(), _abatementDateTime: z.string().optional(), abatementPeriod: z.string().optional(), abatementRange: z.number().int().optional(), abatementString: z.string().optional(), _abatementString: z.string().optional(), asserter: z.string().optional(), bodySite: z.array(z.string()).optional(), category: z.array(z.string()).optional(), clinicalStatus: z.string().optional(), code: z.string().optional(), encounter: z.string().optional(), evidence: z.array(z.string()).optional(), identifier: z.array(z.number().int()).optional(), note: z.array(z.string()).optional(), onsetAge: z.number().int().optional(), onsetDateTime: z.string().optional(), _onsetDateTime: z.string().optional(), onsetPeriod: z.string().optional(), onsetRange: z.number().int().optional(), onsetString: z.string().optional(), _onsetString: z.string().optional(), recordedDate: z.string().optional(), _recordedDate: z.string().optional(), recorder: z.string().optional(), severity: z.string().optional(), stage: z.array(z.string()).optional(), subject: z.string(), verificationStatus: z.string().optional()}); export const serviceRequest = z.object({resource_type: z.string().optional(), fhir_comments: z.union([z.string(), z.array(z.string())]).optional(), id: z.string().min(1).max(64).optional(), _id: z.string().optional(), implicitRules: z.string().optional(), _implicitRules: z.string().optional(), language: z.string().optional(), _language: z.string().optional(), meta: z.string().optional(), contained: z.array(z.string()).optional(), extension: z.array(z.string()).optional(), modifierExtension: z.array(z.string()).optional(), text: z.string().optional(), asNeededBoolean: z.boolean().optional(), _asNeededBoolean: z.string().optional(), asNeededCodeableConcept: z.string().optional(), authoredOn: z.string().optional(), _authoredOn: z.string().optional(), basedOn: z.array(z.string()).optional(), bodySite: z.array(z.string()).optional(), category: z.array(z.string()).optional(), code: z.string().optional(), doNotPerform: z.boolean().optional(), _doNotPerform: z.string().optional(), encounter: z.string().optional(), identifier: z.array(z.number().int()).optional(), instantiatesCanonical: z.array(z.string()).optional(), _instantiatesCanonical: z.array(z.string()).optional(), instantiatesUri: z.array(z.string()).optional(), _instantiatesUri: z.array(z.string()).optional(), insurance: z.array(z.string()).optional(), intent: z.string().optional(), _intent: z.string().optional(), locationCode: z.array(z.string()).optional(), locationReference: z.array(z.string()).optional(), note: z.array(z.string()).optional(), occurrenceDateTime: z.string().optional(), _occurrenceDateTime: z.string().optional(), occurrencePeriod: z.string().optional(), occurrenceTiming: z.string().optional(), orderDetail: z.array(z.string()).optional(), patientInstruction: z.string().optional(), _patientInstruction: z.string().optional(), performer: z.array(z.string()).optional(), performerType: z.string().optional(), priority: z.string().optional(), _priority: z.string().optional(), quantityQuantity: z.number().int().optional(), quantityRange: z.number().int().optional(), quantityRatio: z.string().optional(), reasonCode: z.array(z.string()).optional(), reasonReference: z.array(z.string()).optional(), relevantHistory: z.array(z.string()).optional(), replaces: z.array(z.string()).optional(), requester: z.string().optional(), requisition: z.number().int().optional(), specimen: z.array(z.string()).optional(), status: z.string().optional(), _status: z.string().optional(), subject: z.string(), supportingInfo: z.array(z.string()).optional()}); export const immunization = z.object({resource_type: z.string().optional(), fhir_comments: z.union([z.string(), z.array(z.string())]).optional(), id: z.string().min(1).max(64).optional(), _id: z.string().optional(), implicitRules: z.string().optional(), _implicitRules: z.string().optional(), language: z.string().optional(), _language: z.string().optional(), meta: z.string().optional(), contained: z.array(z.string()).optional(), extension: z.array(z.string()).optional(), modifierExtension: z.array(z.string()).optional(), text: z.string().optional(), doseQuantity: z.number().int().optional(), education: z.array(z.string()).optional(), encounter: z.string().optional(), expirationDate: z.string().optional(), _expirationDate: z.string().optional(), fundingSource: z.string().optional(), identifier: z.array(z.number().int()).optional(), isSubpotent: z.boolean().optional(), _isSubpotent: z.string().optional(), location: z.string().optional(), lotNumber: z.string().optional(), _lotNumber: z.string().optional(), manufacturer: z.string().optional(), note: z.array(z.string()).optional(), occurrenceDateTime: z.string().optional(), _occurrenceDateTime: z.string().optional(), occurrenceString: z.string().optional(), _occurrenceString: z.string().optional(), patient: z.string(), performer: z.array(z.string()).optional(), primarySource: z.boolean().optional(), _primarySource: z.string().optional(), programEligibility: z.array(z.string()).optional(), protocolApplied: z.array(z.string()).optional(), reaction: z.array(z.string()).optional(), reasonCode: z.array(z.string()).optional(), reasonReference: z.array(z.string()).optional(), recorded: z.string().optional(), _recorded: z.string().optional(), reportOrigin: z.string().optional(), route: z.string().optional(), site: z.string().optional(), status: z.string().optional(), _status: z.string().optional(), statusReason: z.string().optional(), subpotentReason: z.array(z.string()).optional(), vaccineCode: z.string()}); export const allergyIntolerance = z.object({resource_type: z.string().optional(), fhir_comments: z.union([z.string(), z.array(z.string())]).optional(), id: z.string().min(1).max(64).optional(), _id: z.string().optional(), implicitRules: z.string().optional(), _implicitRules: z.string().optional(), language: z.string().optional(), _language: z.string().optional(), meta: z.string().optional(), contained: z.array(z.string()).optional(), extension: z.array(z.string()).optional(), modifierExtension: z.array(z.string()).optional(), text: z.string().optional(), asserter: z.string().optional(), category: z.array(z.string()).optional(), _category: z.array(z.string()).optional(), clinicalStatus: z.string().optional(), code: z.string().optional(), criticality: z.string().optional(), _criticality: z.string().optional(), encounter: z.string().optional(), identifier: z.array(z.number().int()).optional(), lastOccurrence: z.string().optional(), _lastOccurrence: z.string().optional(), note: z.array(z.string()).optional(), onsetAge: z.number().int().optional(), onsetDateTime: z.string().optional(), _onsetDateTime: z.string().optional(), onsetPeriod: z.string().optional(), onsetRange: z.number().int().optional(), onsetString: z.string().optional(), _onsetString: z.string().optional(), patient: z.string(), reaction: z.array(z.string()).optional(), recordedDate: z.string().optional(), _recordedDate: z.string().optional(), recorder: z.string().optional(), type: z.string().optional(), _type: z.string().optional(), verificationStatus: z.string().optional()}); export const communication = z.object({resource_type: z.string().optional(), fhir_comments: z.union([z.string(), z.array(z.string())]).optional(), id: z.string().min(1).max(64).optional(), _id: z.string().optional(), implicitRules: z.string().optional(), _implicitRules: z.string().optional(), language: z.string().optional(), _language: z.string().optional(), meta: z.string().optional(), contained: z.array(z.string()).optional(), extension: z.array(z.string()).optional(), modifierExtension: z.array(z.string()).optional(), text: z.string().optional(), about: z.array(z.string()).optional(), basedOn: z.array(z.string()).optional(), category: z.array(z.string()).optional(), encounter: z.string().optional(), identifier: z.array(z.number().int()).optional(), inResponseTo: z.array(z.string()).optional(), instantiatesCanonical: z.array(z.string()).optional(), _instantiatesCanonical: z.array(z.string()).optional(), instantiatesUri: z.array(z.string()).optional(), _instantiatesUri: z.array(z.string()).optional(), medium: z.array(z.string()).optional(), note: z.array(z.string()).optional(), partOf: z.array(z.string()).optional(), payload: z.array(z.string()).optional(), priority: z.string().optional(), _priority: z.string().optional(), reasonCode: z.array(z.string()).optional(), reasonReference: z.array(z.string()).optional(), received: z.string().optional(), _received: z.string().optional(), recipient: z.array(z.string()).optional(), sender: z.string().optional(), sent: z.string().optional(), _sent: z.string().optional(), status: z.string().optional(), _status: z.string().optional(), statusReason: z.string().optional(), subject: z.string().optional(), topic: z.string().optional()}); export const endpoint = z.object({resource_type: z.string().optional(), fhir_comments: z.union([z.string(), z.array(z.string())]).optional(), id: z.string().min(1).max(64).optional(), _id: z.string().optional(), implicitRules: z.string().optional(), _implicitRules: z.string().optional(), language: z.string().optional(), _language: z.string().optional(), meta: z.string().optional(), contained: z.array(z.string()).optional(), extension: z.array(z.string()).optional(), modifierExtension: z.array(z.string()).optional(), text: z.string().optional(), address: z.string().min(1).max(65536).optional(), _address: z.string().optional(), connectionType: z.string(), contact: z.array(z.string()).optional(), header: z.array(z.string()).optional(), _header: z.array(z.string()).optional(), identifier: z.array(z.number().int()).optional(), managingOrganization: z.string().optional(), name: z.string().optional(), _name: z.string().optional(), payloadMimeType: z.array(z.string()).optional(), _payloadMimeType: z.array(z.string()).optional(), payloadType: z.array(z.string()), period: z.string().optional(), status: z.string().optional(), _status: z.string().optional()}); export const documentReference = z.object({resource_type: z.string().optional(), fhir_comments: z.union([z.string(), z.array(z.string())]).optional(), id: z.string().min(1).max(64).optional(), _id: z.string().optional(), implicitRules: z.string().optional(), _implicitRules: z.string().optional(), language: z.string().optional(), _language: z.string().optional(), meta: z.string().optional(), contained: z.array(z.string()).optional(), extension: z.array(z.string()).optional(), modifierExtension: z.array(z.string()).optional(), text: z.string().optional(), authenticator: z.string().optional(), author: z.array(z.string()).optional(), category: z.array(z.string()).optional(), content: z.array(z.string()), context: z.unknown(), custodian: z.string().optional(), date: z.string().optional(), _date: z.string().optional(), description: z.string().optional(), _description: z.string().optional(), docStatus: z.string().optional(), _docStatus: z.string().optional(), identifier: z.array(z.number().int()).optional(), masterIdentifier: z.number().int().optional(), relatesTo: z.array(z.string()).optional(), securityLabel: z.array(z.string()).optional(), status: z.string().optional(), _status: z.string().optional(), subject: z.string().optional(), type: z.string().optional()}); export const action = z.object({type: actionEnum, description: z.string(), resource: z.union([valueSet, observation, condition, serviceRequest, immunization, allergyIntolerance, communication, endpoint, documentReference]).optional(), resourceId: z.string().optional()}); export const existingSuggestion = z.object({label: z.string(), is_recommended: z.boolean(), actions: z.array(action).optional(), uuid: z.string()}); export const definitionAPI = z.object({quality_program: z.string().optional(), name: z.string(), indicator: indicatorEnum, source: source, selection_behavior: selectionBehaviorEnum, closing_codes: z.array(coding).optional(), description: z.string().optional(), practice_id: z.string().optional(), override_reasons: z.array(coding).optional(), links: z.array(link).optional(), start_date: z.string(), end_date: z.string(), additional_documentation: z.array(docSection).optional(), external_id: z.string().optional(), suggestions: z.array(existingSuggestion), id: z.string()}); export const definitionAPIPaginatedResponse = z.object({results: z.array(definitionAPI), cursor: z.string().optional(), next_page_url: z.string().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Retrieve a filtered page of definitions * * GET /caregaps/api/{quality_program}/definition/ */ export const getApiCaregapsApiQualityProgramDefinition = async (args: GetApiCaregapsApiQualityProgramDefinitionArgs, options?: GetApiCaregapsApiQualityProgramDefinitionOptions) => { const {baseUrl = "https://sandbox.elationemr.com", fetch: fetchFn = fetch, OAuth2PasswordBearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.page_size != null) query.append("page_size", String(args.page_size)) if (args.page_num != null) query.append("page_num", String(args.page_num)) for (const item of args.closing_code ?? []) query.append("closing_code", String(item)) for (const item of args.definition_id ?? []) query.append("definition_id", String(item)) if (args.external_id != null) query.append("external_id", String(args.external_id)) if (args.cursor != null) query.append("cursor", String(args.cursor)) if (args.name != null) query.append("name", String(args.name)) if (args.indicator != null) query.append("indicator", String(args.indicator)) if (OAuth2PasswordBearer !== undefined) headers.set('authorization', `Bearer ${OAuth2PasswordBearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/caregaps/api/${encodeURIComponent(String(args.quality_program))}/definition/${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(definitionAPIPaginatedResponse, await res.json()) };