import {z} from 'zod' export type GetApiV1ConnectionsArgs = {active?: boolean | undefined, carrier_name?: string | undefined, metadata_key?: string | undefined, metadata_value?: string | undefined, system_only?: boolean | undefined}; export type GetApiV1ConnectionsOptions = {baseUrl: string, TokenBasic?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const zoom2u = z.object({api_key: z.string()}); export const uspsWtInternational = z.object({username: z.string(), password: z.string(), mailer_id: z.string().optional(), customer_registration_id: z.string().optional(), logistics_manager_mailer_id: z.string().optional()}); export const uspsWt = z.object({username: z.string(), password: z.string(), mailer_id: z.string().optional(), customer_registration_id: z.string().optional(), logistics_manager_mailer_id: z.string().optional()}); export const uspsInternational = z.object({client_id: z.string(), client_secret: z.string(), account_number: z.string().optional(), account_type: z.enum(["EPS", "PERMIT", "METER"]).optional(), manifest_MID: z.string().optional(), CRID: z.string().optional(), MID: z.string().optional()}); export const usps = z.object({client_id: z.string(), client_secret: z.string(), account_number: z.string().optional(), account_type: z.enum(["EPS", "PERMIT", "METER"]).optional(), manifest_MID: z.string().optional(), CRID: z.string().optional(), MID: z.string().optional()}); export const ups = z.object({client_id: z.string(), client_secret: z.string(), account_number: z.string().optional(), account_country_code: z.string().optional()}); export const tnt = z.object({username: z.string(), password: z.string(), account_number: z.string().optional(), account_country_code: z.string().optional()}); export const tge = z.object({username: z.string(), password: z.string(), api_key: z.string(), toll_username: z.string(), toll_password: z.string(), my_toll_token: z.string(), my_toll_identity: z.string(), account_code: z.string().optional(), sscc_count: z.number().int().optional(), shipment_count: z.number().int().optional()}); export const sendle = z.object({sendle_id: z.string(), api_key: z.string(), account_country_code: z.string().optional()}); export const seko = z.object({access_key: z.string()}); export const sapient = z.object({client_id: z.string(), client_secret: z.string(), shipping_account_id: z.string(), sapient_carrier_code: z.enum(["DX", "EVRI", "RM", "UPS", "YODEL"]).optional()}); export const royalmail = z.object({client_id: z.string(), client_secret: z.string()}); export const roadie = z.object({api_key: z.string()}); export const purolator = z.object({username: z.string(), password: z.string(), account_number: z.string(), user_token: z.string().optional(), language: z.enum(["en", "fr"]).optional()}); export const nationex = z.object({api_key: z.string(), customer_id: z.string(), billing_account: z.string().optional(), language: z.enum(["en", "fr"]).optional()}); export const locate2u = z.object({client_id: z.string().optional(), client_secret: z.string().optional()}); export const laposte = z.object({api_key: z.string(), lang: z.enum(["fr_FR", "en_US"]).optional()}); export const hayPost = z.object({username: z.string(), password: z.string(), customer_id: z.string(), customer_type: z.string()}); export const geodis = z.object({api_key: z.string(), identifier: z.string(), code_client: z.string().optional(), language: z.enum(["fr", "en"]).optional()}); export const generic = z.object({display_name: z.string(), custom_carrier_name: z.string(), account_country_code: z.string().optional(), account_number: z.string().optional()}); export const freightcom = z.object({username: z.string(), password: z.string()}); export const fedexWs = z.object({password: z.string(), meter_number: z.string(), account_number: z.string(), user_key: z.string().optional(), language_code: z.string().optional(), account_country_code: z.string().optional()}); export const fedex = z.object({api_key: z.string().optional(), secret_key: z.string().optional(), account_number: z.string().optional(), track_api_key: z.string().optional(), track_secret_key: z.string().optional(), account_country_code: z.string().optional()}); export const eshipper = z.object({principal: z.string(), credential: z.string()}); export const easyship = z.object({access_token: z.string()}); export const easypost = z.object({api_key: z.string()}); export const dpdhl = z.object({username: z.string(), password: z.string(), app_id: z.string().optional(), app_token: z.string().optional(), zt_id: z.string().optional(), zt_password: z.string().optional(), account_number: z.string().optional()}); export const dpd = z.object({delis_id: z.string(), password: z.string(), depot: z.string().optional(), message_language: z.string().optional(), account_country_code: z.string().optional()}); export const dicom = z.object({username: z.string(), password: z.string(), billing_account: z.string().optional()}); export const dhlUniversal = z.object({consumer_key: z.string(), consumer_secret: z.string(), language: z.enum(["en", "de"]).optional()}); export const dhlPoland = z.object({username: z.string(), password: z.string(), account_number: z.string().optional()}); export const dhlParcelDe = z.object({username: z.string(), password: z.string(), dhl_api_key: z.string(), customer_number: z.string().optional(), tracking_consumer_key: z.string().optional(), tracking_consumer_secret: z.string().optional()}); export const dhlExpress = z.object({site_id: z.string(), password: z.string(), account_number: z.string().optional(), account_country_code: z.string().optional()}); export const colissimo = z.object({password: z.string(), contract_number: z.string(), laposte_api_key: z.string().optional()}); export const chronopost = z.object({account_number: z.string(), password: z.string(), id_emit: z.string().optional(), language: z.enum(["en_GB", "fr_FR"]).optional()}); export const canpar = z.object({username: z.string(), password: z.string(), language: z.enum(["en", "fr"]).optional()}); export const canadapost = z.object({username: z.string(), password: z.string(), customer_number: z.string().optional(), contract_id: z.string().optional(), language: z.enum(["en", "fr"]).optional()}); export const bpost = z.object({account_id: z.string(), passphrase: z.string()}); export const boxknight = z.object({username: z.string(), password: z.string()}); export const australiapost = z.object({api_key: z.string(), password: z.string(), account_number: z.string()}); export const asendiaUs = z.object({username: z.string(), password: z.string(), api_key: z.string(), account_number: z.string().optional()}); export const aramex = z.object({username: z.string(), password: z.string(), account_pin: z.string(), account_entity: z.string(), account_number: z.string(), account_country_code: z.string()}); export const amazonShipping = z.object({seller_id: z.string(), developer_id: z.string(), mws_auth_token: z.string(), aws_region: z.string().optional(), account_country_code: z.string().optional()}); export const alliedExpressLocal = z.object({username: z.string(), password: z.string(), account: z.string().optional(), service_type: z.enum(["R", "P", "PT", "PT2"]).optional()}); export const alliedExpress = z.object({username: z.string(), password: z.string(), account: z.string().optional(), service_type: z.enum(["R", "P", "PT", "PT2"]).optional()}); export const connectionCredentialsField = z.union([zoom2u, uspsWtInternational, uspsWt, uspsInternational, usps, ups, tnt, tge, sendle, seko, sapient, royalmail, roadie, purolator, nationex, locate2u, laposte, hayPost, geodis, generic, freightcom, fedexWs, fedex, eshipper, easyship, easypost, dpdhl, dpd, dicom, dhlUniversal, dhlPoland, dhlParcelDe, dhlExpress, colissimo, chronopost, canpar, canadapost, bpost, boxknight, australiapost, asendiaUs, aramex, amazonShipping, alliedExpressLocal, alliedExpress]); export const carrierConnection = z.object({id: z.string(), object_type: z.string().optional(), carrier_name: z.enum(["allied_express", "allied_express_local", "amazon_shipping", "aramex", "asendia_us", "australiapost", "boxknight", "bpost", "canadapost", "canpar", "chronopost", "colissimo", "dhl_express", "dhl_parcel_de", "dhl_poland", "dhl_universal", "dicom", "dpd", "dpdhl", "easypost", "easyship", "eshipper", "fedex", "fedex_ws", "freightcom", "generic", "geodis", "hay_post", "laposte", "locate2u", "nationex", "purolator", "roadie", "royalmail", "sapient", "seko", "sendle", "tge", "tnt", "ups", "usps", "usps_international", "usps_wt", "usps_wt_international", "zoom2u"]), display_name: z.string().optional(), carrier_id: z.string(), credentials: connectionCredentialsField.optional(), capabilities: z.array(z.string()).nullable().optional(), config: z.record(z.string(), z.unknown()).optional(), metadata: z.record(z.string(), z.unknown()).optional(), is_system: z.boolean(), active: z.boolean(), test_mode: z.boolean()}); export const carrierConnectionList = z.object({count: z.number().int().nullable().optional(), next: z.string().nullable().optional(), previous: z.string().nullable().optional(), results: z.array(carrierConnection)}); 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 }; /** * List carrier connections * * GET /v1/connections * * Also accepts auth: Token, OAuth2, JWT */ export const getApiV1Connections = async (args: GetApiV1ConnectionsArgs, options: GetApiV1ConnectionsOptions) => { const {baseUrl, fetch: fetchFn = fetch, TokenBasic} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.active != null) query.append("active", String(args.active)) if (args.carrier_name != null) query.append("carrier_name", String(args.carrier_name)) if (args.metadata_key != null) query.append("metadata_key", String(args.metadata_key)) if (args.metadata_value != null) query.append("metadata_value", String(args.metadata_value)) if (args.system_only != null) query.append("system_only", String(args.system_only)) if (TokenBasic !== undefined) headers.set('authorization', `Basic ${btoa(`${TokenBasic.username}:${TokenBasic.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/connections${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(carrierConnectionList, await res.json()) };