shipflow 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/carriers/aramex/adapter.d.ts +82 -0
  2. package/dist/carriers/aramex/adapter.d.ts.map +1 -0
  3. package/dist/carriers/aramex/index.d.ts +9 -0
  4. package/dist/carriers/aramex/index.d.ts.map +1 -0
  5. package/dist/carriers/aramex/index.js +661 -0
  6. package/dist/carriers/aramex/index.js.map +12 -0
  7. package/dist/carriers/aramex/mappers.d.ts +68 -0
  8. package/dist/carriers/aramex/mappers.d.ts.map +1 -0
  9. package/dist/carriers/aramex/services.d.ts +74 -0
  10. package/dist/carriers/aramex/services.d.ts.map +1 -0
  11. package/dist/carriers/aramex/types.d.ts +302 -0
  12. package/dist/carriers/aramex/types.d.ts.map +1 -0
  13. package/dist/carriers/aymakan/adapter.d.ts +3 -2
  14. package/dist/carriers/aymakan/adapter.d.ts.map +1 -1
  15. package/dist/carriers/aymakan/index.js +54 -43
  16. package/dist/carriers/aymakan/index.js.map +4 -4
  17. package/dist/carriers/aymakan/mappers.d.ts.map +1 -1
  18. package/dist/carriers/aymakan/types.d.ts +4 -6
  19. package/dist/carriers/aymakan/types.d.ts.map +1 -1
  20. package/dist/carriers/base.d.ts +2 -2
  21. package/dist/carriers/base.d.ts.map +1 -1
  22. package/dist/carriers/smsaexpress/adapter.d.ts +1 -1
  23. package/dist/carriers/smsaexpress/adapter.d.ts.map +1 -1
  24. package/dist/carriers/smsaexpress/index.js +12 -8
  25. package/dist/carriers/smsaexpress/index.js.map +4 -4
  26. package/dist/carriers/smsaexpress/mappers.d.ts.map +1 -1
  27. package/dist/core/http.d.ts.map +1 -1
  28. package/dist/core/schemas.d.ts +3 -3
  29. package/dist/core/types.d.ts +1 -1
  30. package/dist/core/types.d.ts.map +1 -1
  31. package/dist/{index-x8sk1kw9.js → index-qjtxhwzv.js} +5 -3
  32. package/dist/{index-x8sk1kw9.js.map → index-qjtxhwzv.js.map} +5 -5
  33. package/dist/index.js +1 -1
  34. package/package.json +8 -3
@@ -7,7 +7,7 @@ import {
7
7
  WebhookVerificationError,
8
8
  validateCreateShipmentInput,
9
9
  validatePickupRequest
10
- } from "../../index-x8sk1kw9.js";
10
+ } from "../../index-qjtxhwzv.js";
11
11
 
12
12
  // src/carriers/aymakan/services.ts
13
13
  var AymakanService = {
@@ -159,9 +159,15 @@ function mapShipmentResponse(data) {
159
159
  raw: data
160
160
  };
161
161
  }
162
+ function parseAymakanDate(value) {
163
+ if (/[TZ]|[+-]\d{2}:?\d{2}$/.test(value)) {
164
+ return new Date(value);
165
+ }
166
+ return new Date(`${value.replace(" ", "T")}+03:00`);
167
+ }
162
168
  function mapTrackingEvent(event) {
163
169
  return {
164
- timestamp: new Date(event.created_at),
170
+ timestamp: parseAymakanDate(event.created_at),
165
171
  statusCode: event.status_code,
166
172
  status: mapAymakanStatus(event.status_code) ?? "unknown",
167
173
  description: event.description,
@@ -169,13 +175,21 @@ function mapTrackingEvent(event) {
169
175
  };
170
176
  }
171
177
  function mapTrackingResult(data) {
178
+ const events = data.tracking_info.map(mapTrackingEvent);
179
+ const latestEvent = events.length ? [...events].sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())[0] : undefined;
180
+ let status;
181
+ if (latestEvent && latestEvent.status !== "unknown") {
182
+ status = latestEvent.status;
183
+ } else {
184
+ status = mapAymakanStatus(data.status) ?? latestEvent?.status ?? "unknown";
185
+ }
172
186
  return {
173
187
  trackingNumber: data.tracking_number,
174
188
  carrier: "aymakan",
175
189
  reference: data.reference ?? undefined,
176
- status: mapAymakanStatus(data.status) ?? "unknown",
190
+ status,
177
191
  statusLabel: data.status_label,
178
- events: data.tracking_info.map(mapTrackingEvent),
192
+ events,
179
193
  deliveryDate: data.delivery_date ? new Date(data.delivery_date) : undefined,
180
194
  pickupDate: data.pickup_date ? new Date(data.pickup_date) : undefined,
181
195
  receivedAt: data.received_at ? new Date(data.received_at) : undefined,
@@ -256,7 +270,7 @@ function parseAymakanWebhook(payload, options) {
256
270
  eventType,
257
271
  trackingNumber: data.tracking_number,
258
272
  reference: data.reference ?? undefined,
259
- status: eventType === "weight_update" ? "unknown" : mapAymakanStatus(data.status) ?? "unknown",
273
+ status: mapAymakanStatus(data.status) ?? "unknown",
260
274
  statusCode: data.status,
261
275
  statusLabel: data.status_label,
262
276
  reasonCode: data.reason_code ?? undefined,
@@ -358,27 +372,30 @@ class AymakanAdapter extends BaseCarrierAdapter {
358
372
  return mapShipmentResponse(response.shipping);
359
373
  }
360
374
  async createBulkShipments(inputs) {
375
+ if (inputs.length > 30) {
376
+ throw new ValidationError("Aymakan bulk create accepts at most 30 shipments per request", { raw: { count: inputs.length } });
377
+ }
361
378
  inputs.forEach(validateCreateShipmentInput);
362
379
  await this.ensureCitiesLoaded();
363
380
  const requests = inputs.map((i) => this.resolveCitiesInInput(i)).map(mapCreateShipmentRequest);
364
- const response = await this.http.post("/shipping/create_bulk", { data: requests });
381
+ const response = await this.http.post("/shipping/create/bulk_shipping", { shipments: requests });
365
382
  if (!response.success) {
366
383
  throw new APIError("Failed to create bulk shipments", {
367
384
  carrier: "aymakan",
368
385
  raw: response
369
386
  });
370
387
  }
371
- return response.data.shipments.map(mapShipmentResponse);
388
+ return response.shipments.map(mapShipmentResponse);
372
389
  }
373
390
  async cancelShipment(trackingNumber) {
374
391
  const response = await this.http.post("/shipping/cancel", {
375
392
  tracking: trackingNumber
376
393
  });
377
- return response.success;
394
+ return response.success === true;
378
395
  }
379
396
  async cancelByReference(reference) {
380
- const response = await this.http.post(`/shipping/cancel/reference/${encodeURIComponent(reference)}`);
381
- return response.success;
397
+ const response = await this.http.post("/shipping/cancel_by_reference", { reference });
398
+ return response.success === true;
382
399
  }
383
400
  async updateDeliveryAddress(trackingNumber, address) {
384
401
  await this.ensureCitiesLoaded();
@@ -415,7 +432,7 @@ class AymakanAdapter extends BaseCarrierAdapter {
415
432
  return response.data.shipments.map(mapTrackingResult);
416
433
  }
417
434
  async trackByReference(reference) {
418
- const response = await this.http.get(`/shipments/by_reference/${encodeURIComponent(reference)}`);
435
+ const response = await this.http.get(`/shipping/by_reference/${encodeURIComponent(reference)}`);
419
436
  if (!response.success || !response.data.shipments[0]) {
420
437
  throw new APIError("Shipment not found", {
421
438
  carrier: "aymakan",
@@ -424,30 +441,22 @@ class AymakanAdapter extends BaseCarrierAdapter {
424
441
  }
425
442
  return mapTrackingResult(response.data.shipments[0]);
426
443
  }
427
- async getLabel(trackingNumber, format) {
444
+ async getLabel(trackingNumber, _format) {
428
445
  const response = await this.http.get(`/shipping/awb/tracking/${encodeURIComponent(trackingNumber)}`);
429
- if (!response.success) {
430
- throw new APIError("Failed to get label", {
431
- carrier: "aymakan",
432
- raw: response
433
- });
434
- }
435
- if (format === "PNG") {
436
- return response.data.label || response.data.awb_url || response.data.pdf_label;
446
+ if (!response.success || !response.data?.awb_url) {
447
+ const msg = response.message ?? response.response ?? "Failed to get label";
448
+ throw new APIError(msg, { carrier: "aymakan", raw: response });
437
449
  }
438
- return response.data.pdf_label || response.data.awb_url || response.data.label;
450
+ return response.data.awb_url;
439
451
  }
440
452
  async getBulkLabels(trackingNumbers) {
441
- const response = await this.http.post("/shipping/bulk_awb_labels", {
442
- tracking_numbers: trackingNumbers
443
- });
444
- if (!response.success) {
445
- throw new APIError("Failed to get bulk labels", {
446
- carrier: "aymakan",
447
- raw: response
448
- });
453
+ const ids = trackingNumbers.map(encodeURIComponent).join(",");
454
+ const response = await this.http.get(`/shipping/bulk_awb/trackings/${ids}`);
455
+ if (!response.success || !response.data?.bulk_awb_url) {
456
+ const msg = response.message ?? response.response ?? "Failed to get bulk labels";
457
+ throw new APIError(msg, { carrier: "aymakan", raw: response });
449
458
  }
450
- return response.data.label_url;
459
+ return response.data.bulk_awb_url;
451
460
  }
452
461
  async getPickupCities() {
453
462
  const response = await this.http.get("/pickup_request/cities");
@@ -485,18 +494,18 @@ class AymakanAdapter extends BaseCarrierAdapter {
485
494
  return mapPickupResponse(response.data);
486
495
  }
487
496
  async cancelPickup(pickupId) {
488
- const response = await this.http.post(`/pickup_request/cancel/${encodeURIComponent(String(pickupId))}`);
489
- return response.success;
497
+ const response = await this.http.post("/pickup_request/cancel", { pickup_request: Number(pickupId) });
498
+ return response.success === true;
490
499
  }
491
500
  async getPickupRequests() {
492
- const response = await this.http.get("/pickup_requests");
501
+ const response = await this.http.get("/pickup_request/list");
493
502
  if (!response.success) {
494
503
  throw new APIError("Failed to get pickup requests", {
495
504
  carrier: "aymakan",
496
505
  raw: response
497
506
  });
498
507
  }
499
- return response.data.pickup_requests.map(mapPickupResponse);
508
+ return response.data.pickupRequests.data.map(mapPickupResponse);
500
509
  }
501
510
  async getCities() {
502
511
  const response = await this.http.get("/cities");
@@ -516,12 +525,13 @@ class AymakanAdapter extends BaseCarrierAdapter {
516
525
  raw: response
517
526
  });
518
527
  }
519
- return response.data.locations.map((loc) => ({
520
- id: String(loc.id),
528
+ return response.data.map((loc) => ({
529
+ id: loc.name,
521
530
  name: loc.name,
522
- nameAr: loc.name_ar,
523
531
  address: loc.address,
524
- city: loc.city
532
+ city: loc.city,
533
+ latitude: loc.location_lat ?? undefined,
534
+ longitude: loc.location_lng ?? undefined
525
535
  }));
526
536
  }
527
537
  async createCustomerAddress(address) {
@@ -549,14 +559,14 @@ class AymakanAdapter extends BaseCarrierAdapter {
549
559
  };
550
560
  }
551
561
  async getCustomerAddresses() {
552
- const response = await this.http.get("/addresses");
562
+ const response = await this.http.get("/address/list");
553
563
  if (!response.success) {
554
564
  throw new APIError("Failed to get customer addresses", {
555
565
  carrier: "aymakan",
556
566
  raw: response
557
567
  });
558
568
  }
559
- return response.data.addresses.map((addr) => ({
569
+ return response.data.address.map((addr) => ({
560
570
  id: addr.id,
561
571
  title: addr.title,
562
572
  name: addr.name,
@@ -571,7 +581,8 @@ class AymakanAdapter extends BaseCarrierAdapter {
571
581
  }));
572
582
  }
573
583
  async updateCustomerAddress(id, address) {
574
- const response = await this.http.put(`/address/update/${id}`, {
584
+ const response = await this.http.put("/address/update", {
585
+ id,
575
586
  title: address.title,
576
587
  name: address.name,
577
588
  email: address.email,
@@ -604,7 +615,7 @@ class AymakanAdapter extends BaseCarrierAdapter {
604
615
  };
605
616
  }
606
617
  async deleteCustomerAddress(id) {
607
- const response = await this.http.delete(`/address/delete/${id}`);
618
+ const response = await this.http.delete("/address/delete", { body: { id } });
608
619
  return response.success;
609
620
  }
610
621
  parseWebhook(payload, options) {
@@ -622,4 +633,4 @@ export {
622
633
  AymakanAdapter
623
634
  };
624
635
 
625
- //# debugId=ECFB3CDDA31BC0F864756E2164756E21
636
+ //# debugId=3C0B3A8328EDCC7D64756E2164756E21
@@ -3,10 +3,10 @@
3
3
  "sources": ["../src/carriers/aymakan/services.ts", "../src/carriers/aymakan/mappers.ts", "../src/carriers/aymakan/adapter.ts"],
4
4
  "sourcesContent": [
5
5
  "// file: src/carriers/aymakan/services.ts\n/**\n * Aymakan Service Type Codes\n * Use these constants for type-safe service selection.\n */\n\nexport const AymakanService = {\n /** Default ecommerce service */\n ECOMMERCE: \"ONP\",\n /** Documents or banking docs service */\n DOCUMENTS: \"DOC\",\n /** Same day delivery service */\n SAME_DAY: \"SDD\",\n /** Reverse pickup service */\n REVERSE_PICKUP: \"RVP\",\n /** Exchange service */\n EXCHANGE: \"EXH\",\n /** Lockers service */\n LOCKERS: \"LOC\",\n /** Heavy and bulky service */\n HEAVY: \"BLK\",\n /** Pallet service */\n PALLET: \"PLT\",\n /** Import express (International) */\n IMPORT_EXPRESS: \"IPX\",\n /** Export express (International) */\n EXPORT_EXPRESS: \"EPX\",\n} as const;\n\nexport type AymakanServiceType =\n (typeof AymakanService)[keyof typeof AymakanService];\n\n/**\n * Aymakan Status Codes\n * Maps carrier-specific codes to our unified status.\n */\nexport const AymakanStatusCodes = {\n // Core lifecycle\n \"AY-0001\": \"created\", // Shipment created / AWB created at origin\n \"AY-0002\": \"picked_up\", // Collected from collection point\n \"AY-0003\": \"at_warehouse\", // Received at hub\n \"AY-0004\": \"out_for_delivery\", // Out for final destination\n \"AY-0005\": \"delivered\", // Delivered to customer\n \"AY-0006\": \"exception\", // Not delivered (failed attempt)\n\n // Warehouse / transfer\n \"AY-0026\": \"at_warehouse\", // Received at [City] Warehouse\n \"AY-0027\": \"in_transit\", // Transferred to destination city\n \"AY-0028\": \"in_transit\", // In transit between hubs\n\n // Pending / rescheduled (delivery was attempted but rescheduled)\n \"AY-0032\": \"pending\", // Pending — future delivery / rescheduled\n\n // Terminal states\n \"AY-0007\": \"returned\", // Returned to shipper\n \"AY-0008\": \"cancelled\", // Cancelled\n \"AY-0009\": \"returned\", // Return to origin\n} as const;\n",
6
- "// file: src/carriers/aymakan/mappers.ts\n/**\n * Aymakan Data Mappers\n * Transform between unified ShipFlow types and Aymakan API formats.\n */\n\nimport { ValidationError, WebhookVerificationError } from \"../../core/errors\";\nimport type {\n Address,\n City,\n CreateShipmentInput,\n CustomerAddress,\n Pickup,\n PickupRequest,\n Shipment,\n ShipmentStatus,\n TrackingEvent,\n TrackingResult,\n WebhookConfig,\n WebhookEvent,\n} from \"../../core/types\";\nimport { AymakanService, AymakanStatusCodes } from \"./services\";\nimport type {\n AymakanAddressRequest,\n AymakanCity,\n AymakanCreateShipmentRequest,\n AymakanNationalAddressRequest,\n AymakanPickupRequest,\n AymakanPickupResponse,\n AymakanShipmentResponse,\n AymakanTrackingEvent,\n AymakanTrackShipmentData,\n AymakanWebhookPayload,\n} from \"./types\";\n\n// ============================================================================\n// STATUS MAPPING\n// ============================================================================\n\nexport function mapAymakanStatus(statusCode: string): ShipmentStatus | undefined {\n const mapped =\n AymakanStatusCodes[statusCode as keyof typeof AymakanStatusCodes];\n return mapped as ShipmentStatus | undefined;\n}\n\n// ============================================================================\n// REQUEST MAPPERS\n// ============================================================================\n\nfunction mapNationalAddress(\n addr?: Address[\"nationalAddress\"],\n): AymakanNationalAddressRequest | undefined {\n if (!addr) return undefined;\n return {\n short_code: addr.shortCode,\n building_number: addr.buildingNumber,\n street_name: addr.streetName,\n district: addr.district,\n additional_number: addr.additionalNumber,\n };\n}\n\n/** Strip non-digit characters from phone numbers (Aymakan requires digits only) */\nfunction sanitizePhone(phone: string): string {\n return phone.replace(/\\D/g, '');\n}\n\n/** Set of valid Aymakan service type codes */\nconst VALID_AYMAKAN_SERVICE_TYPES = new Set(\n Object.values(AymakanService) as string[],\n);\n\n/**\n * Resolve service type to a valid Aymakan code.\n * Returns undefined for unknown values so the API uses its default (ONP/ecommerce).\n */\nfunction resolveServiceType(serviceType?: string): string | undefined {\n if (!serviceType) return undefined;\n if (VALID_AYMAKAN_SERVICE_TYPES.has(serviceType)) return serviceType;\n return undefined;\n}\n\nexport function mapCreateShipmentRequest(\n input: CreateShipmentInput,\n): AymakanCreateShipmentRequest {\n const firstParcel = input.parcels[0];\n const totalPieces = input.parcels.reduce((sum, p) => sum + p.pieces, 0);\n const totalWeight = input.parcels.reduce(\n (sum, p) =>\n sum +\n (p.weight.unit === \"lb\" ? p.weight.value * 0.453592 : p.weight.value),\n 0,\n );\n const totalItems = input.parcels.reduce(\n (sum, p) => sum + (p.itemsCount ?? p.pieces),\n 0,\n );\n\n return {\n requested_by: input.options?.requestedBy ?? input.shipper.name,\n declared_value: input.declaredValue?.amount ?? input.cod?.amount ?? 0,\n declared_value_currency:\n input.declaredValue?.currency ?? input.cod?.currency ?? \"SAR\",\n reference: input.reference,\n customer_tracking: input.options?.customerTracking,\n service_type: resolveServiceType(input.serviceType),\n is_cod: input.cod?.enabled ? 1 : 0,\n cod_amount: input.cod?.enabled ? input.cod.amount : undefined,\n fulfilment_customer_name: input.options?.fulfilmentCustomerName,\n currency: input.cod?.currency ?? \"SAR\",\n\n // Delivery (consignee)\n delivery_name: input.consignee.name,\n delivery_email: input.consignee.email,\n delivery_city: input.consignee.city,\n delivery_address: input.consignee.line1,\n delivery_neighbourhood:\n input.consignee.neighbourhood ?? input.consignee.state,\n delivery_postcode: input.consignee.postalCode,\n delivery_country: input.consignee.countryCode,\n delivery_phone: sanitizePhone(input.consignee.phone),\n delivery_description: input.consignee.description,\n delivery_national_address: mapNationalAddress(\n input.consignee.nationalAddress,\n ),\n\n // Collection (shipper)\n collection_name: input.shipper.company ?? input.shipper.name,\n collection_email: input.shipper.email,\n collection_city: input.shipper.city,\n collection_address: input.shipper.line1,\n collection_neighbourhood:\n input.shipper.neighbourhood ?? input.shipper.state,\n collection_postcode: input.shipper.postalCode,\n collection_country: input.shipper.countryCode,\n collection_phone: sanitizePhone(input.shipper.phone),\n collection_description: input.shipper.description,\n collection_national_address: mapNationalAddress(\n input.shipper.nationalAddress,\n ),\n\n // Parcel details\n weight: totalWeight,\n length: firstParcel?.dimensions?.length,\n width: firstParcel?.dimensions?.width,\n height: firstParcel?.dimensions?.height,\n pieces: totalPieces,\n items_count: totalItems,\n is_insured: input.options?.isInsured ? 1 : 0,\n\n // International\n international_metadata: input.options?.internationalMetadata\n ? {\n document_id: input.options.internationalMetadata.documentId,\n tax_identification_number: input.options.internationalMetadata.taxId,\n invoice_number: input.options.internationalMetadata.invoiceNumber,\n invoice_date: input.options.internationalMetadata.invoiceDate,\n }\n : undefined,\n };\n}\n\nexport function mapPickupRequest(input: PickupRequest): AymakanPickupRequest {\n return {\n reference: input.trackingNumbers?.[0],\n pickup_date: input.date,\n time_slot: input.timeSlot,\n city: input.city,\n contact_name: input.contactName,\n contact_phone: input.contactPhone,\n address: input.address,\n shipments: input.shipmentCount,\n };\n}\n\nexport function mapCustomerAddressRequest(\n addr: CustomerAddress,\n): AymakanAddressRequest {\n return {\n title: addr.title,\n name: addr.name,\n email: addr.email,\n city: addr.city,\n address: addr.address,\n neighbourhood: addr.neighbourhood,\n postcode: addr.postalCode ?? \"\",\n phone: addr.phone,\n description: addr.description ?? \"\",\n };\n}\n\n// ============================================================================\n// RESPONSE MAPPERS\n// ============================================================================\n\nexport function mapShipmentResponse(data: AymakanShipmentResponse): Shipment {\n // Parse cod_amount: API returns string like \"150.00\", we need number\n const codAmount =\n data.cod_amount != null\n ? typeof data.cod_amount === \"string\"\n ? parseFloat(data.cod_amount)\n : data.cod_amount\n : undefined;\n\n return {\n carrier: \"aymakan\",\n trackingNumber: data.tracking_number,\n customerTracking: data.customer_tracking ?? undefined,\n reference: data.reference ?? undefined,\n status: mapAymakanStatus(data.status) ?? \"created\",\n statusLabel: data.status_label,\n labelUrl: data.label || undefined,\n pdfLabelUrl: data.pdf_label || undefined,\n codAmount: codAmount && !Number.isNaN(codAmount) ? codAmount : undefined,\n declaredValue: data.declared_value,\n currency: data.currency,\n createdAt: new Date(data.created_at),\n raw: data,\n };\n}\n\nexport function mapTrackingEvent(event: AymakanTrackingEvent): TrackingEvent {\n return {\n timestamp: new Date(event.created_at),\n statusCode: event.status_code,\n status: mapAymakanStatus(event.status_code) ?? \"unknown\",\n description: event.description,\n descriptionArabic: event.description_ar ?? undefined,\n };\n}\n\nexport function mapTrackingResult(\n data: AymakanTrackShipmentData,\n): TrackingResult {\n return {\n trackingNumber: data.tracking_number,\n carrier: \"aymakan\",\n reference: data.reference ?? undefined,\n status: mapAymakanStatus(data.status) ?? \"unknown\",\n statusLabel: data.status_label,\n events: data.tracking_info.map(mapTrackingEvent),\n deliveryDate: data.delivery_date ? new Date(data.delivery_date) : undefined,\n pickupDate: data.pickup_date ? new Date(data.pickup_date) : undefined,\n receivedAt: data.received_at ? new Date(data.received_at) : undefined,\n codAmount: data.cod_amount\n ? Number.isNaN(parseFloat(data.cod_amount))\n ? undefined\n : parseFloat(data.cod_amount)\n : undefined,\n weight: Number.isNaN(parseFloat(data.weight))\n ? undefined\n : parseFloat(data.weight),\n pieces: data.pieces,\n raw: data,\n };\n}\n\nexport function mapCity(city: AymakanCity): City {\n return {\n nameEn: city.city_en,\n nameAr: city.city_ar,\n };\n}\n\nexport function mapPickupResponse(data: AymakanPickupResponse[\"data\"]): Pickup {\n return {\n id: data.id,\n carrier: \"aymakan\",\n status: (\n [\"pending\", \"processing\", \"completed\", \"cancelled\"] as const\n ).includes(data.status as Pickup[\"status\"])\n ? (data.status as Pickup[\"status\"])\n : \"pending\",\n date: data.pickup_date,\n timeSlot: data.time_slot,\n city: data.city,\n contactName: data.contact_name,\n contactPhone: data.contact_phone,\n address: data.address,\n shipmentCount: data.shipments,\n warehouseId: data.warehouse_id,\n warehouseName: data.warehouse_name,\n createdAt: new Date(data.created_at),\n raw: data,\n };\n}\n\n// ============================================================================\n// WEBHOOK MAPPER\n// ============================================================================\n\n/**\n * Timing-safe string comparison to prevent timing attacks on auth tokens.\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n const encoder = new TextEncoder();\n const bufA = encoder.encode(a);\n const bufB = encoder.encode(b);\n if (bufA.byteLength !== bufB.byteLength) return false;\n // Use crypto.subtle-compatible constant-time compare\n let mismatch = 0;\n for (let i = 0; i < bufA.byteLength; i++) {\n mismatch |= bufA[i]! ^ bufB[i]!;\n }\n return mismatch === 0;\n}\n\nexport function parseAymakanWebhook(\n payload: unknown,\n options?: {\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n config?: WebhookConfig;\n },\n): WebhookEvent {\n const { headers = {}, queryParams = {}, config } = options ?? {};\n\n // Validate required fields\n if (\n !payload ||\n typeof payload !== \"object\" ||\n !(\"tracking_number\" in payload) ||\n !(\"status\" in payload)\n ) {\n throw new ValidationError(\n \"Invalid webhook payload: missing required fields\",\n {\n raw: payload,\n },\n );\n }\n\n const data = payload as AymakanWebhookPayload;\n\n // Verify auth via header (case-insensitive lookup, timing-safe comparison)\n if (config?.authHeader && config?.authValue) {\n const lowerKey = config.authHeader.toLowerCase();\n const headerValue = Object.entries(headers).find(\n ([k]) => k.toLowerCase() === lowerKey,\n )?.[1];\n if (!headerValue || !timingSafeEqual(headerValue, config.authValue)) {\n throw new WebhookVerificationError(\"Invalid webhook auth header\", {\n carrier: \"aymakan\",\n });\n }\n }\n\n // Verify auth via query param (timing-safe comparison)\n if (config?.authQueryParam && config?.authQueryValue) {\n const paramValue = queryParams[config.authQueryParam];\n if (!paramValue || !timingSafeEqual(paramValue, config.authQueryValue)) {\n throw new WebhookVerificationError(\"Invalid webhook auth query param\", {\n carrier: \"aymakan\",\n });\n }\n }\n\n const eventType = data.event ?? \"status_update\";\n\n // Validate timestamp\n const timestamp = new Date(data.date_time);\n if (Number.isNaN(timestamp.getTime())) {\n throw new ValidationError(\n \"Invalid webhook payload: invalid date_time value\",\n { raw: data.date_time },\n );\n }\n\n return {\n carrier: \"aymakan\",\n eventType,\n trackingNumber: data.tracking_number,\n reference: data.reference ?? undefined,\n status: eventType === \"weight_update\" ? \"unknown\" : (mapAymakanStatus(data.status) ?? \"unknown\"),\n statusCode: data.status,\n statusLabel: data.status_label,\n reasonCode: data.reason_code ?? undefined,\n reasonLabel: data.reason_en ?? undefined,\n timestamp,\n raw: data,\n };\n}\n",
7
- "// file: src/carriers/aymakan/adapter.ts\n/**\n * Aymakan Carrier Adapter\n * Full implementation of the CarrierAdapter interface for Aymakan API.\n */\n\nimport { APIError, UnsupportedOperationError } from \"../../core/errors\";\nimport { HttpClient } from \"../../core/http\";\nimport {\n validateCreateShipmentInput,\n validatePickupRequest,\n} from \"../../core/schemas\";\nimport type {\n Address,\n CarrierConfig,\n City,\n CreateShipmentInput,\n CustomerAddress,\n Pickup,\n PickupRequest,\n Shipment,\n TimeSlot,\n TrackingResult,\n WebhookConfig,\n WebhookEvent,\n} from \"../../core/types\";\nimport { BaseCarrierAdapter } from \"../base\";\nimport {\n mapCity,\n mapCreateShipmentRequest,\n mapCustomerAddressRequest,\n mapPickupRequest,\n mapPickupResponse,\n mapShipmentResponse,\n mapTrackingResult,\n parseAymakanWebhook,\n} from \"./mappers\";\nimport type {\n AymakanAddressResponse,\n AymakanCancelResponse,\n AymakanCitiesResponse,\n AymakanCreateShipmentResponse,\n AymakanPickupResponse,\n AymakanTrackResponse,\n} from \"./types\";\n\nconst AYMAKAN_SANDBOX_URL = \"https://dev-api.aymakan.com.sa/v2\";\nconst AYMAKAN_PRODUCTION_URL = \"https://api.aymakan.net/v2\";\n\nexport interface AymakanConfig extends CarrierConfig {\n credentials: {\n apiKey: string;\n };\n}\n\nexport class AymakanAdapter extends BaseCarrierAdapter {\n readonly name = \"aymakan\";\n readonly supportedCountries = [\"SA\", \"AE\", \"BH\", \"KW\", \"OM\", \"QA\"];\n\n private http: HttpClient;\n\n /** Cached Aymakan cities list for city name resolution */\n private citiesCache: City[] | null = null;\n private citiesCacheTime = 0;\n /** Cache TTL: 1 hour */\n private static readonly CITIES_CACHE_TTL = 60 * 60 * 1000;\n\n constructor(config: AymakanConfig) {\n super(config);\n this.http = new HttpClient({\n baseUrl: this.getBaseUrl(),\n carrier: \"aymakan\",\n headers: {\n Authorization: config.credentials.apiKey,\n },\n });\n }\n\n protected getBaseUrl(): string {\n return this.config.mode === \"production\"\n ? AYMAKAN_PRODUCTION_URL\n : AYMAKAN_SANDBOX_URL;\n }\n\n // =========================================================================\n // CITY RESOLUTION\n // =========================================================================\n\n /**\n * Load cities list from Aymakan API and cache it.\n * Silently falls back to empty list on failure so shipments can still be attempted.\n */\n private async ensureCitiesLoaded(): Promise<void> {\n if (\n this.citiesCache &&\n Date.now() - this.citiesCacheTime < AymakanAdapter.CITIES_CACHE_TTL\n ) {\n return;\n }\n try {\n this.citiesCache = await this.getCities();\n this.citiesCacheTime = Date.now();\n } catch {\n if (!this.citiesCache) this.citiesCache = [];\n }\n }\n\n /**\n * Normalize Arabic text for comparison:\n * - Strip diacritics (tashkeel)\n * - Normalize alef variants (أ إ آ → ا)\n * - Normalize taa marbuta (ة → ه)\n * - Trim whitespace\n */\n private static normalizeArabic(text: string): string {\n return text\n .trim()\n .replace(/[\\u064B-\\u065F\\u0670]/g, \"\") // strip tashkeel\n .replace(/[أإآ]/g, \"ا\") // normalize alef\n .replace(/ة/g, \"ه\"); // normalize taa marbuta\n }\n\n /**\n * Resolve a user-input city name to the valid Aymakan English city name.\n *\n * Matching strategy (first match wins):\n * 1. Exact match on English name (case-insensitive)\n * 2. Exact match on Arabic name\n * 3. Normalized Arabic match (handles tashkeel, alef variants, taa marbuta)\n * 4. Match after stripping \"ال\" prefix from Arabic input\n * 5. Substring/contains match on English name (case-insensitive)\n *\n * Falls back to the original input if no match is found.\n */\n private resolveCity(inputCity: string): string {\n if (!this.citiesCache || this.citiesCache.length === 0) return inputCity;\n\n const trimmed = inputCity.trim();\n if (!trimmed) return inputCity;\n const lower = trimmed.toLowerCase();\n\n // 1. Exact English match (case-insensitive)\n const exactEn = this.citiesCache.find(\n (c) => c.nameEn.toLowerCase() === lower,\n );\n if (exactEn) return exactEn.nameEn;\n\n // 2. Exact Arabic match\n const exactAr = this.citiesCache.find((c) => c.nameAr === trimmed);\n if (exactAr) return exactAr.nameEn;\n\n // 3. Normalized Arabic match\n const normalizedInput = AymakanAdapter.normalizeArabic(trimmed);\n const normalizedAr = this.citiesCache.find(\n (c) =>\n c.nameAr &&\n AymakanAdapter.normalizeArabic(c.nameAr) === normalizedInput,\n );\n if (normalizedAr) return normalizedAr.nameEn;\n\n // 4. Arabic without \"ال\" prefix\n const withoutAl = normalizedInput.startsWith(\"ال\")\n ? normalizedInput.slice(2)\n : `ال${normalizedInput}`;\n const alMatch = this.citiesCache.find(\n (c) => c.nameAr && AymakanAdapter.normalizeArabic(c.nameAr) === withoutAl,\n );\n if (alMatch) return alMatch.nameEn;\n\n // 5. Contains match on English name (for partial matches like \"Riyadh\" in \"Riyadh City\")\n const containsEn = this.citiesCache.find(\n (c) =>\n c.nameEn.toLowerCase().includes(lower) ||\n lower.includes(c.nameEn.toLowerCase()),\n );\n if (containsEn) return containsEn.nameEn;\n\n // No match — return as-is and let the API return a validation error\n return trimmed;\n }\n\n /**\n * Resolve city names in a CreateShipmentInput to valid Aymakan city names.\n */\n private resolveCitiesInInput(\n input: CreateShipmentInput,\n ): CreateShipmentInput {\n return {\n ...input,\n shipper: {\n ...input.shipper,\n city: this.resolveCity(input.shipper.city),\n },\n consignee: {\n ...input.consignee,\n city: this.resolveCity(input.consignee.city),\n },\n };\n }\n\n // =========================================================================\n // SHIPPING\n // =========================================================================\n\n protected async executeCreateShipment(\n input: CreateShipmentInput,\n ): Promise<Shipment> {\n await this.ensureCitiesLoaded();\n const resolved = this.resolveCitiesInInput(input);\n const request = mapCreateShipmentRequest(resolved);\n const response = await this.http.post<AymakanCreateShipmentResponse>(\n \"/shipping/create\",\n request,\n );\n\n if (!response.success) {\n throw new APIError(\"Failed to create shipment\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return mapShipmentResponse(response.shipping);\n }\n\n async createBulkShipments(\n inputs: CreateShipmentInput[],\n ): Promise<Shipment[]> {\n inputs.forEach(validateCreateShipmentInput);\n await this.ensureCitiesLoaded();\n const requests = inputs\n .map((i) => this.resolveCitiesInInput(i))\n .map(mapCreateShipmentRequest);\n const response = await this.http.post<{\n success: boolean;\n data: { shipments: AymakanCreateShipmentResponse[\"shipping\"][] };\n }>(\"/shipping/create_bulk\", { data: requests });\n\n if (!response.success) {\n throw new APIError(\"Failed to create bulk shipments\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.shipments.map(mapShipmentResponse);\n }\n\n async cancelShipment(trackingNumber: string): Promise<boolean> {\n // Try passing as body\n const response = await this.http.post<AymakanCancelResponse>(\n \"/shipping/cancel\",\n {\n tracking: trackingNumber,\n },\n );\n return response.success;\n }\n\n async cancelByReference(reference: string): Promise<boolean> {\n const response = await this.http.post<AymakanCancelResponse>(\n `/shipping/cancel/reference/${encodeURIComponent(reference)}`,\n );\n return response.success;\n }\n\n async updateDeliveryAddress(\n trackingNumber: string,\n address: Address,\n ): Promise<boolean> {\n await this.ensureCitiesLoaded();\n const resolvedCity = this.resolveCity(address.city);\n const response = await this.http.post<{ success: boolean }>(\n `/shipping/update_delivery_address/${encodeURIComponent(trackingNumber)}`,\n {\n delivery_name: address.name,\n delivery_email: address.email,\n delivery_city: resolvedCity,\n delivery_address: address.line1,\n delivery_neighbourhood: address.neighbourhood,\n delivery_postcode: address.postalCode,\n delivery_country: address.countryCode,\n delivery_phone: address.phone,\n },\n );\n return response.success;\n }\n\n // =========================================================================\n // TRACKING\n // =========================================================================\n\n async track(trackingNumber: string): Promise<TrackingResult> {\n const results = await this.trackMultiple([trackingNumber]);\n const result = results[0];\n if (!result) {\n throw new APIError(\"Shipment not found\", { carrier: \"aymakan\" });\n }\n return result;\n }\n\n async trackMultiple(trackingNumbers: string[]): Promise<TrackingResult[]> {\n const ids = trackingNumbers.map(encodeURIComponent).join(\",\");\n const response = await this.http.get<AymakanTrackResponse>(\n `/shipping/track/${ids}`,\n );\n\n if (!response.success) {\n throw new APIError(\"Failed to track shipments\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.shipments.map(mapTrackingResult);\n }\n\n async trackByReference(reference: string): Promise<TrackingResult> {\n const response = await this.http.get<AymakanTrackResponse>(\n `/shipments/by_reference/${encodeURIComponent(reference)}`,\n );\n\n if (!response.success || !response.data.shipments[0]) {\n throw new APIError(\"Shipment not found\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return mapTrackingResult(response.data.shipments[0]);\n }\n\n // =========================================================================\n // LABELS\n // =========================================================================\n\n async getLabel(\n trackingNumber: string,\n format?: \"PDF\" | \"PNG\",\n ): Promise<string> {\n const response = await this.http.get<{\n success: boolean;\n data: { label: string; pdf_label: string; awb_url: string };\n }>(`/shipping/awb/tracking/${encodeURIComponent(trackingNumber)}`);\n\n if (!response.success) {\n throw new APIError(\"Failed to get label\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n // Prefer the format the caller requested\n if (format === \"PNG\") {\n return (\n response.data.label || response.data.awb_url || response.data.pdf_label\n );\n }\n return (\n response.data.pdf_label || response.data.awb_url || response.data.label\n );\n }\n\n async getBulkLabels(trackingNumbers: string[]): Promise<string> {\n const response = await this.http.post<{\n success: boolean;\n data: { label_url: string };\n }>(\"/shipping/bulk_awb_labels\", {\n tracking_numbers: trackingNumbers,\n });\n\n if (!response.success) {\n throw new APIError(\"Failed to get bulk labels\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.label_url;\n }\n\n // =========================================================================\n // PICKUPS\n // =========================================================================\n\n async getPickupCities(): Promise<City[]> {\n const response = await this.http.get<AymakanCitiesResponse>(\n \"/pickup_request/cities\",\n );\n\n if (!response.success) {\n throw new APIError(\"Failed to get pickup cities\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.cities.map(mapCity);\n }\n\n async getTimeSlots(_city: string, date: string): Promise<TimeSlot[]> {\n const response = await this.http.get<{\n success: boolean;\n error?: boolean;\n message?: string;\n data: {\n date: string;\n slots: Record<string, string>;\n };\n }>(`/time_slots/${date}`);\n\n // Aymakan returns error responses for invalid dates (past, Fridays, etc.)\n if (!response.success || response.error || !response.data?.slots) {\n const msg = response.message ?? \"No slots available\";\n throw new APIError(msg, { carrier: \"aymakan\", raw: response });\n }\n\n // data.slots is an object like { \"afternoon\": \"After Noon (02 PM - 06 PM)\" }\n return Object.entries(response.data.slots).map(([id, label]) => ({\n id,\n label,\n }));\n }\n\n async createPickup(input: PickupRequest): Promise<Pickup> {\n validatePickupRequest(input);\n await this.ensureCitiesLoaded();\n const resolvedInput = { ...input, city: this.resolveCity(input.city) };\n const request = mapPickupRequest(resolvedInput);\n const response = await this.http.post<AymakanPickupResponse>(\n \"/pickup_request/create\",\n request,\n );\n\n if (!response.success) {\n throw new APIError(\"Failed to create pickup\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return mapPickupResponse(response.data);\n }\n\n async cancelPickup(pickupId: string | number): Promise<boolean> {\n const response = await this.http.post<{ success: boolean }>(\n `/pickup_request/cancel/${encodeURIComponent(String(pickupId))}`,\n );\n return response.success;\n }\n\n async getPickupRequests(): Promise<Pickup[]> {\n const response = await this.http.get<{\n success: boolean;\n data: { pickup_requests: AymakanPickupResponse[\"data\"][] };\n }>(\"/pickup_requests\");\n\n if (!response.success) {\n throw new APIError(\"Failed to get pickup requests\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.pickup_requests.map(mapPickupResponse);\n }\n\n // =========================================================================\n // CITIES & LOCATIONS\n // =========================================================================\n\n async getCities(): Promise<City[]> {\n const response = await this.http.get<AymakanCitiesResponse>(\"/cities\");\n\n if (!response.success) {\n throw new APIError(\"Failed to get cities\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.cities.map(mapCity);\n }\n\n async getDropoffLocations(): Promise<\n {\n id: string;\n name: string;\n nameAr?: string;\n address?: string;\n city?: string;\n }[]\n > {\n const response = await this.http.get<{\n success: boolean;\n data: {\n locations: Array<{\n id: number;\n name: string;\n name_ar?: string;\n address?: string;\n city?: string;\n }>;\n };\n }>(\"/dropoff_locations\");\n\n if (!response.success) {\n throw new APIError(\"Failed to get dropoff locations\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.locations.map((loc) => ({\n id: String(loc.id),\n name: loc.name,\n nameAr: loc.name_ar,\n address: loc.address,\n city: loc.city,\n }));\n }\n\n // =========================================================================\n // CUSTOMER ADDRESSES\n // =========================================================================\n\n async createCustomerAddress(\n address: CustomerAddress,\n ): Promise<CustomerAddress> {\n const request = mapCustomerAddressRequest(address);\n const response = await this.http.post<AymakanAddressResponse>(\n \"/address/create\",\n request,\n );\n\n if (!response.success) {\n throw new APIError(\"Failed to create address\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n const addr = response.data.address;\n return {\n id: addr.id,\n title: addr.title,\n name: addr.name,\n email: addr.email,\n phone: addr.phone,\n city: addr.city,\n address: addr.address,\n neighbourhood: addr.neighbourhood,\n postalCode: addr.postcode,\n countryCode: addr.country,\n description: addr.description,\n };\n }\n\n async getCustomerAddresses(): Promise<CustomerAddress[]> {\n const response = await this.http.get<{\n success: boolean;\n data: { addresses: AymakanAddressResponse[\"data\"][\"address\"][] };\n }>(\"/addresses\");\n\n if (!response.success) {\n throw new APIError(\"Failed to get customer addresses\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.addresses.map((addr) => ({\n id: addr.id,\n title: addr.title,\n name: addr.name,\n email: addr.email,\n phone: addr.phone,\n city: addr.city,\n address: addr.address,\n neighbourhood: addr.neighbourhood,\n postalCode: addr.postcode,\n countryCode: addr.country,\n description: addr.description,\n }));\n }\n\n async updateCustomerAddress(\n id: number,\n address: Partial<CustomerAddress>,\n ): Promise<CustomerAddress> {\n const response = await this.http.put<AymakanAddressResponse>(\n `/address/update/${id}`,\n {\n title: address.title,\n name: address.name,\n email: address.email,\n city: address.city,\n address: address.address,\n neighbourhood: address.neighbourhood,\n postcode: address.postalCode,\n phone: address.phone,\n description: address.description,\n },\n );\n\n if (!response.success) {\n throw new APIError(\"Failed to update address\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n const addr = response.data.address;\n return {\n id: addr.id,\n title: addr.title,\n name: addr.name,\n email: addr.email,\n phone: addr.phone,\n city: addr.city,\n address: addr.address,\n neighbourhood: addr.neighbourhood,\n postalCode: addr.postcode,\n countryCode: addr.country,\n description: addr.description,\n };\n }\n\n async deleteCustomerAddress(id: number): Promise<boolean> {\n const response = await this.http.delete<{ success: boolean }>(\n `/address/delete/${id}`,\n );\n return response.success;\n }\n\n // =========================================================================\n // WEBHOOKS\n // =========================================================================\n\n parseWebhook(\n payload: unknown,\n options?: {\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n config?: WebhookConfig;\n },\n ): WebhookEvent {\n return parseAymakanWebhook(payload, options);\n }\n\n // =========================================================================\n // NOT SUPPORTED\n // =========================================================================\n\n getRates(): Promise<never> {\n throw new UnsupportedOperationError(\"aymakan\", \"getRates\");\n }\n}\n"
6
+ "// file: src/carriers/aymakan/mappers.ts\n/**\n * Aymakan Data Mappers\n * Transform between unified ShipFlow types and Aymakan API formats.\n */\n\nimport { ValidationError, WebhookVerificationError } from \"../../core/errors\";\nimport type {\n Address,\n City,\n CreateShipmentInput,\n CustomerAddress,\n Pickup,\n PickupRequest,\n Shipment,\n ShipmentStatus,\n TrackingEvent,\n TrackingResult,\n WebhookConfig,\n WebhookEvent,\n} from \"../../core/types\";\nimport { AymakanService, AymakanStatusCodes } from \"./services\";\nimport type {\n AymakanAddressRequest,\n AymakanCity,\n AymakanCreateShipmentRequest,\n AymakanNationalAddressRequest,\n AymakanPickupRequest,\n AymakanPickupResponse,\n AymakanShipmentResponse,\n AymakanTrackingEvent,\n AymakanTrackShipmentData,\n AymakanWebhookPayload,\n} from \"./types\";\n\n// ============================================================================\n// STATUS MAPPING\n// ============================================================================\n\nexport function mapAymakanStatus(statusCode: string): ShipmentStatus | undefined {\n const mapped =\n AymakanStatusCodes[statusCode as keyof typeof AymakanStatusCodes];\n return mapped as ShipmentStatus | undefined;\n}\n\n// ============================================================================\n// REQUEST MAPPERS\n// ============================================================================\n\nfunction mapNationalAddress(\n addr?: Address[\"nationalAddress\"],\n): AymakanNationalAddressRequest | undefined {\n if (!addr) return undefined;\n return {\n short_code: addr.shortCode,\n building_number: addr.buildingNumber,\n street_name: addr.streetName,\n district: addr.district,\n additional_number: addr.additionalNumber,\n };\n}\n\n/** Strip non-digit characters from phone numbers (Aymakan requires digits only) */\nfunction sanitizePhone(phone: string): string {\n return phone.replace(/\\D/g, '');\n}\n\n/** Set of valid Aymakan service type codes */\nconst VALID_AYMAKAN_SERVICE_TYPES = new Set(\n Object.values(AymakanService) as string[],\n);\n\n/**\n * Resolve service type to a valid Aymakan code.\n * Returns undefined for unknown values so the API uses its default (ONP/ecommerce).\n */\nfunction resolveServiceType(serviceType?: string): string | undefined {\n if (!serviceType) return undefined;\n if (VALID_AYMAKAN_SERVICE_TYPES.has(serviceType)) return serviceType;\n return undefined;\n}\n\nexport function mapCreateShipmentRequest(\n input: CreateShipmentInput,\n): AymakanCreateShipmentRequest {\n const firstParcel = input.parcels[0];\n const totalPieces = input.parcels.reduce((sum, p) => sum + p.pieces, 0);\n const totalWeight = input.parcels.reduce(\n (sum, p) =>\n sum +\n (p.weight.unit === \"lb\" ? p.weight.value * 0.453592 : p.weight.value),\n 0,\n );\n const totalItems = input.parcels.reduce(\n (sum, p) => sum + (p.itemsCount ?? p.pieces),\n 0,\n );\n\n return {\n requested_by: input.options?.requestedBy ?? input.shipper.name,\n declared_value: input.declaredValue?.amount ?? input.cod?.amount ?? 0,\n declared_value_currency:\n input.declaredValue?.currency ?? input.cod?.currency ?? \"SAR\",\n reference: input.reference,\n customer_tracking: input.options?.customerTracking,\n service_type: resolveServiceType(input.serviceType),\n is_cod: input.cod?.enabled ? 1 : 0,\n cod_amount: input.cod?.enabled ? input.cod.amount : undefined,\n fulfilment_customer_name: input.options?.fulfilmentCustomerName,\n currency: input.cod?.currency ?? \"SAR\",\n\n // Delivery (consignee)\n delivery_name: input.consignee.name,\n delivery_email: input.consignee.email,\n delivery_city: input.consignee.city,\n delivery_address: input.consignee.line1,\n delivery_neighbourhood:\n input.consignee.neighbourhood ?? input.consignee.state,\n delivery_postcode: input.consignee.postalCode,\n delivery_country: input.consignee.countryCode,\n delivery_phone: sanitizePhone(input.consignee.phone),\n delivery_description: input.consignee.description,\n delivery_national_address: mapNationalAddress(\n input.consignee.nationalAddress,\n ),\n\n // Collection (shipper)\n collection_name: input.shipper.company ?? input.shipper.name,\n collection_email: input.shipper.email,\n collection_city: input.shipper.city,\n collection_address: input.shipper.line1,\n collection_neighbourhood:\n input.shipper.neighbourhood ?? input.shipper.state,\n collection_postcode: input.shipper.postalCode,\n collection_country: input.shipper.countryCode,\n collection_phone: sanitizePhone(input.shipper.phone),\n collection_description: input.shipper.description,\n collection_national_address: mapNationalAddress(\n input.shipper.nationalAddress,\n ),\n\n // Parcel details\n weight: totalWeight,\n length: firstParcel?.dimensions?.length,\n width: firstParcel?.dimensions?.width,\n height: firstParcel?.dimensions?.height,\n pieces: totalPieces,\n items_count: totalItems,\n is_insured: input.options?.isInsured ? 1 : 0,\n\n // International\n international_metadata: input.options?.internationalMetadata\n ? {\n document_id: input.options.internationalMetadata.documentId,\n tax_identification_number: input.options.internationalMetadata.taxId,\n invoice_number: input.options.internationalMetadata.invoiceNumber,\n invoice_date: input.options.internationalMetadata.invoiceDate,\n }\n : undefined,\n };\n}\n\nexport function mapPickupRequest(input: PickupRequest): AymakanPickupRequest {\n return {\n reference: input.trackingNumbers?.[0],\n pickup_date: input.date,\n time_slot: input.timeSlot,\n city: input.city,\n contact_name: input.contactName,\n contact_phone: input.contactPhone,\n address: input.address,\n shipments: input.shipmentCount,\n };\n}\n\nexport function mapCustomerAddressRequest(\n addr: CustomerAddress,\n): AymakanAddressRequest {\n return {\n title: addr.title,\n name: addr.name,\n email: addr.email,\n city: addr.city,\n address: addr.address,\n neighbourhood: addr.neighbourhood,\n postcode: addr.postalCode ?? \"\",\n phone: addr.phone,\n description: addr.description ?? \"\",\n };\n}\n\n// ============================================================================\n// RESPONSE MAPPERS\n// ============================================================================\n\nexport function mapShipmentResponse(data: AymakanShipmentResponse): Shipment {\n // Parse cod_amount: API returns string like \"150.00\", we need number\n const codAmount =\n data.cod_amount != null\n ? typeof data.cod_amount === \"string\"\n ? parseFloat(data.cod_amount)\n : data.cod_amount\n : undefined;\n\n return {\n carrier: \"aymakan\",\n trackingNumber: data.tracking_number,\n customerTracking: data.customer_tracking ?? undefined,\n reference: data.reference ?? undefined,\n status: mapAymakanStatus(data.status) ?? \"created\",\n statusLabel: data.status_label,\n labelUrl: data.label || undefined,\n pdfLabelUrl: data.pdf_label || undefined,\n codAmount: codAmount && !Number.isNaN(codAmount) ? codAmount : undefined,\n declaredValue: data.declared_value,\n currency: data.currency,\n createdAt: new Date(data.created_at),\n raw: data,\n };\n}\n\n/**\n * Parse an Aymakan timestamp. Top-level fields are ISO 8601 (with `T`/`Z`), but\n * `tracking_info[].created_at` values are space-separated \"YYYY-MM-DD HH:MM:SS\"\n * strings in Saudi local time (UTC+3) with no timezone marker. `new Date()`\n * would parse those in the host's local timezone, so normalize to +03:00.\n */\nfunction parseAymakanDate(value: string): Date {\n if (/[TZ]|[+-]\\d{2}:?\\d{2}$/.test(value)) {\n return new Date(value);\n }\n return new Date(`${value.replace(\" \", \"T\")}+03:00`);\n}\n\nexport function mapTrackingEvent(event: AymakanTrackingEvent): TrackingEvent {\n return {\n timestamp: parseAymakanDate(event.created_at),\n statusCode: event.status_code,\n status: mapAymakanStatus(event.status_code) ?? \"unknown\",\n description: event.description,\n descriptionArabic: event.description_ar ?? undefined,\n };\n}\n\nexport function mapTrackingResult(\n data: AymakanTrackShipmentData,\n): TrackingResult {\n const events = data.tracking_info.map(mapTrackingEvent);\n\n // The top-level `status` field is a human-readable label on the /track\n // endpoint (e.g. \"Received at Warehouse\") and an AY code on /by_reference.\n // Derive the unified status from the most recent tracking event (whose\n // status_code is always an AY code), falling back to mapping the top-level\n // status, then \"unknown\".\n const latestEvent = events.length\n ? [...events].sort(\n (a, b) => b.timestamp.getTime() - a.timestamp.getTime(),\n )[0]\n : undefined;\n let status: ShipmentStatus;\n if (latestEvent && latestEvent.status !== \"unknown\") {\n status = latestEvent.status;\n } else {\n status = mapAymakanStatus(data.status) ?? latestEvent?.status ?? \"unknown\";\n }\n\n return {\n trackingNumber: data.tracking_number,\n carrier: \"aymakan\",\n reference: data.reference ?? undefined,\n status,\n statusLabel: data.status_label,\n events,\n deliveryDate: data.delivery_date ? new Date(data.delivery_date) : undefined,\n pickupDate: data.pickup_date ? new Date(data.pickup_date) : undefined,\n receivedAt: data.received_at ? new Date(data.received_at) : undefined,\n codAmount: data.cod_amount\n ? Number.isNaN(parseFloat(data.cod_amount))\n ? undefined\n : parseFloat(data.cod_amount)\n : undefined,\n weight: Number.isNaN(parseFloat(data.weight))\n ? undefined\n : parseFloat(data.weight),\n pieces: data.pieces,\n raw: data,\n };\n}\n\nexport function mapCity(city: AymakanCity): City {\n return {\n nameEn: city.city_en,\n nameAr: city.city_ar,\n };\n}\n\nexport function mapPickupResponse(data: AymakanPickupResponse[\"data\"]): Pickup {\n return {\n id: data.id,\n carrier: \"aymakan\",\n status: (\n [\"pending\", \"processing\", \"completed\", \"cancelled\"] as const\n ).includes(data.status as Pickup[\"status\"])\n ? (data.status as Pickup[\"status\"])\n : \"pending\",\n date: data.pickup_date,\n timeSlot: data.time_slot,\n city: data.city,\n contactName: data.contact_name,\n contactPhone: data.contact_phone,\n address: data.address,\n shipmentCount: data.shipments,\n warehouseId: data.warehouse_id,\n warehouseName: data.warehouse_name,\n createdAt: new Date(data.created_at),\n raw: data,\n };\n}\n\n// ============================================================================\n// WEBHOOK MAPPER\n// ============================================================================\n\n/**\n * Timing-safe string comparison to prevent timing attacks on auth tokens.\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n const encoder = new TextEncoder();\n const bufA = encoder.encode(a);\n const bufB = encoder.encode(b);\n if (bufA.byteLength !== bufB.byteLength) return false;\n // Use crypto.subtle-compatible constant-time compare\n let mismatch = 0;\n for (let i = 0; i < bufA.byteLength; i++) {\n mismatch |= bufA[i]! ^ bufB[i]!;\n }\n return mismatch === 0;\n}\n\nexport function parseAymakanWebhook(\n payload: unknown,\n options?: {\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n config?: WebhookConfig;\n },\n): WebhookEvent {\n const { headers = {}, queryParams = {}, config } = options ?? {};\n\n // Validate required fields\n if (\n !payload ||\n typeof payload !== \"object\" ||\n !(\"tracking_number\" in payload) ||\n !(\"status\" in payload)\n ) {\n throw new ValidationError(\n \"Invalid webhook payload: missing required fields\",\n {\n raw: payload,\n },\n );\n }\n\n const data = payload as AymakanWebhookPayload;\n\n // Verify auth via header (case-insensitive lookup, timing-safe comparison)\n if (config?.authHeader && config?.authValue) {\n const lowerKey = config.authHeader.toLowerCase();\n const headerValue = Object.entries(headers).find(\n ([k]) => k.toLowerCase() === lowerKey,\n )?.[1];\n if (!headerValue || !timingSafeEqual(headerValue, config.authValue)) {\n throw new WebhookVerificationError(\"Invalid webhook auth header\", {\n carrier: \"aymakan\",\n });\n }\n }\n\n // Verify auth via query param (timing-safe comparison)\n if (config?.authQueryParam && config?.authQueryValue) {\n const paramValue = queryParams[config.authQueryParam];\n if (!paramValue || !timingSafeEqual(paramValue, config.authQueryValue)) {\n throw new WebhookVerificationError(\"Invalid webhook auth query param\", {\n carrier: \"aymakan\",\n });\n }\n }\n\n const eventType = data.event ?? \"status_update\";\n\n // Validate timestamp\n const timestamp = new Date(data.date_time);\n if (Number.isNaN(timestamp.getTime())) {\n throw new ValidationError(\n \"Invalid webhook payload: invalid date_time value\",\n { raw: data.date_time },\n );\n }\n\n return {\n carrier: \"aymakan\",\n eventType,\n trackingNumber: data.tracking_number,\n reference: data.reference ?? undefined,\n // `status` is a core field present on every webhook regardless of event\n // type, so map it even for weight_update events. Consumers can still branch\n // on `eventType` to detect weight updates.\n status: mapAymakanStatus(data.status) ?? \"unknown\",\n statusCode: data.status,\n statusLabel: data.status_label,\n reasonCode: data.reason_code ?? undefined,\n reasonLabel: data.reason_en ?? undefined,\n timestamp,\n raw: data,\n };\n}\n",
7
+ "// file: src/carriers/aymakan/adapter.ts\n/**\n * Aymakan Carrier Adapter\n * Full implementation of the CarrierAdapter interface for Aymakan API.\n */\n\nimport {\n APIError,\n UnsupportedOperationError,\n ValidationError,\n} from \"../../core/errors\";\nimport { HttpClient } from \"../../core/http\";\nimport {\n validateCreateShipmentInput,\n validatePickupRequest,\n} from \"../../core/schemas\";\nimport type {\n Address,\n CarrierConfig,\n City,\n CreateShipmentInput,\n CustomerAddress,\n Pickup,\n PickupRequest,\n Shipment,\n TimeSlot,\n TrackingResult,\n WebhookConfig,\n WebhookEvent,\n} from \"../../core/types\";\nimport { BaseCarrierAdapter } from \"../base\";\nimport {\n mapCity,\n mapCreateShipmentRequest,\n mapCustomerAddressRequest,\n mapPickupRequest,\n mapPickupResponse,\n mapShipmentResponse,\n mapTrackingResult,\n parseAymakanWebhook,\n} from \"./mappers\";\nimport type {\n AymakanAddressResponse,\n AymakanCancelResponse,\n AymakanCitiesResponse,\n AymakanCreateShipmentResponse,\n AymakanPickupResponse,\n AymakanTrackResponse,\n} from \"./types\";\n\nconst AYMAKAN_SANDBOX_URL = \"https://dev-api.aymakan.com.sa/v2\";\nconst AYMAKAN_PRODUCTION_URL = \"https://api.aymakan.net/v2\";\n\nexport interface AymakanConfig extends CarrierConfig {\n credentials: {\n apiKey: string;\n };\n}\n\nexport class AymakanAdapter extends BaseCarrierAdapter {\n readonly name = \"aymakan\";\n readonly supportedCountries = [\"SA\", \"AE\", \"BH\", \"KW\", \"OM\", \"QA\"];\n\n private http: HttpClient;\n\n /** Cached Aymakan cities list for city name resolution */\n private citiesCache: City[] | null = null;\n private citiesCacheTime = 0;\n /** Cache TTL: 1 hour */\n private static readonly CITIES_CACHE_TTL = 60 * 60 * 1000;\n\n constructor(config: AymakanConfig) {\n super(config);\n this.http = new HttpClient({\n baseUrl: this.getBaseUrl(),\n carrier: \"aymakan\",\n headers: {\n Authorization: config.credentials.apiKey,\n },\n });\n }\n\n protected getBaseUrl(): string {\n return this.config.mode === \"production\"\n ? AYMAKAN_PRODUCTION_URL\n : AYMAKAN_SANDBOX_URL;\n }\n\n // =========================================================================\n // CITY RESOLUTION\n // =========================================================================\n\n /**\n * Load cities list from Aymakan API and cache it.\n * Silently falls back to empty list on failure so shipments can still be attempted.\n */\n private async ensureCitiesLoaded(): Promise<void> {\n if (\n this.citiesCache &&\n Date.now() - this.citiesCacheTime < AymakanAdapter.CITIES_CACHE_TTL\n ) {\n return;\n }\n try {\n this.citiesCache = await this.getCities();\n this.citiesCacheTime = Date.now();\n } catch {\n if (!this.citiesCache) this.citiesCache = [];\n }\n }\n\n /**\n * Normalize Arabic text for comparison:\n * - Strip diacritics (tashkeel)\n * - Normalize alef variants (أ إ آ → ا)\n * - Normalize taa marbuta (ة → ه)\n * - Trim whitespace\n */\n private static normalizeArabic(text: string): string {\n return text\n .trim()\n .replace(/[\\u064B-\\u065F\\u0670]/g, \"\") // strip tashkeel\n .replace(/[أإآ]/g, \"ا\") // normalize alef\n .replace(/ة/g, \"ه\"); // normalize taa marbuta\n }\n\n /**\n * Resolve a user-input city name to the valid Aymakan English city name.\n *\n * Matching strategy (first match wins):\n * 1. Exact match on English name (case-insensitive)\n * 2. Exact match on Arabic name\n * 3. Normalized Arabic match (handles tashkeel, alef variants, taa marbuta)\n * 4. Match after stripping \"ال\" prefix from Arabic input\n * 5. Substring/contains match on English name (case-insensitive)\n *\n * Falls back to the original input if no match is found.\n */\n private resolveCity(inputCity: string): string {\n if (!this.citiesCache || this.citiesCache.length === 0) return inputCity;\n\n const trimmed = inputCity.trim();\n if (!trimmed) return inputCity;\n const lower = trimmed.toLowerCase();\n\n // 1. Exact English match (case-insensitive)\n const exactEn = this.citiesCache.find(\n (c) => c.nameEn.toLowerCase() === lower,\n );\n if (exactEn) return exactEn.nameEn;\n\n // 2. Exact Arabic match\n const exactAr = this.citiesCache.find((c) => c.nameAr === trimmed);\n if (exactAr) return exactAr.nameEn;\n\n // 3. Normalized Arabic match\n const normalizedInput = AymakanAdapter.normalizeArabic(trimmed);\n const normalizedAr = this.citiesCache.find(\n (c) =>\n c.nameAr &&\n AymakanAdapter.normalizeArabic(c.nameAr) === normalizedInput,\n );\n if (normalizedAr) return normalizedAr.nameEn;\n\n // 4. Arabic without \"ال\" prefix\n const withoutAl = normalizedInput.startsWith(\"ال\")\n ? normalizedInput.slice(2)\n : `ال${normalizedInput}`;\n const alMatch = this.citiesCache.find(\n (c) => c.nameAr && AymakanAdapter.normalizeArabic(c.nameAr) === withoutAl,\n );\n if (alMatch) return alMatch.nameEn;\n\n // 5. Contains match on English name (for partial matches like \"Riyadh\" in \"Riyadh City\")\n const containsEn = this.citiesCache.find(\n (c) =>\n c.nameEn.toLowerCase().includes(lower) ||\n lower.includes(c.nameEn.toLowerCase()),\n );\n if (containsEn) return containsEn.nameEn;\n\n // No match — return as-is and let the API return a validation error\n return trimmed;\n }\n\n /**\n * Resolve city names in a CreateShipmentInput to valid Aymakan city names.\n */\n private resolveCitiesInInput(\n input: CreateShipmentInput,\n ): CreateShipmentInput {\n return {\n ...input,\n shipper: {\n ...input.shipper,\n city: this.resolveCity(input.shipper.city),\n },\n consignee: {\n ...input.consignee,\n city: this.resolveCity(input.consignee.city),\n },\n };\n }\n\n // =========================================================================\n // SHIPPING\n // =========================================================================\n\n protected async executeCreateShipment(\n input: CreateShipmentInput,\n ): Promise<Shipment> {\n await this.ensureCitiesLoaded();\n const resolved = this.resolveCitiesInInput(input);\n const request = mapCreateShipmentRequest(resolved);\n const response = await this.http.post<AymakanCreateShipmentResponse>(\n \"/shipping/create\",\n request,\n );\n\n if (!response.success) {\n throw new APIError(\"Failed to create shipment\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return mapShipmentResponse(response.shipping);\n }\n\n async createBulkShipments(\n inputs: CreateShipmentInput[],\n ): Promise<Shipment[]> {\n // Aymakan rejects batches larger than 30 (\"Only 30 shipments can be\n // created at a time.\"), so fail fast with a clear error before the request.\n if (inputs.length > 30) {\n throw new ValidationError(\n \"Aymakan bulk create accepts at most 30 shipments per request\",\n { raw: { count: inputs.length } },\n );\n }\n inputs.forEach(validateCreateShipmentInput);\n await this.ensureCitiesLoaded();\n const requests = inputs\n .map((i) => this.resolveCitiesInInput(i))\n .map(mapCreateShipmentRequest);\n const response = await this.http.post<{\n success: boolean;\n message?: string;\n bulk_awb?: string;\n total_shipments?: number;\n shipments: AymakanCreateShipmentResponse[\"shipping\"][];\n }>(\"/shipping/create/bulk_shipping\", { shipments: requests });\n\n if (!response.success) {\n throw new APIError(\"Failed to create bulk shipments\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.shipments.map(mapShipmentResponse);\n }\n\n async cancelShipment(trackingNumber: string): Promise<boolean> {\n // Try passing as body\n const response = await this.http.post<AymakanCancelResponse>(\n \"/shipping/cancel\",\n {\n tracking: trackingNumber,\n },\n );\n return response.success === true;\n }\n\n async cancelByReference(reference: string): Promise<boolean> {\n const response = await this.http.post<AymakanCancelResponse>(\n \"/shipping/cancel_by_reference\",\n { reference },\n );\n return response.success === true;\n }\n\n async updateDeliveryAddress(\n trackingNumber: string,\n address: Address,\n ): Promise<boolean> {\n await this.ensureCitiesLoaded();\n const resolvedCity = this.resolveCity(address.city);\n const response = await this.http.post<{ success: boolean }>(\n `/shipping/update_delivery_address/${encodeURIComponent(trackingNumber)}`,\n {\n delivery_name: address.name,\n delivery_email: address.email,\n delivery_city: resolvedCity,\n delivery_address: address.line1,\n delivery_neighbourhood: address.neighbourhood,\n delivery_postcode: address.postalCode,\n delivery_country: address.countryCode,\n delivery_phone: address.phone,\n },\n );\n return response.success;\n }\n\n // =========================================================================\n // TRACKING\n // =========================================================================\n\n async track(trackingNumber: string): Promise<TrackingResult> {\n const results = await this.trackMultiple([trackingNumber]);\n const result = results[0];\n if (!result) {\n throw new APIError(\"Shipment not found\", { carrier: \"aymakan\" });\n }\n return result;\n }\n\n async trackMultiple(trackingNumbers: string[]): Promise<TrackingResult[]> {\n const ids = trackingNumbers.map(encodeURIComponent).join(\",\");\n const response = await this.http.get<AymakanTrackResponse>(\n `/shipping/track/${ids}`,\n );\n\n if (!response.success) {\n throw new APIError(\"Failed to track shipments\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.shipments.map(mapTrackingResult);\n }\n\n async trackByReference(reference: string): Promise<TrackingResult> {\n const response = await this.http.get<AymakanTrackResponse>(\n `/shipping/by_reference/${encodeURIComponent(reference)}`,\n );\n\n if (!response.success || !response.data.shipments[0]) {\n throw new APIError(\"Shipment not found\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return mapTrackingResult(response.data.shipments[0]);\n }\n\n // =========================================================================\n // LABELS\n // =========================================================================\n\n async getLabel(\n trackingNumber: string,\n _format?: \"PDF\" | \"ZPL\" | \"PNG\",\n ): Promise<string> {\n // Note: this endpoint always returns a single PDF download URL, so the\n // requested `format` cannot be honored.\n const response = await this.http.get<{\n success: boolean;\n error?: boolean;\n message?: string;\n response?: string;\n data: { awb_url: string };\n }>(`/shipping/awb/tracking/${encodeURIComponent(trackingNumber)}`);\n\n if (!response.success || !response.data?.awb_url) {\n const msg = response.message ?? response.response ?? \"Failed to get label\";\n throw new APIError(msg, { carrier: \"aymakan\", raw: response });\n }\n\n return response.data.awb_url;\n }\n\n async getBulkLabels(trackingNumbers: string[]): Promise<string> {\n // Documented as a GET with comma-separated tracking numbers in the path.\n const ids = trackingNumbers.map(encodeURIComponent).join(\",\");\n const response = await this.http.get<{\n success: boolean;\n error?: boolean;\n message?: string;\n response?: string;\n data: { bulk_awb_url: string };\n }>(`/shipping/bulk_awb/trackings/${ids}`);\n\n if (!response.success || !response.data?.bulk_awb_url) {\n const msg =\n response.message ?? response.response ?? \"Failed to get bulk labels\";\n throw new APIError(msg, { carrier: \"aymakan\", raw: response });\n }\n\n return response.data.bulk_awb_url;\n }\n\n // =========================================================================\n // PICKUPS\n // =========================================================================\n\n async getPickupCities(): Promise<City[]> {\n const response = await this.http.get<AymakanCitiesResponse>(\n \"/pickup_request/cities\",\n );\n\n if (!response.success) {\n throw new APIError(\"Failed to get pickup cities\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.cities.map(mapCity);\n }\n\n async getTimeSlots(_city: string, date: string): Promise<TimeSlot[]> {\n const response = await this.http.get<{\n success: boolean;\n error?: boolean;\n message?: string;\n data: {\n date: string;\n slots: Record<string, string>;\n };\n }>(`/time_slots/${date}`);\n\n // Aymakan returns error responses for invalid dates (past, Fridays, etc.)\n if (!response.success || response.error || !response.data?.slots) {\n const msg = response.message ?? \"No slots available\";\n throw new APIError(msg, { carrier: \"aymakan\", raw: response });\n }\n\n // data.slots is an object like { \"afternoon\": \"After Noon (02 PM - 06 PM)\" }\n return Object.entries(response.data.slots).map(([id, label]) => ({\n id,\n label,\n }));\n }\n\n async createPickup(input: PickupRequest): Promise<Pickup> {\n validatePickupRequest(input);\n await this.ensureCitiesLoaded();\n const resolvedInput = { ...input, city: this.resolveCity(input.city) };\n const request = mapPickupRequest(resolvedInput);\n const response = await this.http.post<AymakanPickupResponse>(\n \"/pickup_request/create\",\n request,\n );\n\n if (!response.success) {\n throw new APIError(\"Failed to create pickup\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return mapPickupResponse(response.data);\n }\n\n async cancelPickup(pickupId: string | number): Promise<boolean> {\n const response = await this.http.post<{ success: boolean }>(\n \"/pickup_request/cancel\",\n { pickup_request: Number(pickupId) },\n );\n return response.success === true;\n }\n\n async getPickupRequests(): Promise<Pickup[]> {\n // The list endpoint returns a Laravel paginated structure:\n // { success, data: { pickupRequests: { data: [...] } } }\n const response = await this.http.get<{\n success: boolean;\n data: { pickupRequests: { data: AymakanPickupResponse[\"data\"][] } };\n }>(\"/pickup_request/list\");\n\n if (!response.success) {\n throw new APIError(\"Failed to get pickup requests\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.pickupRequests.data.map(mapPickupResponse);\n }\n\n // =========================================================================\n // CITIES & LOCATIONS\n // =========================================================================\n\n async getCities(): Promise<City[]> {\n const response = await this.http.get<AymakanCitiesResponse>(\"/cities\");\n\n if (!response.success) {\n throw new APIError(\"Failed to get cities\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.cities.map(mapCity);\n }\n\n async getDropoffLocations(): Promise<\n {\n id: string;\n name: string;\n address?: string;\n city?: string;\n latitude?: number;\n longitude?: number;\n }[]\n > {\n // The API returns `data` as a flat array of warehouse objects. There is no\n // `id` field — the warehouse code lives in `name` (e.g. \"RUH-WH\").\n const response = await this.http.get<{\n success: boolean;\n data: Array<{\n name: string;\n city?: string;\n address?: string;\n manager?: string;\n mobile_phone?: string;\n email?: string;\n location_lat?: number | null;\n location_lng?: number | null;\n }>;\n }>(\"/dropoff_locations\");\n\n if (!response.success) {\n throw new APIError(\"Failed to get dropoff locations\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.map((loc) => ({\n id: loc.name,\n name: loc.name,\n address: loc.address,\n city: loc.city,\n latitude: loc.location_lat ?? undefined,\n longitude: loc.location_lng ?? undefined,\n }));\n }\n\n // =========================================================================\n // CUSTOMER ADDRESSES\n // =========================================================================\n\n async createCustomerAddress(\n address: CustomerAddress,\n ): Promise<CustomerAddress> {\n const request = mapCustomerAddressRequest(address);\n const response = await this.http.post<AymakanAddressResponse>(\n \"/address/create\",\n request,\n );\n\n if (!response.success) {\n throw new APIError(\"Failed to create address\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n const addr = response.data.address;\n return {\n id: addr.id,\n title: addr.title,\n name: addr.name,\n email: addr.email,\n phone: addr.phone,\n city: addr.city,\n address: addr.address,\n neighbourhood: addr.neighbourhood,\n postalCode: addr.postcode,\n countryCode: addr.country,\n description: addr.description,\n };\n }\n\n async getCustomerAddresses(): Promise<CustomerAddress[]> {\n const response = await this.http.get<{\n success: boolean;\n data: { address: AymakanAddressResponse[\"data\"][\"address\"][] };\n }>(\"/address/list\");\n\n if (!response.success) {\n throw new APIError(\"Failed to get customer addresses\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n return response.data.address.map((addr) => ({\n id: addr.id,\n title: addr.title,\n name: addr.name,\n email: addr.email,\n phone: addr.phone,\n city: addr.city,\n address: addr.address,\n neighbourhood: addr.neighbourhood,\n postalCode: addr.postcode,\n countryCode: addr.country,\n description: addr.description,\n }));\n }\n\n async updateCustomerAddress(\n id: number,\n address: Partial<CustomerAddress>,\n ): Promise<CustomerAddress> {\n const response = await this.http.put<AymakanAddressResponse>(\n \"/address/update\",\n {\n id,\n title: address.title,\n name: address.name,\n email: address.email,\n city: address.city,\n address: address.address,\n neighbourhood: address.neighbourhood,\n postcode: address.postalCode,\n phone: address.phone,\n description: address.description,\n },\n );\n\n if (!response.success) {\n throw new APIError(\"Failed to update address\", {\n carrier: \"aymakan\",\n raw: response,\n });\n }\n\n const addr = response.data.address;\n return {\n id: addr.id,\n title: addr.title,\n name: addr.name,\n email: addr.email,\n phone: addr.phone,\n city: addr.city,\n address: addr.address,\n neighbourhood: addr.neighbourhood,\n postalCode: addr.postcode,\n countryCode: addr.country,\n description: addr.description,\n };\n }\n\n async deleteCustomerAddress(id: number): Promise<boolean> {\n // The id must be sent in the JSON request body, not the URL path.\n const response = await this.http.delete<{ success: boolean }>(\n \"/address/delete\",\n { body: { id } },\n );\n return response.success;\n }\n\n // =========================================================================\n // WEBHOOKS\n // =========================================================================\n\n parseWebhook(\n payload: unknown,\n options?: {\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n config?: WebhookConfig;\n },\n ): WebhookEvent {\n return parseAymakanWebhook(payload, options);\n }\n\n // =========================================================================\n // NOT SUPPORTED\n // =========================================================================\n\n getRates(): Promise<never> {\n throw new UnsupportedOperationError(\"aymakan\", \"getRates\");\n }\n}\n"
8
8
  ],
9
- "mappings": "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",
10
- "debugId": "ECFB3CDDA31BC0F864756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "3C0B3A8328EDCC7D64756E2164756E21",
11
11
  "names": []
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../../../src/carriers/aymakan/mappers.ts"],"names":[],"mappings":"AACA;;;GAGG;AAGH,OAAO,KAAK,EAEV,IAAI,EACJ,mBAAmB,EACnB,eAAe,EACf,MAAM,EACN,aAAa,EACb,QAAQ,EACR,cAAc,EACd,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EACV,qBAAqB,EACrB,WAAW,EACX,4BAA4B,EAE5B,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EAEzB,MAAM,SAAS,CAAC;AAMjB,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAI/E;AAuCD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,mBAAmB,GACzB,4BAA4B,CA4E9B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,oBAAoB,CAW3E;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,eAAe,GACpB,qBAAqB,CAYvB;AAMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,QAAQ,CAwB3E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,oBAAoB,GAAG,aAAa,CAQ3E;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,wBAAwB,GAC7B,cAAc,CAsBhB;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAK/C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,GAAG,MAAM,CAqB7E;AAsBD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,GACA,YAAY,CAmEd"}
1
+ {"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../../../src/carriers/aymakan/mappers.ts"],"names":[],"mappings":"AACA;;;GAGG;AAGH,OAAO,KAAK,EAEV,IAAI,EACJ,mBAAmB,EACnB,eAAe,EACf,MAAM,EACN,aAAa,EACb,QAAQ,EACR,cAAc,EACd,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EACV,qBAAqB,EACrB,WAAW,EACX,4BAA4B,EAE5B,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EAEzB,MAAM,SAAS,CAAC;AAMjB,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAI/E;AAuCD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,mBAAmB,GACzB,4BAA4B,CA4E9B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,oBAAoB,CAW3E;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,eAAe,GACpB,qBAAqB,CAYvB;AAMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,QAAQ,CAwB3E;AAeD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,oBAAoB,GAAG,aAAa,CAQ3E;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,wBAAwB,GAC7B,cAAc,CAyChB;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAK/C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,GAAG,MAAM,CAqB7E;AAsBD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,GACA,YAAY,CAsEd"}
@@ -235,12 +235,10 @@ export interface AymakanAddressResponse {
235
235
  };
236
236
  }
237
237
  export interface AymakanCancelResponse {
238
- success: boolean;
239
- shipping?: {
240
- reference: string | null;
241
- tracking_number: string;
242
- status: string;
243
- };
238
+ success?: boolean;
239
+ error?: boolean;
240
+ message?: string;
241
+ response?: string;
244
242
  }
245
243
  export interface AymakanWebhookPayload {
246
244
  tracking_number: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/carriers/aymakan/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/carriers/aymakan/types.ts"],"names":[],"mappings":"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"}
@@ -26,7 +26,7 @@ export interface CarrierAdapter {
26
26
  /** Track shipment by reference */
27
27
  trackByReference?(reference: string): Promise<TrackingResult>;
28
28
  /** Get label URL for a shipment */
29
- getLabel(trackingNumber: string, format?: "PDF" | "PNG"): Promise<string>;
29
+ getLabel(trackingNumber: string, format?: "PDF" | "ZPL" | "PNG"): Promise<string>;
30
30
  /** Get bulk labels as single PDF (if supported) */
31
31
  getBulkLabels?(trackingNumbers: string[]): Promise<string>;
32
32
  /** Get cities available for pickup scheduling */
@@ -81,7 +81,7 @@ export declare abstract class BaseCarrierAdapter implements CarrierAdapter {
81
81
  abstract cancelShipment(trackingNumber: string): Promise<boolean>;
82
82
  abstract track(trackingNumber: string): Promise<TrackingResult>;
83
83
  abstract trackMultiple(trackingNumbers: string[]): Promise<TrackingResult[]>;
84
- abstract getLabel(trackingNumber: string, format?: "PDF" | "PNG"): Promise<string>;
84
+ abstract getLabel(trackingNumber: string, format?: "PDF" | "ZPL" | "PNG"): Promise<string>;
85
85
  /** Get base URL based on mode (sandbox/production) */
86
86
  protected abstract getBaseUrl(): string;
87
87
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/carriers/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/carriers/base.ts"],"names":[],"mappings":"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"}
@@ -29,7 +29,7 @@ export declare class SMSAExpressAdapter extends BaseCarrierAdapter {
29
29
  track(trackingNumber: string): Promise<TrackingResult>;
30
30
  trackMultiple(trackingNumbers: string[]): Promise<TrackingResult[]>;
31
31
  trackByReference(reference: string): Promise<TrackingResult>;
32
- getLabel(trackingNumber: string, _format?: "PDF" | "PNG"): Promise<string>;
32
+ getLabel(trackingNumber: string, _format?: "PDF" | "ZPL" | "PNG"): Promise<string>;
33
33
  getCities(countryCode?: string): Promise<City[]>;
34
34
  getDropoffLocations(): Promise<Location[]>;
35
35
  create2WayShipment(input: CreateShipmentInput): Promise<Shipment>;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/carriers/smsaexpress/adapter.ts"],"names":[],"mappings":"AACA;;;GAGG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,IAAI,EACJ,mBAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAY7C,OAAO,KAAK,EAGV,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EAEtB,wBAAwB,EAEzB,MAAM,SAAS,CAAC;AAQjB,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,qBAAa,kBAAmB,SAAQ,kBAAkB;IACxD,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,kBAAkB,WASzB;IAEF,OAAO,CAAC,IAAI,CAAa;gBAEb,MAAM,EAAE,iBAAiB;IAWrC,SAAS,CAAC,UAAU,IAAI,MAAM;cAUd,qBAAqB,CACnC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,QAAQ,CAAC;YAgBN,iBAAiB;IAY/B;;;;;;OAMG;IACG,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAcxD,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAQtD,aAAa,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAUnE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAY5D,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GACtB,OAAO,CAAC,MAAM,CAAC;IAsCZ,SAAS,CAAC,WAAW,SAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQ9C,mBAAmB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAY1C,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAcjE,WAAW,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7D,oBAAoB,CACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,wBAAwB,CAAC;IAM9B,aAAa,CACjB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,yBAAyB,CAAC;IAWrC,YAAY,CACV,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,aAAa,CAAC;KACxB,GACA,YAAY;IAIf;;;;;;OAMG;IACH,iBAAiB,CACf,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,aAAa,CAAC;KACxB,GACA,YAAY,EAAE;CAGlB"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/carriers/smsaexpress/adapter.ts"],"names":[],"mappings":"AACA;;;GAGG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,IAAI,EACJ,mBAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAY7C,OAAO,KAAK,EAGV,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EAEtB,wBAAwB,EAEzB,MAAM,SAAS,CAAC;AAQjB,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,qBAAa,kBAAmB,SAAQ,kBAAkB;IACxD,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,kBAAkB,WASzB;IAEF,OAAO,CAAC,IAAI,CAAa;gBAEb,MAAM,EAAE,iBAAiB;IAWrC,SAAS,CAAC,UAAU,IAAI,MAAM;cAUd,qBAAqB,CACnC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,QAAQ,CAAC;YAkBN,iBAAiB;IAY/B;;;;;;OAMG;IACG,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBxD,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAQtD,aAAa,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAUnE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAY5D,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAC9B,OAAO,CAAC,MAAM,CAAC;IAsCZ,SAAS,CAAC,WAAW,SAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQ9C,mBAAmB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAY1C,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAcjE,WAAW,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7D,oBAAoB,CACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,wBAAwB,CAAC;IAM9B,aAAa,CACjB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,yBAAyB,CAAC;IAWrC,YAAY,CACV,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,aAAa,CAAC;KACxB,GACA,YAAY;IAIf;;;;;;OAMG;IACH,iBAAiB,CACf,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,aAAa,CAAC;KACxB,GACA,YAAY,EAAE;CAGlB"}