@shopify/shopify-api 3.1.0 → 3.1.2

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 CHANGED
@@ -5,7 +5,15 @@ 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
- ## Unreleased
8
+ ## [3.1.1] - 2022-06-07
9
+
10
+ ### Added
11
+ - Store user id and expiration date of online tokens
12
+
13
+ ### Fixes
14
+ - Properly parse a non-json HTTP response [#257](https://github.com/Shopify/shopify-node-api/issues/257)
15
+ - Don’t create a SQLite DB file if the SQLite storage is not used.
16
+
9
17
 
10
18
  ## [3.1.0] - 2022-05-16
11
19
 
@@ -4,4 +4,5 @@ import type { SessionInterface } from './types';
4
4
  */
5
5
  export declare function sessionFromEntries(entries: [string, string | number][]): SessionInterface;
6
6
  export declare function sessionEntries(session: SessionInterface): [string, string | number][];
7
+ export declare function sessionEqual(sessionA: SessionInterface | undefined, sessionB: SessionInterface | undefined): boolean;
7
8
  //# sourceMappingURL=session-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-utils.d.ts","sourceRoot":"","sources":["../../../src/auth/session/session-utils.ts"],"names":[],"mappings":"AAAA,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,CAsBlB;AAUD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,GACxB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,CAE7B"}
1
+ {"version":3,"file":"session-utils.d.ts","sourceRoot":"","sources":["../../../src/auth/session/session-utils.ts"],"names":[],"mappings":"AAAA,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,CAgDlB;AAYD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,GACxB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,CAmB7B;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,GACrC,OAAO,CAMT"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sessionEntries = exports.sessionFromEntries = void 0;
3
+ exports.sessionEqual = exports.sessionEntries = exports.sessionFromEntries = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  /**
6
6
  * Like Object.fromEntries(), but normalizes the keys and filters out null values.
@@ -11,6 +11,7 @@ function sessionFromEntries(entries) {
11
11
  var _b = tslib_1.__read(_a, 2), _key = _b[0], value = _b[1];
12
12
  return value !== null;
13
13
  })
14
+ // Sanitize keys
14
15
  .map(function (_a) {
15
16
  var _b = tslib_1.__read(_a, 2), key = _b[0], value = _b[1];
16
17
  switch (key.toLowerCase()) {
@@ -18,18 +19,42 @@ function sessionFromEntries(entries) {
18
19
  return ['isOnline', value];
19
20
  case 'accesstoken':
20
21
  return ['accessToken', value];
22
+ case 'onlineaccessinfo':
23
+ return ['onlineAccessInfo', value];
21
24
  default:
22
25
  return [key.toLowerCase(), value];
23
26
  }
27
+ })
28
+ // Sanitize values
29
+ .map(function (_a) {
30
+ var _b = tslib_1.__read(_a, 2), key = _b[0], value = _b[1];
31
+ switch (key) {
32
+ case 'isOnline':
33
+ if (typeof value === 'string') {
34
+ return [key, value.toString().toLowerCase() === 'true'];
35
+ }
36
+ else if (typeof value === 'number') {
37
+ return [key, Boolean(value)];
38
+ }
39
+ return [key, value];
40
+ case 'scope':
41
+ return [key, value.toString()];
42
+ case 'expires':
43
+ return [key, value ? new Date(Number(value) * 1000) : undefined];
44
+ case 'onlineAccessInfo':
45
+ return [
46
+ key,
47
+ {
48
+ // eslint-disable-next-line @typescript-eslint/naming-convention
49
+ associated_user: {
50
+ id: Number(value),
51
+ },
52
+ },
53
+ ];
54
+ default:
55
+ return [key, value];
56
+ }
24
57
  }));
25
- if (typeof obj.isOnline === 'string') {
26
- obj.isOnline = obj.isOnline.toString().toLowerCase() === 'true';
27
- }
28
- else if (typeof obj.isOnline === 'number') {
29
- obj.isOnline = Boolean(obj.isOnline);
30
- }
31
- if (obj.scope)
32
- obj.scope = obj.scope.toString();
33
58
  return obj;
34
59
  }
35
60
  exports.sessionFromEntries = sessionFromEntries;
@@ -40,11 +65,40 @@ var includedKeys = [
40
65
  'isOnline',
41
66
  'scope',
42
67
  'accessToken',
68
+ 'expires',
69
+ 'onlineAccessInfo',
43
70
  ];
44
71
  function sessionEntries(session) {
45
- return Object.entries(session).filter(function (_a) {
72
+ return (Object.entries(session)
73
+ .filter(function (_a) {
46
74
  var _b = tslib_1.__read(_a, 1), key = _b[0];
47
75
  return includedKeys.includes(key);
48
- });
76
+ })
77
+ // Prepare values for db storage
78
+ .map(function (_a) {
79
+ var _b;
80
+ var _c = tslib_1.__read(_a, 2), key = _c[0], value = _c[1];
81
+ switch (key) {
82
+ case 'expires':
83
+ return [
84
+ key,
85
+ value ? Math.floor(value.getTime() / 1000) : undefined,
86
+ ];
87
+ case 'onlineAccessInfo':
88
+ return [key, (_b = value === null || value === void 0 ? void 0 : value.associated_user) === null || _b === void 0 ? void 0 : _b.id];
89
+ default:
90
+ return [key, value];
91
+ }
92
+ }));
49
93
  }
50
94
  exports.sessionEntries = sessionEntries;
95
+ function sessionEqual(sessionA, sessionB) {
96
+ if (!sessionA)
97
+ return false;
98
+ if (!sessionB)
99
+ return false;
100
+ var copyA = sessionFromEntries(sessionEntries(sessionA));
101
+ var copyB = sessionFromEntries(sessionEntries(sessionB));
102
+ return JSON.stringify(copyA) === JSON.stringify(copyB);
103
+ }
104
+ exports.sessionEqual = sessionEqual;
@@ -1 +1 @@
1
- {"version":3,"file":"battery-of-tests.d.ts","sourceRoot":"","sources":["../../../../../src/auth/session/storage/__tests__/battery-of-tests.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAErD,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,QAkC3E"}
1
+ {"version":3,"file":"battery-of-tests.d.ts","sourceRoot":"","sources":["../../../../../src/auth/session/storage/__tests__/battery-of-tests.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAErD,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,QAqF3E"}
@@ -3,59 +3,161 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.batteryOfTests = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var session_1 = require("../../session");
6
+ var session_utils_1 = require("../../session-utils");
6
7
  function batteryOfTests(storageFactory) {
7
8
  var _this = this;
8
- it('can store and delete offline sessions', function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
9
- var storage, sessionId, session;
10
- return tslib_1.__generator(this, function (_a) {
11
- switch (_a.label) {
12
- case 0: return [4 /*yield*/, storageFactory()];
13
- case 1:
14
- storage = _a.sent();
9
+ it('can store and delete all kinds of sessions', function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
10
+ var sessionFactories, sessionId, storage, sessionFactories_1, sessionFactories_1_1, factory, session, _a, _b, _c, _d, e_1_1;
11
+ var e_1, _e;
12
+ var _this = this;
13
+ return tslib_1.__generator(this, function (_f) {
14
+ switch (_f.label) {
15
+ case 0:
16
+ sessionFactories = [
17
+ function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
18
+ var session;
19
+ return tslib_1.__generator(this, function (_a) {
20
+ session = new session_1.Session(sessionId, 'shop', 'state', false);
21
+ return [2 /*return*/, session];
22
+ });
23
+ }); },
24
+ function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
25
+ var session, expiryDate;
26
+ return tslib_1.__generator(this, function (_a) {
27
+ session = new session_1.Session(sessionId, 'shop', 'state', false);
28
+ expiryDate = new Date();
29
+ expiryDate.setMinutes(expiryDate.getMinutes() + 60);
30
+ session.expires = expiryDate;
31
+ return [2 /*return*/, session];
32
+ });
33
+ }); },
34
+ function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
35
+ var session;
36
+ return tslib_1.__generator(this, function (_a) {
37
+ session = new session_1.Session(sessionId, 'shop', 'state', false);
38
+ session.expires = null;
39
+ return [2 /*return*/, session];
40
+ });
41
+ }); },
42
+ function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
43
+ var session;
44
+ return tslib_1.__generator(this, function (_a) {
45
+ session = new session_1.Session(sessionId, 'shop', 'state', false);
46
+ session.expires = undefined;
47
+ return [2 /*return*/, session];
48
+ });
49
+ }); },
50
+ function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
51
+ var session;
52
+ return tslib_1.__generator(this, function (_a) {
53
+ session = new session_1.Session(sessionId, 'shop', 'state', false);
54
+ // eslint-disable-next-line @typescript-eslint/naming-convention
55
+ session.onlineAccessInfo = { associated_user: {} };
56
+ session.onlineAccessInfo.associated_user.id = 123;
57
+ return [2 /*return*/, session];
58
+ });
59
+ }); },
60
+ ];
15
61
  sessionId = 'test_session';
16
- session = new session_1.Session(sessionId, 'shop', 'state', false);
17
- return [4 /*yield*/, expect(storage.storeSession(session)).resolves.toBe(true)];
62
+ return [4 /*yield*/, storageFactory()];
63
+ case 1:
64
+ storage = _f.sent();
65
+ _f.label = 2;
18
66
  case 2:
19
- _a.sent();
20
- return [4 /*yield*/, expect(storage.loadSession(sessionId)).resolves.toEqual(session)];
67
+ _f.trys.push([2, 14, 15, 16]);
68
+ sessionFactories_1 = tslib_1.__values(sessionFactories), sessionFactories_1_1 = sessionFactories_1.next();
69
+ _f.label = 3;
21
70
  case 3:
22
- _a.sent();
23
- return [4 /*yield*/, expect(storage.storeSession(session)).resolves.toBe(true)];
71
+ if (!!sessionFactories_1_1.done) return [3 /*break*/, 13];
72
+ factory = sessionFactories_1_1.value;
73
+ return [4 /*yield*/, factory()];
24
74
  case 4:
25
- _a.sent();
26
- return [4 /*yield*/, expect(storage.loadSession(sessionId)).resolves.toEqual(session)];
75
+ session = _f.sent();
76
+ return [4 /*yield*/, expect(storage.storeSession(session)).resolves.toBe(true)];
27
77
  case 5:
28
- _a.sent();
29
- return [4 /*yield*/, expect(storage.deleteSession(sessionId)).resolves.toBe(true)];
78
+ _f.sent();
79
+ _a = expect;
80
+ _b = session_utils_1.sessionEqual;
81
+ return [4 /*yield*/, storage.loadSession(sessionId)];
30
82
  case 6:
31
- _a.sent();
32
- return [4 /*yield*/, expect(storage.loadSession(sessionId)).resolves.toBeUndefined()];
83
+ _a.apply(void 0, [_b.apply(void 0, [_f.sent(), session])]).toBe(true);
84
+ return [4 /*yield*/, expect(storage.storeSession(session)).resolves.toBe(true)];
33
85
  case 7:
34
- _a.sent();
86
+ _f.sent();
87
+ _c = expect;
88
+ _d = session_utils_1.sessionEqual;
89
+ return [4 /*yield*/, storage.loadSession(sessionId)];
90
+ case 8:
91
+ _c.apply(void 0, [_d.apply(void 0, [_f.sent(), session])]).toBe(true);
92
+ return [4 /*yield*/, expect(storage.deleteSession(sessionId)).resolves.toBe(true)];
93
+ case 9:
94
+ _f.sent();
95
+ return [4 /*yield*/, expect(storage.loadSession(sessionId)).resolves.toBeUndefined()];
96
+ case 10:
97
+ _f.sent();
35
98
  // Deleting a non-existing session should work
36
99
  return [4 /*yield*/, expect(storage.deleteSession(sessionId)).resolves.toBe(true)];
37
- case 8:
100
+ case 11:
38
101
  // Deleting a non-existing session should work
39
- _a.sent();
102
+ _f.sent();
103
+ _f.label = 12;
104
+ case 12:
105
+ sessionFactories_1_1 = sessionFactories_1.next();
106
+ return [3 /*break*/, 3];
107
+ case 13: return [3 /*break*/, 16];
108
+ case 14:
109
+ e_1_1 = _f.sent();
110
+ e_1 = { error: e_1_1 };
111
+ return [3 /*break*/, 16];
112
+ case 15:
113
+ try {
114
+ if (sessionFactories_1_1 && !sessionFactories_1_1.done && (_e = sessionFactories_1.return)) _e.call(sessionFactories_1);
115
+ }
116
+ finally { if (e_1) throw e_1.error; }
117
+ return [7 /*endfinally*/];
118
+ case 16: return [2 /*return*/];
119
+ }
120
+ });
121
+ }); });
122
+ it('can store sessions with unexpected fields', function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
123
+ var storage, sessionId, session, _a, _b;
124
+ return tslib_1.__generator(this, function (_c) {
125
+ switch (_c.label) {
126
+ case 0: return [4 /*yield*/, storageFactory()];
127
+ case 1:
128
+ storage = _c.sent();
129
+ sessionId = 'test_session';
130
+ session = new session_1.Session(sessionId, 'shop', 'state', true);
131
+ session.someField = 'lol';
132
+ return [4 /*yield*/, expect(storage.storeSession(session)).resolves.toBe(true)];
133
+ case 2:
134
+ _c.sent();
135
+ _a = expect;
136
+ _b = session_utils_1.sessionEqual;
137
+ return [4 /*yield*/, storage.loadSession(sessionId)];
138
+ case 3:
139
+ _a.apply(void 0, [_b.apply(void 0, [_c.sent(), session])]).toBe(true);
40
140
  return [2 /*return*/];
41
141
  }
42
142
  });
43
143
  }); });
44
144
  it('can store and delete sessions with online tokens', function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
45
- var storage, sessionId, session;
46
- return tslib_1.__generator(this, function (_a) {
47
- switch (_a.label) {
145
+ var storage, sessionId, session, _a, _b;
146
+ return tslib_1.__generator(this, function (_c) {
147
+ switch (_c.label) {
48
148
  case 0: return [4 /*yield*/, storageFactory()];
49
149
  case 1:
50
- storage = _a.sent();
150
+ storage = _c.sent();
51
151
  sessionId = 'test_session';
52
152
  session = new session_1.Session(sessionId, 'shop', 'state', true);
53
153
  return [4 /*yield*/, expect(storage.storeSession(session)).resolves.toBe(true)];
54
154
  case 2:
55
- _a.sent();
56
- return [4 /*yield*/, expect(storage.loadSession(sessionId)).resolves.toEqual(session)];
155
+ _c.sent();
156
+ _a = expect;
157
+ _b = session_utils_1.sessionEqual;
158
+ return [4 /*yield*/, storage.loadSession(sessionId)];
57
159
  case 3:
58
- _a.sent();
160
+ _a.apply(void 0, [_b.apply(void 0, [_c.sent(), session])]).toBe(true);
59
161
  return [2 /*return*/];
60
162
  }
61
163
  });
@@ -1 +1 @@
1
- {"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../../../src/auth/session/storage/mysql.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAKD,qBAAa,mBAAoB,YAAW,cAAc;IAuBtD,OAAO,CAAC,KAAK;IAtBf,MAAM,CAAC,eAAe,CACpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,CAAC,0BAA0B,CAAC;IAY3C,SAAgB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,UAAU,CAAmB;gBAG3B,KAAK,EAAE,GAAG,EAClB,IAAI,GAAE,OAAO,CAAC,0BAA0B,CAAM;IASnC,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBzD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAY9D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAI1B,IAAI;YAKJ,eAAe;YAQf,WAAW;IAiBzB,OAAO,CAAC,KAAK;CAGd"}
1
+ {"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../../../src/auth/session/storage/mysql.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAKD,qBAAa,mBAAoB,YAAW,cAAc;IAuBtD,OAAO,CAAC,KAAK;IAtBf,MAAM,CAAC,eAAe,CACpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,CAAC,0BAA0B,CAAC;IAY3C,SAAgB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,UAAU,CAAmB;gBAG3B,KAAK,EAAE,GAAG,EAClB,IAAI,GAAE,OAAO,CAAC,0BAA0B,CAAM;IASnC,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBzD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAY9D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAI1B,IAAI;YAKJ,eAAe;YAQf,WAAW;IAmBzB,OAAO,CAAC,KAAK;CAGd"}
@@ -135,7 +135,7 @@ var MySQLSessionStorage = /** @class */ (function () {
135
135
  case 1:
136
136
  hasSessionTable = _a.sent();
137
137
  if (!!hasSessionTable) return [3 /*break*/, 3];
138
- query = "\n CREATE TABLE ".concat(this.options.sessionTableName, " (\n id varchar(255) NOT NULL PRIMARY KEY,\n shop varchar(255) NOT NULL,\n state varchar(255) NOT NULL,\n isOnline tinyint NOT NULL,\n scope varchar(255),\n accessToken varchar(255)\n )\n ");
138
+ query = "\n CREATE TABLE ".concat(this.options.sessionTableName, " (\n id varchar(255) NOT NULL PRIMARY KEY,\n shop varchar(255) NOT NULL,\n state varchar(255) NOT NULL,\n isOnline tinyint NOT NULL,\n scope varchar(255),\n expires integer,\n onlineAccessInfo varchar(255),\n accessToken varchar(255)\n )\n ");
139
139
  return [4 /*yield*/, this.query(query)];
140
140
  case 2:
141
141
  _a.sent();
@@ -1 +1 @@
1
- {"version":3,"file":"postgresql.d.ts","sourceRoot":"","sources":["../../../../src/auth/session/storage/postgresql.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,+BAA+B;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAOD,qBAAa,wBAAyB,YAAW,cAAc;IAuB3D,OAAO,CAAC,KAAK;IAtBf,MAAM,CAAC,eAAe,CACpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,CAAC,+BAA+B,CAAC;IAYhD,SAAgB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,MAAM,CAAY;gBAGhB,KAAK,EAAE,GAAG,EAClB,IAAI,GAAE,OAAO,CAAC,+BAA+B,CAAM;IASxC,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBzD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAY9D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUjD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAIpB,IAAI;YAMJ,aAAa;YAIb,eAAe;YAQf,WAAW;YAiBX,KAAK;CAIpB"}
1
+ {"version":3,"file":"postgresql.d.ts","sourceRoot":"","sources":["../../../../src/auth/session/storage/postgresql.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,+BAA+B;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAOD,qBAAa,wBAAyB,YAAW,cAAc;IAuB3D,OAAO,CAAC,KAAK;IAtBf,MAAM,CAAC,eAAe,CACpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,CAAC,+BAA+B,CAAC;IAYhD,SAAgB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,MAAM,CAAY;gBAGhB,KAAK,EAAE,GAAG,EAClB,IAAI,GAAE,OAAO,CAAC,+BAA+B,CAAM;IASxC,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBzD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAY9D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUjD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAIpB,IAAI;YAMJ,aAAa;YAIb,eAAe;YAQf,WAAW;YAmBX,KAAK;CAIpB"}
@@ -143,7 +143,7 @@ var PostgreSQLSessionStorage = /** @class */ (function () {
143
143
  case 1:
144
144
  hasSessionTable = _a.sent();
145
145
  if (!!hasSessionTable) return [3 /*break*/, 3];
146
- query = "\n CREATE TABLE ".concat(this.options.sessionTableName, " (\n id varchar(255) NOT NULL PRIMARY KEY,\n shop varchar(255) NOT NULL,\n state varchar(255) NOT NULL,\n isOnline boolean NOT NULL,\n scope varchar(255),\n accessToken varchar(255)\n )\n ");
146
+ query = "\n CREATE TABLE ".concat(this.options.sessionTableName, " (\n id varchar(255) NOT NULL PRIMARY KEY,\n shop varchar(255) NOT NULL,\n state varchar(255) NOT NULL,\n isOnline boolean NOT NULL,\n scope varchar(255),\n expires integer,\n onlineAccessInfo varchar(255),\n accessToken varchar(255)\n )\n ");
147
147
  return [4 /*yield*/, this.query(query)];
148
148
  case 2:
149
149
  _a.sent();
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../../src/auth/session/storage/sqlite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAKD,qBAAa,oBAAqB,YAAW,cAAc;IAMvD,OAAO,CAAC,QAAQ;IALlB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,KAAK,CAAgB;gBAGnB,QAAQ,EAAE,MAAM,EACxB,IAAI,GAAE,OAAO,CAAC,2BAA2B,CAAM;IAOpC,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBzD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAa9D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAU1C,eAAe;YAWf,IAAI;IAiBlB,OAAO,CAAC,KAAK;CAWd"}
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../../src/auth/session/storage/sqlite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAKD,qBAAa,oBAAqB,YAAW,cAAc;IAMvD,OAAO,CAAC,QAAQ;IALlB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,KAAK,CAAgB;gBAGnB,QAAQ,EAAE,MAAM,EACxB,IAAI,GAAE,OAAO,CAAC,2BAA2B,CAAM;IAOpC,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBzD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAa9D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAU1C,eAAe;YAWf,IAAI;IAmBlB,OAAO,CAAC,KAAK;CAWd"}
@@ -24,7 +24,10 @@ var SQLiteSessionStorage = /** @class */ (function () {
24
24
  case 1:
25
25
  _a.sent();
26
26
  entries = (0, session_utils_1.sessionEntries)(session);
27
- query = "\n INSERT OR REPLACE INTO ".concat(this.options.sessionTableName, "\n (").concat(Object.keys(session).join(', '), ")\n VALUES (").concat(entries.map(function () { return '?'; }).join(', '), ");\n ");
27
+ query = "\n INSERT OR REPLACE INTO ".concat(this.options.sessionTableName, "\n (").concat(entries.map(function (_a) {
28
+ var _b = tslib_1.__read(_a, 1), key = _b[0];
29
+ return key;
30
+ }).join(', '), ")\n VALUES (").concat(entries.map(function () { return '?'; }).join(', '), ");\n ");
28
31
  return [4 /*yield*/, this.query(query, entries.map(function (_a) {
29
32
  var _b = tslib_1.__read(_a, 2), _key = _b[0], value = _b[1];
30
33
  return value;
@@ -97,7 +100,7 @@ var SQLiteSessionStorage = /** @class */ (function () {
97
100
  case 1:
98
101
  hasSessionTable = _a.sent();
99
102
  if (!!hasSessionTable) return [3 /*break*/, 3];
100
- query = "\n CREATE TABLE ".concat(this.options.sessionTableName, " (\n id varchar(255) NOT NULL PRIMARY KEY,\n shop varchar(255) NOT NULL,\n state varchar(255) NOT NULL,\n isOnline tinyint NOT NULL,\n scope varchar(255),\n accessToken varchar(255)\n )\n ");
103
+ query = "\n CREATE TABLE ".concat(this.options.sessionTableName, " (\n id varchar(255) NOT NULL PRIMARY KEY,\n shop varchar(255) NOT NULL,\n state varchar(255) NOT NULL,\n isOnline integer NOT NULL,\n expires integer,\n scope varchar(255),\n accessToken varchar(255),\n onlineAccessInfo varchar(255)\n )\n ");
101
104
  return [4 /*yield*/, this.query(query)];
102
105
  case 2:
103
106
  _a.sent();
@@ -1,5 +1,5 @@
1
1
  import { DeleteRequestParams, GetRequestParams, PostRequestParams, PutRequestParams, RequestParams, RequestReturn } from './types';
2
- declare class HttpClient {
2
+ export declare class HttpClient {
3
3
  private domain;
4
4
  static readonly RETRY_WAIT_TIME = 1000;
5
5
  static readonly DEPRECATION_ALERT_DELAY = 300000;
@@ -25,5 +25,4 @@ declare class HttpClient {
25
25
  protected getRequestPath(path: string): string;
26
26
  private doRequest;
27
27
  }
28
- export { HttpClient };
29
28
  //# sourceMappingURL=http_client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http_client.d.ts","sourceRoot":"","sources":["../../../src/clients/http_client/http_client.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,cAAM,UAAU;IAOK,OAAO,CAAC,MAAM;IALjC,MAAM,CAAC,QAAQ,CAAC,eAAe,QAAQ;IAEvC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,UAAU;IACjD,OAAO,CAAC,mBAAmB,CAA+B;gBAE/B,MAAM,EAAE,MAAM;IAIzC;;OAEG;IACU,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAIlE;;OAEG;IACU,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpE;;OAEG;IACU,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAIlE;;OAEG;IACU,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;cAIxD,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IA0GtE,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;YAIhC,SAAS;CA8GxB;AAED,OAAO,EAAC,UAAU,EAAC,CAAC"}
1
+ {"version":3,"file":"http_client.d.ts","sourceRoot":"","sources":["../../../src/clients/http_client/http_client.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,qBAAa,UAAU;IAOF,OAAO,CAAC,MAAM;IALjC,MAAM,CAAC,QAAQ,CAAC,eAAe,QAAQ;IAEvC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,UAAU;IACjD,OAAO,CAAC,mBAAmB,CAA+B;gBAE/B,MAAM,EAAE,MAAM;IAIzC;;OAEG;IACU,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAIlE;;OAEG;IACU,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpE;;OAEG;IACU,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAIlE;;OAEG;IACU,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;cAIxD,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IA0GtE,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;YAIhC,SAAS;CA6GxB"}
@@ -162,105 +162,106 @@ var HttpClient = /** @class */ (function () {
162
162
  };
163
163
  HttpClient.prototype.doRequest = function (url, options) {
164
164
  return tslib_1.__awaiter(this, void 0, void 0, function () {
165
- var _this = this;
165
+ var response, body, deprecation, depHash, stack, log, errorMessages, errorMessage, headers, code, statusText, retryAfter, error_2;
166
166
  return tslib_1.__generator(this, function (_a) {
167
- return [2 /*return*/, (0, node_fetch_1.default)(url, options)
168
- .then(function (response) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
169
- var body, deprecation, depHash, stack, log, errorMessages, errorMessage, headers, code, statusText, retryAfter;
170
- return tslib_1.__generator(this, function (_a) {
171
- switch (_a.label) {
172
- case 0: return [4 /*yield*/, response.json()];
173
- case 1:
174
- body = _a.sent();
175
- if (response.ok) {
176
- if (response.headers &&
177
- response.headers.has('X-Shopify-API-Deprecated-Reason')) {
178
- deprecation = {
179
- message: response.headers.get('X-Shopify-API-Deprecated-Reason'),
180
- path: url,
181
- };
182
- depHash = crypto_1.default
183
- .createHash('md5')
184
- .update(JSON.stringify(deprecation))
185
- .digest('hex');
186
- if (!Object.keys(this.LOGGED_DEPRECATIONS).includes(depHash) ||
187
- Date.now() - this.LOGGED_DEPRECATIONS[depHash] >=
188
- HttpClient.DEPRECATION_ALERT_DELAY) {
189
- this.LOGGED_DEPRECATIONS[depHash] = Date.now();
190
- if (context_1.Context.LOG_FILE) {
191
- stack = new Error().stack;
192
- log = "API Deprecation Notice ".concat(new Date().toLocaleString(), " : ").concat(JSON.stringify(deprecation), "\n Stack Trace: ").concat(stack, "\n");
193
- fs_1.default.writeFileSync(context_1.Context.LOG_FILE, log, {
194
- flag: 'a',
195
- encoding: 'utf-8',
196
- });
197
- }
198
- else {
199
- console.warn('API Deprecation Notice:', deprecation);
200
- }
201
- }
202
- }
203
- return [2 /*return*/, {
204
- body: body,
205
- headers: response.headers,
206
- }];
167
+ switch (_a.label) {
168
+ case 0:
169
+ _a.trys.push([0, 3, , 4]);
170
+ return [4 /*yield*/, (0, node_fetch_1.default)(url, options)];
171
+ case 1:
172
+ response = _a.sent();
173
+ return [4 /*yield*/, response.json().catch(function () { return ({}); })];
174
+ case 2:
175
+ body = _a.sent();
176
+ if (response.ok) {
177
+ if (response.headers &&
178
+ response.headers.has('X-Shopify-API-Deprecated-Reason')) {
179
+ deprecation = {
180
+ message: response.headers.get('X-Shopify-API-Deprecated-Reason'),
181
+ path: url,
182
+ };
183
+ depHash = crypto_1.default
184
+ .createHash('md5')
185
+ .update(JSON.stringify(deprecation))
186
+ .digest('hex');
187
+ if (!Object.keys(this.LOGGED_DEPRECATIONS).includes(depHash) ||
188
+ Date.now() - this.LOGGED_DEPRECATIONS[depHash] >=
189
+ HttpClient.DEPRECATION_ALERT_DELAY) {
190
+ this.LOGGED_DEPRECATIONS[depHash] = Date.now();
191
+ if (context_1.Context.LOG_FILE) {
192
+ stack = new Error().stack;
193
+ log = "API Deprecation Notice ".concat(new Date().toLocaleString(), " : ").concat(JSON.stringify(deprecation), "\n Stack Trace: ").concat(stack, "\n");
194
+ fs_1.default.writeFileSync(context_1.Context.LOG_FILE, log, {
195
+ flag: 'a',
196
+ encoding: 'utf-8',
197
+ });
207
198
  }
208
199
  else {
209
- errorMessages = [];
210
- if (body.errors) {
211
- errorMessages.push(JSON.stringify(body.errors, null, 2));
212
- }
213
- if (response.headers && response.headers.get('x-request-id')) {
214
- errorMessages.push("If you report this error, please include this id: ".concat(response.headers.get('x-request-id')));
215
- }
216
- errorMessage = errorMessages.length
217
- ? ":\n".concat(errorMessages.join('\n'))
218
- : '';
219
- headers = response.headers.raw();
220
- code = response.status;
221
- statusText = response.statusText;
222
- switch (true) {
223
- case response.status === network_1.StatusCode.TooManyRequests: {
224
- retryAfter = response.headers.get('Retry-After');
225
- throw new ShopifyErrors.HttpThrottlingError({
226
- message: "Shopify is throttling requests".concat(errorMessage),
227
- code: code,
228
- statusText: statusText,
229
- body: body,
230
- headers: headers,
231
- retryAfter: retryAfter ? parseFloat(retryAfter) : undefined,
232
- });
233
- }
234
- case response.status >= network_1.StatusCode.InternalServerError:
235
- throw new ShopifyErrors.HttpInternalError({
236
- message: "Shopify internal error".concat(errorMessage),
237
- code: code,
238
- statusText: statusText,
239
- body: body,
240
- headers: headers,
241
- });
242
- default:
243
- throw new ShopifyErrors.HttpResponseError({
244
- message: "Received an error response (".concat(response.status, " ").concat(response.statusText, ") from Shopify").concat(errorMessage),
245
- code: code,
246
- statusText: statusText,
247
- body: body,
248
- headers: headers,
249
- });
250
- }
200
+ console.warn('API Deprecation Notice:', deprecation);
251
201
  }
252
- return [2 /*return*/];
202
+ }
203
+ }
204
+ return [2 /*return*/, {
205
+ body: body,
206
+ headers: response.headers,
207
+ }];
208
+ }
209
+ else {
210
+ errorMessages = [];
211
+ if (body.errors) {
212
+ errorMessages.push(JSON.stringify(body.errors, null, 2));
213
+ }
214
+ if (response.headers && response.headers.get('x-request-id')) {
215
+ errorMessages.push("If you report this error, please include this id: ".concat(response.headers.get('x-request-id')));
216
+ }
217
+ errorMessage = errorMessages.length
218
+ ? ":\n".concat(errorMessages.join('\n'))
219
+ : '';
220
+ headers = response.headers.raw();
221
+ code = response.status;
222
+ statusText = response.statusText;
223
+ switch (true) {
224
+ case response.status === network_1.StatusCode.TooManyRequests: {
225
+ retryAfter = response.headers.get('Retry-After');
226
+ throw new ShopifyErrors.HttpThrottlingError({
227
+ message: "Shopify is throttling requests".concat(errorMessage),
228
+ code: code,
229
+ statusText: statusText,
230
+ body: body,
231
+ headers: headers,
232
+ retryAfter: retryAfter ? parseFloat(retryAfter) : undefined,
233
+ });
234
+ }
235
+ case response.status >= network_1.StatusCode.InternalServerError:
236
+ throw new ShopifyErrors.HttpInternalError({
237
+ message: "Shopify internal error".concat(errorMessage),
238
+ code: code,
239
+ statusText: statusText,
240
+ body: body,
241
+ headers: headers,
242
+ });
243
+ default:
244
+ throw new ShopifyErrors.HttpResponseError({
245
+ message: "Received an error response (".concat(response.status, " ").concat(response.statusText, ") from Shopify").concat(errorMessage),
246
+ code: code,
247
+ statusText: statusText,
248
+ body: body,
249
+ headers: headers,
250
+ });
253
251
  }
254
- });
255
- }); })
256
- .catch(function (error) {
257
- if (error instanceof ShopifyErrors.ShopifyError) {
258
- throw error;
252
+ }
253
+ return [3 /*break*/, 4];
254
+ case 3:
255
+ error_2 = _a.sent();
256
+ if (error_2 instanceof ShopifyErrors.ShopifyError) {
257
+ throw error_2;
259
258
  }
260
259
  else {
261
- throw new ShopifyErrors.HttpRequestError("Failed to make Shopify HTTP request: ".concat(error));
260
+ throw new ShopifyErrors.HttpRequestError("Failed to make Shopify HTTP request: ".concat(error_2));
262
261
  }
263
- })];
262
+ return [3 /*break*/, 4];
263
+ case 4: return [2 /*return*/];
264
+ }
264
265
  });
265
266
  });
266
267
  };
package/dist/context.js CHANGED
@@ -17,8 +17,11 @@ var Context = {
17
17
  API_VERSION: base_types_1.ApiVersion.Unstable,
18
18
  IS_EMBEDDED_APP: true,
19
19
  IS_PRIVATE_APP: false,
20
- SESSION_STORAGE: new sqlite_1.SQLiteSessionStorage(dbFile),
20
+ // TS hack as SESSION_STORAGE is guaranteed to be set
21
+ // to a correct value in `initialize()`.
22
+ SESSION_STORAGE: null,
21
23
  initialize: function (params) {
24
+ var _a;
22
25
  var scopes;
23
26
  if (params.SCOPES instanceof scopes_1.AuthScopes) {
24
27
  scopes = params.SCOPES;
@@ -50,12 +53,11 @@ var Context = {
50
53
  this.API_VERSION = params.API_VERSION;
51
54
  this.IS_EMBEDDED_APP = params.IS_EMBEDDED_APP;
52
55
  this.IS_PRIVATE_APP = params.IS_PRIVATE_APP;
56
+ this.SESSION_STORAGE =
57
+ (_a = params.SESSION_STORAGE) !== null && _a !== void 0 ? _a : new sqlite_1.SQLiteSessionStorage(dbFile);
53
58
  if (params.HOST_SCHEME) {
54
59
  this.HOST_SCHEME = params.HOST_SCHEME;
55
60
  }
56
- if (params.SESSION_STORAGE) {
57
- this.SESSION_STORAGE = params.SESSION_STORAGE;
58
- }
59
61
  if (params.USER_AGENT_PREFIX) {
60
62
  this.USER_AGENT_PREFIX = params.USER_AGENT_PREFIX;
61
63
  }
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const SHOPIFY_API_LIBRARY_VERSION = "3.1.0";
1
+ export declare const SHOPIFY_API_LIBRARY_VERSION = "3.1.1";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SHOPIFY_API_LIBRARY_VERSION = void 0;
4
- exports.SHOPIFY_API_LIBRARY_VERSION = '3.1.0';
4
+ exports.SHOPIFY_API_LIBRARY_VERSION = '3.1.1';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shopify/shopify-api",
3
- "version": "3.1.0",
3
+ "version": "3.1.2",
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",
@@ -55,7 +55,7 @@
55
55
  "node-fetch": "^2.6.1",
56
56
  "pg": "^8.7.3",
57
57
  "redis": "^4.0.6",
58
- "sqlite3": "^5.0.2",
58
+ "sqlite3": "^5.0.8",
59
59
  "tslib": "^2.0.3",
60
60
  "uuid": "^8.3.1"
61
61
  },