@shopify/shopify-api 3.0.1 → 3.1.3
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 +25 -1
- 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 +8 -0
- package/dist/auth/session/session-utils.d.ts.map +1 -0
- package/dist/auth/session/session-utils.js +116 -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 +191 -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 +128 -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.d.ts +1 -2
- package/dist/clients/http_client/http_client.d.ts.map +1 -1
- package/dist/clients/http_client/http_client.js +100 -99
- 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 +13 -5
- 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/CHANGELOG.md
CHANGED
|
@@ -5,7 +5,31 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
|
6
6
|
and adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
##
|
|
8
|
+
## [3.1.3] - 2022-06-08
|
|
9
|
+
|
|
10
|
+
### Fixes
|
|
11
|
+
- Return instances of `Session` from session storages, not POJOs.
|
|
12
|
+
|
|
13
|
+
## [3.1.2] - 2022-06-07
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- Store user id and expiration date of online tokens
|
|
17
|
+
|
|
18
|
+
### Fixes
|
|
19
|
+
- Properly parse a non-json HTTP response [#257](https://github.com/Shopify/shopify-node-api/issues/257)
|
|
20
|
+
- Don’t create a SQLite DB file if the SQLite storage is not used.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## [3.1.0] - 2022-05-16
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
- Support for specifying the URI scheme of the host [#385](https://github.com/Shopify/shopify-node-api/pull/385)
|
|
27
|
+
- Add optional `saving` parameter to `serialize` of `Base` class - default is `false` and will include read-only attributes in returned object; `true` used for `save` when committing via API to Shopify.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
- Fixes [#363](https://github.com/Shopify/shopify-node-api/issues/363)
|
|
31
|
+
- Webhooks `register` now checks for any attempt to register a GDPR topic (not done via API but by Partner Dashboard), provides an error message in response
|
|
32
|
+
- For topics that don't exist, `register` checks the response from the initial API call for an `errors` field and returns accordingly
|
|
9
33
|
|
|
10
34
|
## [3.0.1] - 2022-04-11
|
|
11
35
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake-resource-with-custom-prefix.d.ts","sourceRoot":"","sources":["../../src/__tests__/fake-resource-with-custom-prefix.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,EAAE,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAEzC,UAAU,oCAAoC;IAC5C,OAAO,EAAE,gBAAgB,CAAC;IAC1B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB;AAED,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,IAAI;IAC5D,OAAc,WAAW,aAAuB;IAChD,SAAS,CAAC,MAAM,CAAC,IAAI,SAAsC;IAC3D,SAAS,CAAC,MAAM,CAAC,WAAW,SAAwC;IACpE,SAAS,CAAC,MAAM,CAAC,aAAa,SAA0B;IAExD,SAAS,CAAC,MAAM,CAAC,OAAO,KAAM;IAC9B,SAAS,CAAC,MAAM,CAAC,QAAQ,KAAM;IAE/B,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,CAOpC;IAEF,OAAc,IAAI,qBAGf,oCAAoC,KAAG,
|
|
1
|
+
{"version":3,"file":"fake-resource-with-custom-prefix.d.ts","sourceRoot":"","sources":["../../src/__tests__/fake-resource-with-custom-prefix.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,EAAE,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAEzC,UAAU,oCAAoC;IAC5C,OAAO,EAAE,gBAAgB,CAAC;IAC1B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB;AAED,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,IAAI;IAC5D,OAAc,WAAW,aAAuB;IAChD,SAAS,CAAC,MAAM,CAAC,IAAI,SAAsC;IAC3D,SAAS,CAAC,MAAM,CAAC,WAAW,SAAwC;IACpE,SAAS,CAAC,MAAM,CAAC,aAAa,SAA0B;IAExD,SAAS,CAAC,MAAM,CAAC,OAAO,KAAM;IAC9B,SAAS,CAAC,MAAM,CAAC,QAAQ,KAAM;IAE/B,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,CAOpC;IAEF,OAAc,IAAI,qBAGf,oCAAoC,KAAG,QAAQ,4BAA4B,GAAG,IAAI,CAAC,CAMpF;IAEF,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
|
|
@@ -8,6 +8,8 @@ var FakeResourceWithCustomPrefix = /** @class */ (function (_super) {
|
|
|
8
8
|
function FakeResourceWithCustomPrefix() {
|
|
9
9
|
return _super !== null && _super.apply(this, arguments) || this;
|
|
10
10
|
}
|
|
11
|
+
var _a;
|
|
12
|
+
_a = FakeResourceWithCustomPrefix;
|
|
11
13
|
FakeResourceWithCustomPrefix.API_VERSION = base_types_1.ApiVersion.Unstable;
|
|
12
14
|
FakeResourceWithCustomPrefix.NAME = 'fake_resource_with_custom_prefix';
|
|
13
15
|
FakeResourceWithCustomPrefix.PLURAL_NAME = 'fake_resource_with_custom_prefixes';
|
|
@@ -22,18 +24,18 @@ var FakeResourceWithCustomPrefix = /** @class */ (function (_super) {
|
|
|
22
24
|
path: 'fake_resource_with_custom_prefix/<id>.json',
|
|
23
25
|
},
|
|
24
26
|
];
|
|
25
|
-
FakeResourceWithCustomPrefix.find = function (
|
|
26
|
-
var session =
|
|
27
|
+
FakeResourceWithCustomPrefix.find = function (_b) {
|
|
28
|
+
var session = _b.session, id = _b.id;
|
|
27
29
|
return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
28
30
|
var result;
|
|
29
|
-
return tslib_1.__generator(
|
|
30
|
-
switch (
|
|
31
|
+
return tslib_1.__generator(_a, function (_c) {
|
|
32
|
+
switch (_c.label) {
|
|
31
33
|
case 0: return [4 /*yield*/, FakeResourceWithCustomPrefix.baseFind({
|
|
32
34
|
session: session,
|
|
33
35
|
urlIds: { id: id },
|
|
34
36
|
})];
|
|
35
37
|
case 1:
|
|
36
|
-
result =
|
|
38
|
+
result = _c.sent();
|
|
37
39
|
return [2 /*return*/, result ? result[0] : null];
|
|
38
40
|
}
|
|
39
41
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake-resource.d.ts","sourceRoot":"","sources":["../../src/__tests__/fake-resource.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,EAAE,EAAC,QAAQ,EAAE,YAAY,EAAC,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAEzC,UAAU,oBAAoB;IAC5B,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED,UAAU,sBAAsB;IAC9B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,IAAI;IAC5C,OAAc,WAAW,aAAuB;IAChD,SAAS,CAAC,MAAM,CAAC,IAAI,SAAmB;IACxC,SAAS,CAAC,MAAM,CAAC,WAAW,SAAoB;IAEhD,SAAS,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,CAA4B;IAE3E,SAAS,CAAC,MAAM,CAAC,OAAO;;MAEtB;IAEF,SAAS,CAAC,MAAM,CAAC,QAAQ;;MAEvB;IAEF,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,CAiDpC;IAEF,OAAc,IAAI,6DAMf,oBAAoB,KAAG,
|
|
1
|
+
{"version":3,"file":"fake-resource.d.ts","sourceRoot":"","sources":["../../src/__tests__/fake-resource.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,EAAE,EAAC,QAAQ,EAAE,YAAY,EAAC,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAEzC,UAAU,oBAAoB;IAC5B,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED,UAAU,sBAAsB;IAC9B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,IAAI;IAC5C,OAAc,WAAW,aAAuB;IAChD,SAAS,CAAC,MAAM,CAAC,IAAI,SAAmB;IACxC,SAAS,CAAC,MAAM,CAAC,WAAW,SAAoB;IAEhD,SAAS,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,CAA4B;IAE3E,SAAS,CAAC,MAAM,CAAC,OAAO;;MAEtB;IAEF,SAAS,CAAC,MAAM,CAAC,QAAQ;;MAEvB;IAEF,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,CAiDpC;IAEF,OAAc,IAAI,6DAMf,oBAAoB,KAAG,QAAQ,YAAY,GAAG,IAAI,CAAC,CAOpD;IAEF,OAAc,GAAG,yBAGd,mBAAmB,KAAG,QAAQ,YAAY,EAAE,CAAC,CAM9C;IAEF,OAAc,MAAM,wCAIjB,sBAAsB,KAAG,QAAQ,IAAI,CAAC,CASvC;IAEF,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACxC,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAC3C,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC"}
|
|
@@ -8,6 +8,8 @@ var FakeResource = /** @class */ (function (_super) {
|
|
|
8
8
|
function FakeResource() {
|
|
9
9
|
return _super !== null && _super.apply(this, arguments) || this;
|
|
10
10
|
}
|
|
11
|
+
var _a;
|
|
12
|
+
_a = FakeResource;
|
|
11
13
|
FakeResource.API_VERSION = base_types_1.ApiVersion.Unstable;
|
|
12
14
|
FakeResource.NAME = 'fake_resource';
|
|
13
15
|
FakeResource.PLURAL_NAME = 'fake_resources';
|
|
@@ -68,26 +70,26 @@ var FakeResource = /** @class */ (function (_super) {
|
|
|
68
70
|
path: 'other_resources/<other_resource_id>/fake_resources/<id>.json',
|
|
69
71
|
},
|
|
70
72
|
];
|
|
71
|
-
FakeResource.find = function (
|
|
73
|
+
FakeResource.find = function (_b) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
72
74
|
var result;
|
|
73
|
-
var session =
|
|
74
|
-
return tslib_1.__generator(
|
|
75
|
-
switch (
|
|
75
|
+
var session = _b.session, params = _b.params, id = _b.id, _c = _b.other_resource_id, other_resource_id = _c === void 0 ? null : _c, otherArgs = tslib_1.__rest(_b, ["session", "params", "id", "other_resource_id"]);
|
|
76
|
+
return tslib_1.__generator(_a, function (_d) {
|
|
77
|
+
switch (_d.label) {
|
|
76
78
|
case 0: return [4 /*yield*/, FakeResource.baseFind({
|
|
77
79
|
session: session,
|
|
78
80
|
urlIds: { id: id, other_resource_id: other_resource_id },
|
|
79
81
|
params: tslib_1.__assign(tslib_1.__assign({}, params), otherArgs),
|
|
80
82
|
})];
|
|
81
83
|
case 1:
|
|
82
|
-
result =
|
|
84
|
+
result = _d.sent();
|
|
83
85
|
return [2 /*return*/, result ? result[0] : null];
|
|
84
86
|
}
|
|
85
87
|
});
|
|
86
88
|
}); };
|
|
87
|
-
FakeResource.all = function (
|
|
88
|
-
var session =
|
|
89
|
+
FakeResource.all = function (_b) {
|
|
90
|
+
var session = _b.session, params = _b.params;
|
|
89
91
|
return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
90
|
-
return tslib_1.__generator(
|
|
92
|
+
return tslib_1.__generator(_a, function (_c) {
|
|
91
93
|
return [2 /*return*/, FakeResource.baseFind({
|
|
92
94
|
session: session,
|
|
93
95
|
params: params,
|
|
@@ -96,12 +98,12 @@ var FakeResource = /** @class */ (function (_super) {
|
|
|
96
98
|
});
|
|
97
99
|
});
|
|
98
100
|
};
|
|
99
|
-
FakeResource.custom = function (
|
|
100
|
-
var session =
|
|
101
|
+
FakeResource.custom = function (_b) {
|
|
102
|
+
var session = _b.session, id = _b.id, other_resource_id = _b.other_resource_id;
|
|
101
103
|
return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
102
104
|
var response;
|
|
103
|
-
return tslib_1.__generator(
|
|
104
|
-
switch (
|
|
105
|
+
return tslib_1.__generator(_a, function (_c) {
|
|
106
|
+
switch (_c.label) {
|
|
105
107
|
case 0: return [4 /*yield*/, FakeResource.request({
|
|
106
108
|
http_method: 'get',
|
|
107
109
|
operation: 'custom',
|
|
@@ -109,7 +111,7 @@ var FakeResource = /** @class */ (function (_super) {
|
|
|
109
111
|
urlIds: { id: id, other_resource_id: other_resource_id },
|
|
110
112
|
})];
|
|
111
113
|
case 1:
|
|
112
|
-
response =
|
|
114
|
+
response = _c.sent();
|
|
113
115
|
return [2 /*return*/, response.body];
|
|
114
116
|
}
|
|
115
117
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAexB,OAAO,EAAC,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAElD,OAAO,EACL,SAAS,EAIV,MAAM,SAAS,CAAC;AAEjB,QAAA,MAAM,YAAY;;IAGhB;;;;;;;;;;OAUG;uBAEQ,
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAexB,OAAO,EAAC,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAElD,OAAO,EACL,SAAS,EAIV,MAAM,SAAS,CAAC;AAEjB,QAAA,MAAM,YAAY;;IAGhB;;;;;;;;;;OAUG;uBAEQ,KAAK,eAAe,YACnB,KAAK,cAAc,QACvB,MAAM,gBACE,MAAM,uBAEnB,QAAQ,MAAM,CAAC;IAgDlB;;;;;;;;;;OAUG;kCAEQ,KAAK,eAAe,YACnB,KAAK,cAAc,SACtB,SAAS,GACf,QAAQ,gBAAgB,CAAC;IAuG5B;;;;;OAKG;gCAEQ,KAAK,eAAe,YACnB,KAAK,cAAc,GAC5B,MAAM,GAAG,SAAS;IAQrB;;;;;OAKG;0BACmB,MAAM,UAAU,MAAM,GAAG,MAAM;IAIrD;;;;OAIG;8BACuB,MAAM,GAAG,MAAM;IAIzC;;;;;;OAMG;iCAEQ,KAAK,eAAe,YACnB,KAAK,cAAc,uBAE5B,MAAM,GAAG,SAAS;CAiCtB,CAAC;AAcF,OAAO,EAAC,YAAY,EAAC,CAAC"}
|
package/dist/auth/oauth/oauth.js
CHANGED
|
@@ -40,8 +40,8 @@ var ShopifyOAuth = {
|
|
|
40
40
|
keys: [context_1.Context.API_SECRET_KEY],
|
|
41
41
|
secure: true,
|
|
42
42
|
});
|
|
43
|
-
state = nonce_1.default();
|
|
44
|
-
session = new session_1.Session(isOnline ? uuid_1.v4() : this.getOfflineSessionId(shop), shop, state, isOnline);
|
|
43
|
+
state = (0, nonce_1.default)();
|
|
44
|
+
session = new session_1.Session(isOnline ? (0, uuid_1.v4)() : this.getOfflineSessionId(shop), shop, state, isOnline);
|
|
45
45
|
return [4 /*yield*/, context_1.Context.SESSION_STORAGE.storeSession(session)];
|
|
46
46
|
case 1:
|
|
47
47
|
sessionStored = _a.sent();
|
|
@@ -57,12 +57,12 @@ var ShopifyOAuth = {
|
|
|
57
57
|
query = {
|
|
58
58
|
client_id: context_1.Context.API_KEY,
|
|
59
59
|
scope: context_1.Context.SCOPES.toString(),
|
|
60
|
-
redirect_uri: "
|
|
60
|
+
redirect_uri: "".concat(context_1.Context.HOST_SCHEME, "://").concat(context_1.Context.HOST_NAME).concat(redirectPath),
|
|
61
61
|
state: state,
|
|
62
62
|
'grant_options[]': isOnline ? 'per-user' : '',
|
|
63
63
|
};
|
|
64
64
|
queryString = querystring_1.default.stringify(query);
|
|
65
|
-
return [2 /*return*/, "https://"
|
|
65
|
+
return [2 /*return*/, "https://".concat(shop, "/admin/oauth/authorize?").concat(queryString)];
|
|
66
66
|
}
|
|
67
67
|
});
|
|
68
68
|
});
|
|
@@ -92,13 +92,13 @@ var ShopifyOAuth = {
|
|
|
92
92
|
});
|
|
93
93
|
sessionCookie = this.getCookieSessionId(request, response);
|
|
94
94
|
if (!sessionCookie) {
|
|
95
|
-
throw new ShopifyErrors.CookieNotFound("Cannot complete OAuth process. Could not find an OAuth cookie for shop url: "
|
|
95
|
+
throw new ShopifyErrors.CookieNotFound("Cannot complete OAuth process. Could not find an OAuth cookie for shop url: ".concat(query.shop));
|
|
96
96
|
}
|
|
97
97
|
return [4 /*yield*/, context_1.Context.SESSION_STORAGE.loadSession(sessionCookie)];
|
|
98
98
|
case 1:
|
|
99
99
|
currentSession = _a.sent();
|
|
100
100
|
if (!currentSession) {
|
|
101
|
-
throw new ShopifyErrors.SessionNotFound("Cannot complete OAuth process. No session found for the specified shop url: "
|
|
101
|
+
throw new ShopifyErrors.SessionNotFound("Cannot complete OAuth process. No session found for the specified shop url: ".concat(query.shop));
|
|
102
102
|
}
|
|
103
103
|
if (!validQuery(query, currentSession)) {
|
|
104
104
|
throw new ShopifyErrors.InvalidOAuthError('Invalid OAuth callback.');
|
|
@@ -127,7 +127,7 @@ var ShopifyOAuth = {
|
|
|
127
127
|
currentSession.onlineAccessInfo = rest;
|
|
128
128
|
if (!context_1.Context.IS_EMBEDDED_APP) return [3 /*break*/, 4];
|
|
129
129
|
onlineInfo = currentSession.onlineAccessInfo;
|
|
130
|
-
jwtSessionId = this.getJwtSessionId(currentSession.shop, ""
|
|
130
|
+
jwtSessionId = this.getJwtSessionId(currentSession.shop, "".concat(onlineInfo.associated_user.id));
|
|
131
131
|
jwtSession = session_1.Session.cloneSession(currentSession, jwtSessionId);
|
|
132
132
|
return [4 /*yield*/, context_1.Context.SESSION_STORAGE.deleteSession(currentSession.id)];
|
|
133
133
|
case 3:
|
|
@@ -181,7 +181,7 @@ var ShopifyOAuth = {
|
|
|
181
181
|
* @param userId Current actor id
|
|
182
182
|
*/
|
|
183
183
|
getJwtSessionId: function (shop, userId) {
|
|
184
|
-
return shop
|
|
184
|
+
return "".concat(shop, "_").concat(userId);
|
|
185
185
|
},
|
|
186
186
|
/**
|
|
187
187
|
* Builds an offline session id for the given shop.
|
|
@@ -189,7 +189,7 @@ var ShopifyOAuth = {
|
|
|
189
189
|
* @param shop Shopify shop domain
|
|
190
190
|
*/
|
|
191
191
|
getOfflineSessionId: function (shop) {
|
|
192
|
-
return "offline_"
|
|
192
|
+
return "offline_".concat(shop);
|
|
193
193
|
},
|
|
194
194
|
/**
|
|
195
195
|
* Extracts the current session id from the request / response pair.
|
|
@@ -208,7 +208,7 @@ var ShopifyOAuth = {
|
|
|
208
208
|
if (!matches) {
|
|
209
209
|
throw new ShopifyErrors.MissingJwtTokenError('Missing Bearer token in authorization header');
|
|
210
210
|
}
|
|
211
|
-
var jwtPayload = decode_session_token_1.default(matches[1]);
|
|
211
|
+
var jwtPayload = (0, decode_session_token_1.default)(matches[1]);
|
|
212
212
|
var shop = jwtPayload.dest.replace(/^https:\/\//, '');
|
|
213
213
|
if (isOnline) {
|
|
214
214
|
currentSessionId = this.getJwtSessionId(shop, jwtPayload.sub);
|
|
@@ -236,5 +236,5 @@ exports.ShopifyOAuth = ShopifyOAuth;
|
|
|
236
236
|
* @param session Current session
|
|
237
237
|
*/
|
|
238
238
|
function validQuery(query, session) {
|
|
239
|
-
return (hmac_validator_1.default(query) && safe_compare_1.default(query.state, session.state));
|
|
239
|
+
return ((0, hmac_validator_1.default)(query) && (0, safe_compare_1.default)(query.state, session.state));
|
|
240
240
|
}
|
|
@@ -6,7 +6,7 @@ var AuthScopes = /** @class */ (function () {
|
|
|
6
6
|
function AuthScopes(scopes) {
|
|
7
7
|
var scopesArray = [];
|
|
8
8
|
if (typeof scopes === 'string') {
|
|
9
|
-
scopesArray = scopes.split(new RegExp(AuthScopes.SCOPE_DELIMITER
|
|
9
|
+
scopesArray = scopes.split(new RegExp("".concat(AuthScopes.SCOPE_DELIMITER, "\\s*")));
|
|
10
10
|
}
|
|
11
11
|
else if (scopes) {
|
|
12
12
|
scopesArray = scopes;
|
|
@@ -17,8 +17,8 @@ var AuthScopes = /** @class */ (function () {
|
|
|
17
17
|
var impliedScopes = this.getImpliedScopes(scopesArray);
|
|
18
18
|
var scopeSet = new Set(scopesArray);
|
|
19
19
|
var impliedSet = new Set(impliedScopes);
|
|
20
|
-
this.compressedScopes = new Set(tslib_1.
|
|
21
|
-
this.expandedScopes = new Set(tslib_1.
|
|
20
|
+
this.compressedScopes = new Set(tslib_1.__spreadArray([], tslib_1.__read(scopeSet), false).filter(function (x) { return !impliedSet.has(x); }));
|
|
21
|
+
this.expandedScopes = new Set(tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(scopeSet), false), tslib_1.__read(impliedSet), false));
|
|
22
22
|
}
|
|
23
23
|
AuthScopes.prototype.has = function (scope) {
|
|
24
24
|
var _this = this;
|
|
@@ -46,13 +46,13 @@ var AuthScopes = /** @class */ (function () {
|
|
|
46
46
|
return this.toArray().join(AuthScopes.SCOPE_DELIMITER);
|
|
47
47
|
};
|
|
48
48
|
AuthScopes.prototype.toArray = function () {
|
|
49
|
-
return tslib_1.
|
|
49
|
+
return tslib_1.__spreadArray([], tslib_1.__read(this.compressedScopes), false);
|
|
50
50
|
};
|
|
51
51
|
AuthScopes.prototype.getImpliedScopes = function (scopesArray) {
|
|
52
52
|
return scopesArray.reduce(function (array, current) {
|
|
53
53
|
var matches = current.match(/^(unauthenticated_)?write_(.*)$/);
|
|
54
54
|
if (matches) {
|
|
55
|
-
array.push((matches[1] ? matches[1] : ''
|
|
55
|
+
array.push("".concat(matches[1] ? matches[1] : '', "read_").concat(matches[2]));
|
|
56
56
|
}
|
|
57
57
|
return array;
|
|
58
58
|
}, []);
|
|
@@ -2,11 +2,21 @@ import { Session } from './session';
|
|
|
2
2
|
import { SessionStorage } from './session_storage';
|
|
3
3
|
import { MemorySessionStorage } from './storage/memory';
|
|
4
4
|
import { CustomSessionStorage } from './storage/custom';
|
|
5
|
+
import { MySQLSessionStorage } from './storage/mysql';
|
|
6
|
+
import { MongoDBSessionStorage } from './storage/mongodb';
|
|
7
|
+
import { PostgreSQLSessionStorage } from './storage/postgresql';
|
|
8
|
+
import { RedisSessionStorage } from './storage/redis';
|
|
9
|
+
import { SQLiteSessionStorage } from './storage/sqlite';
|
|
5
10
|
declare const ShopifySession: {
|
|
6
11
|
Session: typeof Session;
|
|
7
12
|
MemorySessionStorage: typeof MemorySessionStorage;
|
|
8
13
|
CustomSessionStorage: typeof CustomSessionStorage;
|
|
14
|
+
MySQLSessionStorage: typeof MySQLSessionStorage;
|
|
15
|
+
MongoDBSessionStorage: typeof MongoDBSessionStorage;
|
|
16
|
+
PostgreSQLSessionStorage: typeof PostgreSQLSessionStorage;
|
|
17
|
+
RedisSessionStorage: typeof RedisSessionStorage;
|
|
18
|
+
SQLiteSessionStorage: typeof SQLiteSessionStorage;
|
|
9
19
|
};
|
|
10
20
|
export default ShopifySession;
|
|
11
|
-
export { Session, SessionStorage, MemorySessionStorage, CustomSessionStorage };
|
|
21
|
+
export { Session, SessionStorage, MemorySessionStorage, CustomSessionStorage, MySQLSessionStorage, MongoDBSessionStorage, PostgreSQLSessionStorage, RedisSessionStorage, SQLiteSessionStorage, };
|
|
12
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAClC,OAAO,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAC,oBAAoB,EAAC,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAC,oBAAoB,EAAC,MAAM,kBAAkB,CAAC;AAEtD,QAAA,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAClC,OAAO,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAC,oBAAoB,EAAC,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAC,oBAAoB,EAAC,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAC,mBAAmB,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,wBAAwB,EAAC,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAC,mBAAmB,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAC,oBAAoB,EAAC,MAAM,kBAAkB,CAAC;AAEtD,QAAA,MAAM,cAAc;;;;;;;;;CASnB,CAAC;AAEF,eAAe,cAAc,CAAC;AAC9B,OAAO,EACL,OAAO,EACP,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,GACrB,CAAC"}
|
|
@@ -1,15 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CustomSessionStorage = exports.MemorySessionStorage = exports.Session = void 0;
|
|
3
|
+
exports.SQLiteSessionStorage = exports.RedisSessionStorage = exports.PostgreSQLSessionStorage = exports.MongoDBSessionStorage = exports.MySQLSessionStorage = exports.CustomSessionStorage = exports.MemorySessionStorage = exports.Session = void 0;
|
|
4
4
|
var session_1 = require("./session");
|
|
5
5
|
Object.defineProperty(exports, "Session", { enumerable: true, get: function () { return session_1.Session; } });
|
|
6
6
|
var memory_1 = require("./storage/memory");
|
|
7
7
|
Object.defineProperty(exports, "MemorySessionStorage", { enumerable: true, get: function () { return memory_1.MemorySessionStorage; } });
|
|
8
8
|
var custom_1 = require("./storage/custom");
|
|
9
9
|
Object.defineProperty(exports, "CustomSessionStorage", { enumerable: true, get: function () { return custom_1.CustomSessionStorage; } });
|
|
10
|
+
var mysql_1 = require("./storage/mysql");
|
|
11
|
+
Object.defineProperty(exports, "MySQLSessionStorage", { enumerable: true, get: function () { return mysql_1.MySQLSessionStorage; } });
|
|
12
|
+
var mongodb_1 = require("./storage/mongodb");
|
|
13
|
+
Object.defineProperty(exports, "MongoDBSessionStorage", { enumerable: true, get: function () { return mongodb_1.MongoDBSessionStorage; } });
|
|
14
|
+
var postgresql_1 = require("./storage/postgresql");
|
|
15
|
+
Object.defineProperty(exports, "PostgreSQLSessionStorage", { enumerable: true, get: function () { return postgresql_1.PostgreSQLSessionStorage; } });
|
|
16
|
+
var redis_1 = require("./storage/redis");
|
|
17
|
+
Object.defineProperty(exports, "RedisSessionStorage", { enumerable: true, get: function () { return redis_1.RedisSessionStorage; } });
|
|
18
|
+
var sqlite_1 = require("./storage/sqlite");
|
|
19
|
+
Object.defineProperty(exports, "SQLiteSessionStorage", { enumerable: true, get: function () { return sqlite_1.SQLiteSessionStorage; } });
|
|
10
20
|
var ShopifySession = {
|
|
11
21
|
Session: session_1.Session,
|
|
12
22
|
MemorySessionStorage: memory_1.MemorySessionStorage,
|
|
13
23
|
CustomSessionStorage: custom_1.CustomSessionStorage,
|
|
24
|
+
MySQLSessionStorage: mysql_1.MySQLSessionStorage,
|
|
25
|
+
MongoDBSessionStorage: mongodb_1.MongoDBSessionStorage,
|
|
26
|
+
PostgreSQLSessionStorage: postgresql_1.PostgreSQLSessionStorage,
|
|
27
|
+
RedisSessionStorage: redis_1.RedisSessionStorage,
|
|
28
|
+
SQLiteSessionStorage: sqlite_1.SQLiteSessionStorage,
|
|
14
29
|
};
|
|
15
30
|
exports.default = ShopifySession;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SessionInterface } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Like Object.fromEntries(), but normalizes the keys and filters out null values.
|
|
4
|
+
*/
|
|
5
|
+
export declare function sessionFromEntries(entries: [string, string | number][]): SessionInterface;
|
|
6
|
+
export declare function sessionEntries(session: SessionInterface): [string, string | number][];
|
|
7
|
+
export declare function sessionEqual(sessionA: SessionInterface | undefined, sessionB: SessionInterface | undefined): boolean;
|
|
8
|
+
//# sourceMappingURL=session-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-utils.d.ts","sourceRoot":"","sources":["../../../src/auth/session/session-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAE9C;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,GACnC,gBAAgB,CAkDlB;AAYD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,GACxB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,CAsB7B;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,GACrC,OAAO,CAQT"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sessionEqual = exports.sessionEntries = exports.sessionFromEntries = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var session_1 = require("./session");
|
|
6
|
+
/**
|
|
7
|
+
* Like Object.fromEntries(), but normalizes the keys and filters out null values.
|
|
8
|
+
*/
|
|
9
|
+
function sessionFromEntries(entries) {
|
|
10
|
+
var obj = Object.fromEntries(entries
|
|
11
|
+
.filter(function (_a) {
|
|
12
|
+
var _b = tslib_1.__read(_a, 2), _key = _b[0], value = _b[1];
|
|
13
|
+
return value !== null && value !== undefined;
|
|
14
|
+
})
|
|
15
|
+
// Sanitize keys
|
|
16
|
+
.map(function (_a) {
|
|
17
|
+
var _b = tslib_1.__read(_a, 2), key = _b[0], value = _b[1];
|
|
18
|
+
switch (key.toLowerCase()) {
|
|
19
|
+
case 'isonline':
|
|
20
|
+
return ['isOnline', value];
|
|
21
|
+
case 'accesstoken':
|
|
22
|
+
return ['accessToken', value];
|
|
23
|
+
case 'onlineaccessinfo':
|
|
24
|
+
return ['onlineAccessInfo', value];
|
|
25
|
+
default:
|
|
26
|
+
return [key.toLowerCase(), value];
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
// Sanitize values
|
|
30
|
+
.map(function (_a) {
|
|
31
|
+
var _b = tslib_1.__read(_a, 2), key = _b[0], value = _b[1];
|
|
32
|
+
switch (key) {
|
|
33
|
+
case 'isOnline':
|
|
34
|
+
if (typeof value === 'string') {
|
|
35
|
+
return [key, value.toString().toLowerCase() === 'true'];
|
|
36
|
+
}
|
|
37
|
+
else if (typeof value === 'number') {
|
|
38
|
+
return [key, Boolean(value)];
|
|
39
|
+
}
|
|
40
|
+
return [key, value];
|
|
41
|
+
case 'scope':
|
|
42
|
+
return [key, value.toString()];
|
|
43
|
+
case 'expires':
|
|
44
|
+
return [key, value ? new Date(Number(value) * 1000) : undefined];
|
|
45
|
+
case 'onlineAccessInfo':
|
|
46
|
+
return [
|
|
47
|
+
key,
|
|
48
|
+
{
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
50
|
+
associated_user: {
|
|
51
|
+
id: Number(value),
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
default:
|
|
56
|
+
return [key, value];
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
Object.setPrototypeOf(obj, session_1.Session.prototype);
|
|
60
|
+
return obj;
|
|
61
|
+
}
|
|
62
|
+
exports.sessionFromEntries = sessionFromEntries;
|
|
63
|
+
var includedKeys = [
|
|
64
|
+
'id',
|
|
65
|
+
'shop',
|
|
66
|
+
'state',
|
|
67
|
+
'isOnline',
|
|
68
|
+
'scope',
|
|
69
|
+
'accessToken',
|
|
70
|
+
'expires',
|
|
71
|
+
'onlineAccessInfo',
|
|
72
|
+
];
|
|
73
|
+
function sessionEntries(session) {
|
|
74
|
+
return (Object.entries(session)
|
|
75
|
+
.filter(function (_a) {
|
|
76
|
+
var _b = tslib_1.__read(_a, 2), key = _b[0], value = _b[1];
|
|
77
|
+
return includedKeys.includes(key) && value !== undefined && value !== null;
|
|
78
|
+
})
|
|
79
|
+
// Prepare values for db storage
|
|
80
|
+
.map(function (_a) {
|
|
81
|
+
var _b;
|
|
82
|
+
var _c = tslib_1.__read(_a, 2), key = _c[0], value = _c[1];
|
|
83
|
+
switch (key) {
|
|
84
|
+
case 'expires':
|
|
85
|
+
return [
|
|
86
|
+
key,
|
|
87
|
+
value ? Math.floor(value.getTime() / 1000) : undefined,
|
|
88
|
+
];
|
|
89
|
+
case 'onlineAccessInfo':
|
|
90
|
+
return [key, (_b = value === null || value === void 0 ? void 0 : value.associated_user) === null || _b === void 0 ? void 0 : _b.id];
|
|
91
|
+
default:
|
|
92
|
+
return [key, value];
|
|
93
|
+
}
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
exports.sessionEntries = sessionEntries;
|
|
97
|
+
function sessionEqual(sessionA, sessionB) {
|
|
98
|
+
if (!sessionA)
|
|
99
|
+
return false;
|
|
100
|
+
if (!sessionB)
|
|
101
|
+
return false;
|
|
102
|
+
var copyA = sessionEntries(sessionA);
|
|
103
|
+
copyA.sort(function (_a, _b) {
|
|
104
|
+
var _c = tslib_1.__read(_a, 1), k1 = _c[0];
|
|
105
|
+
var _d = tslib_1.__read(_b, 1), k2 = _d[0];
|
|
106
|
+
return (k1 < k2 ? -1 : 1);
|
|
107
|
+
});
|
|
108
|
+
var copyB = sessionEntries(sessionB);
|
|
109
|
+
copyB.sort(function (_a, _b) {
|
|
110
|
+
var _c = tslib_1.__read(_a, 1), k1 = _c[0];
|
|
111
|
+
var _d = tslib_1.__read(_b, 1), k2 = _d[0];
|
|
112
|
+
return (k1 < k2 ? -1 : 1);
|
|
113
|
+
});
|
|
114
|
+
return JSON.stringify(copyA) === JSON.stringify(copyB);
|
|
115
|
+
}
|
|
116
|
+
exports.sessionEqual = sessionEqual;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"battery-of-tests.d.ts","sourceRoot":"","sources":["../../../../../src/auth/session/storage/__tests__/battery-of-tests.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAErD,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,QA+F3E"}
|