@shopify/shopify-api 3.0.1 → 3.1.0
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/CHANGELOG.md +11 -0
- package/dist/__tests__/fake-resource-with-custom-prefix.d.ts.map +1 -1
- package/dist/__tests__/fake-resource-with-custom-prefix.js +7 -5
- package/dist/__tests__/fake-resource.d.ts.map +1 -1
- package/dist/__tests__/fake-resource.js +15 -13
- package/dist/auth/oauth/oauth.d.ts.map +1 -1
- package/dist/auth/oauth/oauth.js +11 -11
- package/dist/auth/scopes/index.js +5 -5
- package/dist/auth/session/index.d.ts +11 -1
- package/dist/auth/session/index.d.ts.map +1 -1
- package/dist/auth/session/index.js +16 -1
- package/dist/auth/session/session-utils.d.ts +7 -0
- package/dist/auth/session/session-utils.d.ts.map +1 -0
- package/dist/auth/session/session-utils.js +50 -0
- package/dist/auth/session/storage/__tests__/battery-of-tests.d.ts +3 -0
- package/dist/auth/session/storage/__tests__/battery-of-tests.d.ts.map +1 -0
- package/dist/auth/session/storage/__tests__/battery-of-tests.js +78 -0
- package/dist/auth/session/storage/__tests__/utils.d.ts +10 -0
- package/dist/auth/session/storage/__tests__/utils.d.ts.map +1 -0
- package/dist/auth/session/storage/__tests__/utils.js +87 -0
- package/dist/auth/session/storage/custom.js +4 -4
- package/dist/auth/session/storage/mongodb.d.ts +23 -0
- package/dist/auth/session/storage/mongodb.d.ts.map +1 -0
- package/dist/auth/session/storage/mongodb.js +150 -0
- package/dist/auth/session/storage/mysql.d.ts +22 -0
- package/dist/auth/session/storage/mysql.d.ts.map +1 -0
- package/dist/auth/session/storage/mysql.js +154 -0
- package/dist/auth/session/storage/postgresql.d.ts +24 -0
- package/dist/auth/session/storage/postgresql.d.ts.map +1 -0
- package/dist/auth/session/storage/postgresql.js +172 -0
- package/dist/auth/session/storage/redis.d.ts +20 -0
- package/dist/auth/session/storage/redis.d.ts.map +1 -0
- package/dist/auth/session/storage/redis.js +105 -0
- package/dist/auth/session/storage/sqlite.d.ts +19 -0
- package/dist/auth/session/storage/sqlite.d.ts.map +1 -0
- package/dist/auth/session/storage/sqlite.js +125 -0
- package/dist/base-rest-resource.d.ts +2 -1
- package/dist/base-rest-resource.d.ts.map +1 -1
- package/dist/base-rest-resource.js +29 -19
- package/dist/base-types.d.ts +1 -0
- package/dist/base-types.d.ts.map +1 -1
- package/dist/clients/graphql/graphql_client.js +1 -1
- package/dist/clients/http_client/http_client.js +16 -16
- package/dist/clients/rest/rest_client.js +5 -3
- package/dist/context.d.ts +1 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +9 -3
- package/dist/error.js +4 -3
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/rest-resources/2021-07/index.js +2 -0
- package/dist/rest-resources/2021-10/index.js +2 -0
- package/dist/rest-resources/2022-01/index.js +2 -0
- package/dist/rest-resources/2022-04/index.js +2 -0
- package/dist/utils/decode-session-token.js +1 -1
- package/dist/utils/graphql_proxy.js +1 -1
- package/dist/utils/hmac-validator.js +2 -5
- package/dist/utils/processed-query.js +3 -3
- package/dist/utils/safe-compare.d.ts.map +1 -1
- package/dist/utils/safe-compare.js +17 -15
- package/dist/utils/setup-jest.d.ts.map +1 -1
- package/dist/utils/setup-jest.js +4 -3
- package/dist/utils/with-session.js +3 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/webhooks/registry.d.ts +2 -1
- package/dist/webhooks/registry.d.ts.map +1 -1
- package/dist/webhooks/registry.js +39 -13
- package/package.json +12 -4
package/dist/error.js
CHANGED
|
@@ -5,12 +5,12 @@ var tslib_1 = require("tslib");
|
|
|
5
5
|
var ShopifyError = /** @class */ (function (_super) {
|
|
6
6
|
tslib_1.__extends(ShopifyError, _super);
|
|
7
7
|
function ShopifyError() {
|
|
8
|
-
var _newTarget = this.constructor;
|
|
9
8
|
var args = [];
|
|
10
9
|
for (var _i = 0; _i < arguments.length; _i++) {
|
|
11
10
|
args[_i] = arguments[_i];
|
|
12
11
|
}
|
|
13
|
-
var
|
|
12
|
+
var _newTarget = this.constructor;
|
|
13
|
+
var _this = _super.apply(this, tslib_1.__spreadArray([], tslib_1.__read(args), false)) || this;
|
|
14
14
|
Object.setPrototypeOf(_this, _newTarget.prototype);
|
|
15
15
|
return _this;
|
|
16
16
|
}
|
|
@@ -124,8 +124,9 @@ exports.HttpInternalError = HttpInternalError;
|
|
|
124
124
|
var HttpThrottlingError = /** @class */ (function (_super) {
|
|
125
125
|
tslib_1.__extends(HttpThrottlingError, _super);
|
|
126
126
|
function HttpThrottlingError(_a) {
|
|
127
|
+
var _this = this;
|
|
127
128
|
var retryAfter = _a.retryAfter, params = tslib_1.__rest(_a, ["retryAfter"]);
|
|
128
|
-
|
|
129
|
+
_this = _super.call(this, params) || this;
|
|
129
130
|
_this.response.retryAfter = retryAfter;
|
|
130
131
|
return _this;
|
|
131
132
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,11 @@ export declare const Shopify: {
|
|
|
15
15
|
Session: typeof import("./auth/session/session").Session;
|
|
16
16
|
MemorySessionStorage: typeof import("./auth/session").MemorySessionStorage;
|
|
17
17
|
CustomSessionStorage: typeof import("./auth/session").CustomSessionStorage;
|
|
18
|
+
MySQLSessionStorage: typeof import("./auth/session").MySQLSessionStorage;
|
|
19
|
+
MongoDBSessionStorage: typeof import("./auth/session").MongoDBSessionStorage;
|
|
20
|
+
PostgreSQLSessionStorage: typeof import("./auth/session").PostgreSQLSessionStorage;
|
|
21
|
+
RedisSessionStorage: typeof import("./auth/session").RedisSessionStorage;
|
|
22
|
+
SQLiteSessionStorage: typeof import("./auth/session").SQLiteSessionStorage;
|
|
18
23
|
};
|
|
19
24
|
Clients: {
|
|
20
25
|
Rest: typeof import("./clients/rest/rest_client").RestClient;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,aAAa,MAAM,SAAS,CAAC;AAOzC,eAAO,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,aAAa,MAAM,SAAS,CAAC;AAOzC,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQnB,CAAC;AAEF,eAAe,OAAO,CAAC;AACvB,cAAc,SAAS,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaymentTransaction = exports.PaymentGateway = exports.Payment = exports.Page = exports.OrderRisk = exports.Order = exports.MobilePlatformApplication = exports.Metafield = exports.MarketingEvent = exports.LocationsForMove = exports.Location = exports.InventoryLevel = exports.InventoryItem = exports.Image = exports.GiftCardAdjustment = exports.GiftCard = exports.FulfillmentService = exports.FulfillmentRequest = exports.FulfillmentOrder = exports.FulfillmentEvent = exports.Fulfillment = exports.Event = exports.DraftOrder = exports.Dispute = exports.DiscountCode = exports.DeprecatedApiCall = exports.CustomerSavedSearch = exports.CustomerAddress = exports.Customer = exports.CustomCollection = exports.Currency = exports.Country = exports.Comment = exports.CollectionListing = exports.Collection = exports.Collect = exports.Checkout = exports.CarrierService = exports.CancellationRequest = exports.Blog = exports.Balance = exports.AssignedFulfillmentOrder = exports.Asset = exports.Article = exports.ApplicationCredit = exports.ApplicationCharge = exports.ApplePayCertificate = exports.AndroidPayKey = exports.AccessScope = exports.AbandonedCheckout = void 0;
|
|
4
|
+
exports.Webhook = exports.Variant = exports.User = exports.UsageCharge = exports.Transaction = exports.Theme = exports.TenderTransaction = exports.StorefrontAccessToken = exports.SmartCollection = exports.Shop = exports.ShippingZone = exports.ScriptTag = exports.ResourceFeedback = exports.Report = exports.Refund = exports.Redirect = exports.RecurringApplicationCharge = exports.Province = exports.ProductResourceFeedback = exports.ProductListing = exports.Product = exports.PriceRule = exports.Policy = exports.Payout = void 0;
|
|
3
5
|
var abandoned_checkout_1 = require("./abandoned_checkout");
|
|
4
6
|
Object.defineProperty(exports, "AbandonedCheckout", { enumerable: true, get: function () { return abandoned_checkout_1.AbandonedCheckout; } });
|
|
5
7
|
var access_scope_1 = require("./access_scope");
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaymentTransaction = exports.PaymentGateway = exports.Payment = exports.Page = exports.OrderRisk = exports.Order = exports.MobilePlatformApplication = exports.Metafield = exports.MarketingEvent = exports.LocationsForMove = exports.Location = exports.InventoryLevel = exports.InventoryItem = exports.Image = exports.GiftCardAdjustment = exports.GiftCard = exports.FulfillmentService = exports.FulfillmentRequest = exports.FulfillmentOrder = exports.FulfillmentEvent = exports.Fulfillment = exports.Event = exports.DraftOrder = exports.Dispute = exports.DiscountCode = exports.DeprecatedApiCall = exports.CustomerSavedSearch = exports.CustomerAddress = exports.Customer = exports.CustomCollection = exports.Currency = exports.Country = exports.Comment = exports.CollectionListing = exports.Collection = exports.Collect = exports.Checkout = exports.CarrierService = exports.CancellationRequest = exports.Blog = exports.Balance = exports.AssignedFulfillmentOrder = exports.Asset = exports.Article = exports.ApplicationCredit = exports.ApplicationCharge = exports.ApplePayCertificate = exports.AndroidPayKey = exports.AccessScope = exports.AbandonedCheckout = void 0;
|
|
4
|
+
exports.Webhook = exports.Variant = exports.User = exports.UsageCharge = exports.Transaction = exports.Theme = exports.TenderTransaction = exports.StorefrontAccessToken = exports.SmartCollection = exports.Shop = exports.ShippingZone = exports.ScriptTag = exports.ResourceFeedback = exports.Report = exports.Refund = exports.Redirect = exports.RecurringApplicationCharge = exports.Province = exports.ProductResourceFeedback = exports.ProductListing = exports.Product = exports.PriceRule = exports.Policy = exports.Payout = void 0;
|
|
3
5
|
var abandoned_checkout_1 = require("./abandoned_checkout");
|
|
4
6
|
Object.defineProperty(exports, "AbandonedCheckout", { enumerable: true, get: function () { return abandoned_checkout_1.AbandonedCheckout; } });
|
|
5
7
|
var access_scope_1 = require("./access_scope");
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaymentTransaction = exports.PaymentGateway = exports.Payment = exports.Page = exports.OrderRisk = exports.Order = exports.MobilePlatformApplication = exports.Metafield = exports.MarketingEvent = exports.LocationsForMove = exports.Location = exports.InventoryLevel = exports.InventoryItem = exports.Image = exports.GiftCardAdjustment = exports.GiftCard = exports.FulfillmentService = exports.FulfillmentRequest = exports.FulfillmentOrder = exports.FulfillmentEvent = exports.Fulfillment = exports.Event = exports.DraftOrder = exports.Dispute = exports.DiscountCode = exports.DeprecatedApiCall = exports.CustomerSavedSearch = exports.CustomerAddress = exports.Customer = exports.CustomCollection = exports.Currency = exports.Country = exports.Comment = exports.CollectionListing = exports.Collection = exports.Collect = exports.Checkout = exports.CarrierService = exports.CancellationRequest = exports.Blog = exports.Balance = exports.AssignedFulfillmentOrder = exports.Asset = exports.Article = exports.ApplicationCredit = exports.ApplicationCharge = exports.ApplePayCertificate = exports.AndroidPayKey = exports.AccessScope = exports.AbandonedCheckout = void 0;
|
|
4
|
+
exports.Webhook = exports.Variant = exports.User = exports.UsageCharge = exports.Transaction = exports.Theme = exports.TenderTransaction = exports.StorefrontAccessToken = exports.SmartCollection = exports.Shop = exports.ShippingZone = exports.ScriptTag = exports.ResourceFeedback = exports.Report = exports.Refund = exports.Redirect = exports.RecurringApplicationCharge = exports.Province = exports.ProductResourceFeedback = exports.ProductListing = exports.Product = exports.PriceRule = exports.Policy = exports.Payout = void 0;
|
|
3
5
|
var abandoned_checkout_1 = require("./abandoned_checkout");
|
|
4
6
|
Object.defineProperty(exports, "AbandonedCheckout", { enumerable: true, get: function () { return abandoned_checkout_1.AbandonedCheckout; } });
|
|
5
7
|
var access_scope_1 = require("./access_scope");
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaymentTransaction = exports.PaymentGateway = exports.Payment = exports.Page = exports.OrderRisk = exports.Order = exports.MobilePlatformApplication = exports.Metafield = exports.MarketingEvent = exports.LocationsForMove = exports.Location = exports.InventoryLevel = exports.InventoryItem = exports.Image = exports.GiftCardAdjustment = exports.GiftCard = exports.FulfillmentService = exports.FulfillmentRequest = exports.FulfillmentOrder = exports.FulfillmentEvent = exports.Fulfillment = exports.Event = exports.DraftOrder = exports.Dispute = exports.DiscountCode = exports.DeprecatedApiCall = exports.CustomerSavedSearch = exports.CustomerAddress = exports.Customer = exports.CustomCollection = exports.Currency = exports.Country = exports.Comment = exports.CollectionListing = exports.Collection = exports.Collect = exports.Checkout = exports.CarrierService = exports.CancellationRequest = exports.Blog = exports.Balance = exports.AssignedFulfillmentOrder = exports.Asset = exports.Article = exports.ApplicationCredit = exports.ApplicationCharge = exports.ApplePayCertificate = exports.AndroidPayKey = exports.AccessScope = exports.AbandonedCheckout = void 0;
|
|
4
|
+
exports.Webhook = exports.Variant = exports.User = exports.UsageCharge = exports.Transaction = exports.Theme = exports.TenderTransaction = exports.StorefrontAccessToken = exports.SmartCollection = exports.Shop = exports.ShippingZone = exports.ScriptTag = exports.ResourceFeedback = exports.Report = exports.Refund = exports.Redirect = exports.RecurringApplicationCharge = exports.Province = exports.ProductResourceFeedback = exports.ProductListing = exports.Product = exports.PriceRule = exports.Policy = exports.Payout = void 0;
|
|
3
5
|
var abandoned_checkout_1 = require("./abandoned_checkout");
|
|
4
6
|
Object.defineProperty(exports, "AbandonedCheckout", { enumerable: true, get: function () { return abandoned_checkout_1.AbandonedCheckout; } });
|
|
5
7
|
var access_scope_1 = require("./access_scope");
|
|
@@ -20,7 +20,7 @@ function decodeSessionToken(token) {
|
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
catch (error) {
|
|
23
|
-
throw new ShopifyErrors.InvalidJwtError("Failed to parse session token '"
|
|
23
|
+
throw new ShopifyErrors.InvalidJwtError("Failed to parse session token '".concat(token, "': ").concat(error.message));
|
|
24
24
|
}
|
|
25
25
|
// The exp and nbf fields are validated by the JWT library
|
|
26
26
|
if (payload.aud !== context_1.Context.API_KEY) {
|
|
@@ -10,7 +10,7 @@ function graphqlProxy(userReq, userRes) {
|
|
|
10
10
|
var _this = this;
|
|
11
11
|
return tslib_1.__generator(this, function (_a) {
|
|
12
12
|
switch (_a.label) {
|
|
13
|
-
case 0: return [4 /*yield*/, load_current_session_1.default(userReq, userRes)];
|
|
13
|
+
case 0: return [4 /*yield*/, (0, load_current_session_1.default)(userReq, userRes)];
|
|
14
14
|
case 1:
|
|
15
15
|
session = _a.sent();
|
|
16
16
|
if (!session) {
|
|
@@ -19,10 +19,7 @@ function stringifyQuery(query) {
|
|
|
19
19
|
exports.stringifyQuery = stringifyQuery;
|
|
20
20
|
function generateLocalHmac(_a) {
|
|
21
21
|
var code = _a.code, timestamp = _a.timestamp, state = _a.state, shop = _a.shop, host = _a.host;
|
|
22
|
-
var queryString = stringifyQuery(tslib_1.__assign({ code: code,
|
|
23
|
-
timestamp: timestamp,
|
|
24
|
-
state: state,
|
|
25
|
-
shop: shop }, (host && { host: host })));
|
|
22
|
+
var queryString = stringifyQuery(tslib_1.__assign({ code: code, timestamp: timestamp, state: state, shop: shop }, (host && { host: host })));
|
|
26
23
|
return crypto_1.default
|
|
27
24
|
.createHmac('sha256', context_1.Context.API_SECRET_KEY)
|
|
28
25
|
.update(queryString)
|
|
@@ -40,6 +37,6 @@ function validateHmac(query) {
|
|
|
40
37
|
}
|
|
41
38
|
var hmac = query.hmac;
|
|
42
39
|
var localHmac = generateLocalHmac(query);
|
|
43
|
-
return safe_compare_1.default(hmac, localHmac);
|
|
40
|
+
return (0, safe_compare_1.default)(hmac, localHmac);
|
|
44
41
|
}
|
|
45
42
|
exports.default = validateHmac;
|
|
@@ -31,20 +31,20 @@ var ProcessedQuery = /** @class */ (function () {
|
|
|
31
31
|
}
|
|
32
32
|
};
|
|
33
33
|
ProcessedQuery.prototype.putArray = function (key, value) {
|
|
34
|
-
this.processedQuery[key
|
|
34
|
+
this.processedQuery["".concat(key, "[]")] = value;
|
|
35
35
|
};
|
|
36
36
|
ProcessedQuery.prototype.putObject = function (key, value) {
|
|
37
37
|
var _this = this;
|
|
38
38
|
Object.entries(value).forEach(function (_a) {
|
|
39
39
|
var _b = tslib_1.__read(_a, 2), entry = _b[0], entryValue = _b[1];
|
|
40
|
-
_this.processedQuery[key
|
|
40
|
+
_this.processedQuery["".concat(key, "[").concat(entry, "]")] = entryValue;
|
|
41
41
|
});
|
|
42
42
|
};
|
|
43
43
|
ProcessedQuery.prototype.putSimple = function (key, value) {
|
|
44
44
|
this.processedQuery[key] = value;
|
|
45
45
|
};
|
|
46
46
|
ProcessedQuery.prototype.stringify = function () {
|
|
47
|
-
return "?"
|
|
47
|
+
return "?".concat(querystring_1.default.stringify(this.processedQuery));
|
|
48
48
|
};
|
|
49
49
|
return ProcessedQuery;
|
|
50
50
|
}());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-compare.d.ts","sourceRoot":"","sources":["../../src/utils/safe-compare.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CACjC,IAAI,EAAE,MAAM,GAAG;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,EAC5D,IAAI,EAAE,MAAM,GAAG;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAC3D,OAAO,
|
|
1
|
+
{"version":3,"file":"safe-compare.d.ts","sourceRoot":"","sources":["../../src/utils/safe-compare.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CACjC,IAAI,EAAE,MAAM,GAAG;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,EAC5D,IAAI,EAAE,MAAM,GAAG;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAC3D,OAAO,CAyBT"}
|
|
@@ -10,23 +10,25 @@ var ShopifyErrors = tslib_1.__importStar(require("../error"));
|
|
|
10
10
|
* @param strB any string, array of strings, or object with string values
|
|
11
11
|
*/
|
|
12
12
|
function safeCompare(strA, strB) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
else {
|
|
21
|
-
buffA = Buffer.from(strA);
|
|
22
|
-
buffB = Buffer.from(strB);
|
|
23
|
-
}
|
|
24
|
-
if (buffA.length === buffB.length) {
|
|
25
|
-
return crypto_1.default.timingSafeEqual(buffA, buffB);
|
|
26
|
-
}
|
|
13
|
+
var buffA;
|
|
14
|
+
var buffB;
|
|
15
|
+
if (typeof strA !== typeof strB) {
|
|
16
|
+
throw new ShopifyErrors.SafeCompareError("Mismatched data types provided: ".concat(typeof strA, " and ").concat(typeof strB));
|
|
17
|
+
}
|
|
18
|
+
if (typeof strA === 'object') {
|
|
19
|
+
buffA = Buffer.from(JSON.stringify(strA));
|
|
27
20
|
}
|
|
28
21
|
else {
|
|
29
|
-
|
|
22
|
+
buffA = Buffer.from(strA);
|
|
23
|
+
}
|
|
24
|
+
if (typeof strB === 'object') {
|
|
25
|
+
buffB = Buffer.from(JSON.stringify(strB));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
buffB = Buffer.from(strB);
|
|
29
|
+
}
|
|
30
|
+
if (buffA.length === buffB.length) {
|
|
31
|
+
return crypto_1.default.timingSafeEqual(buffA, buffB);
|
|
30
32
|
}
|
|
31
33
|
return false;
|
|
32
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-jest.d.ts","sourceRoot":"","sources":["../../src/utils/setup-jest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup-jest.d.ts","sourceRoot":"","sources":["../../src/utils/setup-jest.ts"],"names":[],"mappings":"AAsCA,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,IAAI,CAAC;QAEb,UAAU,QAAQ,CAAC,CAAC;YAClB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;YAC7D,sBAAsB,IAAI,CAAC,CAAC;SAC7B;KAEF;CACF"}
|
package/dist/utils/setup-jest.js
CHANGED
|
@@ -14,6 +14,7 @@ beforeEach(function () {
|
|
|
14
14
|
API_SECRET_KEY: 'test_secret_key',
|
|
15
15
|
SCOPES: ['test_scope'],
|
|
16
16
|
HOST_NAME: 'test_host_name',
|
|
17
|
+
HOST_SCHEME: 'https',
|
|
17
18
|
API_VERSION: base_types_1.ApiVersion.Unstable,
|
|
18
19
|
IS_EMBEDDED_APP: false,
|
|
19
20
|
IS_PRIVATE_APP: false,
|
|
@@ -36,7 +37,7 @@ expect.extend({
|
|
|
36
37
|
Math.abs(received - compareDate) <= seconds * 1000) {
|
|
37
38
|
return {
|
|
38
39
|
message: function () {
|
|
39
|
-
return "expected "
|
|
40
|
+
return "expected ".concat(received, " not to be within ").concat(seconds, " seconds of ").concat(compareDate);
|
|
40
41
|
},
|
|
41
42
|
pass: true,
|
|
42
43
|
};
|
|
@@ -44,7 +45,7 @@ expect.extend({
|
|
|
44
45
|
else {
|
|
45
46
|
return {
|
|
46
47
|
message: function () {
|
|
47
|
-
return "expected "
|
|
48
|
+
return "expected ".concat(received, " to be within ").concat(seconds, " seconds of ").concat(compareDate);
|
|
48
49
|
},
|
|
49
50
|
pass: false,
|
|
50
51
|
};
|
|
@@ -61,7 +62,7 @@ expect.extend({
|
|
|
61
62
|
if (bodyObject && mockCall[1]) {
|
|
62
63
|
mockCall[1].body = JSON.parse(mockCall[1].body);
|
|
63
64
|
}
|
|
64
|
-
expect(mockCall[0]).toEqual("https://"
|
|
65
|
+
expect(mockCall[0]).toEqual("https://".concat(domain).concat(path).concat(query ? "?".concat(query.replace(/\+/g, '%20')) : ''));
|
|
65
66
|
expect(mockCall[1]).toMatchObject({ method: method, headers: headers, body: data });
|
|
66
67
|
}
|
|
67
68
|
return {
|
|
@@ -19,7 +19,7 @@ function withSession(_a) {
|
|
|
19
19
|
if (!req || !res) {
|
|
20
20
|
throw new ShopifyErrors.MissingRequiredArgument('Please pass in both the "request" and "response" objects.');
|
|
21
21
|
}
|
|
22
|
-
return [4 /*yield*/, load_current_session_1.default(req, res)];
|
|
22
|
+
return [4 /*yield*/, (0, load_current_session_1.default)(req, res)];
|
|
23
23
|
case 1:
|
|
24
24
|
session = _b.sent();
|
|
25
25
|
return [3 /*break*/, 4];
|
|
@@ -27,7 +27,7 @@ function withSession(_a) {
|
|
|
27
27
|
if (!shop) {
|
|
28
28
|
throw new ShopifyErrors.MissingRequiredArgument('Please pass in a value for "shop"');
|
|
29
29
|
}
|
|
30
|
-
return [4 /*yield*/, load_offline_session_1.default(shop)];
|
|
30
|
+
return [4 /*yield*/, (0, load_offline_session_1.default)(shop)];
|
|
31
31
|
case 3:
|
|
32
32
|
session = _b.sent();
|
|
33
33
|
_b.label = 4;
|
|
@@ -52,7 +52,7 @@ function withSession(_a) {
|
|
|
52
52
|
session: session,
|
|
53
53
|
}];
|
|
54
54
|
default:
|
|
55
|
-
throw new ShopifyErrors.UnsupportedClientType("\""
|
|
55
|
+
throw new ShopifyErrors.UnsupportedClientType("\"".concat(clientType, "\" is an unsupported clientType. Please use \"rest\" or \"graphql\"."));
|
|
56
56
|
}
|
|
57
57
|
return [2 /*return*/];
|
|
58
58
|
}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const SHOPIFY_API_LIBRARY_VERSION = "3.0
|
|
1
|
+
export declare const SHOPIFY_API_LIBRARY_VERSION = "3.1.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -59,6 +59,7 @@ interface RegistryInterface {
|
|
|
59
59
|
}
|
|
60
60
|
declare function buildCheckQuery(topic: string): string;
|
|
61
61
|
declare function buildQuery(topic: string, address: string, deliveryMethod?: DeliveryMethod, webhookId?: string): string;
|
|
62
|
+
declare const gdprTopics: string[];
|
|
62
63
|
declare const WebhooksRegistry: RegistryInterface;
|
|
63
|
-
export { WebhooksRegistry, RegistryInterface, buildCheckQuery, buildQuery };
|
|
64
|
+
export { WebhooksRegistry, RegistryInterface, buildCheckQuery, buildQuery, gdprTopics, };
|
|
64
65
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/webhooks/registry.ts"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AAUxB,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,oBAAoB,EAEpB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAEjB,UAAU,gBAAgB;IACxB,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAAC;CACvC;AAED,UAAU,iBAAiB;IACzB,eAAe,EAAE;QAAC,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAAA;KAAC,CAAC;IAEzD;;;;;OAKG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAE/D;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAE9C;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;IAEvD;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAE5D;;;;OAIG;IACH,WAAW,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAExE;;;;;OAKG;IACH,OAAO,CACL,OAAO,EAAE,IAAI,CAAC,eAAe,EAC7B,QAAQ,EAAE,IAAI,CAAC,cAAc,GAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC;AAiCD,iBAAS,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAuB9C;AAED,iBAAS,UAAU,CACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,cAAc,GAAE,cAAoC,EACpD,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAmDR;AAED,QAAA,MAAM,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/webhooks/registry.ts"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AAUxB,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,oBAAoB,EAEpB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAEjB,UAAU,gBAAgB;IACxB,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAAC;CACvC;AAED,UAAU,iBAAiB;IACzB,eAAe,EAAE;QAAC,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAAA;KAAC,CAAC;IAEzD;;;;;OAKG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAE/D;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAE9C;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;IAEvD;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAE5D;;;;OAIG;IACH,WAAW,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAExE;;;;;OAKG;IACH,OAAO,CACL,OAAO,EAAE,IAAI,CAAC,eAAe,EAC7B,QAAQ,EAAE,IAAI,CAAC,cAAc,GAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC;AAiCD,iBAAS,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAuB9C;AAED,iBAAS,UAAU,CACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,cAAc,GAAE,cAAoC,EACpD,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAmDR;AAED,QAAA,MAAM,UAAU,EAAE,MAAM,EAIvB,CAAC;AAEF,QAAA,MAAM,gBAAgB,EAAE,iBA0PvB,CAAC;AAEF,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,UAAU,GACX,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildQuery = exports.buildCheckQuery = exports.WebhooksRegistry = void 0;
|
|
3
|
+
exports.gdprTopics = exports.buildQuery = exports.buildCheckQuery = exports.WebhooksRegistry = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var crypto_1 = require("crypto");
|
|
6
6
|
var network_1 = require("@shopify/network");
|
|
@@ -34,7 +34,7 @@ function validateDeliveryMethod(_deliveryMethod) {
|
|
|
34
34
|
return true;
|
|
35
35
|
}
|
|
36
36
|
function buildCheckQuery(topic) {
|
|
37
|
-
return "{\n webhookSubscriptions(first: 1, topics: "
|
|
37
|
+
return "{\n webhookSubscriptions(first: 1, topics: ".concat(topic, ") {\n edges {\n node {\n id\n endpoint {\n __typename\n ... on WebhookHttpEndpoint {\n callbackUrl\n }\n ... on WebhookEventBridgeEndpoint {\n arn\n }\n ... on WebhookPubSubEndpoint {\n pubSubProject\n pubSubTopic\n }\n }\n }\n }\n }\n }");
|
|
38
38
|
}
|
|
39
39
|
exports.buildCheckQuery = buildCheckQuery;
|
|
40
40
|
function buildQuery(topic, address, deliveryMethod, webhookId) {
|
|
@@ -43,10 +43,10 @@ function buildQuery(topic, address, deliveryMethod, webhookId) {
|
|
|
43
43
|
validateDeliveryMethod(deliveryMethod);
|
|
44
44
|
var identifier;
|
|
45
45
|
if (webhookId) {
|
|
46
|
-
identifier = "id: \""
|
|
46
|
+
identifier = "id: \"".concat(webhookId, "\"");
|
|
47
47
|
}
|
|
48
48
|
else {
|
|
49
|
-
identifier = "topic: "
|
|
49
|
+
identifier = "topic: ".concat(topic);
|
|
50
50
|
}
|
|
51
51
|
var mutationName;
|
|
52
52
|
var webhookSubscriptionArgs;
|
|
@@ -57,13 +57,13 @@ function buildQuery(topic, address, deliveryMethod, webhookId) {
|
|
|
57
57
|
mutationName = webhookId
|
|
58
58
|
? 'webhookSubscriptionUpdate'
|
|
59
59
|
: 'webhookSubscriptionCreate';
|
|
60
|
-
webhookSubscriptionArgs = "{callbackUrl: \""
|
|
60
|
+
webhookSubscriptionArgs = "{callbackUrl: \"".concat(address, "\"}");
|
|
61
61
|
break;
|
|
62
62
|
case types_1.DeliveryMethod.EventBridge:
|
|
63
63
|
mutationName = webhookId
|
|
64
64
|
? 'eventBridgeWebhookSubscriptionUpdate'
|
|
65
65
|
: 'eventBridgeWebhookSubscriptionCreate';
|
|
66
|
-
webhookSubscriptionArgs = "{arn: \""
|
|
66
|
+
webhookSubscriptionArgs = "{arn: \"".concat(address, "\"}");
|
|
67
67
|
break;
|
|
68
68
|
case types_1.DeliveryMethod.PubSub:
|
|
69
69
|
mutationName = webhookId
|
|
@@ -72,12 +72,18 @@ function buildQuery(topic, address, deliveryMethod, webhookId) {
|
|
|
72
72
|
_a = tslib_1.__read(address
|
|
73
73
|
.replace(/^pubsub:\/\//, '')
|
|
74
74
|
.split(':'), 2), pubSubProject = _a[0], pubSubTopic = _a[1];
|
|
75
|
-
webhookSubscriptionArgs = "{pubSubProject: \""
|
|
75
|
+
webhookSubscriptionArgs = "{pubSubProject: \"".concat(pubSubProject, "\",\n pubSubTopic: \"").concat(pubSubTopic, "\"}");
|
|
76
76
|
break;
|
|
77
77
|
}
|
|
78
|
-
return "\n mutation webhookSubscription {\n "
|
|
78
|
+
return "\n mutation webhookSubscription {\n ".concat(mutationName, "(").concat(identifier, ", webhookSubscription: ").concat(webhookSubscriptionArgs, ") {\n userErrors {\n field\n message\n }\n webhookSubscription {\n id\n }\n }\n }\n ");
|
|
79
79
|
}
|
|
80
80
|
exports.buildQuery = buildQuery;
|
|
81
|
+
var gdprTopics = [
|
|
82
|
+
'CUSTOMERS_DATA_REQUEST',
|
|
83
|
+
'CUSTOMERS_REDACT',
|
|
84
|
+
'SHOP_REDACT',
|
|
85
|
+
];
|
|
86
|
+
exports.gdprTopics = gdprTopics;
|
|
81
87
|
var WebhooksRegistry = {
|
|
82
88
|
webhookRegistry: {},
|
|
83
89
|
addHandler: function (topic, _a) {
|
|
@@ -106,10 +112,23 @@ var WebhooksRegistry = {
|
|
|
106
112
|
switch (_c.label) {
|
|
107
113
|
case 0:
|
|
108
114
|
registerReturn = {};
|
|
115
|
+
if (gdprTopics.includes(topic)) {
|
|
116
|
+
registerReturn[topic] = {
|
|
117
|
+
success: false,
|
|
118
|
+
result: {
|
|
119
|
+
errors: [
|
|
120
|
+
{
|
|
121
|
+
message: "GDPR topic '".concat(topic, "' cannot be registered here. Please set the appropriate webhook endpoint in the 'GDPR mandatory webhooks' section of 'App setup' in the Partners Dashboard"),
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
return [2 /*return*/, registerReturn];
|
|
127
|
+
}
|
|
109
128
|
validateDeliveryMethod(deliveryMethod);
|
|
110
129
|
client = new graphql_client_1.GraphqlClient(shop, accessToken);
|
|
111
130
|
address = deliveryMethod === types_1.DeliveryMethod.Http
|
|
112
|
-
? "
|
|
131
|
+
? "".concat(context_1.Context.HOST_SCHEME, "://").concat(context_1.Context.HOST_NAME).concat(path)
|
|
113
132
|
: path;
|
|
114
133
|
return [4 /*yield*/, client.query({
|
|
115
134
|
data: buildCheckQuery(topic),
|
|
@@ -117,6 +136,13 @@ var WebhooksRegistry = {
|
|
|
117
136
|
case 1:
|
|
118
137
|
checkResult = (_c.sent());
|
|
119
138
|
mustRegister = true;
|
|
139
|
+
if ('errors' in checkResult.body) {
|
|
140
|
+
registerReturn[topic] = {
|
|
141
|
+
success: false,
|
|
142
|
+
result: checkResult.body,
|
|
143
|
+
};
|
|
144
|
+
return [2 /*return*/, registerReturn];
|
|
145
|
+
}
|
|
120
146
|
if (checkResult.body.data.webhookSubscriptions.edges.length) {
|
|
121
147
|
node = checkResult.body.data.webhookSubscriptions.edges[0].node;
|
|
122
148
|
endpointAddress = '';
|
|
@@ -252,10 +278,10 @@ var WebhooksRegistry = {
|
|
|
252
278
|
if (missingHeaders.length) {
|
|
253
279
|
response.writeHead(network_1.StatusCode.BadRequest);
|
|
254
280
|
response.end();
|
|
255
|
-
return [2 /*return*/, reject(new ShopifyErrors.InvalidWebhookError("Missing one or more of the required HTTP headers to process webhooks: ["
|
|
281
|
+
return [2 /*return*/, reject(new ShopifyErrors.InvalidWebhookError("Missing one or more of the required HTTP headers to process webhooks: [".concat(missingHeaders.join(', '), "]")))];
|
|
256
282
|
}
|
|
257
283
|
headers = {};
|
|
258
|
-
generatedHash = crypto_1.createHmac('sha256', context_1.Context.API_SECRET_KEY)
|
|
284
|
+
generatedHash = (0, crypto_1.createHmac)('sha256', context_1.Context.API_SECRET_KEY)
|
|
259
285
|
.update(reqBody, 'utf8')
|
|
260
286
|
.digest('base64');
|
|
261
287
|
if (!utils_1.default.safeCompare(generatedHash, hmac)) return [3 /*break*/, 7];
|
|
@@ -280,12 +306,12 @@ var WebhooksRegistry = {
|
|
|
280
306
|
case 4: return [3 /*break*/, 6];
|
|
281
307
|
case 5:
|
|
282
308
|
statusCode = network_1.StatusCode.Forbidden;
|
|
283
|
-
responseError = new ShopifyErrors.InvalidWebhookError("No webhook is registered for topic "
|
|
309
|
+
responseError = new ShopifyErrors.InvalidWebhookError("No webhook is registered for topic ".concat(topic));
|
|
284
310
|
_a.label = 6;
|
|
285
311
|
case 6: return [3 /*break*/, 8];
|
|
286
312
|
case 7:
|
|
287
313
|
statusCode = network_1.StatusCode.Forbidden;
|
|
288
|
-
responseError = new ShopifyErrors.InvalidWebhookError("Could not validate request for topic "
|
|
314
|
+
responseError = new ShopifyErrors.InvalidWebhookError("Could not validate request for topic ".concat(topic));
|
|
289
315
|
_a.label = 8;
|
|
290
316
|
case 8:
|
|
291
317
|
response.writeHead(statusCode, headers);
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shopify/shopify-api",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Shopify API Library for Node - accelerate development with support for authentication, graphql proxy, webhooks",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"prettier": "@shopify/prettier-config",
|
|
8
8
|
"scripts": {
|
|
9
|
-
"test": "jest --testPathIgnorePatterns=src/rest-resources/__tests__",
|
|
9
|
+
"test": "jest --testPathIgnorePatterns=src/rest-resources/__tests__ --testPathIgnorePatterns=src/auth/session/storage",
|
|
10
|
+
"test_sessionstorage": "jest src/auth/session/storage",
|
|
10
11
|
"test_rest_resources": "ls src/rest-resources/__tests__ | xargs -I \"{}\" sh -c 'yarn jest --no-coverage --testPathPattern=\\\"{}\\\" || exit 255'",
|
|
11
12
|
"build": "tsc",
|
|
12
13
|
"lint": "eslint '**/*.{ts,tsx}' --max-warnings 0",
|
|
@@ -49,7 +50,12 @@
|
|
|
49
50
|
"@types/supertest": "^2.0.10",
|
|
50
51
|
"cookies": "^0.8.0",
|
|
51
52
|
"jsonwebtoken": "^8.5.1",
|
|
53
|
+
"mongodb": "^4.5.0",
|
|
54
|
+
"mysql2": "^2.3.3",
|
|
52
55
|
"node-fetch": "^2.6.1",
|
|
56
|
+
"pg": "^8.7.3",
|
|
57
|
+
"redis": "^4.0.6",
|
|
58
|
+
"sqlite3": "^5.0.2",
|
|
53
59
|
"tslib": "^2.0.3",
|
|
54
60
|
"uuid": "^8.3.1"
|
|
55
61
|
},
|
|
@@ -58,7 +64,9 @@
|
|
|
58
64
|
"@shopify/prettier-config": "^1.1.2",
|
|
59
65
|
"@types/cookies": "^0.7.5",
|
|
60
66
|
"@types/jest": "^26.0.15",
|
|
61
|
-
"@types/node": "^14.
|
|
67
|
+
"@types/node": "^14.18.12",
|
|
68
|
+
"@types/pg": "^8.6.5",
|
|
69
|
+
"@types/sqlite3": "^3.1.8",
|
|
62
70
|
"@types/uuid": "^8.3.0",
|
|
63
71
|
"eslint": "^7.30.0",
|
|
64
72
|
"eslint-plugin-prettier": "^4.0.0",
|
|
@@ -69,7 +77,7 @@
|
|
|
69
77
|
"rimraf": "^3.0.2",
|
|
70
78
|
"supertest": "^6.1.3",
|
|
71
79
|
"ts-jest": "^27.1.1",
|
|
72
|
-
"typescript": "^
|
|
80
|
+
"typescript": "^4.6.3"
|
|
73
81
|
},
|
|
74
82
|
"files": [
|
|
75
83
|
"dist/*",
|