diff --git a/CHANGELOG.md b/CHANGELOG.md index 744104662..fa938042d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - `ApiKey.delete` - `ApiKey.enable` - `ApiKey.disable` +- Adds a `Tracker.delete` function ## v8.4.0 (2025-11-24) diff --git a/src/services/tracker_service.js b/src/services/tracker_service.js index 11ce7cbca..0282416b0 100644 --- a/src/services/tracker_service.js +++ b/src/services/tracker_service.js @@ -74,4 +74,22 @@ export default (easypostClient) => return Promise.reject(e); } } + + /** + * Delete a {@link Tracker tracker}. + * See {@link https://docs.easypost.com/docs/trackers#delete-a-tracker EasyPost API Documentation} for more information. + * @param {string} id - The ID of the tracker to delete. + * @returns {Promise} + */ + static async delete(id) { + const url = `trackers/${id}`; + + try { + await easypostClient._delete(url); + + return Promise.resolve(); + } catch (e) { + return Promise.reject(e); + } + } }; diff --git a/test/cassettes/Tracker-Service_4233073632/deletes-a-tracker_3282233340/recording.har b/test/cassettes/Tracker-Service_4233073632/deletes-a-tracker_3282233340/recording.har new file mode 100644 index 000000000..174b2f132 --- /dev/null +++ b/test/cassettes/Tracker-Service_4233073632/deletes-a-tracker_3282233340/recording.har @@ -0,0 +1,311 @@ +{ + "log": { + "_recordingName": "Tracker Service/deletes a tracker", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "71df7d97a4b5e028a84d5b53b02adc06", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 44, + "cookies": [], + "headers": [ + { + "name": "accept-encoding", + "value": "gzip, deflate" + }, + { + "name": "accept", + "value": "application/json" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": 44 + }, + { + "name": "host", + "value": "api.easypost.com" + } + ], + "headersSize": 389, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"tracker\":{\"tracking_code\":\"EZ1000000001\"}}" + }, + "queryString": [], + "url": "https://api.easypost.com/v2/trackers" + }, + "response": { + "bodySize": 890, + "content": { + "encoding": "base64", + "mimeType": "application/json; charset=utf-8", + "size": 890, + "text": "{\"id\":\"trk_e2eecd8746c94c2d8e2f863c7b89f233\",\"object\":\"Tracker\",\"mode\":\"test\",\"tracking_code\":\"EZ1000000001\",\"status\":\"pre_transit\",\"status_detail\":\"status_update\",\"created_at\":\"2025-11-05T23:25:43Z\",\"updated_at\":\"2025-11-05T23:25:43Z\",\"signed_by\":null,\"weight\":null,\"est_delivery_date\":\"2025-11-05T23:25:43Z\",\"shipment_id\":null,\"carrier\":\"USPS\",\"tracking_details\":[{\"object\":\"TrackingDetail\",\"message\":\"Pre-Shipment Info Sent to USPS\",\"description\":\"\",\"status\":\"pre_transit\",\"status_detail\":\"status_update\",\"datetime\":\"2025-10-05T23:25:43Z\",\"source\":\"USPS\",\"carrier_code\":\"\",\"tracking_location\":{\"object\":\"TrackingLocation\",\"city\":null,\"state\":null,\"country\":null,\"zip\":null},\"est_delivery_date\":null},{\"object\":\"TrackingDetail\",\"message\":\"Shipping Label Created\",\"description\":\"\",\"status\":\"pre_transit\",\"status_detail\":\"status_update\",\"datetime\":\"2025-10-06T12:02:43Z\",\"source\":\"USPS\",\"carrier_code\":\"\",\"tracking_location\":{\"object\":\"TrackingLocation\",\"city\":\"HOUSTON\",\"state\":\"TX\",\"country\":null,\"zip\":\"77063\"},\"est_delivery_date\":null}],\"carrier_detail\":{\"object\":\"CarrierDetail\",\"service\":\"First-Class Package Service\",\"container_type\":null,\"est_delivery_date_local\":null,\"est_delivery_time_local\":null,\"origin_location\":\"HOUSTON TX, 77001\",\"origin_tracking_location\":{\"object\":\"TrackingLocation\",\"city\":\"HOUSTON\",\"state\":\"TX\",\"country\":null,\"zip\":\"77063\"},\"destination_location\":\"CHARLESTON SC, 29401\",\"destination_tracking_location\":null,\"guaranteed_delivery_date\":null,\"alternate_identifier\":null,\"initial_delivery_attempt\":null},\"delivery_evidence\":[],\"finalized\":true,\"is_return\":false,\"public_url\":\"https://track.easypost.com/djE6dHJrX2UyZWVjZDg3NDZjOTRjMmQ4ZTJmODYzYzdiODlmMjMz\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-xss-protection", + "value": "1; mode=block" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-download-options", + "value": "noopen" + }, + { + "name": "x-permitted-cross-domain-policies", + "value": "none" + }, + { + "name": "referrer-policy", + "value": "strict-origin-when-cross-origin" + }, + { + "name": "x-ep-request-uuid", + "value": "7dd2312e69824551e78983870039247a" + }, + { + "name": "cache-control", + "value": "private, no-cache, no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "location", + "value": "/api/v2/trackers/trk_e2eecd8746c94c2d8e2f863c7b89f233" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "x-runtime", + "value": "0.064605" + }, + { + "name": "content-encoding", + "value": "gzip" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "x-node", + "value": "bigweb65nuq" + }, + { + "name": "x-version-label", + "value": "easypost-202602022215-5a5c93c546-master" + }, + { + "name": "x-backend", + "value": "easypost" + }, + { + "name": "x-proxied", + "value": "intlb3nuq 5f0235a1ab, extlb2nuq cbbd141214" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload" + }, + { + "name": "connection", + "value": "close" + } + ], + "headersSize": 775, + "httpVersion": "HTTP/1.1", + "redirectURL": "/api/v2/trackers/trk_e2eecd8746c94c2d8e2f863c7b89f233", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-02-03T18:58:25.209Z", + "time": 346, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 346 + } + }, + { + "_id": "abf29a88e8c40d8f8c124c71b94274fb", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept-encoding", + "value": "gzip, deflate" + }, + { + "name": "accept", + "value": "application/json" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "host", + "value": "api.easypost.com" + } + ], + "headersSize": 408, + "httpVersion": "HTTP/1.1", + "method": "DELETE", + "queryString": [], + "url": "https://api.easypost.com/v2/trackers/trk_e2eecd8746c94c2d8e2f863c7b89f233" + }, + "response": { + "bodySize": 60, + "content": { + "encoding": "base64", + "mimeType": "application/json; charset=utf-8", + "size": 60, + "text": "{\"success\":true}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-xss-protection", + "value": "1; mode=block" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-download-options", + "value": "noopen" + }, + { + "name": "x-permitted-cross-domain-policies", + "value": "none" + }, + { + "name": "referrer-policy", + "value": "strict-origin-when-cross-origin" + }, + { + "name": "x-ep-request-uuid", + "value": "7dd2313269824551e7898388003924d5" + }, + { + "name": "cache-control", + "value": "private, no-cache, no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "x-runtime", + "value": "0.033756" + }, + { + "name": "content-encoding", + "value": "gzip" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "x-node", + "value": "bigweb43nuq" + }, + { + "name": "x-version-label", + "value": "easypost-202602022215-5a5c93c546-master" + }, + { + "name": "x-backend", + "value": "easypost" + }, + { + "name": "x-canary", + "value": "direct" + }, + { + "name": "x-proxied", + "value": "intlb4nuq 5f0235a1ab, extlb2nuq cbbd141214" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload" + }, + { + "name": "connection", + "value": "close" + } + ], + "headersSize": 728, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-02-03T18:58:25.558Z", + "time": 253, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 253 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/services/tracker.test.js b/test/services/tracker.test.js index ba4b82d31..37e6b643a 100644 --- a/test/services/tracker.test.js +++ b/test/services/tracker.test.js @@ -84,4 +84,13 @@ describe('Tracker Service', function () { expect(tracker).to.be.an.instanceOf(Tracker); }); }); + + it('deletes a tracker', async function () { + const tracker = await client.Tracker.create({ + tracking_code: 'EZ1000000001', + }); + + // Nothing gets returned here, simply ensure no error gets raised + await client.Tracker.delete(tracker.id); + }); }); diff --git a/types/Tracker/Tracker.d.ts b/types/Tracker/Tracker.d.ts index aaefee098..e6ebef418 100644 --- a/types/Tracker/Tracker.d.ts +++ b/types/Tracker/Tracker.d.ts @@ -187,4 +187,14 @@ export declare class Tracker implements ITracker { trackers: Object, pageSize?: number, ): Promise<{ trackers: Tracker[]; has_more: boolean }>; + + /** + * Delete a Tracker. + * + * @see https://docs.easypost.com/docs/trackers#delete-a-tracker + * + * @param {string} id - The id of the tracker to delete, starts with "trk_" + * @returns {Promise} + */ + static delete(id: string): Promise; }