import {z} from 'zod' export type GetApi202409ProductsArgs = {page?: number | undefined, per_page?: number | undefined, sku?: string | undefined, category?: string | undefined}; export type GetApi202409ProductsOptions = {baseUrl?: string | undefined, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const currencyNullable = z.enum(["AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BRL", "BSD", "BTN", "BWP", "BYR", "BZD", "CAD", "CDF", "CHF", "CLF", "CLP", "CNY", "COP", "CRC", "CUC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EGP", "ERN", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HRK", "HTG", "HUF", "IDR", "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD", "JPY", "KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LTL", "LVL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRO", "MUR", "MVR", "MWK", "MXN", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR", "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SKK", "SLL", "SOS", "SRD", "SSP", "STD", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS", "UAH", "UGX", "USD", "UYU", "UZS", "VES", "VND", "VUV", "WST", "XAF", "XAG", "XAU", "XCD", "XDR", "XOF", "XPF", "YER", "ZAR", "ZMW", "BTC", "JEP", "EEK", "GHC", "MTL", "TMM", "YEN", "ZWD", "ZWL", "ZWN", "ZWR", "null"]).nullable(); export const cpscCompliance = z.object({id: z.string().optional(), coc_type: z.enum(["registered", "unregistered", "exempted"]).nullable().optional(), certifier_identifier: z.string().nullable().optional(), version_identifier: z.string().nullable().optional(), citation_code: z.string().nullable().optional(), certifier_identity: z.string().nullable().optional(), manufacturing_detail: z.string().nullable().optional(), manufacturing_date: z.string().nullable().optional(), testing_detail: z.string().nullable().optional(), laboratory: z.string().nullable().optional(), records_custodian: z.string().nullable().optional(), product_identifier_type: z.enum(["sku", "gtin"]).nullable().optional(), product_identifier: z.string().nullable().optional(), disclaim_code: z.string().nullable().optional()}).nullable(); export const product = z.object({id: z.string().optional(), store_id: z.string().nullable().optional(), name: z.string().optional(), item_category: z.object({id: z.number().int().optional(), name: z.string().optional()}).nullable().optional(), comments: z.string().nullable().optional(), input_type: z.enum(["manual_input", "product_sync", "api", "api_upload", "csv_upload"]).optional(), identifier: z.string().optional(), length: z.number().nullable().optional(), width: z.number().nullable().optional(), height: z.number().nullable().optional(), weight: z.number().nullable().optional(), platform_product_id: z.string().nullable().optional(), manufacturer_part_number: z.string().nullable().optional(), global_trade_item_number: z.string().nullable().optional(), cost_price: z.number().nullable().optional(), cost_price_currency: currencyNullable.optional(), selling_price: z.number().nullable().optional(), selling_price_currency: currencyNullable.optional(), image_url: z.string().nullable().optional(), pick_location: z.string().nullable().optional(), origin_country_alpha2: z.enum(["AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MF", "MG", "MH", "MK", "ML", "MM", "MN", "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", "QA", "RE", "RO", "RS", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "SS", "ST", "SV", "SX", "SY", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF", "WS", "YE", "YT", "ZA", "ZM", "ZW", "null"]).nullable().optional(), hs_code: z.string().nullable().optional(), contains_liquids: z.boolean().nullable().optional(), contains_battery_pi966: z.boolean().nullable().optional(), contains_battery_pi967: z.boolean().nullable().optional(), cpsc_status: z.enum(["not_applicable", "absent", "partial", "complete"]).optional(), cpsc_compliance: cpscCompliance.optional(), created_at: z.string().optional(), updated_at: z.string().optional()}); export const pagination = z.object({next: z.number().int().nullable().optional(), count: z.number().int().nullable().optional(), page: z.number().int().optional()}); export const metaWithPagination = z.object({pagination: pagination.optional(), request_id: z.string().optional()}); export const productList = z.object({products: z.array(product).optional(), meta: metaWithPagination.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 }; /** * List all Products * * GET /2024-09/products */ export const getApi202409Products = async (args: GetApi202409ProductsArgs, options?: GetApi202409ProductsOptions) => { const {baseUrl = "https://public-api.easyship.com", fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.page != null) query.append("page", String(args.page)) if (args.per_page != null) query.append("per_page", String(args.per_page)) if (args.sku != null) query.append("sku", String(args.sku)) if (args.category != null) query.append("category", String(args.category)) if (Bearer !== undefined) headers.set('authorization', `Bearer ${Bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/2024-09/products${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(productList, await res.json()) };