@lodashventure/medusa-parcel-shipping 0.0.7 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/.medusa/server/api/admin/documents/document-packing-slip-settings/route.js +62 -0
  2. package/.medusa/server/api/admin/documents/packing-slip/preview/route.js +47 -0
  3. package/.medusa/server/api/admin/documents/packing-slip/route.js +112 -0
  4. package/.medusa/server/api/admin/parcel-boxes/[id]/route.js +45 -0
  5. package/.medusa/server/api/admin/parcel-boxes/route.js +49 -0
  6. package/.medusa/server/api/admin/shipping-config/areas/[id]/route.js +42 -0
  7. package/.medusa/server/api/admin/shipping-config/areas/route.js +49 -0
  8. package/.medusa/server/api/admin/shipping-config/rates/[id]/route.js +82 -0
  9. package/.medusa/server/api/admin/shipping-config/rates/route.js +95 -0
  10. package/.medusa/server/api/shipping/distance/route.js +85 -0
  11. package/.medusa/server/api/shipping/distance/utils/zodTransform.js +20 -0
  12. package/.medusa/server/api/store/parcel-box-selector/route.js +55 -0
  13. package/.medusa/server/api/webhooks/tracking/route.js +48 -0
  14. package/.medusa/server/common/types.js +4 -0
  15. package/.medusa/server/common/utils/osrm-client.js +81 -0
  16. package/.medusa/server/common/utils/packing.js +379 -0
  17. package/.medusa/server/{src/modules/parcel-shipping/index.js → index.js} +9 -9
  18. package/.medusa/server/links/index.js +9 -0
  19. package/.medusa/server/links/packing-slip-order.js +13 -0
  20. package/.medusa/server/modules/documents/index.js +24 -0
  21. package/.medusa/server/modules/documents/models/document-invoice.js +20 -0
  22. package/.medusa/server/modules/documents/models/document-packing-slip-settings.js +29 -0
  23. package/.medusa/server/modules/documents/models/document-packing-slip.js +32 -0
  24. package/.medusa/server/modules/documents/models/document-settings.js +32 -0
  25. package/.medusa/server/modules/documents/models/index.js +15 -0
  26. package/.medusa/server/modules/documents/service.js +219 -0
  27. package/.medusa/server/modules/documents/services/generators/invoice-generator.js +73 -0
  28. package/.medusa/server/modules/documents/services/generators/packing-slip-generator.js +73 -0
  29. package/.medusa/server/modules/documents/services/templates/invoices/basic/basic-logo.js +55 -0
  30. package/.medusa/server/modules/documents/services/templates/invoices/basic/basic.js +52 -0
  31. package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/customer-info.js +69 -0
  32. package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/header-for-logo.js +32 -0
  33. package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/header-logo.js +29 -0
  34. package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/header.js +35 -0
  35. package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/hr.js +23 -0
  36. package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/invoice-info.js +35 -0
  37. package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/table.js +97 -0
  38. package/.medusa/server/modules/documents/services/templates/packing-slips/basic/basic.js +52 -0
  39. package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/customer-info-small.js +69 -0
  40. package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/customer-info.js +65 -0
  41. package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/header-small.js +37 -0
  42. package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/header.js +37 -0
  43. package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/hr.js +32 -0
  44. package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/table-items-small.js +44 -0
  45. package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/table-items.js +44 -0
  46. package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/table-order-info-small.js +35 -0
  47. package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/table-order-info.js +36 -0
  48. package/.medusa/server/modules/documents/services/templates/packing-slips/basic/small.js +53 -0
  49. package/.medusa/server/modules/documents/types/api.js +14 -0
  50. package/.medusa/server/modules/documents/types/constants.js +17 -0
  51. package/.medusa/server/modules/documents/types/dto.js +14 -0
  52. package/.medusa/server/modules/documents/types/template-kind.js +25 -0
  53. package/.medusa/server/modules/documents/utils/currency.js +25 -0
  54. package/.medusa/server/providers/company-truck/index.js +10 -0
  55. package/.medusa/server/providers/company-truck/models/company-truck-rate.js +23 -0
  56. package/.medusa/server/{src → providers/company-truck/models}/index.js +4 -8
  57. package/.medusa/server/providers/company-truck/models/parcel-box.js +21 -0
  58. package/.medusa/server/providers/company-truck/models/service-area.js +20 -0
  59. package/.medusa/server/providers/company-truck/service.js +456 -0
  60. package/.medusa/server/{src/modules/parcel-shipping → providers/company-truck}/types.js +1 -1
  61. package/.medusa/server/providers/private-carrier/index.js +10 -0
  62. package/.medusa/server/providers/private-carrier/models/index.js +20 -0
  63. package/.medusa/server/providers/private-carrier/models/parcel-box.js +21 -0
  64. package/.medusa/server/providers/private-carrier/models/private-carrier-rate.js +23 -0
  65. package/.medusa/server/providers/private-carrier/models/service-area.js +20 -0
  66. package/.medusa/server/providers/private-carrier/service.js +392 -0
  67. package/.medusa/server/providers/private-carrier/types.js +3 -0
  68. package/.medusa/server/src/admin/index.js +3 -2
  69. package/.medusa/server/src/admin/index.mjs +3 -2
  70. package/.medusa/server/workflows/assign-packing-slip.js +31 -0
  71. package/.medusa/server/workflows/index.js +9 -0
  72. package/package.json +25 -34
  73. package/.medusa/server/src/api/admin/parcel-boxes/[id]/route.js +0 -47
  74. package/.medusa/server/src/api/admin/parcel-boxes/route.js +0 -48
  75. package/.medusa/server/src/api/admin/shipping-config/areas/[id]/route.js +0 -44
  76. package/.medusa/server/src/api/admin/shipping-config/areas/route.js +0 -48
  77. package/.medusa/server/src/api/admin/shipping-config/rates/[id]/route.js +0 -53
  78. package/.medusa/server/src/api/admin/shipping-config/rates/route.js +0 -55
  79. package/.medusa/server/src/api/store/parcel-box-selector/route.js +0 -53
  80. package/.medusa/server/src/modules/parcel-shipping/migrations/Migration20251015120000.js +0 -70
  81. package/.medusa/server/src/modules/parcel-shipping/models/parcel-box.js +0 -21
  82. package/.medusa/server/src/modules/parcel-shipping/models/service-area.js +0 -20
  83. package/.medusa/server/src/modules/parcel-shipping/models/shipping-rate.js +0 -20
  84. package/.medusa/server/src/modules/parcel-shipping/service.js +0 -172
  85. package/.medusa/server/src/modules/parcel-shipping/utils/packing.js +0 -319
  86. package/.medusa/server/src/providers/company-truck/index.js +0 -19
  87. package/.medusa/server/src/providers/parcel-fulfillment-base.js +0 -180
  88. package/.medusa/server/src/providers/private-carrier/index.js +0 -19
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.GET = void 0;
7
+ const zod_1 = __importDefault(require("zod"));
8
+ const zodTransform_1 = require("./utils/zodTransform");
9
+ const querySchema = zod_1.default.object({
10
+ origin: zod_1.default.string().transform(zodTransform_1.zodTransformStringToLatLng),
11
+ destination: zod_1.default.string().transform(zodTransform_1.zodTransformStringToLatLng),
12
+ weight: zod_1.default.coerce.number().positive(),
13
+ province: zod_1.default.string().optional(),
14
+ postcode: zod_1.default.string().optional(),
15
+ });
16
+ const GET = async (req, res) => {
17
+ const queryValidationResult = querySchema.safeParse(req.query);
18
+ if (!queryValidationResult.success) {
19
+ return res.status(400).json({
20
+ error: "validation_error",
21
+ message: "Invalid query parameters",
22
+ details: JSON.parse(queryValidationResult.error.message),
23
+ });
24
+ }
25
+ try {
26
+ const { origin, destination, weight, province, postcode } = queryValidationResult.data;
27
+ // Convert lat/lng strings to tuples
28
+ const originLatLng = [
29
+ parseFloat(origin[0]),
30
+ parseFloat(origin[1]),
31
+ ];
32
+ const destinationLatLng = [
33
+ parseFloat(destination[0]),
34
+ parseFloat(destination[1]),
35
+ ];
36
+ // Prepare address for carrier selection
37
+ const address = {
38
+ province: province || "",
39
+ postcode: postcode || "",
40
+ country: "TH",
41
+ };
42
+ const fulfillmentService = req.scope.resolve("fulfillmentService");
43
+ // Try company truck first (in service area)
44
+ try {
45
+ const companyTruckProvider = (await fulfillmentService.retrieveProvider("company-truck"));
46
+ const result = await companyTruckProvider.quoteShippingWithDistance(originLatLng, destinationLatLng, address, weight);
47
+ res.json({
48
+ distance_km: result.distance_km,
49
+ carrier: result.method,
50
+ service_area: result.area,
51
+ weight_kg: result.weightKg,
52
+ shipping_cost: result.price,
53
+ currency: result.currency,
54
+ });
55
+ }
56
+ catch (companyTruckError) {
57
+ // If company truck fails (out of service area), try private carrier
58
+ if (companyTruckError.message ===
59
+ "Address is not in company truck service area") {
60
+ const privateCarrierProvider = (await fulfillmentService.retrieveProvider("private-carrier"));
61
+ const result = await privateCarrierProvider.quoteShippingWithDistance(originLatLng, destinationLatLng, address, weight);
62
+ res.json({
63
+ distance_km: result.distance_km,
64
+ carrier: result.method,
65
+ service_area: result.area,
66
+ weight_kg: result.weightKg,
67
+ shipping_cost: result.price,
68
+ currency: result.currency,
69
+ });
70
+ }
71
+ else {
72
+ throw companyTruckError;
73
+ }
74
+ }
75
+ }
76
+ catch (error) {
77
+ console.error("[shipping/distance] Error:", error);
78
+ res.status(error.type === "not_allowed" ? 400 : 500).json({
79
+ error: error.code || "shipping_calculation_error",
80
+ message: error.message || "Unable to calculate shipping cost",
81
+ });
82
+ }
83
+ };
84
+ exports.GET = GET;
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3NoaXBwaW5nL2Rpc3RhbmNlL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLDhDQUFvQjtBQUNwQix1REFBa0U7QUFJbEUsTUFBTSxXQUFXLEdBQUcsYUFBQyxDQUFDLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUUsYUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyx5Q0FBMEIsQ0FBQztJQUN4RCxXQUFXLEVBQUUsYUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyx5Q0FBMEIsQ0FBQztJQUM3RCxNQUFNLEVBQUUsYUFBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDcEMsUUFBUSxFQUFFLGFBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDL0IsUUFBUSxFQUFFLGFBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDaEMsQ0FBQyxDQUFDO0FBRUksTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0scUJBQXFCLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25DLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsS0FBSyxFQUFFLGtCQUFrQjtZQUN6QixPQUFPLEVBQUUsMEJBQTBCO1lBQ25DLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDekQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQ3ZELHFCQUFxQixDQUFDLElBQUksQ0FBQztRQUU3QixvQ0FBb0M7UUFDcEMsTUFBTSxZQUFZLEdBQXFCO1lBQ3JDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QixDQUFDO1FBQ0YsTUFBTSxpQkFBaUIsR0FBcUI7WUFDMUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCLENBQUM7UUFFRix3Q0FBd0M7UUFDeEMsTUFBTSxPQUFPLEdBQUc7WUFDZCxRQUFRLEVBQUUsUUFBUSxJQUFJLEVBQUU7WUFDeEIsUUFBUSxFQUFFLFFBQVEsSUFBSSxFQUFFO1lBQ3hCLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztRQUVGLE1BQU0sa0JBQWtCLEdBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUV4RSw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE1BQU0sa0JBQWtCLENBQUMsZ0JBQWdCLENBQ3JFLGVBQWUsQ0FDaEIsQ0FBb0MsQ0FBQztZQUV0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLG9CQUFvQixDQUFDLHlCQUF5QixDQUNqRSxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxNQUFNLENBQ1AsQ0FBQztZQUVGLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3RCLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDekIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUMxQixhQUFhLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQzNCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTthQUMxQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxpQkFBc0IsRUFBRSxDQUFDO1lBQ2hDLG9FQUFvRTtZQUNwRSxJQUNFLGlCQUFpQixDQUFDLE9BQU87Z0JBQ3pCLDhDQUE4QyxFQUM5QyxDQUFDO2dCQUNELE1BQU0sc0JBQXNCLEdBQzFCLENBQUMsTUFBTSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDeEMsaUJBQWlCLENBQ2xCLENBQXNDLENBQUM7Z0JBRTFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sc0JBQXNCLENBQUMseUJBQXlCLENBQ25FLFlBQVksRUFDWixpQkFBaUIsRUFDakIsT0FBTyxFQUNQLE1BQU0sQ0FDUCxDQUFDO2dCQUVGLEdBQUcsQ0FBQyxJQUFJLENBQUM7b0JBQ1AsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO29CQUMvQixPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU07b0JBQ3RCLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDekIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRO29CQUMxQixhQUFhLEVBQUUsTUFBTSxDQUFDLEtBQUs7b0JBQzNCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtpQkFDMUIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0saUJBQWlCLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztRQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3hELEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLDRCQUE0QjtZQUNqRCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxtQ0FBbUM7U0FDOUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQztBQTVGVyxRQUFBLEdBQUcsT0E0RmQifQ==
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.zodTransformStringToLatLng = void 0;
7
+ const zod_1 = __importDefault(require("zod"));
8
+ const zodTransformStringToLatLng = (latlng, ctx) => {
9
+ const values = latlng.split(",");
10
+ if (values.length !== 2) {
11
+ ctx.addIssue({
12
+ code: zod_1.default.ZodIssueCode.custom,
13
+ message: `latlng should be formatted as "lat,lng"`,
14
+ });
15
+ return zod_1.default.NEVER;
16
+ }
17
+ return values;
18
+ };
19
+ exports.zodTransformStringToLatLng = zodTransformStringToLatLng;
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kVHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwaS9zaGlwcGluZy9kaXN0YW5jZS91dGlscy96b2RUcmFuc2Zvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOENBQW9CO0FBRWIsTUFBTSwwQkFBMEIsR0FBRyxDQUN4QyxNQUFjLEVBQ2QsR0FBb0IsRUFDcEIsRUFBRTtJQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDWCxJQUFJLEVBQUUsYUFBQyxDQUFDLFlBQVksQ0FBQyxNQUFNO1lBQzNCLE9BQU8sRUFBRSx5Q0FBeUM7U0FDbkQsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxhQUFDLENBQUMsS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFkVyxRQUFBLDBCQUEwQiw4QkFjckMifQ==
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const zod_1 = require("zod");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const itemSchema = zod_1.z.object({
7
+ sku: zod_1.z.string().min(1),
8
+ width: zod_1.z.number().positive(),
9
+ length: zod_1.z.number().positive(),
10
+ height: zod_1.z.number().positive(),
11
+ weight: zod_1.z.number().nonnegative(),
12
+ quantity: zod_1.z.number().int().positive(),
13
+ attributes: zod_1.z
14
+ .object({
15
+ noStack: zod_1.z.boolean().optional(),
16
+ })
17
+ .optional(),
18
+ });
19
+ const bodySchema = zod_1.z.object({
20
+ items: zod_1.z.array(itemSchema).min(1),
21
+ shipping_address: zod_1.z.object({
22
+ province: zod_1.z.string().min(1),
23
+ postcode: zod_1.z.string().min(1),
24
+ country: zod_1.z.string().min(1),
25
+ }),
26
+ });
27
+ async function POST(req, res) {
28
+ const fulfillmentService = req.scope.resolve("fulfillmentService");
29
+ const provider = (await fulfillmentService.retrieveProvider("company-truck"));
30
+ try {
31
+ const payload = bodySchema.parse(req.body);
32
+ const result = await provider.quote(payload);
33
+ if (result.success) {
34
+ return res.status(200).json(result);
35
+ }
36
+ return res.status(200).json(result);
37
+ }
38
+ catch (error) {
39
+ if (error instanceof zod_1.ZodError) {
40
+ return res.status(400).json({
41
+ code: "invalid_payload",
42
+ issues: error.issues,
43
+ });
44
+ }
45
+ if (error instanceof utils_1.MedusaError) {
46
+ return res
47
+ .status(error.type === utils_1.MedusaError.Types.NOT_ALLOWED ? 403 : 400)
48
+ .json({
49
+ code: error.message,
50
+ });
51
+ }
52
+ throw error;
53
+ }
54
+ }
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3BhcmNlbC1ib3gtc2VsZWN0b3Ivcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE0QkEsb0JBK0JDO0FBMURELDZCQUFrQztBQUNsQyxxREFBd0Q7QUFHeEQsTUFBTSxVQUFVLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxQixHQUFHLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEIsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDNUIsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLEVBQUU7SUFDaEMsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDckMsVUFBVSxFQUFFLE9BQUM7U0FDVixNQUFNLENBQUM7UUFDTixPQUFPLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtLQUNoQyxDQUFDO1NBQ0QsUUFBUSxFQUFFO0NBQ2QsQ0FBQyxDQUFDO0FBRUgsTUFBTSxVQUFVLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxQixLQUFLLEVBQUUsT0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLGdCQUFnQixFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUM7UUFDekIsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNCLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQixPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDM0IsQ0FBQztDQUNILENBQUMsQ0FBQztBQUVJLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUNoRSxNQUFNLGtCQUFrQixHQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDeEUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxNQUFNLGtCQUFrQixDQUFDLGdCQUFnQixDQUN6RCxlQUFlLENBQ2hCLENBQW9DLENBQUM7SUFFdEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTdDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssWUFBWSxjQUFRLEVBQUUsQ0FBQztZQUM5QixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUMxQixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07YUFDckIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksS0FBSyxZQUFZLG1CQUFXLEVBQUUsQ0FBQztZQUNqQyxPQUFPLEdBQUc7aUJBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssbUJBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztpQkFDaEUsSUFBSSxDQUFDO2dCQUNKLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTzthQUNwQixDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyJ9
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const POST = async (req, res) => {
5
+ try {
6
+ const payload = req.body;
7
+ // TODO: Verify webhook signature if your carrier supports it
8
+ // const isValid = verifyWebhookSignature(payload.signature, req.headers);
9
+ // if (!isValid) {
10
+ // return res.status(401).json({ error: "Invalid signature" });
11
+ // }
12
+ // TODO: Update fulfillment status in database
13
+ // You can use Medusa's fulfillment service to update the fulfillment
14
+ // const fulfillmentService: any = req.scope.resolve("fulfillmentService");
15
+ // await fulfillmentService.updateFulfillmentStatus(
16
+ // payload.tracking_number,
17
+ // payload.status
18
+ // );
19
+ // Log the tracking update
20
+ console.log("[Tracking Webhook] Received update:", {
21
+ tracking_number: payload.tracking_number,
22
+ status: payload.status,
23
+ location: payload.location,
24
+ carrier: payload.carrier,
25
+ timestamp: payload.timestamp,
26
+ });
27
+ // TODO: Send customer notification about tracking update
28
+ // const notificationService = req.scope.resolve("notificationService");
29
+ // await notificationService.send({
30
+ // to: customer.email,
31
+ // template: "tracking-update",
32
+ // data: payload,
33
+ // });
34
+ res.status(200).json({
35
+ success: true,
36
+ message: "Tracking update received",
37
+ });
38
+ }
39
+ catch (error) {
40
+ console.error("[Tracking Webhook] Error processing webhook:", error);
41
+ res.status(500).json({
42
+ error: "internal_error",
43
+ message: error.message,
44
+ });
45
+ }
46
+ };
47
+ exports.POST = POST;
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3dlYmhvb2tzL3RyYWNraW5nL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdDTyxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQThCLENBQUM7UUFFbkQsNkRBQTZEO1FBQzdELDBFQUEwRTtRQUMxRSxrQkFBa0I7UUFDbEIsaUVBQWlFO1FBQ2pFLElBQUk7UUFFSiw4Q0FBOEM7UUFDOUMscUVBQXFFO1FBQ3JFLDJFQUEyRTtRQUMzRSxvREFBb0Q7UUFDcEQsNkJBQTZCO1FBQzdCLG1CQUFtQjtRQUNuQixLQUFLO1FBRUwsMEJBQTBCO1FBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUNBQXFDLEVBQUU7WUFDakQsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlO1lBQ3hDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1lBQ3hCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztTQUM3QixDQUFDLENBQUM7UUFFSCx5REFBeUQ7UUFDekQsd0VBQXdFO1FBQ3hFLG1DQUFtQztRQUNuQyx3QkFBd0I7UUFDeEIsaUNBQWlDO1FBQ2pDLG1CQUFtQjtRQUNuQixNQUFNO1FBRU4sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsMEJBQTBCO1NBQ3BDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsOENBQThDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsS0FBSyxFQUFFLGdCQUFnQjtZQUN2QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQztBQTlDVyxRQUFBLElBQUksUUE4Q2YifQ==
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // Common types shared between providers
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbW9uL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3Q0FBd0MifQ==
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OSRMClient = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ /**
6
+ * Client for interacting with OpenStreetMap Routing Machine (OSRM) API
7
+ * Used to calculate route distances for distance-based shipping pricing
8
+ */
9
+ class OSRMClient {
10
+ constructor(baseUrl = "https://router.project-osrm.org") {
11
+ this.baseUrl = baseUrl;
12
+ }
13
+ /**
14
+ * Calculate the driving distance between two coordinates
15
+ * @param origin - [latitude, longitude] of the origin
16
+ * @param destination - [latitude, longitude] of the destination
17
+ * @returns Distance in kilometers
18
+ */
19
+ async calculateRouteDistance(origin, destination) {
20
+ const [lat1, lng1] = origin;
21
+ const [lat2, lng2] = destination;
22
+ // OSRM expects coordinates in lng,lat format
23
+ const osrmUrl = `${this.baseUrl}/route/v1/driving/${lng1},${lat1};${lng2},${lat2}?overview=false`;
24
+ try {
25
+ const response = await fetch(osrmUrl);
26
+ if (!response.ok) {
27
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `OSRM API returned status ${response.status}: ${response.statusText}`);
28
+ }
29
+ const data = await response.json();
30
+ if (data.code !== "Ok") {
31
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `OSRM API returned error code: ${data.code}`);
32
+ }
33
+ if (!data.routes || data.routes.length === 0) {
34
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No route found between origin and destination coordinates.");
35
+ }
36
+ // Convert meters to kilometers
37
+ const distanceKm = data.routes[0].distance / 1000;
38
+ return Number(distanceKm.toFixed(2));
39
+ }
40
+ catch (error) {
41
+ if (error instanceof utils_1.MedusaError) {
42
+ throw error;
43
+ }
44
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to calculate route distance: ${error.message}`);
45
+ }
46
+ }
47
+ /**
48
+ * Calculate route with additional details (duration, geometry, etc.)
49
+ * @param origin - [latitude, longitude] of the origin
50
+ * @param destination - [latitude, longitude] of the destination
51
+ * @returns Route details including distance and duration
52
+ */
53
+ async calculateRoute(origin, destination) {
54
+ const [lat1, lng1] = origin;
55
+ const [lat2, lng2] = destination;
56
+ const osrmUrl = `${this.baseUrl}/route/v1/driving/${lng1},${lat1};${lng2},${lat2}?overview=false&steps=false`;
57
+ try {
58
+ const response = await fetch(osrmUrl);
59
+ if (!response.ok) {
60
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `OSRM API returned status ${response.status}`);
61
+ }
62
+ const data = await response.json();
63
+ if (data.code !== "Ok" || !data.routes?.length) {
64
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No route found between coordinates");
65
+ }
66
+ const route = data.routes[0];
67
+ return {
68
+ distance_km: Number((route.distance / 1000).toFixed(2)),
69
+ duration_minutes: Number((route.duration / 60).toFixed(0)),
70
+ };
71
+ }
72
+ catch (error) {
73
+ if (error instanceof utils_1.MedusaError) {
74
+ throw error;
75
+ }
76
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to calculate route: ${error.message}`);
77
+ }
78
+ }
79
+ }
80
+ exports.OSRMClient = OSRMClient;
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3NybS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL29zcm0tY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUF3RDtBQWF4RDs7O0dBR0c7QUFDSCxNQUFhLFVBQVU7SUFHckIsWUFBWSxVQUFrQixpQ0FBaUM7UUFDN0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUMxQixNQUF3QixFQUN4QixXQUE2QjtRQUU3QixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUM1QixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUVqQyw2Q0FBNkM7UUFDN0MsTUFBTSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxxQkFBcUIsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxpQkFBaUIsQ0FBQztRQUVsRyxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV0QyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLDRCQUE0QixRQUFRLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FDdEUsQ0FBQztZQUNKLENBQUM7WUFFRCxNQUFNLElBQUksR0FBaUIsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFakQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN2QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENB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