import {z} from 'zod' export type TempUnit = 'CELSIUS' | 'FAHRENHEIT'; export type TempRangeKind = {min?: number | undefined, max?: number | undefined, unit?: TempUnit | undefined}; export type SpecificationKindBool = {value?: boolean | undefined}; export type HazmatKind = {hazmatClass?: string | undefined, unCode?: string | undefined}; export type PackageAccessorial = {code?: 'REFRIGERATED' | undefined, details?: TempRangeKind | undefined} | {code?: 'LIFTGATE' | undefined, details?: SpecificationKindBool | undefined} | {code?: 'HAZMAT' | undefined, details?: HazmatKind | undefined}; export type ItemIdentifierType = 'CONTAINER_NUMBER' | 'PALLET_NUMBER' | 'DELIVERY_NUMBER' | 'PICKUP_NUMBER' | 'VEHICLE_IDENTIFICATION_NUMBER' | 'SERIAL_NUMBER' | 'PURCHASE_ORDER' | 'SALES_ORDER' | 'WAREHOUSE_MOVEMENT_ORDER' | 'ADVANCED_SHIPMENT_NOTICE' | 'INVOICE_NUMBER' | 'STOCK_KEEPING_UNIT' | 'UNIVERSAL_PRODUCT_CODE' | 'UNKNOWN'; export type ItemIdentifier = {type?: ItemIdentifierType | undefined, value?: string | undefined}; export type OrderIdentifierType = 'PURCHASE_ORDER' | 'SALES_ORDER' | 'INVOICE_ID' | 'WAREHOUSE_MOVEMENT_ORDER' | 'ADVANCED_SHIPMENT_NOTICE'; export type PackageItemOrderIdentifier = {type?: OrderIdentifierType | undefined, value?: string | undefined}; export type PackageItem = {identifiers?: Array | undefined, orderIdentifier?: PackageItemOrderIdentifier | undefined, unitQuantity?: number | undefined}; export type LogisticsIdentifierTypeEnum = 'AIR_WAYBILL' | 'BILL_OF_LADING' | 'HOUSE_BILL_OF_LADING' | 'BOOKING_NUMBER' | 'CARRIER_IATA' | 'CARRIER_ICAO' | 'CARRIER_NAME' | 'CARRIER_SCAC' | 'FFW_SCAC' | 'NVOCC_SCAC' | 'NVOCC_NAME' | 'FFW_NAME' | 'FFW_MASTER_ID' | 'NVOCC_MASTER_ID' | 'CONTAINER_ID' | 'CUSTOMER_REFERENCE' | 'DELIVERY_NUMBER' | 'EXTERNAL' | 'FLIGHT_NUMBER' | 'ORDER' | 'PICKUP' | 'PRO' | 'PURCHASE_ORDER' | 'RAIL_CAR_ID' | 'RAIL_WAYBILL' | 'TRACKING_NUMBER' | 'TRAILER_ID' | 'UNKNOWN' | 'VESSEL_IMO' | 'VESSEL_NAME' | 'WAYBILL' | 'VESSEL_CALL_SIGN' | 'VESSEL_MMSI' | 'CARRIER_US_DOT_NUMBER' | 'CARRIER_MC_NUMBER' | 'SUBSCRIPTION_ID' | 'HOUSE_AIR_WAYBILL' | 'SALES_ORDER' | 'WAREHOUSE_MOVEMENT_ORDER' | 'ADVANCED_SHIPMENT_NOTICE' | 'DRIVER_MOBILE_PHONE_NUMBER' | 'VEHICLE_ID' | 'LICENSE_PLATE' | 'TRAILER_LICENSE_PLATE' | 'SENSITECH_DEVICE_ID' | 'EMERSON_DEVICE_ID' | 'TIVE_DEVICE_ID' | 'ZILLION_DEVICE_ID' | 'VOYAGE_NUMBER' | 'CARRIER_MASTER_ID' | 'CARRIER_NMC_ID' | 'CONTAINER_TYPE' | 'TRAIN_NUMBER' | 'WAGON_ID' | 'TRAIN_ID' | 'CAPACITY_PROVIDER_ACCOUNT_GROUP' | 'CAPACITY_PROVIDER_ACCOUNT_CODE' | 'SERIAL_NUMBER' | 'VEHICLE_IDENTIFICATION_NUMBER' | 'REFERENCE_NUMBER' | 'CONTAINER_PIN' | 'VESSEL_P44_ID' | 'EXPORT_CUSTOMS_BROKER' | 'IMPORT_CUSTOMS_BROKER' | 'POL_QUALITY_CONTROL_PROVIDER' | 'POD_QUALITY_CONTROL_PROVIDER' | 'AIRCRAFT_ICAO' | 'AIRLINE_NAME' | 'SEAL_NUMBER' | 'DRAYAGE_CARRIER_SCAC' | 'EXPORT_DRAYAGE_CARRIER_SCAC' | 'IMPORT_DRAYAGE_CARRIER_SCAC' | 'INBOUND_VOYAGE_NUMBER'; export type LogisticsIdentifier = {type?: LogisticsIdentifierTypeEnum | undefined, value?: string | undefined}; export type LengthUnit = 'FT' | 'M' | 'IN' | 'CM' | 'MI' | 'KM'; export type Dimensions = {height?: number | undefined, length?: number | undefined, unit?: LengthUnit | undefined, width?: number | undefined}; export type HandlingUnitType = 'BAG' | 'BALE' | 'BOX' | 'BUCKET' | 'BUNDLE' | 'CAN' | 'CARTON' | 'CASE' | 'COIL' | 'CRATE' | 'CYLINDER' | 'DRUM' | 'PAIL' | 'PALLET' | 'PIECES' | 'REEL' | 'ROLL' | 'SKID' | 'TOTE' | 'TUBE'; export type Volume = {unit?: ('CUBIC_FT' | 'CUBIC_M' | 'L' | 'HL') | undefined, value?: number | undefined}; export type WeightUnit = 'LB' | 'KG'; export type BookingWeight = {unit?: WeightUnit | undefined, value?: number | undefined}; export type PackageDetails = {dimensions?: Dimensions | undefined, type?: HandlingUnitType | undefined, volume?: Volume | undefined, weight?: BookingWeight | undefined}; export type CreateUpdatePackage = {accessorials?: Array | undefined, items?: Array | undefined, identifiers?: Array | undefined, isStackable?: boolean | undefined, package?: PackageDetails | undefined}; export type CreateApiServicesBookingV1PackagingArgs = {body: CreateUpdatePackage}; export type CreateApiServicesBookingV1PackagingOptions = {baseUrl?: string | undefined, oAuth2?: string | undefined, fetch?: typeof fetch | undefined}; export const tempUnit = z.enum(["CELSIUS", "FAHRENHEIT"]); export const tempRangeKind = z.object({min: z.number().optional(), max: z.number().optional(), unit: tempUnit.optional()}); export const specificationKindBool = z.object({value: z.boolean().optional()}); export const hazmatKind = z.object({hazmatClass: z.string().optional(), unCode: z.string().optional()}); export const packageAccessorial = z.union([z.object({code: z.literal("REFRIGERATED").optional(), details: tempRangeKind.optional()}), z.object({code: z.literal("LIFTGATE").optional(), details: specificationKindBool.optional()}), z.object({code: z.literal("HAZMAT").optional(), details: hazmatKind.optional()})]); export const countryCode = z.enum(["US", "CA", "MX", "AG", "BB", "BS", "BZ", "CR", "CU", "DM", "DO", "GD", "GT", "HN", "HT", "JM", "KN", "LC", "NI", "PA", "SV", "TT", "VC", "AI", "AW", "BL", "BM", "BQ", "CW", "GL", "GP", "KY", "MF", "MQ", "MS", "PM", "PR", "SX", "TC", "UM", "VG", "VI", "AT", "BE", "BG", "CY", "CZ", "DK", "DE", "EE", "ES", "FI", "FR", "GB", "GR", "HR", "HU", "IE", "IT", "LT", "LU", "LV", "MT", "NL", "PL", "PT", "RO", "SE", "SK", "SI", "CH", "IS", "LI", "NO", "AL", "ME", "MK", "RS", "TR", "AD", "AX", "BA", "BV", "BY", "FO", "GG", "GI", "IM", "IO", "JE", "MC", "MD", "SJ", "SM", "TF", "UA", "VA", "AE", "AF", "AM", "AZ", "BD", "BH", "BN", "BT", "CN", "GE", "HK", "ID", "IL", "IN", "IQ", "IR", "JO", "JP", "KG", "KH", "KP", "KR", "KW", "KZ", "LA", "LB", "LK", "MM", "MN", "MO", "MV", "MY", "NP", "OM", "PH", "PK", "PS", "QA", "RU", "SA", "SG", "SY", "TH", "TJ", "TL", "TM", "TW", "UZ", "VN", "YE", "AO", "BF", "BI", "BJ", "BW", "CD", "CF", "CG", "CI", "CM", "CV", "DJ", "DZ", "EG", "EH", "ER", "ET", "GA", "GH", "GM", "GN", "GQ", "GW", "HM", "KE", "KM", "LR", "LS", "LY", "MA", "MG", "ML", "MR", "MU", "MW", "MZ", "NA", "NE", "NG", "RE", "RW", "SC", "SD", "SH", "SL", "SN", "SO", "SS", "ST", "SZ", "TD", "TG", "TN", "TZ", "UG", "YT", "ZA", "ZM", "ZW", "AR", "BO", "BR", "CL", "CO", "EC", "FK", "GF", "GS", "GY", "PE", "PY", "SR", "UY", "VE", "AS", "AU", "CC", "CK", "CX", "FJ", "FM", "GU", "KI", "MH", "MP", "NC", "NF", "NR", "NU", "NZ", "PF", "PG", "PN", "PW", "SB", "TK", "TO", "TV", "VU", "WF", "WS", "AQ", "EL", "UK", "XK", "XS", "XI"]); export const address = z.object({addressLines: z.array(z.string()).optional(), city: z.string().optional(), country: countryCode.optional(), postalCode: z.string().optional(), state: z.string().optional()}); export const geoCoordinates = z.object({latitude: z.number().optional(), longitude: z.number().optional()}); export const locationIdentifierType = z.enum(["UNKNOWN", "AIRPORT_IATA", "AIRPORT_ICAO", "PORT_UN_LOCODE", "RAIL_SPLC", "DATA_PROVIDER_LOCATION_CODE", "LOCODE"]); export const bookingLocationIdentifier = z.object({type: locationIdentifierType.optional(), value: z.string().optional()}); export const bookingLocation = z.object({address: address.optional(), geoCoordinates: geoCoordinates.optional(), id: z.string().optional(), identifiers: z.array(bookingLocationIdentifier).optional(), name: z.string().optional(), timeZone: z.string().optional()}); export const itemIdentifierType = z.enum(["CONTAINER_NUMBER", "PALLET_NUMBER", "DELIVERY_NUMBER", "PICKUP_NUMBER", "VEHICLE_IDENTIFICATION_NUMBER", "SERIAL_NUMBER", "PURCHASE_ORDER", "SALES_ORDER", "WAREHOUSE_MOVEMENT_ORDER", "ADVANCED_SHIPMENT_NOTICE", "INVOICE_NUMBER", "STOCK_KEEPING_UNIT", "UNIVERSAL_PRODUCT_CODE", "UNKNOWN"]); export const itemIdentifier = z.object({type: itemIdentifierType.optional(), value: z.string().optional()}); export const orderIdentifierType = z.enum(["PURCHASE_ORDER", "SALES_ORDER", "INVOICE_ID", "WAREHOUSE_MOVEMENT_ORDER", "ADVANCED_SHIPMENT_NOTICE"]); export const packageItemOrderIdentifier = z.object({type: orderIdentifierType.optional(), value: z.string().optional()}); export const packageItem = z.object({identifiers: z.array(itemIdentifier).optional(), orderIdentifier: packageItemOrderIdentifier.optional(), unitQuantity: z.number().int().gte(1).optional()}); export const logisticsIdentifierTypeEnum = z.enum(["AIR_WAYBILL", "BILL_OF_LADING", "HOUSE_BILL_OF_LADING", "BOOKING_NUMBER", "CARRIER_IATA", "CARRIER_ICAO", "CARRIER_NAME", "CARRIER_SCAC", "FFW_SCAC", "NVOCC_SCAC", "NVOCC_NAME", "FFW_NAME", "FFW_MASTER_ID", "NVOCC_MASTER_ID", "CONTAINER_ID", "CUSTOMER_REFERENCE", "DELIVERY_NUMBER", "EXTERNAL", "FLIGHT_NUMBER", "ORDER", "PICKUP", "PRO", "PURCHASE_ORDER", "RAIL_CAR_ID", "RAIL_WAYBILL", "TRACKING_NUMBER", "TRAILER_ID", "UNKNOWN", "VESSEL_IMO", "VESSEL_NAME", "WAYBILL", "VESSEL_CALL_SIGN", "VESSEL_MMSI", "CARRIER_US_DOT_NUMBER", "CARRIER_MC_NUMBER", "SUBSCRIPTION_ID", "HOUSE_AIR_WAYBILL", "SALES_ORDER", "WAREHOUSE_MOVEMENT_ORDER", "ADVANCED_SHIPMENT_NOTICE", "DRIVER_MOBILE_PHONE_NUMBER", "VEHICLE_ID", "LICENSE_PLATE", "TRAILER_LICENSE_PLATE", "SENSITECH_DEVICE_ID", "EMERSON_DEVICE_ID", "TIVE_DEVICE_ID", "ZILLION_DEVICE_ID", "VOYAGE_NUMBER", "CARRIER_MASTER_ID", "CARRIER_NMC_ID", "CONTAINER_TYPE", "TRAIN_NUMBER", "WAGON_ID", "TRAIN_ID", "CAPACITY_PROVIDER_ACCOUNT_GROUP", "CAPACITY_PROVIDER_ACCOUNT_CODE", "SERIAL_NUMBER", "VEHICLE_IDENTIFICATION_NUMBER", "REFERENCE_NUMBER", "CONTAINER_PIN", "VESSEL_P44_ID", "EXPORT_CUSTOMS_BROKER", "IMPORT_CUSTOMS_BROKER", "POL_QUALITY_CONTROL_PROVIDER", "POD_QUALITY_CONTROL_PROVIDER", "AIRCRAFT_ICAO", "AIRLINE_NAME", "SEAL_NUMBER", "DRAYAGE_CARRIER_SCAC", "EXPORT_DRAYAGE_CARRIER_SCAC", "IMPORT_DRAYAGE_CARRIER_SCAC", "INBOUND_VOYAGE_NUMBER"]); export const logisticsIdentifier = z.object({type: logisticsIdentifierTypeEnum.optional(), value: z.string().min(1).optional()}); export const lengthUnit = z.enum(["FT", "M", "IN", "CM", "MI", "KM"]); export const dimensions = z.object({height: z.number().gte(0).optional(), length: z.number().gte(0).optional(), unit: lengthUnit.optional(), width: z.number().gte(0).optional()}); export const handlingUnitType = z.enum(["BAG", "BALE", "BOX", "BUCKET", "BUNDLE", "CAN", "CARTON", "CASE", "COIL", "CRATE", "CYLINDER", "DRUM", "PAIL", "PALLET", "PIECES", "REEL", "ROLL", "SKID", "TOTE", "TUBE"]); export const volume = z.object({unit: z.enum(["CUBIC_FT", "CUBIC_M", "L", "HL"]).optional(), value: z.number().optional()}); export const weightUnit = z.enum(["LB", "KG"]); export const bookingWeight = z.object({unit: weightUnit.optional(), value: z.number().gte(0).optional()}); export const packageDetails = z.object({dimensions: dimensions.optional(), type: handlingUnitType.optional(), volume: volume.optional(), weight: bookingWeight.optional()}); export const packageStatus = z.enum(["UNASSIGNED", "ASSIGNED", "CONFIRMED"]); export const packageResponse = z.object({accessorials: z.array(packageAccessorial).optional(), createdDateTime: z.string().optional(), destinationLocation: bookingLocation.optional(), id: z.string().optional(), items: z.array(packageItem).optional(), identifiers: z.array(logisticsIdentifier).optional(), isStackable: z.boolean().optional(), lastModifiedDateTime: z.string().optional(), originLocation: bookingLocation.optional(), package: packageDetails.optional(), status: packageStatus.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 }; /** * Create Package * * POST /services/booking/v1/packaging */ export const createApiServicesBookingV1Packaging = async (args: CreateApiServicesBookingV1PackagingArgs, options?: CreateApiServicesBookingV1PackagingOptions) => { const {baseUrl = "https://na12.api.project44.com", fetch: fetchFn = fetch, oAuth2} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (oAuth2 !== undefined) headers.set('authorization', `Bearer ${oAuth2}`) const url = `${baseUrl.replace(/\/+$/, '')}/services/booking/v1/packaging${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(packageResponse, await res.json()) };