shipflow 0.3.0 → 0.3.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.
@@ -21,9 +21,13 @@ export declare class SMSAExpressAdapter extends BaseCarrierAdapter {
21
21
  /**
22
22
  * Cancel a reverse-pickup (C2B) shipment.
23
23
  *
24
- * **Important:** SMSA only supports cancellation for C2B/reverse-pickup shipments.
25
- * Calling this on a B2C shipment will result in an API error or return `false`.
26
- * B2C shipments cannot be cancelled via the SMSA API.
24
+ * **Important:** SMSA only supports cancellation for C2B/reverse-pickup
25
+ * shipments, via the C2B endpoint. B2C shipments cannot be cancelled through
26
+ * the SMSA API: the endpoint responds without a cancellation confirmation,
27
+ * which is surfaced as an {@link APIError} rather than a misleading `false`.
28
+ * That lets callers tell "the carrier could not cancel" apart from a genuine
29
+ * refusal of a cancellable shipment and fall back accordingly. Consistent with
30
+ * the other adapters, this method either returns `true` or throws.
27
31
  */
28
32
  cancelShipment(trackingNumber: string): Promise<boolean>;
29
33
  track(trackingNumber: string): Promise<TrackingResult>;
@@ -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;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"}
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;;;;;;;;;;OAUG;IACG,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBxD,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"}
@@ -340,7 +340,13 @@ class SMSAExpressAdapter extends BaseCarrierAdapter {
340
340
  }
341
341
  async cancelShipment(trackingNumber) {
342
342
  const response = await this.http.post(`/api/c2b/cancel/${encodeURIComponent(trackingNumber)}`);
343
- return typeof response === "string" ? response.toLowerCase().includes("cancelled") : true;
343
+ if (typeof response !== "string") {
344
+ return true;
345
+ }
346
+ if (response.toLowerCase().includes("cancelled")) {
347
+ return true;
348
+ }
349
+ throw new APIError(response.trim() || "SMSA did not confirm cancellation (B2C shipments cannot be cancelled via the SMSA API)", { carrier: "smsaexpress", raw: response });
344
350
  }
345
351
  async track(trackingNumber) {
346
352
  const response = await this.http.get(`/api/track/single/${encodeURIComponent(trackingNumber)}`);
@@ -415,4 +421,4 @@ export {
415
421
  SMSAExpressAdapter
416
422
  };
417
423
 
418
- //# debugId=D913394BAA446A3064756E2164756E21
424
+ //# debugId=E494CE182FFD4CD964756E2164756E21
@@ -4,9 +4,9 @@
4
4
  "sourcesContent": [
5
5
  "// file: src/carriers/smsaexpress/services.ts\n/**\n * SMSA Express Service Type Codes\n * Use these constants for type-safe service selection.\n */\n\nexport const SMSAService = {\n /** E-commerce delivery */\n ECOMMERCE_DELIVERY: \"EDDL\",\n /** Express delivery */\n EXPRESS_DELIVERY: \"EDEL\",\n /** C2B / Reverse pickup */\n C2B_REVERSE: \"EDCR\",\n} as const;\n\nexport type SMSAServiceType = (typeof SMSAService)[keyof typeof SMSAService];\n\n/**\n * SMSA Express Scan Type Codes → Unified ShipmentStatus mapping.\n *\n * Based on /api/track/statuslookup response.\n * Scan types not explicitly listed default to \"in_transit\".\n */\nexport const SMSAStatusCodes: Record<string, string> = {\n // Delivery\n DL: \"delivered\",\n\n // Out for delivery\n OD: \"out_for_delivery\",\n\n // Arrived at facility\n AF: \"at_warehouse\",\n\n // Hub / sorting\n HOP: \"in_transit\",\n HOR: \"in_transit\",\n HOT: \"in_transit\",\n\n // Picked up / collected\n PU: \"picked_up\",\n PKD: \"picked_up\",\n\n // Customs\n CR: \"in_transit\",\n CH: \"in_transit\",\n\n // Exceptions\n DE: \"exception\",\n DMG: \"exception\",\n MISS: \"exception\",\n\n // Cancelled / returned\n CAN: \"cancelled\",\n RTO: \"returned\",\n RTN: \"returned\",\n\n // Processing\n CC: \"at_warehouse\",\n PP: \"pending\",\n\n // Created / booked\n BK: \"created\",\n NEW: \"created\",\n};\n",
6
6
  "// file: src/carriers/smsaexpress/mappers.ts\n/**\n * SMSA Express Data Mappers\n * Transform between unified ShipFlow types and SMSA Express API formats.\n */\n\nimport {\n APIError,\n ValidationError,\n WebhookVerificationError,\n} from \"../../core/errors\";\nimport type {\n City,\n CreateShipmentInput,\n Location,\n Shipment,\n ShipmentStatus,\n TrackingEvent,\n TrackingResult,\n WebhookConfig,\n WebhookEvent,\n} from \"../../core/types\";\nimport { SMSAStatusCodes } from \"./services\";\nimport type {\n SMSACityLookupItem,\n SMSACreate2WayShipmentRequest,\n SMSACreateB2CShipmentRequest,\n SMSACreateC2BShipmentRequest,\n SMSAOfficeLookupItem,\n SMSAShipmentAddress,\n SMSAShipmentResponse,\n SMSATrackingResponse,\n SMSATrackingScan,\n SMSAWebhookShipment,\n} from \"./types\";\n\n// ============================================================================\n// STATUS MAPPING\n// ============================================================================\n\nexport function mapSMSAStatus(scanType: string): ShipmentStatus {\n return (SMSAStatusCodes[scanType] as ShipmentStatus) ?? \"in_transit\";\n}\n\n/**\n * Derive the current shipment status from tracking scans.\n * Defensively sorts by ScanDateTime descending before taking the latest.\n */\nfunction deriveStatusFromScans(\n scans: SMSATrackingScan[] | undefined,\n isDelivered?: boolean,\n): { status: ShipmentStatus; statusLabel: string } {\n if (isDelivered) {\n return { status: \"delivered\", statusLabel: \"Delivered\" };\n }\n // Records may omit Scans entirely (freshly-booked AWB, partial bulk record).\n const safeScans = scans ?? [];\n if (safeScans.length === 0) {\n return { status: \"unknown\", statusLabel: \"Unknown\" };\n }\n const sorted = [...safeScans].sort(\n (a, b) =>\n new Date(b.ScanDateTime).getTime() -\n new Date(a.ScanDateTime).getTime(),\n );\n const latest = sorted[0]!;\n return {\n status: mapSMSAStatus(latest.ScanType),\n statusLabel: latest.ScanDescription,\n };\n}\n\n// ============================================================================\n// REQUEST MAPPERS\n// ============================================================================\n\n/**\n * Round a weight to 3 decimal places to avoid float-arithmetic noise\n * (e.g. 0.1 + 0.2 = 0.30000000000000004) leaking into the API payload.\n */\nfunction roundWeight(weight: number): number {\n return Math.round(weight * 1000) / 1000;\n}\n\nfunction mapAddress(\n addr: CreateShipmentInput[\"shipper\"] | CreateShipmentInput[\"consignee\"],\n opts?: { includeShortCode?: boolean },\n): SMSAShipmentAddress {\n const result: SMSAShipmentAddress = {\n ContactName: addr.name,\n ContactPhoneNumber: addr.phone,\n Country: addr.countryCode,\n City: addr.city,\n AddressLine1: addr.line1,\n AddressLine2: addr.line2,\n District: addr.neighbourhood ?? addr.state,\n PostalCode: addr.postalCode,\n };\n\n if (addr.coordinates) {\n result.Coordinates = `${addr.coordinates.latitude},${addr.coordinates.longitude}`;\n }\n\n // ShortCode is valid only on the consignee address per the SMSA spec.\n if (opts?.includeShortCode && addr.nationalAddress?.shortCode) {\n result.ShortCode = addr.nationalAddress.shortCode;\n }\n\n return result;\n}\n\nexport function mapCreateB2CRequest(\n input: CreateShipmentInput,\n): SMSACreateB2CShipmentRequest {\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\n const consigneeAddress = mapAddress(input.consignee, {\n includeShortCode: true,\n });\n if (input.options?.metadata?.consigneeId) {\n consigneeAddress.ConsigneeID = input.options.metadata.consigneeId as string;\n }\n\n return {\n ConsigneeAddress: consigneeAddress,\n ShipperAddress: mapAddress(input.shipper),\n OrderNumber: input.reference ?? `ORD-${Date.now()}`,\n CODAmount: input.cod?.enabled ? input.cod.amount : 0,\n DeclaredValue: input.declaredValue?.amount ?? 0,\n ContentDescription: input.parcels[0]?.description ?? \"Shipment contents\",\n Parcels: totalPieces,\n ShipDate: new Date().toISOString().slice(0, 19),\n // When COD is enabled, its currency is the amount physically collected\n // and must win over the declared-value currency.\n ShipmentCurrency:\n (input.cod?.enabled ? input.cod.currency : undefined) ??\n input.declaredValue?.currency ??\n input.cod?.currency ??\n \"SAR\",\n Weight: roundWeight(totalWeight),\n WeightUnit: \"KG\",\n WaybillType: input.labelFormat === \"ZPL\" ? \"ZPL\" : \"PDF\",\n ServiceCode: input.serviceType,\n SMSARetailID: (input.options?.metadata?.smsaRetailId as string) ?? \"0\",\n VatPaid: (input.options?.metadata?.vatPaid as boolean) ?? true,\n DutyPaid: (input.options?.metadata?.dutyPaid as boolean) ?? false,\n };\n}\n\n/**\n * Map to C2B (reverse pickup) request.\n * In C2B flow, the consignee is the pickup point (customer returning),\n * and the shipper is the return-to address (merchant warehouse).\n */\nexport function mapCreateC2BRequest(\n input: CreateShipmentInput,\n): SMSACreateC2BShipmentRequest {\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\n return {\n PickupAddress: mapAddress(input.consignee, { includeShortCode: true }),\n ReturnToAddress: mapAddress(input.shipper),\n OrderNumber: input.reference ?? `ORD-${Date.now()}`,\n DeclaredValue: input.declaredValue?.amount ?? 0.1,\n ContentDescription:\n input.parcels[0]?.description ?? \"Return shipment contents\",\n Parcels: totalPieces,\n ShipDate: new Date().toISOString().slice(0, 19),\n // When COD is enabled, its currency is the amount physically collected\n // and must win over the declared-value currency.\n ShipmentCurrency:\n (input.cod?.enabled ? input.cod.currency : undefined) ??\n input.declaredValue?.currency ??\n input.cod?.currency ??\n \"SAR\",\n Weight: roundWeight(totalWeight),\n WeightUnit: \"KG\",\n WaybillType: input.labelFormat === \"ZPL\" ? \"ZPL\" : \"PDF\",\n ServiceCode: input.serviceType ?? \"EDCR\",\n SMSARetailID: (input.options?.metadata?.smsaRetailId as string) ?? \"0\",\n };\n}\n\n// ============================================================================\n// RESPONSE MAPPERS\n// ============================================================================\n\nexport function mapShipmentResponse(\n data: SMSAShipmentResponse,\n input: CreateShipmentInput,\n): Shipment {\n const firstWaybill = data.waybills?.[0];\n const trackingNumber = firstWaybill?.awb ?? data.sawb;\n\n if (!trackingNumber) {\n throw new APIError(\"No tracking number in shipment response\", {\n carrier: \"smsaexpress\",\n raw: data,\n });\n }\n\n return {\n carrier: \"smsaexpress\",\n trackingNumber,\n reference: input.reference,\n status: \"created\",\n statusLabel: \"Created\",\n codAmount: input.cod?.enabled ? input.cod.amount : undefined,\n declaredValue: input.declaredValue?.amount,\n // When COD is enabled, its currency is the amount physically collected\n // and must win over the declared-value currency.\n currency:\n (input.cod?.enabled ? input.cod.currency : undefined) ??\n input.declaredValue?.currency ??\n input.cod?.currency ??\n \"SAR\",\n returnLabel: firstWaybill?.returnBarcode\n ? `data:application/pdf;base64,${firstWaybill.returnBarcode}`\n : undefined,\n // Guard a missing createDate so we never build `new Date(\"undefined+03:00\")`\n // (Invalid Date). Append the SMSA timezone (+03:00) only to bare timestamps.\n createdAt: data.createDate\n ? new Date(\n /[Z]$|[+-]\\d{2}(:\\d{2})?$/.test(data.createDate)\n ? data.createDate\n : `${data.createDate}+03:00`,\n )\n : new Date(),\n raw: data,\n };\n}\n\nexport function mapTrackingEvent(scan: SMSATrackingScan): TrackingEvent {\n return {\n timestamp: new Date(\n scan.ScanTimeZone\n ? `${scan.ScanDateTime}${scan.ScanTimeZone}`\n : scan.ScanDateTime,\n ),\n statusCode: scan.ScanType,\n status: mapSMSAStatus(scan.ScanType),\n description: scan.ScanDescription,\n location: scan.City,\n };\n}\n\nexport function mapTrackingResult(data: SMSATrackingResponse): TrackingResult {\n // Real API records (freshly-booked AWB, partial bulk record) may omit Scans\n // entirely; default to [] so a scan-less record yields \"unknown\" instead of\n // throwing (and failing the whole trackMultiple batch).\n const scans = data.Scans ?? [];\n const { status, statusLabel } = deriveStatusFromScans(scans, data.isDelivered);\n\n const deliveredScan = scans.find((s) => s.ScanType === \"DL\");\n const deliveredTimestamp = deliveredScan\n ? new Date(\n deliveredScan.ScanTimeZone\n ? `${deliveredScan.ScanDateTime}${deliveredScan.ScanTimeZone}`\n : deliveredScan.ScanDateTime,\n )\n : undefined;\n\n return {\n trackingNumber: data.AWB,\n carrier: \"smsaexpress\",\n reference: data.Reference || undefined,\n status,\n statusLabel,\n events: scans.map(mapTrackingEvent),\n deliveryDate: deliveredTimestamp,\n codAmount: data.CODAmount > 0 ? data.CODAmount : undefined,\n pieces: data.Pieces,\n raw: data,\n };\n}\n\nexport function mapCity(city: SMSACityLookupItem): City {\n return {\n nameEn: city.cityName,\n code: city.cityCode,\n };\n}\n\nexport function mapOffice(office: SMSAOfficeLookupItem): Location {\n const [lat, lng] = (office.coordinates || \"\")\n .split(\",\")\n .map((s) => parseFloat(s.trim()));\n\n return {\n id: office.code,\n name: office.address,\n nameAr: office.addressAR,\n city: office.cityName,\n latitude: Number.isNaN(lat) ? undefined : lat,\n longitude: Number.isNaN(lng) ? undefined : lng,\n };\n}\n\nexport function mapCreate2WayRequest(\n input: CreateShipmentInput,\n): SMSACreate2WayShipmentRequest {\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\n const consigneeAddress = mapAddress(input.consignee, {\n includeShortCode: true,\n });\n if (input.options?.metadata?.consigneeId) {\n consigneeAddress.ConsigneeID = input.options.metadata.consigneeId as string;\n }\n\n return {\n ConsigneeAddress: consigneeAddress,\n ShipperAddress: mapAddress(input.shipper),\n OrderNumber: input.reference ?? `ORD-${Date.now()}`,\n DeclaredValue: input.declaredValue?.amount ?? 0,\n ContentDescription: input.parcels[0]?.description ?? \"Shipment contents\",\n Parcels: totalPieces,\n ShipDate: new Date().toISOString().slice(0, 19),\n ShipmentCurrency: input.declaredValue?.currency ?? \"SAR\",\n Weight: roundWeight(totalWeight),\n WeightUnit: \"KG\",\n WaybillType: input.labelFormat === \"ZPL\" ? \"ZPL\" : \"PDF\",\n SMSARetailID: (input.options?.metadata?.smsaRetailId as string) ?? \"0\",\n VatPaid: (input.options?.metadata?.vatPaid as boolean) ?? true,\n DutyPaid: (input.options?.metadata?.dutyPaid as boolean) ?? false,\n };\n}\n\n// ============================================================================\n// WEBHOOK MAPPERS\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 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\nfunction verifyWebhookAuth(options?: {\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n config?: WebhookConfig;\n}): void {\n const { headers = {}, queryParams = {}, config } = options ?? {};\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: \"smsaexpress\",\n });\n }\n }\n\n // Verify auth via query param (SMSA uses API key as query param, timing-safe)\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: \"smsaexpress\",\n });\n }\n }\n}\n\nfunction mapWebhookShipmentToEvent(\n shipment: SMSAWebhookShipment,\n): WebhookEvent {\n // A webhook record may arrive without Scans; default to [] so a scan-less\n // shipment yields \"unknown\" instead of throwing.\n const scans = shipment.Scans ?? [];\n const { status, statusLabel } = deriveStatusFromScans(\n scans,\n shipment.isDelivered,\n );\n\n // Sort scans descending to get the latest one for timestamp/statusCode\n const sorted = [...scans].sort(\n (a, b) =>\n new Date(b.ScanDateTime).getTime() -\n new Date(a.ScanDateTime).getTime(),\n );\n const latestScan = sorted[0];\n const timestamp = latestScan\n ? new Date(\n latestScan.ScanTimeZone\n ? `${latestScan.ScanDateTime}${latestScan.ScanTimeZone}`\n : latestScan.ScanDateTime,\n )\n : new Date();\n\n return {\n carrier: \"smsaexpress\",\n eventType: \"status_update\",\n trackingNumber: shipment.AWB,\n reference: shipment.Reference || undefined,\n status,\n statusCode: latestScan?.ScanType ?? \"unknown\",\n statusLabel,\n timestamp,\n raw: shipment,\n };\n}\n\nfunction validateWebhookPayload(payload: unknown): SMSAWebhookShipment[] {\n if (!Array.isArray(payload)) {\n throw new ValidationError(\n \"Invalid SMSA webhook payload: expected an array of shipments\",\n { raw: payload },\n );\n }\n\n if (payload.length === 0) {\n throw new ValidationError(\"Invalid SMSA webhook payload: empty array\", {\n raw: payload,\n });\n }\n\n for (const item of payload) {\n if (\n !item ||\n typeof item !== \"object\" ||\n !(\"AWB\" in item) ||\n !(\"Scans\" in item)\n ) {\n throw new ValidationError(\n \"Invalid SMSA webhook payload: shipment missing required fields (AWB, Scans)\",\n { raw: item },\n );\n }\n }\n\n return payload as SMSAWebhookShipment[];\n}\n\n/**\n * Parse an SMSA webhook payload and return a single WebhookEvent\n * for the first shipment in the batch.\n *\n * SMSA sends webhooks as an array of shipments. This function returns\n * only the first item — use `parseSMSAWebhookBatch()` for full batch parsing.\n */\nexport function parseSMSAWebhook(\n payload: unknown,\n options?: {\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n config?: WebhookConfig;\n },\n): WebhookEvent {\n verifyWebhookAuth(options);\n const shipments = validateWebhookPayload(payload);\n return mapWebhookShipmentToEvent(shipments[0]!);\n}\n\n/**\n * Parse an SMSA webhook payload and return a WebhookEvent for every\n * shipment in the batch.\n *\n * SMSA sends webhook payloads as an array of shipments, each with\n * their own tracking scans.\n */\nexport function parseSMSAWebhookBatch(\n payload: unknown,\n options?: {\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n config?: WebhookConfig;\n },\n): WebhookEvent[] {\n verifyWebhookAuth(options);\n const shipments = validateWebhookPayload(payload);\n return shipments.map(mapWebhookShipmentToEvent);\n}\n",
7
- "// file: src/carriers/smsaexpress/adapter.ts\n/**\n * SMSA Express Carrier Adapter\n * Full implementation of the CarrierAdapter interface for SMSA Express API.\n */\n\nimport { APIError } from \"../../core/errors\";\nimport { HttpClient } from \"../../core/http\";\nimport type {\n CarrierConfig,\n City,\n CreateShipmentInput,\n Location,\n Shipment,\n TrackingResult,\n WebhookConfig,\n WebhookEvent,\n} from \"../../core/types\";\nimport { BaseCarrierAdapter } from \"../base\";\nimport {\n mapCity,\n mapCreate2WayRequest,\n mapCreateB2CRequest,\n mapCreateC2BRequest,\n mapOffice,\n mapShipmentResponse,\n mapTrackingResult,\n parseSMSAWebhook,\n parseSMSAWebhookBatch,\n} from \"./mappers\";\nimport type {\n SMSACityLookupItem,\n SMSAOfficeLookupItem,\n SMSAPushIdDetailsRequest,\n SMSAPushIdDetailsResponse,\n SMSASendInvoiceRequest,\n SMSAShipmentResponse,\n SMSAShortAddressResponse,\n SMSATrackingResponse,\n} from \"./types\";\n\nconst SMSA_SANDBOX_URL = \"https://ecomapis-sandbox.azurewebsites.net\";\nconst SMSA_PRODUCTION_URL = \"https://ecomapis.smsaexpress.com\";\n\n/** Reverse-pickup / C2B service codes */\nconst C2B_SERVICE_CODES = new Set([\"EDCR\"]);\n\nexport interface SMSAExpressConfig extends CarrierConfig {\n credentials: {\n apiKey: string;\n };\n}\n\nexport class SMSAExpressAdapter extends BaseCarrierAdapter {\n readonly name = \"smsaexpress\";\n readonly supportedCountries = [\n \"SA\",\n \"AE\",\n \"BH\",\n \"EG\",\n \"KW\",\n \"OM\",\n \"QA\",\n \"JO\",\n ];\n\n private http: HttpClient;\n\n constructor(config: SMSAExpressConfig) {\n super(config);\n this.http = new HttpClient({\n baseUrl: this.getBaseUrl(),\n carrier: \"smsaexpress\",\n headers: {\n apikey: config.credentials.apiKey,\n },\n });\n }\n\n protected getBaseUrl(): string {\n return this.config.mode === \"production\"\n ? SMSA_PRODUCTION_URL\n : SMSA_SANDBOX_URL;\n }\n\n // =========================================================================\n // SHIPPING\n // =========================================================================\n\n protected async executeCreateShipment(\n input: CreateShipmentInput,\n ): Promise<Shipment> {\n const isC2B =\n input.serviceType !== undefined &&\n C2B_SERVICE_CODES.has(input.serviceType);\n\n if (isC2B) {\n return this.createC2BShipment(input);\n }\n\n const request = mapCreateB2CRequest(input);\n const response = await this.http.post<SMSAShipmentResponse>(\n \"/api/shipment/b2c/new\",\n request,\n );\n\n return mapShipmentResponse(response, input);\n }\n\n private async createC2BShipment(\n input: CreateShipmentInput,\n ): Promise<Shipment> {\n const request = mapCreateC2BRequest(input);\n const response = await this.http.post<SMSAShipmentResponse>(\n \"/api/c2b/new\",\n request,\n );\n\n return mapShipmentResponse(response, input);\n }\n\n /**\n * Cancel a reverse-pickup (C2B) shipment.\n *\n * **Important:** SMSA only supports cancellation for C2B/reverse-pickup shipments.\n * Calling this on a B2C shipment will result in an API error or return `false`.\n * B2C shipments cannot be cancelled via the SMSA API.\n */\n async cancelShipment(trackingNumber: string): Promise<boolean> {\n const response = await this.http.post<string>(\n `/api/c2b/cancel/${encodeURIComponent(trackingNumber)}`,\n );\n // API returns a plain-text message on success (e.g. \"Shipment Cancelled\n // Successfully!\"); inspect it for confirmation. A non-string (JSON) success\n // response is treated as success.\n return typeof response === \"string\"\n ? response.toLowerCase().includes(\"cancelled\")\n : true;\n }\n\n // =========================================================================\n // TRACKING\n // =========================================================================\n\n async track(trackingNumber: string): Promise<TrackingResult> {\n const response = await this.http.get<SMSATrackingResponse>(\n `/api/track/single/${encodeURIComponent(trackingNumber)}`,\n );\n\n return mapTrackingResult(response);\n }\n\n async trackMultiple(trackingNumbers: string[]): Promise<TrackingResult[]> {\n const response = await this.http.post<SMSATrackingResponse[]>(\n \"/api/track/bulk/\",\n trackingNumbers,\n { retry: true },\n );\n\n return response.map(mapTrackingResult);\n }\n\n async trackByReference(reference: string): Promise<TrackingResult> {\n const response = await this.http.get<SMSATrackingResponse>(\n `/api/track/reference/${encodeURIComponent(reference)}`,\n );\n\n return mapTrackingResult(response);\n }\n\n // =========================================================================\n // LABELS\n // =========================================================================\n\n async getLabel(\n trackingNumber: string,\n _format?: \"PDF\" | \"ZPL\" | \"PNG\",\n ): Promise<string> {\n // SMSA returns the waybill file (base64 PDF) as part of the shipment query.\n // Try B2C first (most common), then C2B as fallback.\n const encoded = encodeURIComponent(trackingNumber);\n\n for (const path of [\n `/api/shipment/b2c/query/${encoded}`,\n `/api/c2b/query/${encoded}`,\n ]) {\n try {\n const response = await this.http.get<SMSAShipmentResponse>(path);\n const waybill = response.waybills?.[0];\n if (waybill?.awbFile) {\n return `data:application/pdf;base64,${waybill.awbFile}`;\n }\n } catch (error) {\n // Only swallow 4xx API errors (shipment type mismatch / not found).\n // Re-throw auth, network, server, and unexpected errors immediately.\n if (\n !(error instanceof APIError) ||\n error.statusCode === 401 ||\n (error.statusCode !== undefined && error.statusCode >= 500)\n ) {\n throw error;\n }\n }\n }\n\n throw new APIError(\"No label found for shipment\", {\n carrier: \"smsaexpress\",\n raw: { trackingNumber },\n });\n }\n\n // =========================================================================\n // CITIES & LOCATIONS\n // =========================================================================\n\n async getCities(countryCode = \"SA\"): Promise<City[]> {\n const response = await this.http.get<SMSACityLookupItem[]>(\n `/api/lookup/cities/${encodeURIComponent(countryCode)}`,\n );\n\n return response.map(mapCity);\n }\n\n async getDropoffLocations(): Promise<Location[]> {\n const response = await this.http.get<SMSAOfficeLookupItem[]>(\n \"/api/lookup/smsaoffices\",\n );\n\n return response.map(mapOffice);\n }\n\n // =========================================================================\n // 2-WAY SHIPMENT\n // =========================================================================\n\n async create2WayShipment(input: CreateShipmentInput): Promise<Shipment> {\n const request = mapCreate2WayRequest(input);\n const response = await this.http.post<SMSAShipmentResponse>(\n \"/api/TwoWayShipment/new\",\n request,\n );\n\n return mapShipmentResponse(response, input);\n }\n\n // =========================================================================\n // INVOICE & ID OPERATIONS (SMSA-specific)\n // =========================================================================\n\n async sendInvoice(request: SMSASendInvoiceRequest): Promise<string> {\n return this.http.post<string>(\"/api/invoice\", request);\n }\n\n async validateShortAddress(\n shortCode: string,\n ): Promise<SMSAShortAddressResponse> {\n return this.http.get<SMSAShortAddressResponse>(\n `/api/Lookup/FullAddressByShortCode/${encodeURIComponent(shortCode)}`,\n );\n }\n\n async pushIdDetails(\n request: SMSAPushIdDetailsRequest,\n ): Promise<SMSAPushIdDetailsResponse> {\n return this.http.post<SMSAPushIdDetailsResponse>(\n \"/api/shipment/identity-details\",\n request,\n );\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 parseSMSAWebhook(payload, options);\n }\n\n /**\n * Parse a batch SMSA webhook payload into multiple events.\n *\n * SMSA sends webhook payloads as an array of shipments, each with their own\n * tracking scans. This method returns a WebhookEvent for every shipment\n * in the payload.\n */\n parseWebhookBatch(\n payload: unknown,\n options?: {\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n config?: WebhookConfig;\n },\n ): WebhookEvent[] {\n return parseSMSAWebhookBatch(payload, options);\n }\n}\n"
7
+ "// file: src/carriers/smsaexpress/adapter.ts\n/**\n * SMSA Express Carrier Adapter\n * Full implementation of the CarrierAdapter interface for SMSA Express API.\n */\n\nimport { APIError } from \"../../core/errors\";\nimport { HttpClient } from \"../../core/http\";\nimport type {\n CarrierConfig,\n City,\n CreateShipmentInput,\n Location,\n Shipment,\n TrackingResult,\n WebhookConfig,\n WebhookEvent,\n} from \"../../core/types\";\nimport { BaseCarrierAdapter } from \"../base\";\nimport {\n mapCity,\n mapCreate2WayRequest,\n mapCreateB2CRequest,\n mapCreateC2BRequest,\n mapOffice,\n mapShipmentResponse,\n mapTrackingResult,\n parseSMSAWebhook,\n parseSMSAWebhookBatch,\n} from \"./mappers\";\nimport type {\n SMSACityLookupItem,\n SMSAOfficeLookupItem,\n SMSAPushIdDetailsRequest,\n SMSAPushIdDetailsResponse,\n SMSASendInvoiceRequest,\n SMSAShipmentResponse,\n SMSAShortAddressResponse,\n SMSATrackingResponse,\n} from \"./types\";\n\nconst SMSA_SANDBOX_URL = \"https://ecomapis-sandbox.azurewebsites.net\";\nconst SMSA_PRODUCTION_URL = \"https://ecomapis.smsaexpress.com\";\n\n/** Reverse-pickup / C2B service codes */\nconst C2B_SERVICE_CODES = new Set([\"EDCR\"]);\n\nexport interface SMSAExpressConfig extends CarrierConfig {\n credentials: {\n apiKey: string;\n };\n}\n\nexport class SMSAExpressAdapter extends BaseCarrierAdapter {\n readonly name = \"smsaexpress\";\n readonly supportedCountries = [\n \"SA\",\n \"AE\",\n \"BH\",\n \"EG\",\n \"KW\",\n \"OM\",\n \"QA\",\n \"JO\",\n ];\n\n private http: HttpClient;\n\n constructor(config: SMSAExpressConfig) {\n super(config);\n this.http = new HttpClient({\n baseUrl: this.getBaseUrl(),\n carrier: \"smsaexpress\",\n headers: {\n apikey: config.credentials.apiKey,\n },\n });\n }\n\n protected getBaseUrl(): string {\n return this.config.mode === \"production\"\n ? SMSA_PRODUCTION_URL\n : SMSA_SANDBOX_URL;\n }\n\n // =========================================================================\n // SHIPPING\n // =========================================================================\n\n protected async executeCreateShipment(\n input: CreateShipmentInput,\n ): Promise<Shipment> {\n const isC2B =\n input.serviceType !== undefined &&\n C2B_SERVICE_CODES.has(input.serviceType);\n\n if (isC2B) {\n return this.createC2BShipment(input);\n }\n\n const request = mapCreateB2CRequest(input);\n const response = await this.http.post<SMSAShipmentResponse>(\n \"/api/shipment/b2c/new\",\n request,\n );\n\n return mapShipmentResponse(response, input);\n }\n\n private async createC2BShipment(\n input: CreateShipmentInput,\n ): Promise<Shipment> {\n const request = mapCreateC2BRequest(input);\n const response = await this.http.post<SMSAShipmentResponse>(\n \"/api/c2b/new\",\n request,\n );\n\n return mapShipmentResponse(response, input);\n }\n\n /**\n * Cancel a reverse-pickup (C2B) shipment.\n *\n * **Important:** SMSA only supports cancellation for C2B/reverse-pickup\n * shipments, via the C2B endpoint. B2C shipments cannot be cancelled through\n * the SMSA API: the endpoint responds without a cancellation confirmation,\n * which is surfaced as an {@link APIError} rather than a misleading `false`.\n * That lets callers tell \"the carrier could not cancel\" apart from a genuine\n * refusal of a cancellable shipment and fall back accordingly. Consistent with\n * the other adapters, this method either returns `true` or throws.\n */\n async cancelShipment(trackingNumber: string): Promise<boolean> {\n const response = await this.http.post<string>(\n `/api/c2b/cancel/${encodeURIComponent(trackingNumber)}`,\n );\n // A non-string (JSON) success response is treated as success.\n if (typeof response !== \"string\") {\n return true;\n }\n // Success messages contain \"cancelled\" (e.g. \"Shipment Cancelled\n // Successfully!\"). Anything else means the carrier did NOT cancel — most\n // commonly because this is a B2C shipment, which the SMSA API cannot cancel.\n if (response.toLowerCase().includes(\"cancelled\")) {\n return true;\n }\n throw new APIError(\n response.trim() ||\n \"SMSA did not confirm cancellation (B2C shipments cannot be cancelled via the SMSA API)\",\n { carrier: \"smsaexpress\", raw: response },\n );\n }\n\n // =========================================================================\n // TRACKING\n // =========================================================================\n\n async track(trackingNumber: string): Promise<TrackingResult> {\n const response = await this.http.get<SMSATrackingResponse>(\n `/api/track/single/${encodeURIComponent(trackingNumber)}`,\n );\n\n return mapTrackingResult(response);\n }\n\n async trackMultiple(trackingNumbers: string[]): Promise<TrackingResult[]> {\n const response = await this.http.post<SMSATrackingResponse[]>(\n \"/api/track/bulk/\",\n trackingNumbers,\n { retry: true },\n );\n\n return response.map(mapTrackingResult);\n }\n\n async trackByReference(reference: string): Promise<TrackingResult> {\n const response = await this.http.get<SMSATrackingResponse>(\n `/api/track/reference/${encodeURIComponent(reference)}`,\n );\n\n return mapTrackingResult(response);\n }\n\n // =========================================================================\n // LABELS\n // =========================================================================\n\n async getLabel(\n trackingNumber: string,\n _format?: \"PDF\" | \"ZPL\" | \"PNG\",\n ): Promise<string> {\n // SMSA returns the waybill file (base64 PDF) as part of the shipment query.\n // Try B2C first (most common), then C2B as fallback.\n const encoded = encodeURIComponent(trackingNumber);\n\n for (const path of [\n `/api/shipment/b2c/query/${encoded}`,\n `/api/c2b/query/${encoded}`,\n ]) {\n try {\n const response = await this.http.get<SMSAShipmentResponse>(path);\n const waybill = response.waybills?.[0];\n if (waybill?.awbFile) {\n return `data:application/pdf;base64,${waybill.awbFile}`;\n }\n } catch (error) {\n // Only swallow 4xx API errors (shipment type mismatch / not found).\n // Re-throw auth, network, server, and unexpected errors immediately.\n if (\n !(error instanceof APIError) ||\n error.statusCode === 401 ||\n (error.statusCode !== undefined && error.statusCode >= 500)\n ) {\n throw error;\n }\n }\n }\n\n throw new APIError(\"No label found for shipment\", {\n carrier: \"smsaexpress\",\n raw: { trackingNumber },\n });\n }\n\n // =========================================================================\n // CITIES & LOCATIONS\n // =========================================================================\n\n async getCities(countryCode = \"SA\"): Promise<City[]> {\n const response = await this.http.get<SMSACityLookupItem[]>(\n `/api/lookup/cities/${encodeURIComponent(countryCode)}`,\n );\n\n return response.map(mapCity);\n }\n\n async getDropoffLocations(): Promise<Location[]> {\n const response = await this.http.get<SMSAOfficeLookupItem[]>(\n \"/api/lookup/smsaoffices\",\n );\n\n return response.map(mapOffice);\n }\n\n // =========================================================================\n // 2-WAY SHIPMENT\n // =========================================================================\n\n async create2WayShipment(input: CreateShipmentInput): Promise<Shipment> {\n const request = mapCreate2WayRequest(input);\n const response = await this.http.post<SMSAShipmentResponse>(\n \"/api/TwoWayShipment/new\",\n request,\n );\n\n return mapShipmentResponse(response, input);\n }\n\n // =========================================================================\n // INVOICE & ID OPERATIONS (SMSA-specific)\n // =========================================================================\n\n async sendInvoice(request: SMSASendInvoiceRequest): Promise<string> {\n return this.http.post<string>(\"/api/invoice\", request);\n }\n\n async validateShortAddress(\n shortCode: string,\n ): Promise<SMSAShortAddressResponse> {\n return this.http.get<SMSAShortAddressResponse>(\n `/api/Lookup/FullAddressByShortCode/${encodeURIComponent(shortCode)}`,\n );\n }\n\n async pushIdDetails(\n request: SMSAPushIdDetailsRequest,\n ): Promise<SMSAPushIdDetailsResponse> {\n return this.http.post<SMSAPushIdDetailsResponse>(\n \"/api/shipment/identity-details\",\n request,\n );\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 parseSMSAWebhook(payload, options);\n }\n\n /**\n * Parse a batch SMSA webhook payload into multiple events.\n *\n * SMSA sends webhook payloads as an array of shipments, each with their own\n * tracking scans. This method returns a WebhookEvent for every shipment\n * in the payload.\n */\n parseWebhookBatch(\n payload: unknown,\n options?: {\n headers?: Record<string, string>;\n queryParams?: Record<string, string>;\n config?: WebhookConfig;\n },\n ): WebhookEvent[] {\n return parseSMSAWebhookBatch(payload, options);\n }\n}\n"
8
8
  ],
9
- "mappings": ";;;;;;;;;AAMO,IAAM,cAAc;AAAA,EAEzB,oBAAoB;AAAA,EAEpB,kBAAkB;AAAA,EAElB,aAAa;AACf;AAUO,IAAM,kBAA0C;AAAA,EAErD,IAAI;AAAA,EAGJ,IAAI;AAAA,EAGJ,IAAI;AAAA,EAGJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EAGL,IAAI;AAAA,EACJ,KAAK;AAAA,EAGL,IAAI;AAAA,EACJ,IAAI;AAAA,EAGJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,MAAM;AAAA,EAGN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EAGL,IAAI;AAAA,EACJ,IAAI;AAAA,EAGJ,IAAI;AAAA,EACJ,KAAK;AACP;;;ACvBO,SAAS,aAAa,CAAC,UAAkC;AAAA,EAC9D,OAAQ,gBAAgB,aAAgC;AAAA;AAO1D,SAAS,qBAAqB,CAC5B,OACA,aACiD;AAAA,EACjD,IAAI,aAAa;AAAA,IACf,OAAO,EAAE,QAAQ,aAAa,aAAa,YAAY;AAAA,EACzD;AAAA,EAEA,MAAM,YAAY,SAAS,CAAC;AAAA,EAC5B,IAAI,UAAU,WAAW,GAAG;AAAA,IAC1B,OAAO,EAAE,QAAQ,WAAW,aAAa,UAAU;AAAA,EACrD;AAAA,EACA,MAAM,SAAS,CAAC,GAAG,SAAS,EAAE,KAC5B,CAAC,GAAG,MACF,IAAI,KAAK,EAAE,YAAY,EAAE,QAAQ,IACjC,IAAI,KAAK,EAAE,YAAY,EAAE,QAAQ,CACrC;AAAA,EACA,MAAM,SAAS,OAAO;AAAA,EACtB,OAAO;AAAA,IACL,QAAQ,cAAc,OAAO,QAAQ;AAAA,IACrC,aAAa,OAAO;AAAA,EACtB;AAAA;AAWF,SAAS,WAAW,CAAC,QAAwB;AAAA,EAC3C,OAAO,KAAK,MAAM,SAAS,IAAI,IAAI;AAAA;AAGrC,SAAS,UAAU,CACjB,MACA,MACqB;AAAA,EACrB,MAAM,SAA8B;AAAA,IAClC,aAAa,KAAK;AAAA,IAClB,oBAAoB,KAAK;AAAA,IACzB,SAAS,KAAK;AAAA,IACd,MAAM,KAAK;AAAA,IACX,cAAc,KAAK;AAAA,IACnB,cAAc,KAAK;AAAA,IACnB,UAAU,KAAK,iBAAiB,KAAK;AAAA,IACrC,YAAY,KAAK;AAAA,EACnB;AAAA,EAEA,IAAI,KAAK,aAAa;AAAA,IACpB,OAAO,cAAc,GAAG,KAAK,YAAY,YAAY,KAAK,YAAY;AAAA,EACxE;AAAA,EAGA,IAAI,MAAM,oBAAoB,KAAK,iBAAiB,WAAW;AAAA,IAC7D,OAAO,YAAY,KAAK,gBAAgB;AAAA,EAC1C;AAAA,EAEA,OAAO;AAAA;AAGF,SAAS,mBAAmB,CACjC,OAC8B;AAAA,EAC9B,MAAM,cAAc,MAAM,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AAAA,EACtE,MAAM,cAAc,MAAM,QAAQ,OAChC,CAAC,KAAK,MACJ,OACC,EAAE,OAAO,SAAS,OAAO,EAAE,OAAO,QAAQ,WAAW,EAAE,OAAO,QACjE,CACF;AAAA,EAEA,MAAM,mBAAmB,WAAW,MAAM,WAAW;AAAA,IACnD,kBAAkB;AAAA,EACpB,CAAC;AAAA,EACD,IAAI,MAAM,SAAS,UAAU,aAAa;AAAA,IACxC,iBAAiB,cAAc,MAAM,QAAQ,SAAS;AAAA,EACxD;AAAA,EAEA,OAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,gBAAgB,WAAW,MAAM,OAAO;AAAA,IACxC,aAAa,MAAM,aAAa,OAAO,KAAK,IAAI;AAAA,IAChD,WAAW,MAAM,KAAK,UAAU,MAAM,IAAI,SAAS;AAAA,IACnD,eAAe,MAAM,eAAe,UAAU;AAAA,IAC9C,oBAAoB,MAAM,QAAQ,IAAI,eAAe;AAAA,IACrD,SAAS;AAAA,IACT,UAAU,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,IAG9C,mBACG,MAAM,KAAK,UAAU,MAAM,IAAI,WAAW,cAC3C,MAAM,eAAe,YACrB,MAAM,KAAK,YACX;AAAA,IACF,QAAQ,YAAY,WAAW;AAAA,IAC/B,YAAY;AAAA,IACZ,aAAa,MAAM,gBAAgB,QAAQ,QAAQ;AAAA,IACnD,aAAa,MAAM;AAAA,IACnB,cAAe,MAAM,SAAS,UAAU,gBAA2B;AAAA,IACnE,SAAU,MAAM,SAAS,UAAU,WAAuB;AAAA,IAC1D,UAAW,MAAM,SAAS,UAAU,YAAwB;AAAA,EAC9D;AAAA;AAQK,SAAS,mBAAmB,CACjC,OAC8B;AAAA,EAC9B,MAAM,cAAc,MAAM,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AAAA,EACtE,MAAM,cAAc,MAAM,QAAQ,OAChC,CAAC,KAAK,MACJ,OACC,EAAE,OAAO,SAAS,OAAO,EAAE,OAAO,QAAQ,WAAW,EAAE,OAAO,QACjE,CACF;AAAA,EAEA,OAAO;AAAA,IACL,eAAe,WAAW,MAAM,WAAW,EAAE,kBAAkB,KAAK,CAAC;AAAA,IACrE,iBAAiB,WAAW,MAAM,OAAO;AAAA,IACzC,aAAa,MAAM,aAAa,OAAO,KAAK,IAAI;AAAA,IAChD,eAAe,MAAM,eAAe,UAAU;AAAA,IAC9C,oBACE,MAAM,QAAQ,IAAI,eAAe;AAAA,IACnC,SAAS;AAAA,IACT,UAAU,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,IAG9C,mBACG,MAAM,KAAK,UAAU,MAAM,IAAI,WAAW,cAC3C,MAAM,eAAe,YACrB,MAAM,KAAK,YACX;AAAA,IACF,QAAQ,YAAY,WAAW;AAAA,IAC/B,YAAY;AAAA,IACZ,aAAa,MAAM,gBAAgB,QAAQ,QAAQ;AAAA,IACnD,aAAa,MAAM,eAAe;AAAA,IAClC,cAAe,MAAM,SAAS,UAAU,gBAA2B;AAAA,EACrE;AAAA;AAOK,SAAS,mBAAmB,CACjC,MACA,OACU;AAAA,EACV,MAAM,eAAe,KAAK,WAAW;AAAA,EACrC,MAAM,iBAAiB,cAAc,OAAO,KAAK;AAAA,EAEjD,IAAI,CAAC,gBAAgB;AAAA,IACnB,MAAM,IAAI,SAAS,2CAA2C;AAAA,MAC5D,SAAS;AAAA,MACT,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,WAAW,MAAM,KAAK,UAAU,MAAM,IAAI,SAAS;AAAA,IACnD,eAAe,MAAM,eAAe;AAAA,IAGpC,WACG,MAAM,KAAK,UAAU,MAAM,IAAI,WAAW,cAC3C,MAAM,eAAe,YACrB,MAAM,KAAK,YACX;AAAA,IACF,aAAa,cAAc,gBACvB,+BAA+B,aAAa,kBAC5C;AAAA,IAGJ,WAAW,KAAK,aACZ,IAAI,KACF,2BAA2B,KAAK,KAAK,UAAU,IAC3C,KAAK,aACL,GAAG,KAAK,kBACd,IACA,IAAI;AAAA,IACR,KAAK;AAAA,EACP;AAAA;AAGK,SAAS,gBAAgB,CAAC,MAAuC;AAAA,EACtE,OAAO;AAAA,IACL,WAAW,IAAI,KACb,KAAK,eACD,GAAG,KAAK,eAAe,KAAK,iBAC5B,KAAK,YACX;AAAA,IACA,YAAY,KAAK;AAAA,IACjB,QAAQ,cAAc,KAAK,QAAQ;AAAA,IACnC,aAAa,KAAK;AAAA,IAClB,UAAU,KAAK;AAAA,EACjB;AAAA;AAGK,SAAS,iBAAiB,CAAC,MAA4C;AAAA,EAI5E,MAAM,QAAQ,KAAK,SAAS,CAAC;AAAA,EAC7B,QAAQ,QAAQ,gBAAgB,sBAAsB,OAAO,KAAK,WAAW;AAAA,EAE7E,MAAM,gBAAgB,MAAM,KAAK,CAAC,MAAM,EAAE,aAAa,IAAI;AAAA,EAC3D,MAAM,qBAAqB,gBACvB,IAAI,KACJ,cAAc,eACV,GAAG,cAAc,eAAe,cAAc,iBAC9C,cAAc,YACpB,IACE;AAAA,EAEJ,OAAO;AAAA,IACL,gBAAgB,KAAK;AAAA,IACrB,SAAS;AAAA,IACT,WAAW,KAAK,aAAa;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,QAAQ,MAAM,IAAI,gBAAgB;AAAA,IAClC,cAAc;AAAA,IACd,WAAW,KAAK,YAAY,IAAI,KAAK,YAAY;AAAA,IACjD,QAAQ,KAAK;AAAA,IACb,KAAK;AAAA,EACP;AAAA;AAGK,SAAS,OAAO,CAAC,MAAgC;AAAA,EACtD,OAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,EACb;AAAA;AAGK,SAAS,SAAS,CAAC,QAAwC;AAAA,EAChE,OAAO,KAAK,QAAQ,OAAO,eAAe,IACvC,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,WAAW,EAAE,KAAK,CAAC,CAAC;AAAA,EAElC,OAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO;AAAA,IACf,MAAM,OAAO;AAAA,IACb,UAAU,OAAO,MAAM,GAAG,IAAI,YAAY;AAAA,IAC1C,WAAW,OAAO,MAAM,GAAG,IAAI,YAAY;AAAA,EAC7C;AAAA;AAGK,SAAS,oBAAoB,CAClC,OAC+B;AAAA,EAC/B,MAAM,cAAc,MAAM,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AAAA,EACtE,MAAM,cAAc,MAAM,QAAQ,OAChC,CAAC,KAAK,MACJ,OACC,EAAE,OAAO,SAAS,OAAO,EAAE,OAAO,QAAQ,WAAW,EAAE,OAAO,QACjE,CACF;AAAA,EAEA,MAAM,mBAAmB,WAAW,MAAM,WAAW;AAAA,IACnD,kBAAkB;AAAA,EACpB,CAAC;AAAA,EACD,IAAI,MAAM,SAAS,UAAU,aAAa;AAAA,IACxC,iBAAiB,cAAc,MAAM,QAAQ,SAAS;AAAA,EACxD;AAAA,EAEA,OAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,gBAAgB,WAAW,MAAM,OAAO;AAAA,IACxC,aAAa,MAAM,aAAa,OAAO,KAAK,IAAI;AAAA,IAChD,eAAe,MAAM,eAAe,UAAU;AAAA,IAC9C,oBAAoB,MAAM,QAAQ,IAAI,eAAe;AAAA,IACrD,SAAS;AAAA,IACT,UAAU,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,IAC9C,kBAAkB,MAAM,eAAe,YAAY;AAAA,IACnD,QAAQ,YAAY,WAAW;AAAA,IAC/B,YAAY;AAAA,IACZ,aAAa,MAAM,gBAAgB,QAAQ,QAAQ;AAAA,IACnD,cAAe,MAAM,SAAS,UAAU,gBAA2B;AAAA,IACnE,SAAU,MAAM,SAAS,UAAU,WAAuB;AAAA,IAC1D,UAAW,MAAM,SAAS,UAAU,YAAwB;AAAA,EAC9D;AAAA;AAUF,SAAS,eAAe,CAAC,GAAW,GAAoB;AAAA,EACtD,MAAM,UAAU,IAAI;AAAA,EACpB,MAAM,OAAO,QAAQ,OAAO,CAAC;AAAA,EAC7B,MAAM,OAAO,QAAQ,OAAO,CAAC;AAAA,EAC7B,IAAI,KAAK,eAAe,KAAK;AAAA,IAAY,OAAO;AAAA,EAChD,IAAI,WAAW;AAAA,EACf,SAAS,IAAI,EAAG,IAAI,KAAK,YAAY,KAAK;AAAA,IACxC,YAAY,KAAK,KAAM,KAAK;AAAA,EAC9B;AAAA,EACA,OAAO,aAAa;AAAA;AAGtB,SAAS,iBAAiB,CAAC,SAIlB;AAAA,EACP,QAAQ,UAAU,CAAC,GAAG,cAAc,CAAC,GAAG,WAAW,WAAW,CAAC;AAAA,EAG/D,IAAI,QAAQ,cAAc,QAAQ,WAAW;AAAA,IAC3C,MAAM,WAAW,OAAO,WAAW,YAAY;AAAA,IAC/C,MAAM,cAAc,OAAO,QAAQ,OAAO,EAAE,KAC1C,EAAE,OAAO,EAAE,YAAY,MAAM,QAC/B,IAAI;AAAA,IACJ,IAAI,CAAC,eAAe,CAAC,gBAAgB,aAAa,OAAO,SAAS,GAAG;AAAA,MACnE,MAAM,IAAI,yBAAyB,+BAA+B;AAAA,QAChE,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAGA,IAAI,QAAQ,kBAAkB,QAAQ,gBAAgB;AAAA,IACpD,MAAM,aAAa,YAAY,OAAO;AAAA,IACtC,IAAI,CAAC,cAAc,CAAC,gBAAgB,YAAY,OAAO,cAAc,GAAG;AAAA,MACtE,MAAM,IAAI,yBAAyB,oCAAoC;AAAA,QACrE,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAGF,SAAS,yBAAyB,CAChC,UACc;AAAA,EAGd,MAAM,QAAQ,SAAS,SAAS,CAAC;AAAA,EACjC,QAAQ,QAAQ,gBAAgB,sBAC9B,OACA,SAAS,WACX;AAAA,EAGA,MAAM,SAAS,CAAC,GAAG,KAAK,EAAE,KACxB,CAAC,GAAG,MACF,IAAI,KAAK,EAAE,YAAY,EAAE,QAAQ,IACjC,IAAI,KAAK,EAAE,YAAY,EAAE,QAAQ,CACrC;AAAA,EACA,MAAM,aAAa,OAAO;AAAA,EAC1B,MAAM,YAAY,aACd,IAAI,KACJ,WAAW,eACP,GAAG,WAAW,eAAe,WAAW,iBACxC,WAAW,YACjB,IACE,IAAI;AAAA,EAER,OAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,gBAAgB,SAAS;AAAA,IACzB,WAAW,SAAS,aAAa;AAAA,IACjC;AAAA,IACA,YAAY,YAAY,YAAY;AAAA,IACpC;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACP;AAAA;AAGF,SAAS,sBAAsB,CAAC,SAAyC;AAAA,EACvE,IAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAAA,IAC3B,MAAM,IAAI,gBACR,gEACA,EAAE,KAAK,QAAQ,CACjB;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ,WAAW,GAAG;AAAA,IACxB,MAAM,IAAI,gBAAgB,6CAA6C;AAAA,MACrE,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,QAAQ,SAAS;AAAA,IAC1B,IACE,CAAC,QACD,OAAO,SAAS,YAChB,EAAE,SAAS,SACX,EAAE,WAAW,OACb;AAAA,MACA,MAAM,IAAI,gBACR,+EACA,EAAE,KAAK,KAAK,CACd;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAUF,SAAS,gBAAgB,CAC9B,SACA,SAKc;AAAA,EACd,kBAAkB,OAAO;AAAA,EACzB,MAAM,YAAY,uBAAuB,OAAO;AAAA,EAChD,OAAO,0BAA0B,UAAU,EAAG;AAAA;AAUzC,SAAS,qBAAqB,CACnC,SACA,SAKgB;AAAA,EAChB,kBAAkB,OAAO;AAAA,EACzB,MAAM,YAAY,uBAAuB,OAAO;AAAA,EAChD,OAAO,UAAU,IAAI,yBAAyB;AAAA;;;AC9chD,IAAM,mBAAmB;AACzB,IAAM,sBAAsB;AAG5B,IAAM,oBAAoB,IAAI,IAAI,CAAC,MAAM,CAAC;AAAA;AAQnC,MAAM,2BAA2B,mBAAmB;AAAA,EAChD,OAAO;AAAA,EACP,qBAAqB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEQ;AAAA,EAER,WAAW,CAAC,QAA2B;AAAA,IACrC,MAAM,MAAM;AAAA,IACZ,KAAK,OAAO,IAAI,WAAW;AAAA,MACzB,SAAS,KAAK,WAAW;AAAA,MACzB,SAAS;AAAA,MACT,SAAS;AAAA,QACP,QAAQ,OAAO,YAAY;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA;AAAA,EAGO,UAAU,GAAW;AAAA,IAC7B,OAAO,KAAK,OAAO,SAAS,eACxB,sBACA;AAAA;AAAA,OAOU,sBAAqB,CACnC,OACmB;AAAA,IACnB,MAAM,QACJ,MAAM,gBAAgB,aACtB,kBAAkB,IAAI,MAAM,WAAW;AAAA,IAEzC,IAAI,OAAO;AAAA,MACT,OAAO,KAAK,kBAAkB,KAAK;AAAA,IACrC;AAAA,IAEA,MAAM,UAAU,oBAAoB,KAAK;AAAA,IACzC,MAAM,WAAW,MAAM,KAAK,KAAK,KAC/B,yBACA,OACF;AAAA,IAEA,OAAO,oBAAoB,UAAU,KAAK;AAAA;AAAA,OAG9B,kBAAiB,CAC7B,OACmB;AAAA,IACnB,MAAM,UAAU,oBAAoB,KAAK;AAAA,IACzC,MAAM,WAAW,MAAM,KAAK,KAAK,KAC/B,gBACA,OACF;AAAA,IAEA,OAAO,oBAAoB,UAAU,KAAK;AAAA;AAAA,OAUtC,eAAc,CAAC,gBAA0C;AAAA,IAC7D,MAAM,WAAW,MAAM,KAAK,KAAK,KAC/B,mBAAmB,mBAAmB,cAAc,GACtD;AAAA,IAIA,OAAO,OAAO,aAAa,WACvB,SAAS,YAAY,EAAE,SAAS,WAAW,IAC3C;AAAA;AAAA,OAOA,MAAK,CAAC,gBAAiD;AAAA,IAC3D,MAAM,WAAW,MAAM,KAAK,KAAK,IAC/B,qBAAqB,mBAAmB,cAAc,GACxD;AAAA,IAEA,OAAO,kBAAkB,QAAQ;AAAA;AAAA,OAG7B,cAAa,CAAC,iBAAsD;AAAA,IACxE,MAAM,WAAW,MAAM,KAAK,KAAK,KAC/B,oBACA,iBACA,EAAE,OAAO,KAAK,CAChB;AAAA,IAEA,OAAO,SAAS,IAAI,iBAAiB;AAAA;AAAA,OAGjC,iBAAgB,CAAC,WAA4C;AAAA,IACjE,MAAM,WAAW,MAAM,KAAK,KAAK,IAC/B,wBAAwB,mBAAmB,SAAS,GACtD;AAAA,IAEA,OAAO,kBAAkB,QAAQ;AAAA;AAAA,OAO7B,SAAQ,CACZ,gBACA,SACiB;AAAA,IAGjB,MAAM,UAAU,mBAAmB,cAAc;AAAA,IAEjD,WAAW,QAAQ;AAAA,MACjB,2BAA2B;AAAA,MAC3B,kBAAkB;AAAA,IACpB,GAAG;AAAA,MACD,IAAI;AAAA,QACF,MAAM,WAAW,MAAM,KAAK,KAAK,IAA0B,IAAI;AAAA,QAC/D,MAAM,UAAU,SAAS,WAAW;AAAA,QACpC,IAAI,SAAS,SAAS;AAAA,UACpB,OAAO,+BAA+B,QAAQ;AAAA,QAChD;AAAA,QACA,OAAO,OAAO;AAAA,QAGd,IACE,EAAE,iBAAiB,aACnB,MAAM,eAAe,OACpB,MAAM,eAAe,aAAa,MAAM,cAAc,KACvD;AAAA,UACA,MAAM;AAAA,QACR;AAAA;AAAA,IAEJ;AAAA,IAEA,MAAM,IAAI,SAAS,+BAA+B;AAAA,MAChD,SAAS;AAAA,MACT,KAAK,EAAE,eAAe;AAAA,IACxB,CAAC;AAAA;AAAA,OAOG,UAAS,CAAC,cAAc,MAAuB;AAAA,IACnD,MAAM,WAAW,MAAM,KAAK,KAAK,IAC/B,sBAAsB,mBAAmB,WAAW,GACtD;AAAA,IAEA,OAAO,SAAS,IAAI,OAAO;AAAA;AAAA,OAGvB,oBAAmB,GAAwB;AAAA,IAC/C,MAAM,WAAW,MAAM,KAAK,KAAK,IAC/B,yBACF;AAAA,IAEA,OAAO,SAAS,IAAI,SAAS;AAAA;AAAA,OAOzB,mBAAkB,CAAC,OAA+C;AAAA,IACtE,MAAM,UAAU,qBAAqB,KAAK;AAAA,IAC1C,MAAM,WAAW,MAAM,KAAK,KAAK,KAC/B,2BACA,OACF;AAAA,IAEA,OAAO,oBAAoB,UAAU,KAAK;AAAA;AAAA,OAOtC,YAAW,CAAC,SAAkD;AAAA,IAClE,OAAO,KAAK,KAAK,KAAa,gBAAgB,OAAO;AAAA;AAAA,OAGjD,qBAAoB,CACxB,WACmC;AAAA,IACnC,OAAO,KAAK,KAAK,IACf,sCAAsC,mBAAmB,SAAS,GACpE;AAAA;AAAA,OAGI,cAAa,CACjB,SACoC;AAAA,IACpC,OAAO,KAAK,KAAK,KACf,kCACA,OACF;AAAA;AAAA,EAOF,YAAY,CACV,SACA,SAKc;AAAA,IACd,OAAO,iBAAiB,SAAS,OAAO;AAAA;AAAA,EAU1C,iBAAiB,CACf,SACA,SAKgB;AAAA,IAChB,OAAO,sBAAsB,SAAS,OAAO;AAAA;AAEjD;",
10
- "debugId": "D913394BAA446A3064756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "E494CE182FFD4CD964756E2164756E21",
11
11
  "names": []
12
12
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shipflow",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Unified Shipping SDK for MENA Region — Aymakan, SMSA Express, Aramex, and more",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",