@heuristical/trackit
Version:
This module allows you to connect to many shipping carriers like UPS and FedEx and download tracking data for your packages in a common schema
201 lines • 7.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
// TODO: This file was created by bulk-decaffeinate.
// Sanity-check the conversion and remove this comment.
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* DS202: Simplify dynamic range loops
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
const change_case_1 = require("change-case");
const underscore_1 = require("underscore");
const checkdigit_1 = require("./checkdigit");
function _preprocess(trk) {
return change_case_1.upperCase(trk.replace(/\s+/g, ''));
}
function _confirmUps(trk) {
let sum = 0;
for (let index = 2; index <= 16; index++) {
let num;
const asciiValue = trk[index].charCodeAt(0);
if ((asciiValue >= 48) && (asciiValue <= 57)) {
num = parseInt(trk[index], 10);
}
else {
num = (asciiValue - 63) % 10;
}
if ((index % 2) !== 0) {
num = num * 2;
}
sum += num;
}
const checkdigit = (sum % 10) > 0 ? 10 - (sum % 10) : 0;
if (checkdigit === parseInt(trk[17], 10)) {
return [true, true];
}
return [false, false];
}
function _confirmUpsFreight(trk) {
const firstChar = `${(trk.charCodeAt(0) - 63) % 10}`;
const remaining = trk.slice(1);
trk = `${firstChar}${remaining}`;
if (checkdigit_1.CheckDigit(trk, [3, 1, 7], 10)) {
return [true, true];
}
return [false, false];
}
function _confirmFedex12(trk) {
if (checkdigit_1.CheckDigit(trk, [3, 1, 7], 11)) {
return [true, false];
}
return [false, false];
}
function _confirmFedexDoorTag(trk) {
if (checkdigit_1.CheckDigit(trk.match(/^DT(\d{12})$/)[1], [3, 1, 7], 11)) {
return [true, true];
}
return [false, false];
}
function _confirmFedexSmartPost(trk) {
if (checkdigit_1.CheckDigit(`91${trk}`, [3, 1], 10)) {
return [true, false];
}
return [false, false];
}
function _confirmFedex15(trk) {
if (checkdigit_1.CheckDigit(trk, [1, 3], 10)) {
return [true, false];
}
return [false, false];
}
function _confirmFedex20(trk) {
if (checkdigit_1.CheckDigit(trk, [3, 1, 7], 11)) {
return [true, false];
}
else {
const alteredTrk = `92${trk}`;
if (checkdigit_1.CheckDigit(alteredTrk, [3, 1], 10)) {
return [true, false];
}
}
return [false, false];
}
function _confirmUsps20(trk) {
if (checkdigit_1.CheckDigit(trk, [3, 1], 10)) {
return [true, false];
}
return [false, false];
}
function _confirmFedex9622(trk) {
if (checkdigit_1.CheckDigit(trk, [3, 1, 7], 11)) {
return [true, false];
}
if (checkdigit_1.CheckDigit(trk.slice(7), [1, 3], 10)) {
return [true, false];
}
return [false, false];
}
function _confirmUsps22(trk) {
if (checkdigit_1.CheckDigit(trk, [3, 1], 10)) {
return [true, false];
}
return [false, false];
}
function _confirmUsps26(trk) {
if (checkdigit_1.CheckDigit(trk, [3, 1], 10)) {
return [true, false];
}
return [false, false];
}
function _confirmUsps420Zip(trk) {
if (checkdigit_1.CheckDigit(trk.match(/^420\d{5}(\d{22})$/)[1], [3, 1], 10)) {
return [true, false];
}
return [false, false];
}
function _confirmUsps420ZipPlus4(trk) {
if (checkdigit_1.CheckDigit(trk.match(/^420\d{9}(\d{22})$/)[1], [3, 1], 10)) {
return [true, false];
}
else {
if (checkdigit_1.CheckDigit(trk.match(/^420\d{5}(\d{26})$/)[1], [3, 1], 10)) {
return [true, false];
}
}
return [false, false];
}
function _confirmCanadaPost16(trk) {
if (checkdigit_1.CheckDigit(trk, [3, 1], 10)) {
return [true, false];
}
return [false, false];
}
function _confirmA1International(trk) {
if ((trk.length === 9) || (trk.length === 13)) {
return [true, false];
}
return [false, false];
}
const CARRIERS = [
{ name: 'ups', regex: /^1Z[0-9A-Z]{16}$/, confirm: _confirmUps },
{ name: 'ups', regex: /^(H|T|J|K|F|W|M|Q|A)\d{10}$/, confirm: _confirmUpsFreight },
{ name: 'amazon', regex: /^1\d{2}-\d{7}-\d{7}:\d{13}$/ },
{ name: 'fedex', regex: /^\d{12}$/, confirm: _confirmFedex12 },
{ name: 'fedex', regex: /^\d{15}$/, confirm: _confirmFedex15 },
{ name: 'fedex', regex: /^\d{20}$/, confirm: _confirmFedex20 },
{ name: 'usps', regex: /^\d{20}$/, confirm: _confirmUsps20 },
{ name: 'usps', regex: /^02\d{18}$/, confirm: _confirmFedexSmartPost },
{ name: 'fedex', regex: /^02\d{18}$/, confirm: _confirmFedexSmartPost },
{ name: 'fedex', regex: /^DT\d{12}$/, confirm: _confirmFedexDoorTag },
{ name: 'fedex', regex: /^927489\d{16}$/ },
{ name: 'fedex', regex: /^926129\d{16}$/ },
{ name: 'upsmi', regex: /^927489\d{16}$/ },
{ name: 'upsmi', regex: /^926129\d{16}$/ },
{ name: 'upsmi', regex: /^927489\d{20}$/ },
{ name: 'fedex', regex: /^96\d{20}$/, confirm: _confirmFedex9622 },
{ name: 'usps', regex: /^927489\d{16}$/ },
{ name: 'usps', regex: /^926129\d{16}$/ },
{ name: 'fedex', regex: /^7489\d{16}$/ },
{ name: 'fedex', regex: /^6129\d{16}$/ },
{ name: 'usps', regex: /^(91|92|93|94|95|96)\d{20}$/, confirm: _confirmUsps22 },
{ name: 'usps', regex: /^\d{26}$/, confirm: _confirmUsps26 },
{ name: 'usps', regex: /^420\d{27}$/, confirm: _confirmUsps420Zip },
{ name: 'usps', regex: /^420\d{31}$/, confirm: _confirmUsps420ZipPlus4 },
{ name: 'dhlgm', regex: /^420\d{27}$/, confirm: _confirmUsps420Zip },
{ name: 'dhlgm', regex: /^420\d{31}$/, confirm: _confirmUsps420ZipPlus4 },
{ name: 'dhlgm', regex: /^94748\d{17}$/, confirm: _confirmUsps22 },
{ name: 'dhlgm', regex: /^93612\d{17}$/, confirm: _confirmUsps22 },
{ name: 'dhlgm', regex: /^GM\d{16}/ },
{ name: 'usps', regex: /^[A-Z]{2}\d{9}[A-Z]{2}$/ },
{ name: 'canadapost', regex: /^\d{16}$/, confirm: _confirmCanadaPost16 },
{ name: 'lasership', regex: /^L[A-Z]\d{8}$/ },
{ name: 'lasership', regex: /^1LS\d{12}/ },
{ name: 'lasership', regex: /^Q\d{8}[A-Z]/ },
{ name: 'ontrac', regex: /^(C|D)\d{14}$/ },
{ name: 'prestige', regex: /^P[A-Z]{1}\d{8}/ },
{ name: 'a1intl', regex: /^AZ.\d+/, confirm: _confirmA1International }
];
function default_1(trk) {
const carriers = [];
trk = _preprocess(trk);
CARRIERS.every(function (c) {
if (trk.match(c.regex)) {
if (c.confirm != null) {
const [good, stop] = Array.from(c.confirm(trk));
if (good) {
carriers.push(c.name);
}
return !stop;
}
carriers.push(c.name);
return true;
}
return true;
});
return underscore_1.uniq(carriers);
}
exports.default = default_1;
//# sourceMappingURL=guessCarrier.js.map