medusa-shiprocket-fulfillment-plugin 0.2.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.
@@ -1,27 +1,59 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handleError = void 0;
3
+ exports.handleError = handleError;
4
4
  const utils_1 = require("@medusajs/utils");
5
- const handleError = (error) => {
6
- const message = error.response?.data?.message || error.message;
7
- const code = error.response?.status || 500;
8
- if (code === 401) {
9
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Authentication failed with Shiprocket");
10
- }
11
- if (code === 429) {
12
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Rate limit exceeded. Please try again later.");
13
- }
14
- if (code === 400 && error.response?.data?.errors) {
15
- const validationErrors = Object.entries(error.response.data.errors)
16
- .map(([field, msgs]) => `${field}: ${Array.isArray(msgs) ? msgs.join(", ") : msgs}`)
5
+ /**
6
+ * Handles Shiprocket API errors and converts them to MedusaError with appropriate types
7
+ * @param error - The Axios error from the API call
8
+ * @param context - Optional context about the operation for better error messages
9
+ */
10
+ function handleError(error, context) {
11
+ const axiosError = error;
12
+ const statusCode = axiosError?.response?.status || 0;
13
+ const responseData = axiosError?.response?.data;
14
+ // Extract error message from Shiprocket response
15
+ let message = responseData?.message || axiosError?.message || "Unknown Shiprocket error";
16
+ // Add context to message if available
17
+ const contextStr = context?.operation
18
+ ? `[${context.operation}]`
19
+ : "";
20
+ // Handle validation errors (field-level errors from Shiprocket)
21
+ if (responseData?.errors && typeof responseData.errors === "object") {
22
+ const validationErrors = Object.entries(responseData.errors)
23
+ .map(([field, msgs]) => {
24
+ const msgStr = Array.isArray(msgs) ? msgs.join(", ") : String(msgs);
25
+ return `${field}: ${msgStr}`;
26
+ })
17
27
  .join("; ");
18
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Validation failed: ${validationErrors}`);
28
+ message = `Validation failed: ${validationErrors}`;
19
29
  }
20
- throw new utils_1.MedusaError(code === 404
21
- ? utils_1.MedusaError.Types.NOT_FOUND
22
- : code === 400
23
- ? utils_1.MedusaError.Types.INVALID_DATA
24
- : utils_1.MedusaError.Types.UNEXPECTED_STATE, message);
25
- };
26
- exports.handleError = handleError;
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLWVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9zaGlwcm9ja2V0L2NsaWVudC9oYW5kbGUtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQTZDO0FBR3RDLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBa0MsRUFBUyxFQUFFO0lBQ3JFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFBO0lBQzlELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxJQUFJLEdBQUcsQ0FBQTtJQUUxQyxJQUFJLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHVDQUF1QyxDQUMxQyxDQUFBO0lBQ0wsQ0FBQztJQUVELElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLG1CQUFXLENBQ2pCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsOENBQThDLENBQ2pELENBQUE7SUFDTCxDQUFDO0lBRUQsSUFBSSxJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDOUQsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ25GLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNmLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHNCQUFzQixnQkFBZ0IsRUFBRSxDQUMzQyxDQUFBO0lBQ0wsQ0FBQztJQUVELE1BQU0sSUFBSSxtQkFBVyxDQUNqQixJQUFJLEtBQUssR0FBRztRQUNSLENBQUMsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTO1FBQzdCLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRztZQUNkLENBQUMsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLENBQUMsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDeEMsT0FBTyxDQUNWLENBQUE7QUFDTCxDQUFDLENBQUE7QUFwQ1ksUUFBQSxXQUFXLGVBb0N2QiJ9
30
+ // Map HTTP status codes to appropriate MedusaError types
31
+ switch (statusCode) {
32
+ case 401:
33
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, `${contextStr} Shiprocket authentication failed. Please verify your API credentials.`);
34
+ case 404:
35
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `${contextStr} ${message}`);
36
+ case 429:
37
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, `${contextStr} Shiprocket rate limit exceeded. Please retry after a few seconds.`);
38
+ case 400:
39
+ case 422:
40
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `${contextStr} ${message}`);
41
+ case 405:
42
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `${contextStr} Invalid API method. This may indicate a plugin bug.`);
43
+ case 500:
44
+ case 502:
45
+ case 503:
46
+ case 504:
47
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `${contextStr} Shiprocket server error (${statusCode}). Please try again later.`);
48
+ default:
49
+ // Network errors or unknown status codes
50
+ if (axiosError?.code === "ECONNABORTED") {
51
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `${contextStr} Shiprocket request timed out. Please try again.`);
52
+ }
53
+ if (axiosError?.code === "ENOTFOUND" || axiosError?.code === "ECONNREFUSED") {
54
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `${contextStr} Unable to connect to Shiprocket. Please check your network connection.`);
55
+ }
56
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `${contextStr} ${message}`);
57
+ }
58
+ }
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLWVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9zaGlwcm9ja2V0L2NsaWVudC9oYW5kbGUtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQkEsa0NBdUZDO0FBakhELDJDQUE2QztBQXFCN0M7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUFjLEVBQUUsT0FBc0I7SUFDOUQsTUFBTSxVQUFVLEdBQUcsS0FBb0MsQ0FBQTtJQUN2RCxNQUFNLFVBQVUsR0FBRyxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUE7SUFDcEQsTUFBTSxZQUFZLEdBQUcsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUE7SUFFL0MsaURBQWlEO0lBQ2pELElBQUksT0FBTyxHQUFHLFlBQVksRUFBRSxPQUFPLElBQUksVUFBVSxFQUFFLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQTtJQUV4RixzQ0FBc0M7SUFDdEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLFNBQVM7UUFDakMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsR0FBRztRQUMxQixDQUFDLENBQUMsRUFBRSxDQUFBO0lBRVIsZ0VBQWdFO0lBQ2hFLElBQUksWUFBWSxFQUFFLE1BQU0sSUFBSSxPQUFPLFlBQVksQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7YUFDdkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNuQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDbkUsT0FBTyxHQUFHLEtBQUssS0FBSyxNQUFNLEVBQUUsQ0FBQTtRQUNoQyxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDZixPQUFPLEdBQUcsc0JBQXNCLGdCQUFnQixFQUFFLENBQUE7SUFDdEQsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCxRQUFRLFVBQVUsRUFBRSxDQUFDO1FBQ2pCLEtBQUssR0FBRztZQUNKLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLEdBQUcsVUFBVSx3RUFBd0UsQ0FDeEYsQ0FBQTtRQUVMLEtBQUssR0FBRztZQUNKLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLEdBQUcsVUFBVSxJQUFJLE9BQU8sRUFBRSxDQUM3QixDQUFBO1FBRUwsS0FBSyxHQUFHO1lBQ0osTUFBTSxJQUFJLG1CQUFXLENBQ2pCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFDN0IsR0FBRyxVQUFVLG9FQUFvRSxDQUNwRixDQUFBO1FBRUwsS0FBSyxHQUFHLENBQUM7UUFDVCxLQUFLLEdBQUc7WUFDSixNQUFNLElBQUksbUJBQVcsQ0FDakIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixHQUFHLFVBQVUsSUFBSSxPQUFPLEVBQUUsQ0FDN0IsQ0FBQTtRQUVMLEtBQUssR0FBRztZQUNKLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLEdBQUcsVUFBVSxzREFBc0QsQ0FDdEUsQ0FBQTtRQUVMLEtBQUssR0FBRyxDQUFDO1FBQ1QsS0FBSyxHQUFHLENBQUM7UUFDVCxLQUFLLEdBQUcsQ0FBQztRQUNULEtBQUssR0FBRztZQUNKLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsR0FBRyxVQUFVLDZCQUE2QixVQUFVLDRCQUE0QixDQUNuRixDQUFBO1FBRUw7WUFDSSx5Q0FBeUM7WUFDekMsSUFBSSxVQUFVLEVBQUUsSUFBSSxLQUFLLGNBQWMsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksbUJBQVcsQ0FDakIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLEdBQUcsVUFBVSxrREFBa0QsQ0FDbEUsQ0FBQTtZQUNMLENBQUM7WUFFRCxJQUFJLFVBQVUsRUFBRSxJQUFJLEtBQUssV0FBVyxJQUFJLFVBQVUsRUFBRSxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQzFFLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsR0FBRyxVQUFVLHlFQUF5RSxDQUN6RixDQUFBO1lBQ0wsQ0FBQztZQUVELE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsR0FBRyxVQUFVLElBQUksT0FBTyxFQUFFLENBQzdCLENBQUE7SUFDVCxDQUFDO0FBQ0wsQ0FBQyJ9
@@ -7,6 +7,7 @@ const axios_1 = __importDefault(require("axios"));
7
7
  const utils_1 = require("@medusajs/utils");
8
8
  const authenticate_1 = require("./methods/authenticate");
9
9
  const handle_error_1 = require("./handle-error");
10
+ const DEFAULT_TIMEOUT = 15000; // 15 seconds
10
11
  class ShiprocketClient {
11
12
  constructor(options) {
12
13
  this.token = null;
@@ -20,9 +21,9 @@ class ShiprocketClient {
20
21
  this.axios = axios_1.default.create({
21
22
  baseURL: "https://apiv2.shiprocket.in/v1/external",
22
23
  headers: { "Content-Type": "application/json" },
23
- timeout: 10000,
24
+ timeout: options.timeout || DEFAULT_TIMEOUT,
24
25
  });
25
- // Interceptor to handle 401 Unauthorized automatically
26
+ // Interceptor to handle 401 Unauthorized - auto-refresh token
26
27
  this.axios.interceptors.response.use((response) => response, async (error) => {
27
28
  const originalRequest = error.config;
28
29
  if (error.response?.status === 401 &&
@@ -57,36 +58,46 @@ class ShiprocketClient {
57
58
  await this.refreshToken();
58
59
  }
59
60
  }
61
+ /**
62
+ * Calculate shipping rate for a route
63
+ */
60
64
  async calculate(data) {
61
65
  await this.ensureToken();
62
66
  try {
63
67
  const response = await this.axios.get("/courier/serviceability/", { params: data });
64
68
  const availableCouriers = response.data.data.available_courier_companies;
65
69
  if (!availableCouriers?.length) {
66
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "No couriers available for this route");
70
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `No couriers available for route ${data.pickup_postcode} -> ${data.delivery_postcode}`);
67
71
  }
72
+ // Filter by allowed courier IDs if specified
68
73
  const filtered = data.allowed_courier_ids?.length
69
74
  ? availableCouriers.filter((c) => data.allowed_courier_ids.includes(c.id))
70
75
  : availableCouriers;
71
76
  if (!filtered?.length) {
72
77
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "No allowed couriers available for this route");
73
78
  }
79
+ // Return cheapest rate
74
80
  const cheapest = filtered.reduce((min, curr) => Number(curr.rate) < Number(min.rate) ? curr : min);
75
81
  return Math.ceil(Number(cheapest?.rate) || 0);
76
82
  }
77
83
  catch (error) {
78
- (0, handle_error_1.handleError)(error);
79
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Rate calculation failed unexpectedly");
84
+ if (error instanceof utils_1.MedusaError)
85
+ throw error;
86
+ (0, handle_error_1.handleError)(error, { operation: "calculate" });
80
87
  }
81
88
  }
89
+ /**
90
+ * Create an order in Shiprocket and assign AWB
91
+ */
82
92
  async create(fulfillment, items, order) {
83
93
  await this.ensureToken();
84
- const req = (val, name) => {
94
+ const require = (val, name) => {
85
95
  if (val === undefined || val === null || val === "") {
86
96
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Missing required field: ${name}`);
87
97
  }
88
98
  return val;
89
99
  };
100
+ // Map order items by ID for quick lookup
90
101
  const orderItemMap = new Map();
91
102
  if (Array.isArray(order.items)) {
92
103
  order.items.forEach((orderItem) => {
@@ -98,7 +109,8 @@ class ShiprocketClient {
98
109
  let totalBreadth = 0;
99
110
  let totalHeight = 0;
100
111
  try {
101
- const order_date = new Date(order.created_at)
112
+ // Format date as DD-MM-YYYY HH:mm
113
+ const orderDate = new Date(order.created_at)
102
114
  .toLocaleString("en-GB", {
103
115
  day: "2-digit", month: "2-digit", year: "numeric",
104
116
  hour: "2-digit", minute: "2-digit", hour12: false,
@@ -106,7 +118,7 @@ class ShiprocketClient {
106
118
  .replace(",", "")
107
119
  .replace(/\//g, "-");
108
120
  // Calculate totals and dimensions
109
- items.forEach((item) => {
121
+ for (const item of items) {
110
122
  const orderItem = orderItemMap.get(item.line_item_id);
111
123
  if (!orderItem) {
112
124
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Order item not found for fulfillment item: ${item.title}`);
@@ -115,47 +127,47 @@ class ShiprocketClient {
115
127
  if (!variant) {
116
128
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Variant data missing for item: ${item.title}`);
117
129
  }
118
- const weight = Number(variant.weight || 0) / 1000;
130
+ const weight = Number(variant.weight || 0) / 1000; // Convert grams to kg
119
131
  const length = Number(variant.length || 0);
120
132
  const breadth = Number(variant.width || 0);
121
133
  const height = Number(variant.height || 0);
122
134
  if (!weight || !length || !breadth || !height) {
123
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Missing dimensions/weight for item "${item.title}". Please update product variant settings.`);
135
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Missing dimensions/weight for "${item.title}". Update product variant settings.`);
124
136
  }
125
137
  const quantity = Number(item.quantity || item.raw_quantity?.value || 1);
126
138
  totalWeight += weight * quantity;
127
139
  totalLength = Math.max(totalLength, length);
128
140
  totalBreadth = Math.max(totalBreadth, breadth);
129
141
  totalHeight += height * quantity;
130
- });
142
+ }
131
143
  const shipping = order.shipping_address || fulfillment?.delivery_address || {};
132
144
  const billing = order.billing_address || order.customer || {};
133
- // Build Order Payload with STRICT validation
145
+ // Build order payload
134
146
  const orderData = {
135
- order_id: `${order.id}-${Math.floor(Date.now() / 1000)}`, // Safer randomness
136
- order_date,
147
+ order_id: `${order.id}-${Math.floor(Date.now() / 1000)}`,
148
+ order_date: orderDate,
137
149
  pickup_location: this.pickup_location || "Primary",
138
- billing_customer_name: req(billing.first_name, "Billing First Name"),
150
+ billing_customer_name: require(billing.first_name, "Billing First Name"),
139
151
  billing_last_name: billing.last_name || "",
140
- billing_address: req(shipping.address_1 || billing.address_1, "Billing Address 1"),
152
+ billing_address: require(shipping.address_1 || billing.address_1, "Billing Address"),
141
153
  billing_address_2: shipping.address_2 || billing.address_2 || "",
142
- billing_city: req(shipping.city || billing.city, "Billing City"),
143
- billing_pincode: Number(req(shipping.postal_code || billing.postal_code, "Billing Pincode")),
144
- billing_state: req(shipping.province || billing.province, "Billing State"),
145
- billing_country: req(shipping.country_code || billing.country_code || "IN", "Billing Country"),
146
- billing_email: req(billing.email || order.email, "Billing Email"),
147
- billing_phone: Number(req(shipping.phone || billing.phone, "Billing Phone").toString().replace(/[^0-9]/g, "")),
154
+ billing_city: require(shipping.city || billing.city, "Billing City"),
155
+ billing_pincode: Number(require(shipping.postal_code || billing.postal_code, "Billing Pincode")),
156
+ billing_state: require(shipping.province || billing.province, "Billing State"),
157
+ billing_country: require(shipping.country_code || billing.country_code || "IN", "Billing Country"),
158
+ billing_email: require(billing.email || order.email, "Billing Email"),
159
+ billing_phone: Number(require(shipping.phone || billing.phone, "Billing Phone").toString().replace(/[^0-9]/g, "")),
148
160
  shipping_is_billing: true,
149
- shipping_customer_name: req(shipping.first_name, "Shipping First Name"),
161
+ shipping_customer_name: require(shipping.first_name, "Shipping First Name"),
150
162
  shipping_last_name: shipping.last_name || "",
151
- shipping_address: req(shipping.address_1, "Shipping Address 1"),
163
+ shipping_address: require(shipping.address_1, "Shipping Address"),
152
164
  shipping_address_2: shipping.address_2 || "",
153
- shipping_city: req(shipping.city, "Shipping City"),
154
- shipping_pincode: Number(req(shipping.postal_code, "Shipping Pincode")),
155
- shipping_country: req(shipping.country_code || "IN", "Shipping Country"),
156
- shipping_state: req(shipping.province, "Shipping State"),
157
- shipping_email: req(billing.email || order.email, "Shipping Email"),
158
- shipping_phone: Number(req(shipping.phone, "Shipping Phone").toString().replace(/[^0-9]/g, "")),
165
+ shipping_city: require(shipping.city, "Shipping City"),
166
+ shipping_pincode: Number(require(shipping.postal_code, "Shipping Pincode")),
167
+ shipping_country: require(shipping.country_code || "IN", "Shipping Country"),
168
+ shipping_state: require(shipping.province, "Shipping State"),
169
+ shipping_email: require(billing.email || order.email, "Shipping Email"),
170
+ shipping_phone: Number(require(shipping.phone, "Shipping Phone").toString().replace(/[^0-9]/g, "")),
159
171
  order_items: items.map((item) => {
160
172
  const orderItem = orderItemMap.get(item.line_item_id);
161
173
  const variant = orderItem.variant;
@@ -182,30 +194,31 @@ class ShiprocketClient {
182
194
  height: totalHeight,
183
195
  weight: totalWeight,
184
196
  };
197
+ // Create order
185
198
  const orderCreated = await this.axios
186
199
  .post("/orders/create/adhoc", orderData)
187
200
  .catch((err) => {
188
- // Extract deep error message if available
189
- const apiError = err;
190
- const firstError = apiError.response?.data?.errors
191
- ? Object.values(apiError.response.data.errors)[0][0]
192
- : err.message;
193
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Shiprocket Error: ${firstError}`);
201
+ const apiError = err?.response?.data?.errors;
202
+ if (apiError) {
203
+ const firstError = Object.values(apiError)[0];
204
+ const msg = Array.isArray(firstError) ? firstError[0] : firstError;
205
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Shiprocket: ${msg}`);
206
+ }
207
+ throw err;
194
208
  });
195
209
  if (!orderCreated.data?.shipment_id) {
196
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Failed to create Shiprocket order: No shipment ID returned");
210
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Shiprocket order created but no shipment ID returned");
197
211
  }
198
212
  // Assign AWB
199
- const awbCreated = await this.axios.post(`/courier/assign/awb`, {
200
- shipment_id: orderCreated.data.shipment_id,
201
- });
213
+ const awbPayload = { shipment_id: orderCreated.data.shipment_id };
214
+ const awbCreated = await this.axios.post("/courier/assign/awb", awbPayload);
202
215
  if (awbCreated.data.awb_assign_status !== 1) {
203
- // Try to cancel if AWB fails to avoid stuck orders
216
+ // Cancel order to avoid stuck state
204
217
  try {
205
218
  await this.cancel(orderCreated.data.order_id);
206
219
  }
207
- catch (e) { /* ignore */ }
208
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, awbCreated.data.message || "AWB assignment failed");
220
+ catch { /* ignore */ }
221
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, awbCreated.data.message || "AWB assignment failed - no courier available");
209
222
  }
210
223
  const responseData = awbCreated.data.response.data;
211
224
  return {
@@ -218,19 +231,26 @@ class ShiprocketClient {
218
231
  };
219
232
  }
220
233
  catch (error) {
221
- (0, handle_error_1.handleError)(error);
222
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Order creation failed");
234
+ if (error instanceof utils_1.MedusaError)
235
+ throw error;
236
+ (0, handle_error_1.handleError)(error, { operation: "create", orderId: order?.id });
223
237
  }
224
238
  }
239
+ /**
240
+ * Cancel an order in Shiprocket
241
+ */
225
242
  async cancel(orderId) {
226
243
  await this.ensureToken();
227
244
  try {
228
- await this.axios.post(`/orders/cancel`, { ids: [orderId] });
245
+ await this.axios.post("/orders/cancel", { ids: [orderId] });
229
246
  }
230
247
  catch (error) {
231
- (0, handle_error_1.handleError)(error);
248
+ (0, handle_error_1.handleError)(error, { operation: "cancel", orderId });
232
249
  }
233
250
  }
251
+ /**
252
+ * Get tracking information for a shipment
253
+ */
234
254
  async getTrackingInfo(trackingNumber) {
235
255
  await this.ensureToken();
236
256
  try {
@@ -238,19 +258,17 @@ class ShiprocketClient {
238
258
  return response.data;
239
259
  }
240
260
  catch (error) {
241
- (0, handle_error_1.handleError)(error);
242
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Tracking failed");
261
+ (0, handle_error_1.handleError)(error, { operation: "tracking" });
243
262
  }
244
263
  }
264
+ /**
265
+ * Create a return order in Shiprocket
266
+ */
245
267
  async createReturn(fulfillment) {
246
268
  await this.ensureToken();
247
- // Implementation of Return Order
248
- // Note: Shiprocket Return API requires specific fields.
249
- // We assume 'fulfillment' contains necessary return details linked to the original order.
250
269
  const returnData = {
251
270
  order_id: `${fulfillment.id}-${Math.floor(Date.now() / 1000)}`,
252
- order_date: new Date().toISOString().split('T')[0],
253
- cannel_id: "", // Optional
271
+ order_date: new Date().toISOString().split("T")[0],
254
272
  pickup_customer_name: fulfillment.pickup_address?.first_name,
255
273
  pickup_last_name: fulfillment.pickup_address?.last_name || "",
256
274
  pickup_address: fulfillment.pickup_address?.address_1,
@@ -261,35 +279,40 @@ class ShiprocketClient {
261
279
  pickup_pincode: fulfillment.pickup_address?.postal_code,
262
280
  pickup_email: fulfillment.email,
263
281
  pickup_phone: fulfillment.pickup_address?.phone,
264
- order_items: fulfillment.items.map((item) => ({
282
+ order_items: fulfillment.items?.map((item) => ({
265
283
  name: item.title,
266
284
  sku: item.sku,
267
285
  units: item.quantity,
268
286
  selling_price: item.unit_price,
269
287
  discount: "",
270
- qc_enable: false // default false
271
- })),
288
+ qc_enable: false,
289
+ })) || [],
272
290
  payment_method: "Prepaid",
273
291
  total_discount: "0",
274
292
  sub_total: fulfillment.sub_total || 0,
275
- length: 10, breadth: 10, height: 10, weight: 0.5 // defaults if missing on return items
293
+ length: 10,
294
+ breadth: 10,
295
+ height: 10,
296
+ weight: 0.5,
276
297
  };
277
298
  try {
278
- const response = await this.axios.post(`/orders/create/return`, returnData);
299
+ const response = await this.axios.post("/orders/create/return", returnData);
279
300
  return response.data;
280
301
  }
281
302
  catch (error) {
282
- (0, handle_error_1.handleError)(error);
283
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Failed to create return order");
303
+ (0, handle_error_1.handleError)(error, { operation: "createReturn" });
284
304
  }
285
305
  }
306
+ /**
307
+ * Generate documents (manifest, label, invoice) for a shipment
308
+ */
286
309
  async createDocuments(fulfillment) {
287
310
  await this.ensureToken();
288
- const createPromise = (url, params) => this.axios.get(url, { params }).catch(() => ({ data: null })); // Return null on fail to not break all
311
+ const safeGet = (url, params) => this.axios.get(url, { params }).catch(() => ({ data: null }));
289
312
  const [manifestRes, labelRes, invoiceRes] = await Promise.all([
290
- createPromise(`/manifests/generate`, { order_ids: [fulfillment.shipment_id] }),
291
- createPromise(`/courier/generate/label`, { shipment_id: [fulfillment.shipment_id] }),
292
- createPromise(`/orders/print/invoice`, { ids: [fulfillment.order_id] })
313
+ safeGet("/manifests/generate", { order_ids: [fulfillment.shipment_id] }),
314
+ safeGet("/courier/generate/label", { shipment_id: [fulfillment.shipment_id] }),
315
+ safeGet("/orders/print/invoice", { ids: [fulfillment.order_id] }),
293
316
  ]);
294
317
  const extractUrl = (res, key, checkKey, checkVal) => {
295
318
  if (!res?.data)
@@ -305,20 +328,36 @@ class ShiprocketClient {
305
328
  invoice: extractUrl(invoiceRes, "invoice_url", "is_invoice_created", true),
306
329
  };
307
330
  }
331
+ /**
332
+ * Generate label for a shipment
333
+ */
308
334
  async generateLabel(fulfillment) {
309
335
  await this.ensureToken();
310
- const res = await this.axios.get(`/courier/generate/label`, {
311
- params: { shipment_id: [fulfillment.shipment_id] }
312
- });
313
- return res.data?.[0]?.label_url || "";
336
+ try {
337
+ const res = await this.axios.get("/courier/generate/label", {
338
+ params: { shipment_id: [fulfillment.shipment_id] },
339
+ });
340
+ return res.data?.[0]?.label_url || "";
341
+ }
342
+ catch {
343
+ return "";
344
+ }
314
345
  }
346
+ /**
347
+ * Generate invoice for an order
348
+ */
315
349
  async generateInvoice(fulfillment) {
316
350
  await this.ensureToken();
317
- const res = await this.axios.get(`/orders/print/invoice`, {
318
- params: { ids: [fulfillment.order_id] }
319
- });
320
- return res.data?.[0]?.invoice_url || "";
351
+ try {
352
+ const res = await this.axios.get("/orders/print/invoice", {
353
+ params: { ids: [fulfillment.order_id] },
354
+ });
355
+ return res.data?.[0]?.invoice_url || "";
356
+ }
357
+ catch {
358
+ return "";
359
+ }
321
360
  }
322
361
  }
323
362
  exports.default = ShiprocketClient;
324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3NoaXByb2NrZXQvY2xpZW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTRDO0FBQzVDLDJDQUE2QztBQUM3Qyx5REFBcUQ7QUFDckQsaURBQTRDO0FBVTVDLE1BQXFCLGdCQUFnQjtJQVFqQyxZQUFZLE9BQWdDO1FBSHBDLFVBQUssR0FBa0IsSUFBSSxDQUFBO1FBQzNCLGVBQVUsR0FBRyxLQUFLLENBQUE7UUFHdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLG1CQUFXLENBQ2pCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIseUNBQXlDLENBQzVDLENBQUE7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFBO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQTtRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUE7UUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxlQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3RCLE9BQU8sRUFBRSx5Q0FBeUM7WUFDbEQsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1lBQy9DLE9BQU8sRUFBRSxLQUFLO1NBQ2pCLENBQUMsQ0FBQTtRQUVGLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNoQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUN0QixLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDWixNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFBO1lB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
363
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3NoaXByb2NrZXQvY2xpZW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTRDO0FBQzVDLDJDQUE2QztBQUM3Qyx5REFBcUQ7QUFDckQsaURBQTRDO0FBVTVDLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQSxDQUFDLGFBQWE7QUFFM0MsTUFBcUIsZ0JBQWdCO0lBUWpDLFlBQVksT0FBZ0M7UUFIcEMsVUFBSyxHQUFrQixJQUFJLENBQUE7UUFDM0IsZUFBVSxHQUFHLEtBQUssQ0FBQTtRQUd0QixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksbUJBQVcsQ0FDakIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix5Q0FBeUMsQ0FDNUMsQ0FBQTtRQUNMLENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUE7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFBO1FBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQTtRQUU5QyxJQUFJLENBQUMsS0FBSyxHQUFHLGVBQUssQ0FBQyxNQUFNLENBQUM7WUFDdEIsT0FBTyxFQUFFLHlDQUF5QztZQUNsRCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7WUFDL0MsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUksZUFBZTtTQUM5QyxDQUFDLENBQUE7UUFFRiw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FDaEMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFDdEIsS0FBSyxF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
@@ -1,38 +1,37 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.authenticate = void 0;
3
+ exports.authenticate = authenticate;
4
4
  const utils_1 = require("@medusajs/utils");
5
5
  const handle_error_1 = require("../handle-error");
6
6
  /**
7
7
  * Authenticates with the Shiprocket API to get a token.
8
- * @param axios - The Axios instance to use for the request.
9
- * @param email - The user's email.
10
- * @param password - The user's password.
11
- * @param isDisposed - Whether the client is disposed.
12
- * @returns The authentication token and its expiry time.
8
+ * Token is valid for 10 days per Shiprocket docs.
13
9
  */
14
- const authenticate = async (axios, email, password, isDisposed) => {
10
+ async function authenticate(axios, email, password, isDisposed) {
15
11
  if (isDisposed) {
16
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Cannot authenticate disposed client");
12
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Cannot authenticate: client is disposed");
17
13
  }
18
14
  try {
19
15
  const response = await axios.post("/auth/login", {
20
16
  email,
21
17
  password,
22
18
  });
23
- if (!response.data.token) {
24
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No token received in authentication response");
19
+ if (!response.data?.token) {
20
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Shiprocket authentication failed: no token received");
25
21
  }
26
22
  return {
27
23
  token: response.data.token,
28
- // Token valid for 10 days, refresh after 8
24
+ // Token valid for 10 days, refresh proactively after 8 days
29
25
  tokenExpiry: Date.now() + 8 * 24 * 60 * 60 * 1000,
30
26
  };
31
27
  }
32
28
  catch (error) {
33
- (0, handle_error_1.handleError)(error);
34
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Authentication failed unexpectedly");
29
+ // If it's already a MedusaError, rethrow it
30
+ if (error instanceof utils_1.MedusaError) {
31
+ throw error;
32
+ }
33
+ // Otherwise, let handleError process the API error
34
+ (0, handle_error_1.handleError)(error, { operation: "authenticate" });
35
35
  }
36
- };
37
- exports.authenticate = authenticate;
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9zaGlwcm9ja2V0L2NsaWVudC9tZXRob2RzL2F1dGhlbnRpY2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBNkM7QUFFN0Msa0RBQTZDO0FBRzdDOzs7Ozs7O0dBT0c7QUFDSSxNQUFNLFlBQVksR0FBRyxLQUFLLEVBQzdCLEtBQW9CLEVBQ3BCLEtBQWEsRUFDYixRQUFnQixFQUNoQixVQUFtQixFQUM0QixFQUFFO0lBQ2pELElBQUksVUFBVSxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksbUJBQVcsQ0FDakIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLHFDQUFxQyxDQUN4QyxDQUFBO0lBQ0wsQ0FBQztJQUVELElBQUksQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBeUIsYUFBYSxFQUFFO1lBQ3JFLEtBQUs7WUFDTCxRQUFRO1NBQ1gsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLG1CQUFXLENBQ2pCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsOENBQThDLENBQ2pELENBQUE7UUFDTCxDQUFDO1FBRUQsT0FBTztZQUNILEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFDMUIsMkNBQTJDO1lBQzNDLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7U0FDcEQsQ0FBQTtJQUNMLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2IsSUFBQSwwQkFBVyxFQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2xCLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsb0NBQW9DLENBQ3ZDLENBQUE7SUFDTCxDQUFDO0FBQ0wsQ0FBQyxDQUFBO0FBdENZLFFBQUEsWUFBWSxnQkFzQ3hCIn0=
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9zaGlwcm9ja2V0L2NsaWVudC9tZXRob2RzL2F1dGhlbnRpY2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVNBLG9DQXVDQztBQWhERCwyQ0FBNkM7QUFFN0Msa0RBQTZDO0FBRzdDOzs7R0FHRztBQUNJLEtBQUssVUFBVSxZQUFZLENBQzlCLEtBQW9CLEVBQ3BCLEtBQWEsRUFDYixRQUFnQixFQUNoQixVQUFtQjtJQUVuQixJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLG1CQUFXLENBQ2pCLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyx5Q0FBeUMsQ0FDNUMsQ0FBQTtJQUNMLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQXlCLGFBQWEsRUFBRTtZQUNyRSxLQUFLO1lBQ0wsUUFBUTtTQUNYLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHFEQUFxRCxDQUN4RCxDQUFBO1FBQ0wsQ0FBQztRQUVELE9BQU87WUFDSCxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQzFCLDREQUE0RDtZQUM1RCxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO1NBQ3BELENBQUE7SUFDTCxDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN0Qiw0Q0FBNEM7UUFDNUMsSUFBSSxLQUFLLFlBQVksbUJBQVcsRUFBRSxDQUFDO1lBQy9CLE1BQU0sS0FBSyxDQUFBO1FBQ2YsQ0FBQztRQUNELG1EQUFtRDtRQUNuRCxJQUFBLDBCQUFXLEVBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUE7SUFDckQsQ0FBQztBQUNMLENBQUMifQ==
@@ -6,10 +6,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const utils_1 = require("@medusajs/framework/utils");
7
7
  const client_1 = __importDefault(require("./client"));
8
8
  class ShipRocketFulfillmentProviderService extends utils_1.AbstractFulfillmentProviderService {
9
+ /**
10
+ * Validates the plugin options at startup.
11
+ * @param options - The plugin configuration options
12
+ * @throws Error if required options are missing
13
+ */
14
+ static validateOptions(options) {
15
+ if (!options.email || typeof options.email !== "string") {
16
+ throw new Error("Shiprocket plugin requires 'email' option (API user email)");
17
+ }
18
+ if (!options.password || typeof options.password !== "string") {
19
+ throw new Error("Shiprocket plugin requires 'password' option (API user password)");
20
+ }
21
+ // Validate pickup_location if provided
22
+ if (options.pickup_location && typeof options.pickup_location !== "string") {
23
+ throw new Error("Shiprocket 'pickup_location' option must be a string");
24
+ }
25
+ }
9
26
  /**
10
27
  * Constructs a new instance of the ShipRocketFulfillmentProviderService.
11
- * @param {Logger} logger - The logger instance.
12
- * @param {Options} options - The options for the Shiprocket client.
13
28
  */
14
29
  constructor({ logger }, options) {
15
30
  super();
@@ -19,21 +34,22 @@ class ShipRocketFulfillmentProviderService extends utils_1.AbstractFulfillmentPr
19
34
  email: options.email,
20
35
  password: options.password,
21
36
  pickup_location: options.pickup_location,
37
+ timeout: options.timeout,
22
38
  });
39
+ this.logger_.info("Shiprocket fulfillment provider initialized");
23
40
  }
24
41
  /**
25
42
  * Returns the fulfillment options for Shiprocket.
26
- * @returns An array of fulfillment options.
27
43
  */
28
44
  async getFulfillmentOptions() {
29
45
  return [
30
46
  {
31
- id: "Standard Shipping",
47
+ id: "shiprocket-standard",
32
48
  name: "Standard Shipping",
33
49
  is_return: false,
34
50
  },
35
51
  {
36
- id: "Return Shipping",
52
+ id: "shiprocket-return",
37
53
  name: "Return Shipping",
38
54
  is_return: true,
39
55
  },
@@ -41,35 +57,41 @@ class ShipRocketFulfillmentProviderService extends utils_1.AbstractFulfillmentPr
41
57
  }
42
58
  /**
43
59
  * Determines whether the fulfillment option can calculate the shipping rate.
44
- * @param data - The fulfillment option data.
45
- * @returns A promise that resolves to a boolean indicating whether the option can calculate the rate.
46
60
  */
47
- async canCalculate(data) {
61
+ async canCalculate(_data) {
48
62
  return true;
49
63
  }
50
64
  /**
51
65
  * Calculates the shipping rate for a given order.
52
- * @param optionData - The fulfillment option data.
53
- * @param data - The fulfillment data.
54
- * @param context - The fulfillment context.
55
- * @returns The calculated shipping rate.
56
- * @throws {Error} If either pickup or delivery postcodes are missing.
57
- * @throws {Error} If weight is missing.
58
66
  */
59
- async calculatePrice(optionData, data, context) {
60
- const params = {
61
- pickup_postcode: context["from_location"]?.address?.postal_code,
62
- delivery_postcode: context["shipping_address"]?.postal_code,
63
- weight: (context["items"]?.[0]?.metadata?.weight),
64
- cod: (this.options_.cod !== "true") ? 0 : 1,
65
- };
66
- if (!params.pickup_postcode || !params.delivery_postcode) {
67
- throw new Error("Both pickup and delivery postcodes are required for rate calculation.");
67
+ async calculatePrice(_optionData, _data, context) {
68
+ const pickupPostcode = context["from_location"]?.address?.postal_code;
69
+ const deliveryPostcode = context["shipping_address"]?.postal_code;
70
+ if (!pickupPostcode) {
71
+ this.logger_.warn("Shiprocket: Missing pickup postcode. Ensure a Stock Location with an address is linked to the Sales Channel.");
72
+ }
73
+ if (!pickupPostcode || !deliveryPostcode) {
74
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Both pickup and delivery postcodes are required for rate calculation");
68
75
  }
69
- if (!params.weight) {
70
- throw new Error("Weight is required for rate calculation.");
76
+ // Calculate total weight from items
77
+ const items = (context["items"] || []);
78
+ let totalWeightGrams = 0;
79
+ for (const item of items) {
80
+ const quantity = item.quantity || 1;
81
+ const itemWeight = item.variant?.weight ?? item.metadata?.weight ?? 0;
82
+ totalWeightGrams += itemWeight * quantity;
71
83
  }
84
+ // Convert to kg, default to 0.5kg if no weight set
85
+ const weightKg = totalWeightGrams > 0 ? totalWeightGrams / 1000 : 0.5;
86
+ const params = {
87
+ pickup_postcode: pickupPostcode,
88
+ delivery_postcode: deliveryPostcode,
89
+ weight: weightKg,
90
+ cod: (this.options_.cod === "true" || this.options_.cod === 1) ? 1 : 0,
91
+ };
92
+ this.logger_.debug(`Shiprocket: Calculating rate for ${pickupPostcode} -> ${deliveryPostcode}, weight: ${weightKg}kg`);
72
93
  const price = await this.client.calculate(params);
94
+ this.logger_.debug(`Shiprocket: Calculated rate: ${price}`);
73
95
  return {
74
96
  calculated_amount: price,
75
97
  is_calculated_price_tax_inclusive: true,
@@ -77,15 +99,14 @@ class ShipRocketFulfillmentProviderService extends utils_1.AbstractFulfillmentPr
77
99
  }
78
100
  /**
79
101
  * Creates a fulfillment in Shiprocket.
80
- * @param data - The fulfillment data.
81
- * @param items - The items in the fulfillment.
82
- * @param order - The order associated with the fulfillment.
83
- * @param fulfillment - The fulfillment data.
84
- * @returns The created fulfillment data.
85
102
  */
86
103
  async createFulfillment(data, items, order, fulfillment) {
104
+ const orderId = order?.id || "unknown";
105
+ this.logger_.info(`Shiprocket: Creating fulfillment for order ${orderId}`);
87
106
  try {
88
107
  const externalData = await this.client.create(fulfillment, items, order);
108
+ this.logger_.info(`Shiprocket: Fulfillment created - Order ID: ${externalData.order_id}, ` +
109
+ `Shipment ID: ${externalData.shipment_id}, AWB: ${externalData.awb}`);
89
110
  const { label, manifest, invoice } = await this.client.createDocuments(externalData);
90
111
  return {
91
112
  data: {
@@ -97,34 +118,34 @@ class ShipRocketFulfillmentProviderService extends utils_1.AbstractFulfillmentPr
97
118
  tracking_number: externalData.tracking_number || "",
98
119
  tracking_url: externalData.tracking_url || "",
99
120
  label_url: label || "",
100
- // invoice_url: invoice || "", // types might not support this in label object, but okay to omit if not needed
101
121
  },
102
122
  ],
103
123
  };
104
124
  }
105
125
  catch (err) {
106
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, (err?.message || err?.response?.data?.message || "Failed to create fulfillment"));
126
+ this.logger_.error(`Shiprocket: Failed to create fulfillment for order ${orderId}: ${err.message}`);
127
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, err?.message || "Failed to create fulfillment");
107
128
  }
108
129
  }
109
130
  /**
110
131
  * Cancels a fulfillment in Shiprocket.
111
- * @param data - The fulfillment data.
112
- * @throws {MedusaError} If the order ID is not provided.
113
132
  */
114
133
  async cancelFulfillment(data) {
115
- const { order_id } = data;
116
- if (!order_id) {
117
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Order ID is required");
134
+ const orderId = data.order_id;
135
+ if (!orderId) {
136
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Shiprocket order_id is required to cancel fulfillment");
118
137
  }
119
- await this.client.cancel(order_id);
138
+ this.logger_.info(`Shiprocket: Cancelling fulfillment for order ${orderId}`);
139
+ await this.client.cancel(orderId);
140
+ this.logger_.info(`Shiprocket: Fulfillment cancelled for order ${orderId}`);
120
141
  }
121
142
  /**
122
143
  * Creates a return fulfillment in Shiprocket.
123
- * @param fulfillment - The fulfillment data.
124
- * @returns The created return fulfillment data.
125
144
  */
126
145
  async createReturnFulfillment(fulfillment) {
146
+ this.logger_.info(`Shiprocket: Creating return fulfillment`);
127
147
  const externalData = await this.client.createReturn(fulfillment);
148
+ this.logger_.info(`Shiprocket: Return fulfillment created - AWB: ${externalData.awb || externalData.tracking_number}`);
128
149
  return {
129
150
  data: {
130
151
  ...(fulfillment || {}),
@@ -140,65 +161,47 @@ class ShipRocketFulfillmentProviderService extends utils_1.AbstractFulfillmentPr
140
161
  };
141
162
  }
142
163
  /**
143
- * Retrieves the documents associated with a fulfillment.
144
- * @param data - The fulfillment data.
145
- * @returns An array of documents associated with the fulfillment.
146
- */
147
- async getFulfillmentDocuments(data) {
148
- const invoice = await this.client.generateInvoice(data);
149
- return invoice || [];
164
+ * Retrieves the documents associated with a fulfillment.
165
+ */
166
+ async getFulfillmentDocuments(_data) {
167
+ // Shiprocket documents are fetched during fulfillment creation
168
+ return [];
150
169
  }
151
170
  /**
152
171
  * Retrieves the documents associated with a shipment.
153
- * @param data - The shipment data.
154
- * @returns An array of documents associated with the shipment.
155
172
  */
156
- async getShipmentDocuments(data) {
157
- const label = await this.client.generateLabel(data);
158
- return label || [];
173
+ async getShipmentDocuments(_data) {
174
+ // Shiprocket documents are fetched during fulfillment creation
175
+ return [];
159
176
  }
160
177
  /**
161
178
  * Retrieves the documents associated with a return fulfillment.
162
- * @param data - The return fulfillment data.
163
- * @returns An empty array, as document retrieval is not supported for returns.
164
179
  */
165
- async getReturnDocuments(data) {
180
+ async getReturnDocuments(_data) {
166
181
  return [];
167
182
  }
168
183
  /**
169
- * Retrieves the documents associated with a fulfillment, given its data and the type of documents to retrieve.
170
- * @param fulfillmentData - The fulfillment data.
171
- * @param documentType - The type of documents to retrieve.
172
- * @returns A promise that resolves once the documents have been retrieved.
173
- * @remarks Document retrieval is not supported by this provider.
184
+ * Retrieves the documents associated with a fulfillment by type.
174
185
  */
175
- async retrieveDocuments(fulfillmentData, documentType) {
176
- this.logger_.debug("Document retrieval not supported");
186
+ async retrieveDocuments(_fulfillmentData, _documentType) {
187
+ this.logger_.debug("Shiprocket: Document retrieval by type not supported");
177
188
  }
178
189
  /**
179
- * Validates the fulfillment data to ensure it has the required information.
180
- * If the external ID is not present, it will be generated automatically.
181
- * @param optionData - The data provided by the user when creating a fulfillment option.
182
- * @param data - The data provided by the user when creating a fulfillment.
183
- * @param context - The context of the fulfillment.
184
- * @returns A promise that resolves with the validated fulfillment data.
190
+ * Validates the fulfillment data.
185
191
  */
186
- async validateFulfillmentData(optionData, data, context) {
192
+ async validateFulfillmentData(_optionData, data, _context) {
187
193
  return {
188
194
  ...data,
189
- external_id: `temp_${Date.now()}`,
195
+ external_id: `shiprocket_${Date.now()}`,
190
196
  };
191
197
  }
192
198
  /**
193
- * Validates a fulfillment option to ensure it has the required information.
194
- * @param data - The data provided by the user when creating a fulfillment option.
195
- * @returns A promise that resolves with a boolean indicating whether the option is valid.
196
- * @remarks A fulfillment option is valid if it has an external ID.
199
+ * Validates a fulfillment option.
197
200
  */
198
201
  async validateOption(data) {
199
- return data.external_id !== undefined;
202
+ return data.id === "shiprocket-standard" || data.id === "shiprocket-return" || data.external_id !== undefined;
200
203
  }
201
204
  }
202
205
  ShipRocketFulfillmentProviderService.identifier = "shiprocket";
203
206
  exports.default = ShipRocketFulfillmentProviderService;
204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvc2hpcHJvY2tldC9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQTRGO0FBYTVGLHNEQUF3QztBQWF4QyxNQUFNLG9DQUFxQyxTQUFRLDBDQUFrQztJQU9qRjs7OztPQUlHO0lBQ0gsWUFBWSxFQUFFLE1BQU0sRUFBd0IsRUFBRSxPQUFnQjtRQUMxRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQztZQUMvQixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7WUFDcEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZTtTQUMzQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQjtRQUN2QixPQUFPO1lBQ0g7Z0JBQ0ksRUFBRSxFQUFFLG1CQUFtQjtnQkFDdkIsSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsU0FBUyxFQUFFLEtBQUs7YUFDbkI7WUFDRDtnQkFDSSxFQUFFLEVBQUUsaUJBQWlCO2dCQUNyQixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixTQUFTLEVBQUUsSUFBSTthQUNsQjtTQUNKLENBQUM7SUFDTixDQUFDO0lBR0Q7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBNkI7UUFDNUMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNEOzs7Ozs7OztPQVFHO0lBRUgsS0FBSyxDQUFDLGNBQWMsQ0FDaEIsVUFBeUQsRUFDekQsSUFBNkMsRUFDN0MsT0FBbUQ7UUFFbkQsTUFBTSxNQUFNLEdBQUc7WUFD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
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvc2hpcHJvY2tldC9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQTRGO0FBYTVGLHNEQUF3QztBQWN4QyxNQUFNLG9DQUFxQyxTQUFRLDBDQUFrQztJQU9qRjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFnQztRQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFDRCx1Q0FBdUM7UUFDdkMsSUFBSSxPQUFPLENBQUMsZUFBZSxJQUFJLE9BQU8sT0FBTyxDQUFDLGVBQWUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN6RSxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDNUUsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksRUFBRSxNQUFNLEVBQXdCLEVBQUUsT0FBZ0I7UUFDMUQsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZ0JBQWdCLENBQUM7WUFDL0IsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixl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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "medusa-shiprocket-fulfillment-plugin",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Shiprocket Fulfillment Provider Plugin for MedusaJS 2",
5
5
  "author": "SAM-AEL",
6
6
  "homepage": "https://github.com/SAM-AEL",
@@ -9,18 +9,15 @@
9
9
  "files": [
10
10
  ".medusa/server"
11
11
  ],
12
+ "main": ".medusa/server/src/providers/shiprocket/index.js",
12
13
  "exports": {
14
+ ".": "./.medusa/server/src/providers/shiprocket/index.js",
13
15
  "./package.json": "./package.json",
14
16
  "./workflows": "./.medusa/server/src/workflows/index.js",
15
17
  "./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
16
18
  "./modules/*": "./.medusa/server/src/modules/*/index.js",
17
19
  "./providers/*": "./.medusa/server/src/providers/*/index.js",
18
- "./*": "./.medusa/server/src/*.js",
19
- "./admin": {
20
- "import": "./.medusa/server/src/admin/index.mjs",
21
- "require": "./.medusa/server/src/admin/index.js",
22
- "default": "./.medusa/server/src/admin/index.js"
23
- }
20
+ "./*": "./.medusa/server/src/*.js"
24
21
  },
25
22
  "keywords": [
26
23
  "medusa",
@@ -34,6 +31,9 @@
34
31
  "dev": "medusa plugin:develop",
35
32
  "prepublishOnly": "medusa plugin:build"
36
33
  },
34
+ "dependencies": {
35
+ "axios": "^1.7.0"
36
+ },
37
37
  "devDependencies": {
38
38
  "@medusajs/admin-sdk": "2.4.0",
39
39
  "@medusajs/cli": "2.4.0",
@@ -80,4 +80,4 @@
80
80
  "engines": {
81
81
  "node": ">=20"
82
82
  }
83
- }
83
+ }
@@ -1,82 +0,0 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { defineWidgetConfig } from "@medusajs/admin-sdk";
3
- import { Container, Heading, Text } from "@medusajs/ui";
4
- const ShiprocketTrackingWidget = ({ data: order }) => {
5
- var _a;
6
- if (!(order == null ? void 0 : order.id) || !(order == null ? void 0 : order.fulfillments)) return null;
7
- const activeShipments = (_a = order.fulfillments) == null ? void 0 : _a.filter(
8
- (f) => {
9
- var _a2;
10
- return !f.canceled_at && f.data.awb && f.data.shipment_id && ((_a2 = f.provider) == null ? void 0 : _a2.id) === "shiprocket_shiprocket";
11
- }
12
- );
13
- return /* @__PURE__ */ jsxs(Container, { className: "p-6 rounded-lg shadow-lg border border-neutral-700", children: [
14
- /* @__PURE__ */ jsx("header", { className: "mb-6", children: /* @__PURE__ */ jsx(Heading, { level: "h2", className: "font-semibold text-lg text-white", children: "Shiprocket Printables" }) }),
15
- (activeShipments == null ? void 0 : activeShipments.length) === 0 ? /* @__PURE__ */ jsx(Text, { className: "text-sm italic text-gray-400", children: "No active shipments" }) : /* @__PURE__ */ jsx("ul", { className: "space-y-6", children: activeShipments.map((fulfillment) => {
16
- var _a2, _b, _c, _d, _e, _f, _g;
17
- return /* @__PURE__ */ jsxs(
18
- "li",
19
- {
20
- className: "bg-neutral-900/10 rounded-xl shadow-none p-5 flex flex-col gap-4 border border-neutral-900/10",
21
- children: [
22
- /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
23
- /* @__PURE__ */ jsxs(Text, { className: "text-sm text-gray-300 font-normal", children: [
24
- /* @__PURE__ */ jsx("span", { className: "text-xs font-normal text-white", children: "Shipment ID:" }),
25
- " ",
26
- ((_a2 = fulfillment.data) == null ? void 0 : _a2.shipment_id) || "No AWB found"
27
- ] }),
28
- /* @__PURE__ */ jsx("span", { className: `
29
- px-2 py-1 rounded-lg shadow-none text-[9px] font-semibold uppercase select-none
30
- ${fulfillment.status === "delivered" ? "bg-green-500 text-black" : fulfillment.status === "pending" ? "bg-yellow-400 text-black" : "bg-red-700 text-white"}
31
- min-w-[4.5rem] text-center`, children: fulfillment.status || "Cancelled" })
32
- ] }),
33
- JSON.stringify(fulfillment, null, 2),
34
- /* @__PURE__ */ jsxs("div", { className: "flex justify-center items-center gap-3 mt-4", children: [
35
- ((_b = fulfillment.labels) == null ? void 0 : _b.label_url) && /* @__PURE__ */ jsx(
36
- "a",
37
- {
38
- href: `${(_c = fulfillment.labels) == null ? void 0 : _c.label_url}`,
39
- target: "_blank",
40
- rel: "noopener noreferrer",
41
- className: "flex-1 px-4 py-1 text-xs bg-neutral-900/60 font-medium hover:bg-neutral-900/90 rounded-lg transition-colors text-center",
42
- "aria-disabled": "false",
43
- children: "Label"
44
- }
45
- ),
46
- ((_d = fulfillment.labels) == null ? void 0 : _d.manifest_url) && /* @__PURE__ */ jsx(
47
- "a",
48
- {
49
- href: `${(_e = fulfillment.labels) == null ? void 0 : _e.manifest_url}`,
50
- target: "_blank",
51
- rel: "noopener noreferrer",
52
- className: "flex-1 px-4 py-1 text-xs bg-neutral-900/60 font-medium hover:bg-neutral-900/90 rounded-lg transition-colors text-center",
53
- "aria-disabled": "false",
54
- children: "Manifest"
55
- }
56
- ),
57
- ((_f = fulfillment.labels) == null ? void 0 : _f.invoice_url) && /* @__PURE__ */ jsx(
58
- "a",
59
- {
60
- href: `${(_g = fulfillment.labels) == null ? void 0 : _g.invoice_url}`,
61
- target: "_blank",
62
- rel: "noopener noreferrer",
63
- className: "flex-1 px-4 py-1 text-xs bg-neutral-900/60 font-medium hover:bg-neutral-900/90 rounded-lg transition-colors text-center",
64
- "aria-disabled": "false",
65
- children: "Invoice"
66
- }
67
- )
68
- ] })
69
- ]
70
- },
71
- fulfillment.id
72
- );
73
- }) })
74
- ] });
75
- };
76
- const config = defineWidgetConfig({
77
- zone: "order.details.side.after"
78
- });
79
- export {
80
- config,
81
- ShiprocketTrackingWidget as default
82
- };