@shipengine/connect-carrier-api 2.9.1 → 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.
Files changed (103) hide show
  1. package/lib/app/build-native-rating-routes.d.ts +3 -0
  2. package/lib/app/build-native-rating-routes.js +103 -0
  3. package/lib/app/build-native-rating-routes.js.map +1 -0
  4. package/lib/app/carrier-app.js +5 -1
  5. package/lib/app/carrier-app.js.map +1 -1
  6. package/lib/app/create-get-rates-handler.d.ts +5 -0
  7. package/lib/app/create-get-rates-handler.js +95 -0
  8. package/lib/app/create-get-rates-handler.js.map +1 -0
  9. package/lib/app/index.d.ts +1 -0
  10. package/lib/app/index.js +1 -0
  11. package/lib/app/index.js.map +1 -1
  12. package/lib/app/internal/carrier-specification.d.ts +2 -4
  13. package/lib/app/internal/carrier-specification.js +9 -1
  14. package/lib/app/internal/carrier-specification.js.map +1 -1
  15. package/lib/app/internal/native-rating-specification.d.ts +5 -0
  16. package/lib/app/internal/native-rating-specification.js +3 -0
  17. package/lib/app/internal/native-rating-specification.js.map +1 -0
  18. package/lib/app/internal/route.d.ts +17 -3
  19. package/lib/app/internal/route.js.map +1 -1
  20. package/lib/app/metadata/carrier.d.ts +2 -6
  21. package/lib/app/metadata/carrier.js +6 -13
  22. package/lib/app/metadata/carrier.js.map +1 -1
  23. package/lib/app/metadata/custom-validators/file-exists.d.ts +1 -0
  24. package/lib/app/metadata/custom-validators/file-exists.js +12 -0
  25. package/lib/app/metadata/custom-validators/file-exists.js.map +1 -0
  26. package/lib/app/metadata/native-rating-configuration.d.ts +12 -0
  27. package/lib/app/metadata/native-rating-configuration.js +13 -0
  28. package/lib/app/metadata/native-rating-configuration.js.map +1 -0
  29. package/lib/app/metadata/package-type.js +2 -3
  30. package/lib/app/metadata/package-type.js.map +1 -1
  31. package/lib/app/metadata/rate-card.d.ts +9 -0
  32. package/lib/app/metadata/rate-card.js +10 -0
  33. package/lib/app/metadata/rate-card.js.map +1 -0
  34. package/lib/app/metadata/shipping-service.js +2 -3
  35. package/lib/app/metadata/shipping-service.js.map +1 -1
  36. package/lib/app/native-rating/base-rate-context.d.ts +3 -0
  37. package/lib/app/native-rating/base-rate-context.js +79 -0
  38. package/lib/app/native-rating/base-rate-context.js.map +1 -0
  39. package/lib/app/native-rating/context-results.d.ts +3 -0
  40. package/lib/app/native-rating/context-results.js +3 -0
  41. package/lib/app/native-rating/context-results.js.map +1 -0
  42. package/lib/app/native-rating/create-dynamic-carrier.d.ts +7 -0
  43. package/lib/app/native-rating/create-dynamic-carrier.js +63 -0
  44. package/lib/app/native-rating/create-dynamic-carrier.js.map +1 -0
  45. package/lib/app/native-rating/get-rates.d.ts +7 -0
  46. package/lib/app/native-rating/get-rates.js +3 -0
  47. package/lib/app/native-rating/get-rates.js.map +1 -0
  48. package/lib/app/native-rating/get-variables.d.ts +6 -0
  49. package/lib/app/native-rating/get-variables.js +3 -0
  50. package/lib/app/native-rating/get-variables.js.map +1 -0
  51. package/lib/app/native-rating/get-zone.d.ts +6 -0
  52. package/lib/app/native-rating/get-zone.js +3 -0
  53. package/lib/app/native-rating/get-zone.js.map +1 -0
  54. package/lib/app/native-rating/implementation-type.d.ts +31 -0
  55. package/lib/app/native-rating/implementation-type.js +8 -0
  56. package/lib/app/native-rating/implementation-type.js.map +1 -0
  57. package/lib/app/native-rating/index.d.ts +2 -0
  58. package/lib/app/native-rating/index.js +6 -0
  59. package/lib/app/native-rating/index.js.map +1 -0
  60. package/lib/app/native-rating/numeric-currency.d.ts +5 -0
  61. package/lib/app/native-rating/numeric-currency.js +3 -0
  62. package/lib/app/native-rating/numeric-currency.js.map +1 -0
  63. package/lib/app/native-rating/rating-context.d.ts +15 -0
  64. package/lib/app/native-rating/rating-context.js +3 -0
  65. package/lib/app/native-rating/rating-context.js.map +1 -0
  66. package/lib/models/rates/rate.d.ts +4 -2
  67. package/lib/models/rates/rate.js +2 -1
  68. package/lib/models/rates/rate.js.map +1 -1
  69. package/lib/models/shipment-item.d.ts +7 -0
  70. package/lib/models/shipment-item.js +3 -0
  71. package/lib/models/shipment-item.js.map +1 -0
  72. package/lib/requests/get-rates-request.d.ts +3 -0
  73. package/lib/requests/get-rates-request.js.map +1 -1
  74. package/package.json +7 -1
  75. package/spec.json +0 -12
  76. package/src/app/build-native-rating-routes.ts +117 -0
  77. package/src/app/carrier-app.ts +10 -2
  78. package/src/app/create-get-rates-handler.ts +119 -0
  79. package/src/app/index.ts +1 -0
  80. package/src/app/internal/carrier-specification.ts +16 -5
  81. package/src/app/internal/native-rating-specification.ts +5 -0
  82. package/src/app/internal/route.ts +20 -3
  83. package/src/app/metadata/carrier.ts +6 -18
  84. package/src/app/metadata/custom-validators/file-exists.ts +8 -0
  85. package/src/app/metadata/native-rating-configuration.ts +19 -0
  86. package/src/app/metadata/package-type.ts +2 -3
  87. package/src/app/metadata/rate-card.ts +14 -0
  88. package/src/app/metadata/shipping-service.ts +3 -3
  89. package/src/app/native-rating/base-rate-context.ts +97 -0
  90. package/src/app/native-rating/context-results.ts +3 -0
  91. package/src/app/native-rating/create-dynamic-carrier.ts +82 -0
  92. package/src/app/native-rating/get-rates.ts +9 -0
  93. package/src/app/native-rating/get-variables.ts +9 -0
  94. package/src/app/native-rating/get-zone.ts +9 -0
  95. package/src/app/native-rating/implementation-type.ts +34 -0
  96. package/src/app/native-rating/index.ts +2 -0
  97. package/src/app/native-rating/numeric-currency.ts +5 -0
  98. package/src/app/native-rating/rating-context.ts +19 -0
  99. package/src/models/rates/rate.ts +6 -3
  100. package/src/models/shipment-item.ts +7 -0
  101. package/src/requests/get-rates-request.ts +3 -0
  102. package/tsconfig.json +4 -1
  103. package/tsconfig.tsbuildinfo +1 -1
@@ -10,6 +10,7 @@ const service_class_1 = require("./service-class");
10
10
  const service_grade_1 = require("./service-grade");
11
11
  const service_required_properties_1 = require("./service-required-properties");
12
12
  const joi_1 = tslib_1.__importDefault(require("joi"));
13
+ const connect_runtime_1 = require("@shipengine/connect-runtime");
13
14
  exports.ShippingServiceSchema = joi_1.default.object({
14
15
  ConfirmationTypes: joi_1.default.array().optional().items(confirmation_type_1.ConfirmationTypeSchema).unique('Type'),
15
16
  ServiceAttributes: joi_1.default.array().items(services_attributes_1.ServiceAttributesEnumSchema).optional(),
@@ -23,9 +24,7 @@ exports.ShippingServiceSchema = joi_1.default.object({
23
24
  Code: joi_1.default.string().required().max(50),
24
25
  Abbreviation: joi_1.default.string().required().max(20),
25
26
  Name: joi_1.default.string().required().max(80),
26
- ApiCode: joi_1.default.string()
27
- .optional()
28
- .pattern(/^[a-z][a-z0-9_]*[a-z]$/, 'ApiCode'),
27
+ ApiCode: joi_1.default.string().optional().pattern(connect_runtime_1.ApiCodeRegex, connect_runtime_1.ApiCodeValidationMessage),
29
28
  Id: joi_1.default.string().uuid().required(),
30
29
  });
31
30
  //# sourceMappingURL=shipping-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shipping-service.js","sourceRoot":"","sources":["../../../src/app/metadata/shipping-service.ts"],"names":[],"mappings":";;;;AAAA,2DAA+E;AAC/E,+DAAqF;AACrF,+DAA2F;AAC3F,+CAAqE;AACrE,mDAA2E;AAC3E,mDAA2E;AAC3E,+EAGuC;AACvC,sDAAsB;AAkCT,QAAA,qBAAqB,GAAG,aAAG,CAAC,MAAM,CAAC;IAC9C,iBAAiB,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,0CAAsB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IACtF,iBAAiB,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,iDAA2B,CAAC,CAAC,QAAQ,EAAE;IAC5E,kBAAkB,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,8CAAwB,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;IAChG,mBAAmB,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,kCAAoB,CAAC,CAAC,MAAM,EAAE;IAChF,kBAAkB,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,iEAAmC,CAAC,CAAC,MAAM,EAAE;IAC9F,KAAK,EAAE,sCAAsB,CAAC,QAAQ,EAAE;IACxC,KAAK,EAAE,sCAAsB,CAAC,QAAQ,EAAE;IACxC,SAAS,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1C,aAAa,EAAE,aAAG,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChD,IAAI,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACrC,YAAY,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7C,IAAI,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACrC,OAAO,EAAE,aAAG,CAAC,MAAM,EAAE;SAClB,QAAQ,EAAE;SACV,OAAO,CAAC,wBAAwB,EAAE,SAAS,CAAC;IAC/C,EAAE,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC"}
1
+ {"version":3,"file":"shipping-service.js","sourceRoot":"","sources":["../../../src/app/metadata/shipping-service.ts"],"names":[],"mappings":";;;;AAAA,2DAA+E;AAC/E,+DAAqF;AACrF,+DAA2F;AAC3F,+CAAqE;AACrE,mDAA2E;AAC3E,mDAA2E;AAC3E,+EAGuC;AACvC,sDAAsB;AAEtB,iEAAqF;AAkCxE,QAAA,qBAAqB,GAAG,aAAG,CAAC,MAAM,CAAC;IAC9C,iBAAiB,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,0CAAsB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IACtF,iBAAiB,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,iDAA2B,CAAC,CAAC,QAAQ,EAAE;IAC5E,kBAAkB,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,8CAAwB,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;IAChG,mBAAmB,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,kCAAoB,CAAC,CAAC,MAAM,EAAE;IAChF,kBAAkB,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,iEAAmC,CAAC,CAAC,MAAM,EAAE;IAC9F,KAAK,EAAE,sCAAsB,CAAC,QAAQ,EAAE;IACxC,KAAK,EAAE,sCAAsB,CAAC,QAAQ,EAAE;IACxC,SAAS,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1C,aAAa,EAAE,aAAG,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChD,IAAI,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACrC,YAAY,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7C,IAAI,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACrC,OAAO,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,8BAAY,EAAE,0CAAwB,CAAC;IAChF,EAAE,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { RatingContext } from './rating-context';
2
+ import { RateCard } from '../metadata/rate-card';
3
+ export declare const createContextBuilder: (basePath: string) => (rateCard: RateCard) => RatingContext;
@@ -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,3 @@
1
+ export interface ContextResults<T> {
2
+ [dataKey: string]: T;
3
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=context-results.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=get-rates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-rates.js","sourceRoot":"","sources":["../../../src/app/native-rating/get-rates.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { ContextResults } from './context-results';
2
+ export declare type GetVariableResults = ContextResults<any>;
3
+ /** Function to get rating variables from the context */
4
+ export interface GetVariables {
5
+ (dataKeys: string[]): Promise<GetVariableResults>;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=get-variables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-variables.js","sourceRoot":"","sources":["../../../src/app/native-rating/get-variables.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { ContextResults } from './context-results';
2
+ export declare type GetZoneResults = ContextResults<any>;
3
+ /** Function to get zone data from the context */
4
+ export interface GetZone {
5
+ (dataKeys: string[]): Promise<GetZoneResults>;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=get-zone.js.map
@@ -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,2 @@
1
+ export * from './rating-context';
2
+ export * from './implementation-type';
@@ -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,5 @@
1
+ /** NumericCurrency so that we don't have to convert from the string Currency all over the place */
2
+ export interface NumericCurrency {
3
+ currency: string;
4
+ amount: number | undefined;
5
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=numeric-currency.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=rating-context.js.map
@@ -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 Estimated delivery text. It could be any text, a number, a date, etc. */
29
- estimated_delivery_text?: string;
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>;
@@ -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
- estimated_delivery_text: joi_1.default.string().optional().empty(),
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;CAyBhB;AAzBD,oBAyBC;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,uBAAuB,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE;CACzD,CAAC,CAAC"}
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,7 @@
1
+ /** And item that is part of a shipment */
2
+ export interface ShipmentItem {
3
+ /** Sku of the item */
4
+ sku?: string;
5
+ /** Quantity of the item */
6
+ quantity?: number;
7
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=shipment-item.js.map
@@ -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;AAc7C,8DAA8D;AAC9D,MAAa,eAAgB,SAAQ,0BAAW;CAiB/C;AAjBD,0CAiBC"}
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.9.1",
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,8 +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"
45
+ },
46
+ "peerDependencies": {
47
+ "@shipengine/connect-runtime": "^1.3.0-beta"
42
48
  }
43
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
+ };