import {z} from 'zod' export type ConvertToOption = string | {formatName: string, formatOptions?: ({SelectPdfVersion?: (0 | 1 | 2 | 3 | 4 | 15 | 16 | 17 | 20) | undefined, ConvertOOoTargetToPDFTarget?: boolean | undefined, ExportFormFields?: boolean | undefined, ExportLinksRelativeFsys?: boolean | undefined, ExportNotes?: boolean | undefined, ExportNotesPages?: boolean | undefined, FormsType?: (0 | 1 | 2 | 3) | undefined, IsAddStream?: boolean | undefined, IsSkipEmptyPages?: boolean | undefined, UseTransitionEffects?: boolean | undefined, DocumentOpenPassword?: string | undefined, EncryptFile?: boolean | undefined, PermissionPassword?: string | undefined, RestrictPermissions?: boolean | undefined, Changes?: (0 | 1 | 2 | 3 | 4) | undefined, EnableCopyingOfContent?: boolean | undefined, EnableTextAccessForAccessibilityTools?: boolean | undefined, Printing?: (0 | 1 | 2) | undefined, MaxImageResolution?: (75 | 150 | 300 | 600 | 1200) | undefined, ReduceImageResolution?: boolean | undefined, UseLosslessCompression?: boolean | undefined, Watermark?: string | undefined, Watermarks?: (Array<{text: string, anchor?: ('topLeft' | 'top' | 'topRight' | 'left' | 'center' | 'right' | 'bottomLeft' | 'bottom' | 'bottomRight') | undefined, offsetX?: number | undefined, offsetY?: number | undefined, rotation?: number | undefined, color?: string | undefined, size?: number | undefined, opacity?: number | undefined, font?: ('Courier' | 'Courier-Bold' | 'Courier-Oblique' | 'Courier-BoldOblique' | 'Helvetica' | 'Helvetica-Bold' | 'Helvetica-Oblique' | 'Helvetica-BoldOblique' | 'Times-Roman' | 'Times-Bold' | 'Times-Italic' | 'Times-BoldItalic') | undefined, fromPage?: number | undefined, toPage?: number | undefined}>) | undefined, UseTaggedPDF?: boolean | undefined, PDFUACompliance?: boolean | undefined, AllowDuplicateFieldNames?: boolean | undefined, CenterWindow?: boolean | undefined, DisplayPDFDocumentTitle?: boolean | undefined, ExportBookmarks?: boolean | undefined, ExportBookmarksToPDFDestination?: boolean | undefined, FirstPageOnLeft?: boolean | undefined, HideViewerMenubar?: boolean | undefined, HideViewerToolbar?: boolean | undefined, HideViewerWindowControls?: boolean | undefined, InitialPage?: number | undefined, InitialView?: (0 | 1 | 2) | undefined, Magnification?: (0 | 1 | 2 | 3 | 4) | undefined, OpenBookmarkLevels?: number | undefined, OpenInFullScreenMode?: boolean | undefined, PageLayout?: (0 | 1 | 2 | 3) | undefined, PageRange?: string | undefined, PDFViewSelection?: (0 | 1 | 2) | undefined, ResizeWindowToInitialPage?: boolean | undefined, Zoom?: number | undefined, PixelWidth?: number | undefined, PixelHeight?: number | undefined, FullPage?: boolean | undefined, Scale?: number | undefined, ColorMode?: number | undefined, Quality?: number | undefined, Compression?: number | undefined, Interlaced?: number | undefined, Translucent?: number | undefined, fieldSeparator?: string | undefined, textDelimiter?: string | undefined, characterSet?: string | undefined}) | undefined}; export type Converter = 'L' | 'O' | 'C' | 'I'; export type ConvertInlineRequestBody = {template: string, data?: (Record | Array) | undefined, convertTo?: ConvertToOption | undefined, converter?: Converter | undefined, timezone?: string | undefined, lang?: string | undefined, complement?: Record | undefined, variableStr?: string | undefined, reportName?: string | undefined, enum?: Record | undefined, translations?: Record | undefined, currencySource?: string | undefined, currencyTarget?: string | undefined, currencyRates?: Record | undefined, hardRefresh?: boolean | undefined, batchSplitBy?: string | undefined, batchOutput?: ('zip' | 'pdf') | undefined, batchReportName?: string | undefined, preReleaseFeatureIn?: number | undefined, failOn?: Array<'IMAGE_URL_ERROR'> | undefined}; export type CreateApiRenderTemplateArgs = {'carbone-version': '5' | '4' | '3' | 'staging', 'carbone-webhook-url'?: string | undefined, 'carbone-webhook-header-authorization'?: string | undefined, 'carbone-egress-header-authorization'?: string | undefined, download?: boolean | undefined, body: ConvertInlineRequestBody}; export type CreateApiRenderTemplateOptions = {baseUrl?: string | undefined, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const createApiRenderTemplateResponse = z.object({success: z.boolean().optional(), data: z.object({renderId: z.string().optional()}).optional(), message: 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 }; /** * Convert a document * * POST /render/template */ export const createApiRenderTemplate = async (args: CreateApiRenderTemplateArgs, options?: CreateApiRenderTemplateOptions) => { const {baseUrl = "https://api.carbone.io", fetch: fetchFn = fetch, bearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args['carbone-version'] != null) headers.set("carbone-version", String(args['carbone-version'])) if (args['carbone-webhook-url'] != null) headers.set("carbone-webhook-url", String(args['carbone-webhook-url'])) if (args['carbone-webhook-header-authorization'] != null) headers.set("carbone-webhook-header-authorization", String(args['carbone-webhook-header-authorization'])) if (args['carbone-egress-header-authorization'] != null) headers.set("carbone-egress-header-authorization", String(args['carbone-egress-header-authorization'])) if (args.download != null) query.append("download", String(args.download)) if (bearerAuth !== undefined) headers.set('authorization', `Bearer ${bearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/render/template${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", 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(createApiRenderTemplateResponse, await res.json()) };