import {z} from 'zod' export type GetApiApiV2MetadataOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const string: z.ZodType = z.object({extension: z.array(z.lazy(() => extension)).optional(), id: z.lazy(() => string.optional()), value: z.string().optional()}); export const uri = z.object({extension: z.array(z.lazy(() => extension)).optional(), id: string.optional(), value: z.string().optional()}); export const isExtensionValueXChoice = z.object({}); export const extensionValueX = z.object({Choice: isExtensionValueXChoice.optional()}); export const extension: z.ZodType = z.object({extension: z.array(z.lazy(() => extension)).optional(), id: string.optional(), url: uri.optional(), value: extensionValueX.optional()}); export const unknownContentCodeCodeValue = z.number().int(); export const unknownContentCodeCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: unknownContentCodeCodeValue.optional()}); export const dateTimePrecision = z.number().int(); export const dateTime = z.object({extension: z.array(extension).optional(), id: string.optional(), precision: dateTimePrecision.optional(), timezone: z.string().optional(), value_us: z.number().int().optional()}); export const period = z.object({end: dateTime.optional(), extension: z.array(extension).optional(), id: string.optional(), start: dateTime.optional()}); export const positiveInt = z.object({extension: z.array(extension).optional(), id: string.optional(), value: z.number().int().optional()}); export const contactPointSystemCodeValue = z.number().int(); export const contactPointSystemCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: contactPointSystemCodeValue.optional()}); export const contactPointUseCodeValue = z.number().int(); export const contactPointUseCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: contactPointUseCodeValue.optional()}); export const contactPoint = z.object({extension: z.array(extension).optional(), id: string.optional(), period: period.optional(), rank: positiveInt.optional(), system: contactPointSystemCode.optional(), use: contactPointUseCode.optional(), value: string.optional()}); export const contactDetail = z.object({extension: z.array(extension).optional(), id: string.optional(), name: string.optional(), telecom: z.array(contactPoint).optional()}); export const isContainedResourceOneofResource = z.object({}); export const containedResource = z.object({OneofResource: isContainedResourceOneofResource.optional()}); export const markdown = z.object({extension: z.array(extension).optional(), id: string.optional(), value: z.string().optional()}); export const documentModeCodeValue = z.number().int(); export const documentModeCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: documentModeCodeValue.optional()}); export const isReferenceReference = z.object({}); export const code = z.object({extension: z.array(extension).optional(), id: string.optional(), value: z.string().optional()}); export const coding = z.object({code: code.optional(), display: string.optional(), extension: z.array(extension).optional(), id: string.optional(), system: uri.optional(), user_selected: z.boolean().optional(), version: string.optional()}); export const codeableConcept = z.object({coding: z.array(coding).optional(), extension: z.array(extension).optional(), id: string.optional(), text: string.optional()}); export const identifierUseCodeValue = z.number().int(); export const identifierUseCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: identifierUseCodeValue.optional()}); export const identifier = z.object({assigner: z.lazy(() => reference.optional()), extension: z.array(extension).optional(), id: string.optional(), period: period.optional(), system: uri.optional(), type: codeableConcept.optional(), use: identifierUseCode.optional(), value: string.optional()}); export const reference: z.ZodType = z.object({Reference: isReferenceReference.optional(), display: string.optional(), extension: z.array(extension).optional(), id: string.optional(), identifier: identifier.optional()}); export const capabilityStatementDocument = z.object({documentation: string.optional(), extension: z.array(extension).optional(), id: string.optional(), mode: documentModeCode.optional(), modifier_extension: z.array(extension).optional(), profile: reference.optional()}); export const id = z.object({extension: z.array(extension).optional(), id: string.optional(), value: z.string().optional()}); export const mimeTypeCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: z.string().optional()}); export const capabilityStatementImplementation = z.object({description: string.optional(), extension: z.array(extension).optional(), id: string.optional(), modifier_extension: z.array(extension).optional(), url: uri.optional()}); export const languageCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: z.string().optional()}); export const capabilityStatementMessagingEndpoint = z.object({address: uri.optional(), extension: z.array(extension).optional(), id: string.optional(), modifier_extension: z.array(extension).optional(), protocol: coding.optional()}); export const messageSignificanceCategoryCodeValue = z.number().int(); export const messageSignificanceCategoryCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: messageSignificanceCategoryCodeValue.optional()}); export const resourceTypeCodeValue = z.number().int(); export const resourceTypeCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: resourceTypeCodeValue.optional()}); export const eventCapabilityModeCodeValue = z.number().int(); export const eventCapabilityModeCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: eventCapabilityModeCodeValue.optional()}); export const capabilityStatementMessagingEvent = z.object({category: messageSignificanceCategoryCode.optional(), code: coding.optional(), documentation: string.optional(), extension: z.array(extension).optional(), focus: resourceTypeCode.optional(), id: string.optional(), mode: eventCapabilityModeCode.optional(), modifier_extension: z.array(extension).optional(), request: reference.optional(), response: reference.optional()}); export const unsignedInt = z.object({extension: z.array(extension).optional(), id: string.optional(), value: z.number().int().optional()}); export const capabilityStatementMessagingSupportedMessage = z.object({definition: reference.optional(), extension: z.array(extension).optional(), id: string.optional(), mode: eventCapabilityModeCode.optional(), modifier_extension: z.array(extension).optional()}); export const capabilityStatementMessaging = z.object({documentation: string.optional(), endpoint: z.array(capabilityStatementMessagingEndpoint).optional(), event: z.array(capabilityStatementMessagingEvent).optional(), extension: z.array(extension).optional(), id: string.optional(), modifier_extension: z.array(extension).optional(), reliable_cache: unsignedInt.optional(), supported_message: z.array(capabilityStatementMessagingSupportedMessage).optional()}); export const instantPrecision = z.number().int(); export const instant = z.object({extension: z.array(extension).optional(), id: string.optional(), precision: instantPrecision.optional(), timezone: z.string().optional(), value_us: z.number().int().optional()}); export const meta = z.object({extension: z.array(extension).optional(), id: string.optional(), last_updated: instant.optional(), profile: z.array(uri).optional(), security: z.array(coding).optional(), tag: z.array(coding).optional(), version_id: id.optional()}); export const systemRestfulInteractionCodeValue = z.number().int(); export const systemRestfulInteractionCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: systemRestfulInteractionCodeValue.optional()}); export const capabilityStatementRestSystemInteraction = z.object({code: systemRestfulInteractionCode.optional(), documentation: string.optional(), extension: z.array(extension).optional(), id: string.optional(), modifier_extension: z.array(extension).optional()}); export const restfulCapabilityModeCodeValue = z.number().int(); export const restfulCapabilityModeCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: restfulCapabilityModeCodeValue.optional()}); export const capabilityStatementRestOperation = z.object({definition: reference.optional(), extension: z.array(extension).optional(), id: string.optional(), modifier_extension: z.array(extension).optional(), name: string.optional()}); export const conditionalDeleteStatusCodeValue = z.number().int(); export const conditionalDeleteStatusCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: conditionalDeleteStatusCodeValue.optional()}); export const conditionalReadStatusCodeValue = z.number().int(); export const conditionalReadStatusCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: conditionalReadStatusCodeValue.optional()}); export const typeRestfulInteractionCodeValue = z.number().int(); export const typeRestfulInteractionCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: typeRestfulInteractionCodeValue.optional()}); export const capabilityStatementRestResourceResourceInteraction = z.object({code: typeRestfulInteractionCode.optional(), documentation: string.optional(), extension: z.array(extension).optional(), id: string.optional(), modifier_extension: z.array(extension).optional()}); export const referenceHandlingPolicyCodeValue = z.number().int(); export const referenceHandlingPolicyCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: referenceHandlingPolicyCodeValue.optional()}); export const searchParamTypeCodeValue = z.number().int(); export const searchParamTypeCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: searchParamTypeCodeValue.optional()}); export const capabilityStatementRestResourceSearchParam = z.object({definition: uri.optional(), documentation: string.optional(), extension: z.array(extension).optional(), id: string.optional(), modifier_extension: z.array(extension).optional(), name: string.optional(), type: searchParamTypeCode.optional()}); export const resourceVersionPolicyCodeValue = z.number().int(); export const resourceVersionPolicyCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: resourceVersionPolicyCodeValue.optional()}); export const capabilityStatementRestResource = z.object({conditional_create: z.boolean().optional(), conditional_delete: conditionalDeleteStatusCode.optional(), conditional_read: conditionalReadStatusCode.optional(), conditional_update: z.boolean().optional(), documentation: markdown.optional(), extension: z.array(extension).optional(), id: string.optional(), interaction: z.array(capabilityStatementRestResourceResourceInteraction).optional(), modifier_extension: z.array(extension).optional(), profile: reference.optional(), read_history: z.boolean().optional(), reference_policy: z.array(referenceHandlingPolicyCode).optional(), search_include: z.array(string).optional(), search_param: z.array(capabilityStatementRestResourceSearchParam).optional(), search_rev_include: z.array(string).optional(), type: resourceTypeCode.optional(), update_create: z.boolean().optional(), versioning: resourceVersionPolicyCode.optional()}); export const base64Binary = z.object({extension: z.array(extension).optional(), id: string.optional(), value: z.array(z.number().int()).optional()}); export const capabilityStatementRestSecurityCertificate = z.object({blob: base64Binary.optional(), extension: z.array(extension).optional(), id: string.optional(), modifier_extension: z.array(extension).optional(), type: mimeTypeCode.optional()}); export const capabilityStatementRestSecurity = z.object({certificate: z.array(capabilityStatementRestSecurityCertificate).optional(), cors: z.boolean().optional(), description: string.optional(), extension: z.array(extension).optional(), id: string.optional(), modifier_extension: z.array(extension).optional(), service: z.array(codeableConcept).optional()}); export const capabilityStatementRest = z.object({compartment: z.array(uri).optional(), documentation: string.optional(), extension: z.array(extension).optional(), id: string.optional(), interaction: z.array(capabilityStatementRestSystemInteraction).optional(), mode: restfulCapabilityModeCode.optional(), modifier_extension: z.array(extension).optional(), operation: z.array(capabilityStatementRestOperation).optional(), resource: z.array(capabilityStatementRestResource).optional(), search_param: z.array(capabilityStatementRestResourceSearchParam).optional(), security: capabilityStatementRestSecurity.optional()}); export const capabilityStatementSoftware = z.object({extension: z.array(extension).optional(), id: string.optional(), modifier_extension: z.array(extension).optional(), name: string.optional(), release_date: z.string().optional(), version: string.optional()}); export const xhtml = z.object({id: string.optional(), value: z.string().optional()}); export const narrativeStatusCodeValue = z.number().int(); export const narrativeStatusCode = z.object({extension: z.array(extension).optional(), id: string.optional(), value: narrativeStatusCodeValue.optional()}); export const narrative = z.object({div: xhtml.optional(), extension: z.array(extension).optional(), id: string.optional(), status: narrativeStatusCode.optional()}); export const isUsageContextValueValue = z.object({}); export const usageContextValue = z.object({Value: isUsageContextValueValue.optional()}); export const usageContext = z.object({code: coding.optional(), extension: z.array(extension).optional(), id: string.optional(), value: usageContextValue.optional()}); export const capabilityStatement = z.object({accept_unknown: unknownContentCodeCode.optional(), contact: z.array(contactDetail).optional(), contained: z.array(containedResource).optional(), copyright: markdown.optional(), date: z.string().optional(), description: markdown.optional(), document: z.array(capabilityStatementDocument).optional(), experimental: z.boolean().optional(), extension: z.array(extension).optional(), fhir_version: id.optional(), format: z.array(mimeTypeCode).optional(), id: id.optional(), implementation: capabilityStatementImplementation.optional(), implementation_guide: z.array(uri).optional(), implicit_rules: uri.optional(), instantiates: z.array(uri).optional(), jurisdiction: z.array(codeableConcept).optional(), kind: z.string().optional(), language: languageCode.optional(), messaging: z.array(capabilityStatementMessaging).optional(), meta: meta.optional(), modifier_extension: z.array(extension).optional(), name: string.optional(), patch_format: z.array(mimeTypeCode).optional(), profile: z.array(reference).optional(), publisher: z.string().optional(), purpose: markdown.optional(), rest: z.array(capabilityStatementRest).optional(), software: capabilityStatementSoftware.optional(), status: z.string().optional(), text: narrative.optional(), title: string.optional(), url: uri.optional(), use_context: z.array(usageContext).optional(), version: 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 }; /** * Get metadata * * GET /api/v2/metadata */ export const getApiApiV2Metadata = async (options: GetApiApiV2MetadataOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/api/v2/metadata${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(capabilityStatement, await res.json()) };