import {z} from 'zod' export type ConnectAccessWorldwideRequestBody = {nickname: string, username: string, password: string}; export type Email = string; export type ConnectAmazonBuyShippingRequestBody = {nickname: string, merchant_seller_id: string, mws_auth_token: string, email: Email}; export type ConnectAmazonShippingUk = {nickname: string, auth_code: string}; export type ConnectApcRequestBody = {nickname: string, username: string, password: string}; export type ConnectAsendiaRequestBody = {nickname: string, account_number: string, username: string, password: string, api_key: string, processing_location: string, sub_account_number?: string | undefined}; export type ConnectAustraliaPostRequestBody = {account_number: string, api_key: string, api_secret: string, nickname: string}; export type ConnectCanadaPostRequestBody = {nickname: string, api_key: string, api_secret: string, account_number: string, contract_id: string}; export type AncillaryServiceEndorsement = 'none' | 'return_service_requested' | 'forwarding_service_requested' | 'address_service_requested' | 'change_service_requested' | 'leave_if_no_response'; export type ConnectDhlEcommerceRequestBody = {nickname: string, client_id: string, username: string, password: string, pickup_number: string, distribution_center: string, api_key?: string | undefined, api_secret?: string | undefined, ancillary_endorsement?: AncillaryServiceEndorsement | undefined, account_number?: string | undefined, ftp_username?: string | undefined, ftp_password?: string | undefined, sold_to?: string | undefined, registration_id?: string | undefined, software_name?: string | undefined}; export type CountryCode = string; export type ConnectDhlExpressRequestBody = {nickname: string, account_number: string, site_id?: string | undefined, password?: string | undefined, country_code?: CountryCode | undefined}; export type ConnectDhlExpressAuRequestBody = {nickname: string, account_number: string}; export type ConnectDhlExpressCaRequestBody = {nickname: string, account_number: string}; export type SeId = string; export type ConnectDhlExpressUkRequestBody = {account_number: string, site_id: SeId, password: string, nickname: string}; export type ConnectDpdRequestBody = {account_number: string, password: string, nickname: string}; export type ConnectEndiciaRequestBody = {nickname: string, account: string, passphrase: string}; export type ConnectEpgShippingRequestBody = {nickname: string, token: string}; export type ConnectFedexRequestBody = {account_number: string, address1: string, address2?: string | undefined, city: string, company?: string | undefined, country_code: string, email: Email, first_name: string, last_name: string, phone: string, postal_code: string, state: string, nickname: string, agree_to_eula: boolean, meter_number?: string | undefined}; export type ConnectFedexUkRequestBody = {account_number: string, address1: string, address2?: string | undefined, city: string, company?: string | undefined, country_code: string, email: Email, first_name: string, last_name: string, phone: string, postal_code: string, state: string, nickname: string, agree_to_eula: boolean, meter_number?: string | undefined}; export type ConnectFirstmileRequestBody = {nickname: string, mailer_id: SeId, profile_name?: string | undefined, password: string}; export type ConnectImexRequestBody = {nickname: string, username: string, password: string}; export type ConnectLasershipRequestBody = {nickname: string, web_services_id: string, web_services_key: string, customer_branch: string, Address: string, Address2?: string | undefined, PostalCode: string, City: string, State: string, country?: string | undefined, Phone?: string | undefined, Email?: string | undefined, instructions?: string | undefined, facility_code?: string | undefined, lasership_critical_pull_time: string, lasership_critical_entry_time: string, declare_piece_attributes_separately_for_every_shipment?: boolean | undefined, AttrAlcohol?: boolean | undefined, AttrDryIce?: boolean | undefined, AttrHazmat?: boolean | undefined, AttrTwoPersons?: boolean | undefined, AttrExplosive?: boolean | undefined, AttrControlledSubstance?: boolean | undefined, AttrRefrigerated?: boolean | undefined, AttrPerishable?: boolean | undefined, AttrNoRTS?: boolean | undefined}; export type ConnectNewgisticsRequestBody = {merchant_id?: number | undefined, mailer_id?: number | undefined, induction_site: string, nickname: string}; export type ConnectOntracRequestBody = {nickname: string, account_number: string, password: string}; export type ConnectPurolatorRequestBody = {account_number: string, activation_key: string, nickname: string}; export type ConnectRoyalMailRequestBody = {account_number: string, oba_email?: Email | undefined, contact_name: string, email?: Email | undefined, company_name?: string | undefined, street_line1?: string | undefined, street_line2?: string | undefined, street_line3?: string | undefined, city: string, postal_code: string, phone?: string | undefined, nickname: string}; export type ConnectSekoRequestBody = {nickname: string, access_key: string}; export type ConnectSendleRequestBody = {nickname: string, sendle_id: SeId, api_key: string}; export type ConnectStampsRequestBody = {nickname: string, username: string, password: string}; export type ConnectUpsRequestBody = {nickname: string, account_number: string, account_postal_code: string, account_country_code: string}; export type ConnectCarrierRequestBody = ConnectAccessWorldwideRequestBody | ConnectAmazonBuyShippingRequestBody | ConnectAmazonShippingUk | ConnectApcRequestBody | ConnectAsendiaRequestBody | ConnectAustraliaPostRequestBody | ConnectCanadaPostRequestBody | ConnectDhlEcommerceRequestBody | ConnectDhlExpressRequestBody | ConnectDhlExpressAuRequestBody | ConnectDhlExpressCaRequestBody | ConnectDhlExpressUkRequestBody | ConnectDpdRequestBody | ConnectEndiciaRequestBody | ConnectEpgShippingRequestBody | ConnectFedexRequestBody | ConnectFedexUkRequestBody | ConnectFirstmileRequestBody | ConnectImexRequestBody | ConnectLasershipRequestBody | ConnectNewgisticsRequestBody | ConnectOntracRequestBody | ConnectPurolatorRequestBody | ConnectRoyalMailRequestBody | ConnectSekoRequestBody | ConnectSendleRequestBody | ConnectStampsRequestBody | ConnectUpsRequestBody; export type CreateApiV2ConnectionsCarriersCarrierNameArgs = {body: ConnectCarrierRequestBody}; export type CreateApiV2ConnectionsCarriersCarrierNameOptions = {baseUrl?: string | undefined, apiKeys?: string | undefined, fetch?: typeof fetch | undefined}; export const seId = z.string().min(1).max(25); export const connectCarrierResponseBody = z.object({carrier_id: seId}); 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 }; /** * Connect a carrier account * * POST /v2/connections/carriers/{carrier_name} */ export const createApiV2ConnectionsCarriersCarrierName = async (args: CreateApiV2ConnectionsCarriersCarrierNameArgs, options?: CreateApiV2ConnectionsCarriersCarrierNameOptions) => { const {baseUrl = "https://api.shipstation.com", fetch: fetchFn = fetch, apiKeys} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (apiKeys !== undefined) headers.set("api-key", apiKeys) const url = `${baseUrl.replace(/\/+$/, '')}/v2/connections/carriers/${encodeURIComponent(String(args.carrier_name))}${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(connectCarrierResponseBody, await res.json()) };