@shipengine/connect-carrier-api 2.10.0 → 2.11.0-beta
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.
- package/lib/app/build-native-rating-routes.d.ts +3 -0
- package/lib/app/build-native-rating-routes.js +103 -0
- package/lib/app/build-native-rating-routes.js.map +1 -0
- package/lib/app/carrier-app.js +5 -1
- package/lib/app/carrier-app.js.map +1 -1
- package/lib/app/create-get-rates-handler.d.ts +5 -0
- package/lib/app/create-get-rates-handler.js +95 -0
- package/lib/app/create-get-rates-handler.js.map +1 -0
- package/lib/app/index.d.ts +1 -0
- package/lib/app/index.js +1 -0
- package/lib/app/index.js.map +1 -1
- package/lib/app/internal/carrier-specification.d.ts +2 -4
- package/lib/app/internal/carrier-specification.js +9 -1
- package/lib/app/internal/carrier-specification.js.map +1 -1
- package/lib/app/internal/native-rating-specification.d.ts +5 -0
- package/lib/app/internal/native-rating-specification.js +3 -0
- package/lib/app/internal/native-rating-specification.js.map +1 -0
- package/lib/app/internal/route.d.ts +17 -3
- package/lib/app/internal/route.js.map +1 -1
- package/lib/app/metadata/carrier.d.ts +2 -6
- package/lib/app/metadata/carrier.js +4 -10
- package/lib/app/metadata/carrier.js.map +1 -1
- package/lib/app/metadata/custom-validators/file-exists.d.ts +1 -0
- package/lib/app/metadata/custom-validators/file-exists.js +12 -0
- package/lib/app/metadata/custom-validators/file-exists.js.map +1 -0
- package/lib/app/metadata/native-rating-configuration.d.ts +12 -0
- package/lib/app/metadata/native-rating-configuration.js +13 -0
- package/lib/app/metadata/native-rating-configuration.js.map +1 -0
- package/lib/app/metadata/rate-card.d.ts +9 -0
- package/lib/app/metadata/rate-card.js +10 -0
- package/lib/app/metadata/rate-card.js.map +1 -0
- package/lib/app/native-rating/base-rate-context.d.ts +3 -0
- package/lib/app/native-rating/base-rate-context.js +79 -0
- package/lib/app/native-rating/base-rate-context.js.map +1 -0
- package/lib/app/native-rating/context-results.d.ts +3 -0
- package/lib/app/native-rating/context-results.js +3 -0
- package/lib/app/native-rating/context-results.js.map +1 -0
- package/lib/app/native-rating/create-dynamic-carrier.d.ts +7 -0
- package/lib/app/native-rating/create-dynamic-carrier.js +63 -0
- package/lib/app/native-rating/create-dynamic-carrier.js.map +1 -0
- package/lib/app/native-rating/get-rates.d.ts +7 -0
- package/lib/app/native-rating/get-rates.js +3 -0
- package/lib/app/native-rating/get-rates.js.map +1 -0
- package/lib/app/native-rating/get-variables.d.ts +6 -0
- package/lib/app/native-rating/get-variables.js +3 -0
- package/lib/app/native-rating/get-variables.js.map +1 -0
- package/lib/app/native-rating/get-zone.d.ts +6 -0
- package/lib/app/native-rating/get-zone.js +3 -0
- package/lib/app/native-rating/get-zone.js.map +1 -0
- package/lib/app/native-rating/implementation-type.d.ts +31 -0
- package/lib/app/native-rating/implementation-type.js +8 -0
- package/lib/app/native-rating/implementation-type.js.map +1 -0
- package/lib/app/native-rating/index.d.ts +2 -0
- package/lib/app/native-rating/index.js +6 -0
- package/lib/app/native-rating/index.js.map +1 -0
- package/lib/app/native-rating/numeric-currency.d.ts +5 -0
- package/lib/app/native-rating/numeric-currency.js +3 -0
- package/lib/app/native-rating/numeric-currency.js.map +1 -0
- package/lib/app/native-rating/rating-context.d.ts +15 -0
- package/lib/app/native-rating/rating-context.js +3 -0
- package/lib/app/native-rating/rating-context.js.map +1 -0
- package/lib/models/rates/rate.d.ts +4 -2
- package/lib/models/rates/rate.js +2 -1
- package/lib/models/rates/rate.js.map +1 -1
- package/lib/models/shipment-item.d.ts +7 -0
- package/lib/models/shipment-item.js +3 -0
- package/lib/models/shipment-item.js.map +1 -0
- package/lib/requests/get-rates-request.d.ts +3 -0
- package/lib/requests/get-rates-request.js.map +1 -1
- package/package.json +5 -2
- package/spec.json +0 -12
- package/src/app/build-native-rating-routes.ts +117 -0
- package/src/app/carrier-app.ts +10 -2
- package/src/app/create-get-rates-handler.ts +119 -0
- package/src/app/index.ts +1 -0
- package/src/app/internal/carrier-specification.ts +16 -5
- package/src/app/internal/native-rating-specification.ts +5 -0
- package/src/app/internal/route.ts +20 -3
- package/src/app/metadata/carrier.ts +3 -15
- package/src/app/metadata/custom-validators/file-exists.ts +8 -0
- package/src/app/metadata/native-rating-configuration.ts +19 -0
- package/src/app/metadata/rate-card.ts +14 -0
- package/src/app/native-rating/base-rate-context.ts +97 -0
- package/src/app/native-rating/context-results.ts +3 -0
- package/src/app/native-rating/create-dynamic-carrier.ts +82 -0
- package/src/app/native-rating/get-rates.ts +9 -0
- package/src/app/native-rating/get-variables.ts +9 -0
- package/src/app/native-rating/get-zone.ts +9 -0
- package/src/app/native-rating/implementation-type.ts +34 -0
- package/src/app/native-rating/index.ts +2 -0
- package/src/app/native-rating/numeric-currency.ts +5 -0
- package/src/app/native-rating/rating-context.ts +19 -0
- package/src/models/rates/rate.ts +6 -3
- package/src/models/shipment-item.ts +7 -0
- package/src/requests/get-rates-request.ts +3 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createContextBuilder = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const winston_1 = tslib_1.__importStar(require("winston"));
|
|
8
|
+
/** Predicate that returns true if the value is defined, false if not */
|
|
9
|
+
const valueIsUndefined = ([key, value]) => {
|
|
10
|
+
const isIncluded = value !== undefined;
|
|
11
|
+
console.log(`${isIncluded ? '✔️' : '❌'} ${key}`);
|
|
12
|
+
return isIncluded;
|
|
13
|
+
};
|
|
14
|
+
/** Build a lookup function to find values for a list of keys */
|
|
15
|
+
const buildLookup = (name, items, mapper) => (keys) => {
|
|
16
|
+
console.log(`Getting ${name} keys (${keys.length} total):`);
|
|
17
|
+
console.group();
|
|
18
|
+
try {
|
|
19
|
+
const things = keys.map((key) => {
|
|
20
|
+
var _a;
|
|
21
|
+
const foundValue = (_a = items.find((item) => key === item.key)) === null || _a === void 0 ? void 0 : _a.value;
|
|
22
|
+
const mappedValue = foundValue && mapper ? mapper(foundValue) : foundValue;
|
|
23
|
+
return [key, mappedValue];
|
|
24
|
+
});
|
|
25
|
+
const values = Object.fromEntries(things.filter(valueIsUndefined));
|
|
26
|
+
return Promise.resolve(values);
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
console.groupEnd();
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const loadData = (basePath) => (dataType) => {
|
|
33
|
+
try {
|
|
34
|
+
const data = fs_1.readFileSync(path_1.resolve(basePath, `${dataType}.json`));
|
|
35
|
+
const json = JSON.parse(data.toString());
|
|
36
|
+
return [dataType, (json === null || json === void 0 ? void 0 : json[dataType]) || []];
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
return [dataType, []];
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const createContextBuilder = (basePath) => {
|
|
43
|
+
let zoneLookup;
|
|
44
|
+
const getZoneLookup = () => {
|
|
45
|
+
if (!zoneLookup) {
|
|
46
|
+
const zones = loadData(basePath)('zones')[1];
|
|
47
|
+
zoneLookup = buildLookup('zone', zones);
|
|
48
|
+
}
|
|
49
|
+
return zoneLookup;
|
|
50
|
+
};
|
|
51
|
+
const log = winston_1.default.createLogger({
|
|
52
|
+
format: winston_1.format.combine(winston_1.format.colorize(), winston_1.format.timestamp(), winston_1.format.metadata()),
|
|
53
|
+
transports: [new winston_1.transports.Console({ level: 'debug' })],
|
|
54
|
+
});
|
|
55
|
+
return (rateCard) => {
|
|
56
|
+
let dataLookup;
|
|
57
|
+
const getDataLookup = () => {
|
|
58
|
+
if (!dataLookup) {
|
|
59
|
+
const loadedData = Object.fromEntries(['rates', 'variables'].map(loadData(path_1.resolve(basePath, rateCard.Id))));
|
|
60
|
+
dataLookup = {
|
|
61
|
+
rates: buildLookup('rate', loadedData.rates, (x) => ({
|
|
62
|
+
amount: +x,
|
|
63
|
+
currency: rateCard.Currency,
|
|
64
|
+
})),
|
|
65
|
+
variables: buildLookup('variables', loadedData.variables),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return dataLookup;
|
|
69
|
+
};
|
|
70
|
+
return {
|
|
71
|
+
getRates: (keys) => getDataLookup().rates(keys),
|
|
72
|
+
getVariables: (keys) => getDataLookup().variables(keys),
|
|
73
|
+
getZone: (keys) => getZoneLookup()(keys),
|
|
74
|
+
log,
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
exports.createContextBuilder = createContextBuilder;
|
|
79
|
+
//# sourceMappingURL=base-rate-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-rate-context.js","sourceRoot":"","sources":["../../../src/app/native-rating/base-rate-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-results.js","sourceRoot":"","sources":["../../../src/app/native-rating/context-results.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RatingCarrier } from './implementation-type';
|
|
2
|
+
/** Create a dynamic carrier
|
|
3
|
+
* @param code Code that should be used for the carrier
|
|
4
|
+
* @returns Carrier with code ready to be executed
|
|
5
|
+
*/
|
|
6
|
+
declare const createDynamicCarrier: (code: string) => RatingCarrier;
|
|
7
|
+
export default createDynamicCarrier;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vm2_1 = require("vm2");
|
|
4
|
+
/** Ensure that the carrier module has the correct shape
|
|
5
|
+
* @param module Object into which code should be exported
|
|
6
|
+
*/
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
const validateCode = (module) => {
|
|
9
|
+
var _a;
|
|
10
|
+
if (((_a = module === null || module === void 0 ? void 0 : module.exports) === null || _a === void 0 ? void 0 : _a.default) === undefined) {
|
|
11
|
+
return {
|
|
12
|
+
errors: ['Code must have a default export'],
|
|
13
|
+
hasGetZonesFunction: false,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const errors = [];
|
|
17
|
+
const { rateShipments, getZones } = module.exports.default;
|
|
18
|
+
const hasGetZonesFunction = getZones !== undefined;
|
|
19
|
+
if (typeof rateShipments !== 'function') {
|
|
20
|
+
errors.push("Code must contain a function named 'rateShipments'");
|
|
21
|
+
}
|
|
22
|
+
else if (rateShipments.length !== 2) {
|
|
23
|
+
errors.push("'rateShipments' function must have two parameters");
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
errors,
|
|
27
|
+
hasGetZonesFunction,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
/** Create a dynamic carrier
|
|
31
|
+
* @param code Code that should be used for the carrier
|
|
32
|
+
* @returns Carrier with code ready to be executed
|
|
33
|
+
*/
|
|
34
|
+
const createDynamicCarrier = (code) => {
|
|
35
|
+
var _a;
|
|
36
|
+
// This is to make sure that the code we need to run doesn't get excluded because of dangling comments, etc.
|
|
37
|
+
const resetCode = code + ';\n /* */ \n';
|
|
38
|
+
const validationResults = new vm2_1.VM({
|
|
39
|
+
sandbox: { module: {}, validateCode },
|
|
40
|
+
}).run(`${resetCode}; validateCode(module);`);
|
|
41
|
+
if (((_a = validationResults.errors) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
|
42
|
+
throw new Error(validationResults.errors.join('; '));
|
|
43
|
+
}
|
|
44
|
+
const rateShipmentsScript = new vm2_1.VMScript(`${resetCode} module.exports.default.rateShipments(context, shipment);`);
|
|
45
|
+
const executionVM = new vm2_1.VM({
|
|
46
|
+
sandbox: {
|
|
47
|
+
module: {},
|
|
48
|
+
context: {},
|
|
49
|
+
shipment: {},
|
|
50
|
+
zoneContext: {},
|
|
51
|
+
origin: {},
|
|
52
|
+
destination: {},
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
const carrier = {
|
|
56
|
+
rateShipments: (context, shipment) => {
|
|
57
|
+
return executionVM.setGlobals({ context, shipment }).run(rateShipmentsScript);
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
return carrier;
|
|
61
|
+
};
|
|
62
|
+
exports.default = createDynamicCarrier;
|
|
63
|
+
//# sourceMappingURL=create-dynamic-carrier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-dynamic-carrier.js","sourceRoot":"","sources":["../../../src/app/native-rating/create-dynamic-carrier.ts"],"names":[],"mappings":";;AAAA,6BAAmC;AAWnC;;GAEG;AACH,8DAA8D;AAC9D,MAAM,YAAY,GAAG,CAAC,MAAY,EAAyB,EAAE;;IAC3D,IAAI,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,OAAO,MAAK,SAAS,EAAE;QAC1C,OAAO;YACL,MAAM,EAAE,CAAC,iCAAiC,CAAC;YAC3C,mBAAmB,EAAE,KAAK;SAC3B,CAAC;KACH;IAED,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;IAC3D,MAAM,mBAAmB,GAAG,QAAQ,KAAK,SAAS,CAAC;IAEnD,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE;QACvC,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;KACnE;SAAM,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;KAClE;IAED,OAAO;QACL,MAAM;QACN,mBAAmB;KACpB,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAiB,EAAE;;IAC3D,4GAA4G;IAC5G,MAAM,SAAS,GAAG,IAAI,GAAG,cAAc,CAAC;IAExC,MAAM,iBAAiB,GAAG,IAAI,QAAE,CAAC;QAC/B,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE;KACtC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,yBAAyB,CAAC,CAAC;IAC9C,IAAI,CAAA,MAAA,iBAAiB,CAAC,MAAM,0CAAE,MAAM,IAAG,CAAC,EAAE;QACxC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KACtD;IAED,MAAM,mBAAmB,GAAG,IAAI,cAAQ,CACtC,GAAG,SAAS,2DAA2D,CACxE,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,QAAE,CAAC;QACzB,OAAO,EAAE;YACP,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,EAAE;YACZ,WAAW,EAAE,EAAE;YACf,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,EAAE;SAChB;KACF,CAAC,CAAC;IAEH,MAAM,OAAO,GAAkB;QAC7B,aAAa,EAAE,CACb,OAAsB,EACtB,QAAyB,EACI,EAAE;YAC/B,OAAO,WAAW,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAChF,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,kBAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ContextResults } from './context-results';
|
|
2
|
+
import { NumericCurrency } from './numeric-currency';
|
|
3
|
+
export declare type GetRatesResults = ContextResults<NumericCurrency>;
|
|
4
|
+
/** Function to get rates from the context */
|
|
5
|
+
export interface GetRates {
|
|
6
|
+
(dataKeys: string[]): Promise<GetRatesResults>;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-rates.js","sourceRoot":"","sources":["../../../src/app/native-rating/get-rates.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-variables.js","sourceRoot":"","sources":["../../../src/app/native-rating/get-variables.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-zone.js","sourceRoot":"","sources":["../../../src/app/native-rating/get-zone.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Rate } from '../../models/rates';
|
|
2
|
+
import { GetRatesRequest } from '../../requests/get-rates-request';
|
|
3
|
+
import { RatingContext } from './rating-context';
|
|
4
|
+
/** A rate request shipment with its corresponding id */
|
|
5
|
+
export interface ShipmentAndId {
|
|
6
|
+
/** rate_request_identifier for the rate request */
|
|
7
|
+
id: string;
|
|
8
|
+
/** Shipment for the rate request */
|
|
9
|
+
shipment: GetRatesRequest;
|
|
10
|
+
}
|
|
11
|
+
/** Rate results with its corresponding rate request id */
|
|
12
|
+
export interface RateResultsAndId {
|
|
13
|
+
/** rate_request_identifier for the corresponding rate request */
|
|
14
|
+
id: string;
|
|
15
|
+
/** Error, if any */
|
|
16
|
+
error?: unknown;
|
|
17
|
+
/** Rates for a given rate request */
|
|
18
|
+
rates: Rate[];
|
|
19
|
+
}
|
|
20
|
+
/** Implementation of a carrier */
|
|
21
|
+
export interface RatingCarrier {
|
|
22
|
+
/** Rate shipments
|
|
23
|
+
* @param context Native Rating context that can be used by the implementation to interact with the underlying service
|
|
24
|
+
* @param shipment Shipments that should be rated
|
|
25
|
+
* @returns List of rates for the given shipments
|
|
26
|
+
*/
|
|
27
|
+
rateShipments: (context: RatingContext, shipment: ShipmentAndId[]) => Promise<RateResultsAndId[]>;
|
|
28
|
+
}
|
|
29
|
+
/** Signify a validation error from the carrier */
|
|
30
|
+
export declare class CarrierValidationError extends Error {
|
|
31
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CarrierValidationError = void 0;
|
|
4
|
+
/** Signify a validation error from the carrier */
|
|
5
|
+
class CarrierValidationError extends Error {
|
|
6
|
+
}
|
|
7
|
+
exports.CarrierValidationError = CarrierValidationError;
|
|
8
|
+
//# sourceMappingURL=implementation-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implementation-type.js","sourceRoot":"","sources":["../../../src/app/native-rating/implementation-type.ts"],"names":[],"mappings":";;;AAgCA,kDAAkD;AAClD,MAAa,sBAAuB,SAAQ,KAAK;CAAG;AAApD,wDAAoD"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./rating-context"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./implementation-type"), exports);
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/app/native-rating/index.ts"],"names":[],"mappings":";;;AAAA,2DAAiC;AACjC,gEAAsC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numeric-currency.js","sourceRoot":"","sources":["../../../src/app/native-rating/numeric-currency.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Logger } from 'winston';
|
|
2
|
+
import { GetVariables } from './get-variables';
|
|
3
|
+
import { GetRates } from './get-rates';
|
|
4
|
+
import { GetZone } from './get-zone';
|
|
5
|
+
/** Rates request context */
|
|
6
|
+
export interface RatingContext {
|
|
7
|
+
/** Function to get rates for given keys */
|
|
8
|
+
getRates: GetRates;
|
|
9
|
+
/** Function to get variables for given keys */
|
|
10
|
+
getVariables: GetVariables;
|
|
11
|
+
/** Function to get zone for given keys */
|
|
12
|
+
getZone: GetZone;
|
|
13
|
+
/** Logger that implementers can use */
|
|
14
|
+
log: Logger;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rating-context.js","sourceRoot":"","sources":["../../../src/app/native-rating/rating-context.ts"],"names":[],"mappings":""}
|
|
@@ -25,7 +25,9 @@ export declare class Rate {
|
|
|
25
25
|
carrier_rate_id?: string;
|
|
26
26
|
/** @description DateTime after which the rate will no longer be accepted. ISO 8601 format, with local offset. Example: 2021-08-20T14:38:36.859237-05:00 */
|
|
27
27
|
expiration_datetime?: string;
|
|
28
|
-
/** @description
|
|
29
|
-
|
|
28
|
+
/** @description The Package type of this rate */
|
|
29
|
+
package_type?: string;
|
|
30
|
+
/** @description The zone this rate is for */
|
|
31
|
+
zone?: string;
|
|
30
32
|
}
|
|
31
33
|
export declare const RateSchema: Joi.ObjectSchema<any>;
|
package/lib/models/rates/rate.js
CHANGED
|
@@ -21,6 +21,7 @@ exports.RateSchema = joi_1.default.object({
|
|
|
21
21
|
delivery_window: time_window_1.TimeWindowSchema.optional(),
|
|
22
22
|
carrier_rate_id: joi_1.default.string().optional().empty(),
|
|
23
23
|
expiration_datetime: joi_1.default.string().optional().empty().isoDate(),
|
|
24
|
-
|
|
24
|
+
package_type: joi_1.default.string().optional().empty(),
|
|
25
|
+
zone: joi_1.default.string().optional().empty(),
|
|
25
26
|
});
|
|
26
27
|
//# sourceMappingURL=rate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate.js","sourceRoot":"","sources":["../../../src/models/rates/rate.ts"],"names":[],"mappings":";;;;AAAA,sDAAsB;AACtB,oEAAsF;AACtF,gDAA8D;AAE9D,8CAA8C;AAC9C,MAAa,IAAI;
|
|
1
|
+
{"version":3,"file":"rate.js","sourceRoot":"","sources":["../../../src/models/rates/rate.ts"],"names":[],"mappings":";;;;AAAA,sDAAsB;AACtB,oEAAsF;AACtF,gDAA8D;AAE9D,8CAA8C;AAC9C,MAAa,IAAI;CA2BhB;AA3BD,oBA2BC;AAEY,QAAA,UAAU,GAAG,aAAG,CAAC,MAAM,CAAC;IACnC,YAAY,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE;IAC7C,aAAa,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE;IACxD,2BAA2B,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE;IACtE,kBAAkB,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,yCAAqB,CAAC;IACvE,cAAc,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,aAAG,CAAC,MAAM,EAAE,CAAC;IAC1D,gBAAgB,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,aAAG,CAAC,MAAM,EAAE,CAAC;IAC5D,eAAe,EAAE,aAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACzC,qBAAqB,EAAE,8BAAgB,CAAC,QAAQ,EAAE;IAClD,eAAe,EAAE,8BAAgB,CAAC,QAAQ,EAAE;IAC5C,eAAe,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE;IAChD,mBAAmB,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE;IAC9D,YAAY,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE;IAC7C,IAAI,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE;CACtC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shipment-item.js","sourceRoot":"","sources":["../../src/models/shipment-item.ts"],"names":[],"mappings":""}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BaseRequest } from './base-request';
|
|
2
2
|
import { ConfirmationTypes, AdvancedOptions, InsuranceProviders, Package, Customs, ShipFrom, ShipTo, PudoLocation, FulfillmentPlanDetails, TimeWindow } from '../models';
|
|
3
|
+
import { ShipmentItem } from '../models/shipment-item';
|
|
3
4
|
/** @description Basic structure for a request to get rates */
|
|
4
5
|
export declare class GetRatesRequest extends BaseRequest {
|
|
5
6
|
service_code?: string;
|
|
@@ -18,4 +19,6 @@ export declare class GetRatesRequest extends BaseRequest {
|
|
|
18
19
|
fulfillment_plan_details?: FulfillmentPlanDetails;
|
|
19
20
|
/** @description The carrier pickup window is the time designated when the carrier will pickup your package from the initial location */
|
|
20
21
|
carrier_pickup_window?: TimeWindow;
|
|
22
|
+
/** Items included in the shipment */
|
|
23
|
+
items?: ShipmentItem[];
|
|
21
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-rates-request.js","sourceRoot":"","sources":["../../src/requests/get-rates-request.ts"],"names":[],"mappings":";;;AAAA,iDAA6C;
|
|
1
|
+
{"version":3,"file":"get-rates-request.js","sourceRoot":"","sources":["../../src/requests/get-rates-request.ts"],"names":[],"mappings":";;;AAAA,iDAA6C;AAe7C,8DAA8D;AAC9D,MAAa,eAAgB,SAAQ,0BAAW;CAmB/C;AAnBD,0CAmBC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shipengine/connect-carrier-api",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.11.0-beta",
|
|
4
4
|
"description": "This is the typescript/javascript definitions for carrier api",
|
|
5
5
|
"homepage": "https://github.com/ShipEngine/connect",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -36,11 +36,14 @@
|
|
|
36
36
|
"typescript": "^4.3.5",
|
|
37
37
|
"vitest": "^0.23.4"
|
|
38
38
|
},
|
|
39
|
+
"optionalDependencies": {
|
|
40
|
+
"vm2": "^3.9.5"
|
|
41
|
+
},
|
|
39
42
|
"dependencies": {
|
|
40
43
|
"joi": "^17.4.2",
|
|
41
44
|
"tslib": "^2.3.1"
|
|
42
45
|
},
|
|
43
46
|
"peerDependencies": {
|
|
44
|
-
"@shipengine/connect-runtime": "^1.
|
|
47
|
+
"@shipengine/connect-runtime": "^1.3.0-beta"
|
|
45
48
|
}
|
|
46
49
|
}
|
package/spec.json
CHANGED
|
@@ -956,7 +956,6 @@
|
|
|
956
956
|
},
|
|
957
957
|
"tip": {
|
|
958
958
|
"required": ["currency", "amount"],
|
|
959
|
-
"type": "object",
|
|
960
959
|
"properties": {
|
|
961
960
|
"amount": {
|
|
962
961
|
"type": "string",
|
|
@@ -1072,7 +1071,6 @@
|
|
|
1072
1071
|
},
|
|
1073
1072
|
"amount": {
|
|
1074
1073
|
"required": ["currency", "amount"],
|
|
1075
|
-
"type": "object",
|
|
1076
1074
|
"properties": {
|
|
1077
1075
|
"amount": {
|
|
1078
1076
|
"type": "string",
|
|
@@ -1677,7 +1675,6 @@
|
|
|
1677
1675
|
},
|
|
1678
1676
|
"buyer_shipping_amount_paid": {
|
|
1679
1677
|
"required": ["currency", "amount"],
|
|
1680
|
-
"type": "object",
|
|
1681
1678
|
"properties": {
|
|
1682
1679
|
"amount": {
|
|
1683
1680
|
"type": "string",
|
|
@@ -1693,7 +1690,6 @@
|
|
|
1693
1690
|
},
|
|
1694
1691
|
"duties_paid": {
|
|
1695
1692
|
"required": ["currency", "amount"],
|
|
1696
|
-
"type": "object",
|
|
1697
1693
|
"properties": {
|
|
1698
1694
|
"amount": {
|
|
1699
1695
|
"type": "string",
|
|
@@ -1739,7 +1735,6 @@
|
|
|
1739
1735
|
},
|
|
1740
1736
|
"value": {
|
|
1741
1737
|
"required": ["currency", "amount"],
|
|
1742
|
-
"type": "object",
|
|
1743
1738
|
"properties": {
|
|
1744
1739
|
"amount": {
|
|
1745
1740
|
"type": "string",
|
|
@@ -2528,7 +2523,6 @@
|
|
|
2528
2523
|
},
|
|
2529
2524
|
"insured_value": {
|
|
2530
2525
|
"required": ["currency", "amount"],
|
|
2531
|
-
"type": "object",
|
|
2532
2526
|
"properties": {
|
|
2533
2527
|
"amount": {
|
|
2534
2528
|
"type": "string",
|
|
@@ -2783,12 +2777,6 @@
|
|
|
2783
2777
|
"description": "DateTime after which the rate will no longer be accepted. (ISO 8601 format, with local offset)",
|
|
2784
2778
|
"format": "date-time",
|
|
2785
2779
|
"example": "2021-08-20T14:38:36.859237-05:00"
|
|
2786
|
-
},
|
|
2787
|
-
"estimated_delivery_text": {
|
|
2788
|
-
"type": "string",
|
|
2789
|
-
"description": "Estimated delivery text. It could be any text, a number, a date, etc.",
|
|
2790
|
-
"example": "Monday by 11:00 PM",
|
|
2791
|
-
"nullable": true
|
|
2792
2780
|
}
|
|
2793
2781
|
},
|
|
2794
2782
|
"additionalProperties": false,
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { resolve } from 'path';
|
|
2
|
+
import { stat } from 'fs/promises';
|
|
3
|
+
import { Request } from 'express';
|
|
4
|
+
import { Method, Route } from './internal/route';
|
|
5
|
+
import { CarrierAppMetadata } from './metadata/carrier-app-metadata';
|
|
6
|
+
import { rateLogicName } from './create-get-rates-handler';
|
|
7
|
+
import { RateCard } from './metadata/rate-card';
|
|
8
|
+
|
|
9
|
+
const buildFilePath = async (path: string, fileName: string, error: string) => {
|
|
10
|
+
const filePath = resolve(path, fileName);
|
|
11
|
+
|
|
12
|
+
try {
|
|
13
|
+
await stat(filePath);
|
|
14
|
+
return filePath;
|
|
15
|
+
} catch {
|
|
16
|
+
throw new Error(error);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const buildNativeRatingRoutes = (metadata: CarrierAppMetadata): Route[] => {
|
|
21
|
+
const getCarrierDetails = async (
|
|
22
|
+
req: Request,
|
|
23
|
+
): Promise<{ path: string; rateCards: RateCard[] }> => {
|
|
24
|
+
const carrierId = req.params.carrier_id;
|
|
25
|
+
const carrier = metadata.Carriers.find((x) => x.Id === carrierId);
|
|
26
|
+
if (!carrier) {
|
|
27
|
+
throw new Error(`Could not find carrier with id ${carrierId}`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (!carrier.NativeRating) {
|
|
31
|
+
throw new Error(`Carrier ${carrierId} does not have a NativeRating property`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (!carrier.NativeRating.Path) {
|
|
35
|
+
throw new Error(`Carrier ${carrierId} does not have NativeRating path set`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
await stat(carrier.NativeRating.Path);
|
|
40
|
+
} catch {
|
|
41
|
+
throw new Error(`Carrier ${carrierId} does not have NativeRating data`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
path: carrier.NativeRating.Path,
|
|
46
|
+
rateCards: carrier.NativeRating.RateCards || [],
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const getRateCardPath = async (req: Request): Promise<string> => {
|
|
51
|
+
const rateCardId = req.params.id;
|
|
52
|
+
const { path, rateCards } = await getCarrierDetails(req);
|
|
53
|
+
|
|
54
|
+
if (!rateCards.find((x) => x.Id === rateCardId)) {
|
|
55
|
+
throw new Error(`Could not find a rate card with id ${rateCardId}`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const rateCardPath = resolve(path, rateCardId);
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
await stat(rateCardPath);
|
|
62
|
+
} catch {
|
|
63
|
+
throw new Error(`Rate card does not have any data`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return rateCardPath;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return [
|
|
70
|
+
{
|
|
71
|
+
path: '/NativeRating/:carrier_id/RateCards',
|
|
72
|
+
method: Method.GET,
|
|
73
|
+
handler: async (req: Request) => {
|
|
74
|
+
const { rateCards } = await getCarrierDetails(req);
|
|
75
|
+
return rateCards.map((x) => ({ Id: x.Id, Currency: x.Currency }));
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
path: '/NativeRating/:carrier_id/RateCards/:id/Implementation',
|
|
80
|
+
method: Method.GET,
|
|
81
|
+
handler: async (req: any) => {
|
|
82
|
+
const path = await getRateCardPath(req);
|
|
83
|
+
const code = await buildFilePath(path, rateLogicName, `Could not find rating logic`);
|
|
84
|
+
return { code };
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
...['Rates', 'Variables'].map((x) => ({
|
|
88
|
+
path: `/NativeRating/:carrier_id/RateCards/:id/${x}`,
|
|
89
|
+
method: Method.GET,
|
|
90
|
+
file: async (req: any) => {
|
|
91
|
+
const path = await getRateCardPath(req);
|
|
92
|
+
return await buildFilePath(
|
|
93
|
+
path,
|
|
94
|
+
`${x.toLowerCase()}.json`,
|
|
95
|
+
`Could not find ${x.toLowerCase()}`,
|
|
96
|
+
);
|
|
97
|
+
},
|
|
98
|
+
})),
|
|
99
|
+
{
|
|
100
|
+
path: '/NativeRating/:carrier_id/Implementation',
|
|
101
|
+
method: Method.GET,
|
|
102
|
+
handler: async (req: any) => {
|
|
103
|
+
const { path } = await getCarrierDetails(req);
|
|
104
|
+
const code = await buildFilePath(path, rateLogicName, `Could not find rating logic`);
|
|
105
|
+
return { code };
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
path: '/NativeRating/:carrier_id/Zones',
|
|
110
|
+
method: Method.GET,
|
|
111
|
+
file: async (req: any) => {
|
|
112
|
+
const { path } = await getCarrierDetails(req);
|
|
113
|
+
return await buildFilePath(path, 'zones.json', `Could not find zones`);
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
};
|