This Shippo API client wrapper was created due to issues with building on edge nodes in the Vercel network due to dynamic code used in the official shippo-node-client (https://github.com/goshippo/shippo-node-client). More details can be found here goshippo/shippo-node-client#94.
Created
November 26, 2023 06:54
-
-
Save robpetty/c9d895220ccdb764c346669258f09e8d to your computer and use it in GitHub Desktop.
Simple Shippo API Client Wrapper
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export default class ShippoClient { | |
private apiToken: string; | |
private basePath: string; | |
protected addresses: string; | |
protected shipments: string; | |
protected transactions: string; | |
constructor(config: any) { | |
this.apiToken = config.api_key; | |
this.basePath = "https://api.goshippo.com"; | |
// set API paths | |
this.addresses = `addresses`; | |
this.shipments = `shipments`; | |
this.transactions = `transactions`; | |
} | |
async request(url = "", config: any = {}) { | |
let response = null; | |
try { | |
if (config.method == "GET") { | |
response = await fetch(url, { | |
method: "GET", | |
headers: { | |
"Content-Type": "application/json", | |
Authorization: `ShippoToken ${this.apiToken}`, | |
}, | |
}); | |
} else if (config.method == "POST") { | |
response = await fetch(url, { | |
method: "POST", | |
headers: { | |
"Content-Type": "application/json", | |
Authorization: `ShippoToken ${this.apiToken}`, | |
}, | |
body: JSON.stringify(config.body), | |
}); | |
} | |
if (response !== null) { | |
if (!response.ok) { | |
console.log(response); | |
throw new Error(`Shippo API error: ${response.statusText}`); | |
} | |
return await response.json(); | |
} | |
} catch (error) { | |
//this.handleApiError(error); | |
throw error; | |
} | |
} | |
async getAddress(addressId: any) { | |
let url = `${this.basePath}/${this.addresses}/${addressId}`; | |
let config = { | |
method: "GET", | |
}; | |
return await this.request(url, config); | |
} | |
async validateAddress(addressId: any) { | |
let url = `${this.basePath}/${this.addresses}/${addressId}/validate`; | |
let config = { | |
method: "GET", | |
}; | |
return await this.request(url, config); | |
} | |
async createAddress(address: any) { | |
let url = `${this.basePath}/${this.addresses}`; | |
let config = { | |
method: "POST", | |
body: address, | |
}; | |
return await this.request(url, config); | |
} | |
async createShippoShipment(addressFrom: any, addressTo: any, parcel: any) { | |
let url = `${this.basePath}/${this.shipments}`; | |
let config = { | |
method: "POST", | |
body: { | |
address_from: addressFrom, | |
address_to: addressTo, | |
parcels: [parcel], | |
async: false, | |
}, | |
}; | |
return await this.request(url, config); | |
} | |
async createShippoTransaction(rateId: string, labelFileType: string) { | |
let url = `${this.basePath}/${this.transactions}`; | |
let config = { | |
method: "POST", | |
body: { | |
rate: rateId, | |
label_file_type: labelFileType, | |
async: false, | |
}, | |
}; | |
return await this.request(url, config); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var addresser = require("addresser"); | |
import ShippoClient from "@/utils/shippo-client/client"; | |
let shippoClient = new ShippoClient({ | |
api_key: process.env.SHIPPO_TEST_TOKEN, | |
}); | |
export function shippoMapAddresserToShippoFormat( | |
name: string, | |
parsedAddress: any, | |
) { | |
let shippoAddress = { | |
name: name, | |
street1: parsedAddress.addressLine1, | |
street2: parsedAddress.addressLine2, | |
city: parsedAddress.placeName, | |
state: parsedAddress.stateAbbreviation, | |
country: "US", | |
zip: parsedAddress.zipCode, | |
}; | |
return shippoAddress; | |
} | |
// TODO: Review and clean up. | |
export async function shippoCreateOrUpdateAddress( | |
displayName: string, | |
address: string, | |
) { | |
//let result = null; | |
// generalized parsing | |
let parsedAddress = addresser.parseAddress(address); | |
// convert to Shippo format, Shippo requires address_to.name | |
parsedAddress = shippoMapAddresserToShippoFormat(displayName, parsedAddress); | |
// must create before you can validate | |
let result = await shippoClient.createAddress(parsedAddress); | |
//let temp = await shippoClient.getAddress(result.object_id); | |
let validAddress = await shippoClient.validateAddress(result.object_id); | |
// To see results from Shippo validating US addresses need to create before validating | |
console.log(validAddress); | |
console.log(result); | |
return result; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment