@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.
Files changed (71) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/dist/__tests__/fake-resource-with-custom-prefix.d.ts.map +1 -1
  3. package/dist/__tests__/fake-resource-with-custom-prefix.js +7 -5
  4. package/dist/__tests__/fake-resource.d.ts.map +1 -1
  5. package/dist/__tests__/fake-resource.js +15 -13
  6. package/dist/auth/oauth/oauth.d.ts.map +1 -1
  7. package/dist/auth/oauth/oauth.js +11 -11
  8. package/dist/auth/scopes/index.js +5 -5
  9. package/dist/auth/session/index.d.ts +11 -1
  10. package/dist/auth/session/index.d.ts.map +1 -1
  11. package/dist/auth/session/index.js +16 -1
  12. package/dist/auth/session/session-utils.d.ts +8 -0
  13. package/dist/auth/session/session-utils.d.ts.map +1 -0
  14. package/dist/auth/session/session-utils.js +116 -0
  15. package/dist/auth/session/storage/__tests__/battery-of-tests.d.ts +3 -0
  16. package/dist/auth/session/storage/__tests__/battery-of-tests.d.ts.map +1 -0
  17. package/dist/auth/session/storage/__tests__/battery-of-tests.js +191 -0
  18. package/dist/auth/session/storage/__tests__/utils.d.ts +10 -0
  19. package/dist/auth/session/storage/__tests__/utils.d.ts.map +1 -0
  20. package/dist/auth/session/storage/__tests__/utils.js +87 -0
  21. package/dist/auth/session/storage/custom.js +4 -4
  22. package/dist/auth/session/storage/mongodb.d.ts +23 -0
  23. package/dist/auth/session/storage/mongodb.d.ts.map +1 -0
  24. package/dist/auth/session/storage/mongodb.js +150 -0
  25. package/dist/auth/session/storage/mysql.d.ts +22 -0
  26. package/dist/auth/session/storage/mysql.d.ts.map +1 -0
  27. package/dist/auth/session/storage/mysql.js +154 -0
  28. package/dist/auth/session/storage/postgresql.d.ts +24 -0
  29. package/dist/auth/session/storage/postgresql.d.ts.map +1 -0
  30. package/dist/auth/session/storage/postgresql.js +172 -0
  31. package/dist/auth/session/storage/redis.d.ts +20 -0
  32. package/dist/auth/session/storage/redis.d.ts.map +1 -0
  33. package/dist/auth/session/storage/redis.js +105 -0
  34. package/dist/auth/session/storage/sqlite.d.ts +19 -0
  35. package/dist/auth/session/storage/sqlite.d.ts.map +1 -0
  36. package/dist/auth/session/storage/sqlite.js +128 -0
  37. package/dist/base-rest-resource.d.ts +2 -1
  38. package/dist/base-rest-resource.d.ts.map +1 -1
  39. package/dist/base-rest-resource.js +29 -19
  40. package/dist/base-types.d.ts +1 -0
  41. package/dist/base-types.d.ts.map +1 -1
  42. package/dist/clients/graphql/graphql_client.js +1 -1
  43. package/dist/clients/http_client/http_client.d.ts +1 -2
  44. package/dist/clients/http_client/http_client.d.ts.map +1 -1
  45. package/dist/clients/http_client/http_client.js +100 -99
  46. package/dist/clients/rest/rest_client.js +5 -3
  47. package/dist/context.d.ts +1 -0
  48. package/dist/context.d.ts.map +1 -1
  49. package/dist/context.js +13 -5
  50. package/dist/error.js +4 -3
  51. package/dist/index.d.ts +5 -0
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/rest-resources/2021-07/index.js +2 -0
  54. package/dist/rest-resources/2021-10/index.js +2 -0
  55. package/dist/rest-resources/2022-01/index.js +2 -0
  56. package/dist/rest-resources/2022-04/index.js +2 -0
  57. package/dist/utils/decode-session-token.js +1 -1
  58. package/dist/utils/graphql_proxy.js +1 -1
  59. package/dist/utils/hmac-validator.js +2 -5
  60. package/dist/utils/processed-query.js +3 -3
  61. package/dist/utils/safe-compare.d.ts.map +1 -1
  62. package/dist/utils/safe-compare.js +17 -15
  63. package/dist/utils/setup-jest.d.ts.map +1 -1
  64. package/dist/utils/setup-jest.js +4 -3
  65. package/dist/utils/with-session.js +3 -3
  66. package/dist/version.d.ts +1 -1
  67. package/dist/version.js +1 -1
  68. package/dist/webhooks/registry.d.ts +2 -1
  69. package/dist/webhooks/registry.d.ts.map +1 -1
  70. package/dist/webhooks/registry.js +39 -13
  71. package/package.json +12 -4
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MySQLSessionStorage = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var promise_1 = tslib_1.__importDefault(require("mysql2/promise"));
6
+ var session_utils_1 = require("../session-utils");
7
+ var defaultMySQLSessionStorageOptions = {
8
+ sessionTableName: 'shopify_sessions',
9
+ };
10
+ var MySQLSessionStorage = /** @class */ (function () {
11
+ function MySQLSessionStorage(dbUrl, opts) {
12
+ if (opts === void 0) { opts = {}; }
13
+ this.dbUrl = dbUrl;
14
+ if (typeof this.dbUrl === 'string') {
15
+ this.dbUrl = new URL(this.dbUrl);
16
+ }
17
+ this.options = tslib_1.__assign(tslib_1.__assign({}, defaultMySQLSessionStorageOptions), opts);
18
+ this.ready = this.init();
19
+ }
20
+ MySQLSessionStorage.withCredentials = function (host, dbName, username, password, opts) {
21
+ return new MySQLSessionStorage(new URL("mysql://".concat(encodeURIComponent(username), ":").concat(encodeURIComponent(password), "@").concat(host, "/").concat(encodeURIComponent(dbName))), opts);
22
+ };
23
+ MySQLSessionStorage.prototype.storeSession = function (session) {
24
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
25
+ var entries, query;
26
+ return tslib_1.__generator(this, function (_a) {
27
+ switch (_a.label) {
28
+ case 0: return [4 /*yield*/, this.ready];
29
+ case 1:
30
+ _a.sent();
31
+ entries = (0, session_utils_1.sessionEntries)(session);
32
+ query = "\n REPLACE INTO ".concat(this.options.sessionTableName, "\n (").concat(entries.map(function (_a) {
33
+ var _b = tslib_1.__read(_a, 1), key = _b[0];
34
+ return key;
35
+ }).join(', '), ")\n VALUES (").concat(entries.map(function () { return "?"; }).join(', '), ")\n ");
36
+ return [4 /*yield*/, this.query(query, entries.map(function (_a) {
37
+ var _b = tslib_1.__read(_a, 2), _key = _b[0], value = _b[1];
38
+ return value;
39
+ }))];
40
+ case 2:
41
+ _a.sent();
42
+ return [2 /*return*/, true];
43
+ }
44
+ });
45
+ });
46
+ };
47
+ MySQLSessionStorage.prototype.loadSession = function (id) {
48
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
49
+ var query, _a, rows, rawResult;
50
+ return tslib_1.__generator(this, function (_b) {
51
+ switch (_b.label) {
52
+ case 0: return [4 /*yield*/, this.ready];
53
+ case 1:
54
+ _b.sent();
55
+ query = "\n SELECT * FROM `".concat(this.options.sessionTableName, "`\n WHERE id = ?;\n ");
56
+ return [4 /*yield*/, this.query(query, [id])];
57
+ case 2:
58
+ _a = tslib_1.__read.apply(void 0, [_b.sent(), 1]), rows = _a[0];
59
+ if (!Array.isArray(rows) || (rows === null || rows === void 0 ? void 0 : rows.length) !== 1)
60
+ return [2 /*return*/, undefined];
61
+ rawResult = rows[0];
62
+ return [2 /*return*/, (0, session_utils_1.sessionFromEntries)(Object.entries(rawResult))];
63
+ }
64
+ });
65
+ });
66
+ };
67
+ MySQLSessionStorage.prototype.deleteSession = function (id) {
68
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
69
+ var query;
70
+ return tslib_1.__generator(this, function (_a) {
71
+ switch (_a.label) {
72
+ case 0: return [4 /*yield*/, this.ready];
73
+ case 1:
74
+ _a.sent();
75
+ query = "\n DELETE FROM ".concat(this.options.sessionTableName, "\n WHERE id = ?;\n ");
76
+ return [4 /*yield*/, this.query(query, [id])];
77
+ case 2:
78
+ _a.sent();
79
+ return [2 /*return*/, true];
80
+ }
81
+ });
82
+ });
83
+ };
84
+ MySQLSessionStorage.prototype.disconnect = function () {
85
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
86
+ return tslib_1.__generator(this, function (_a) {
87
+ switch (_a.label) {
88
+ case 0: return [4 /*yield*/, this.connection.end()];
89
+ case 1:
90
+ _a.sent();
91
+ return [2 /*return*/];
92
+ }
93
+ });
94
+ });
95
+ };
96
+ MySQLSessionStorage.prototype.init = function () {
97
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
98
+ var _a;
99
+ return tslib_1.__generator(this, function (_b) {
100
+ switch (_b.label) {
101
+ case 0:
102
+ _a = this;
103
+ return [4 /*yield*/, promise_1.default.createConnection(this.dbUrl.toString())];
104
+ case 1:
105
+ _a.connection = _b.sent();
106
+ return [4 /*yield*/, this.createTable()];
107
+ case 2:
108
+ _b.sent();
109
+ return [2 /*return*/];
110
+ }
111
+ });
112
+ });
113
+ };
114
+ MySQLSessionStorage.prototype.hasSessionTable = function () {
115
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
116
+ var query, _a, rows;
117
+ return tslib_1.__generator(this, function (_b) {
118
+ switch (_b.label) {
119
+ case 0:
120
+ query = "\n SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ?;\n ";
121
+ return [4 /*yield*/, this.query(query, [this.options.sessionTableName])];
122
+ case 1:
123
+ _a = tslib_1.__read.apply(void 0, [_b.sent(), 1]), rows = _a[0];
124
+ return [2 /*return*/, Array.isArray(rows) && rows.length === 1];
125
+ }
126
+ });
127
+ });
128
+ };
129
+ MySQLSessionStorage.prototype.createTable = function () {
130
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
131
+ var hasSessionTable, query;
132
+ return tslib_1.__generator(this, function (_a) {
133
+ switch (_a.label) {
134
+ case 0: return [4 /*yield*/, this.hasSessionTable()];
135
+ case 1:
136
+ hasSessionTable = _a.sent();
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 expires integer,\n onlineAccessInfo varchar(255),\n accessToken varchar(255)\n )\n ");
139
+ return [4 /*yield*/, this.query(query)];
140
+ case 2:
141
+ _a.sent();
142
+ _a.label = 3;
143
+ case 3: return [2 /*return*/];
144
+ }
145
+ });
146
+ });
147
+ };
148
+ MySQLSessionStorage.prototype.query = function (sql, params) {
149
+ if (params === void 0) { params = []; }
150
+ return this.connection.query(sql, params);
151
+ };
152
+ return MySQLSessionStorage;
153
+ }());
154
+ exports.MySQLSessionStorage = MySQLSessionStorage;
@@ -0,0 +1,24 @@
1
+ import { SessionInterface } from '../types';
2
+ import { SessionStorage } from '../session_storage';
3
+ export interface PostgreSQLSessionStorageOptions {
4
+ sessionTableName: string;
5
+ port: number;
6
+ }
7
+ export declare class PostgreSQLSessionStorage implements SessionStorage {
8
+ private dbUrl;
9
+ static withCredentials(host: string, dbName: string, username: string, password: string, opts: Partial<PostgreSQLSessionStorageOptions>): PostgreSQLSessionStorage;
10
+ readonly ready: Promise<void>;
11
+ private options;
12
+ private client;
13
+ constructor(dbUrl: URL, opts?: Partial<PostgreSQLSessionStorageOptions>);
14
+ storeSession(session: SessionInterface): Promise<boolean>;
15
+ loadSession(id: string): Promise<SessionInterface | undefined>;
16
+ deleteSession(id: string): Promise<boolean>;
17
+ disconnect(): Promise<void>;
18
+ private init;
19
+ private connectClient;
20
+ private hasSessionTable;
21
+ private createTable;
22
+ private query;
23
+ }
24
+ //# sourceMappingURL=postgresql.d.ts.map
@@ -0,0 +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;YAmBX,KAAK;CAIpB"}
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostgreSQLSessionStorage = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var pg_1 = tslib_1.__importDefault(require("pg"));
6
+ var session_utils_1 = require("../session-utils");
7
+ var defaultPostgreSQLSessionStorageOptions = {
8
+ sessionTableName: 'shopify_sessions',
9
+ port: 3211,
10
+ };
11
+ var PostgreSQLSessionStorage = /** @class */ (function () {
12
+ function PostgreSQLSessionStorage(dbUrl, opts) {
13
+ if (opts === void 0) { opts = {}; }
14
+ this.dbUrl = dbUrl;
15
+ if (typeof this.dbUrl === 'string') {
16
+ this.dbUrl = new URL(this.dbUrl);
17
+ }
18
+ this.options = tslib_1.__assign(tslib_1.__assign({}, defaultPostgreSQLSessionStorageOptions), opts);
19
+ this.ready = this.init();
20
+ }
21
+ PostgreSQLSessionStorage.withCredentials = function (host, dbName, username, password, opts) {
22
+ return new PostgreSQLSessionStorage(new URL("postgres://".concat(encodeURIComponent(username), ":").concat(encodeURIComponent(password), "@").concat(host, "/").concat(encodeURIComponent(dbName))), opts);
23
+ };
24
+ PostgreSQLSessionStorage.prototype.storeSession = function (session) {
25
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
26
+ var entries, query;
27
+ return tslib_1.__generator(this, function (_a) {
28
+ switch (_a.label) {
29
+ case 0: return [4 /*yield*/, this.ready];
30
+ case 1:
31
+ _a.sent();
32
+ entries = (0, session_utils_1.sessionEntries)(session);
33
+ query = "\n INSERT INTO ".concat(this.options.sessionTableName, "\n (").concat(entries.map(function (_a) {
34
+ var _b = tslib_1.__read(_a, 1), key = _b[0];
35
+ return key;
36
+ }).join(', '), ")\n VALUES (").concat(entries.map(function (_, i) { return "$".concat(i + 1); }).join(', '), ")\n ON CONFLICT (id) DO UPDATE SET ").concat(entries
37
+ .map(function (_a) {
38
+ var _b = tslib_1.__read(_a, 1), key = _b[0];
39
+ return "".concat(key, " = Excluded.").concat(key);
40
+ })
41
+ .join(', '), ";\n ");
42
+ return [4 /*yield*/, this.query(query, entries.map(function (_a) {
43
+ var _b = tslib_1.__read(_a, 2), _key = _b[0], value = _b[1];
44
+ return value;
45
+ }))];
46
+ case 2:
47
+ _a.sent();
48
+ return [2 /*return*/, true];
49
+ }
50
+ });
51
+ });
52
+ };
53
+ PostgreSQLSessionStorage.prototype.loadSession = function (id) {
54
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
55
+ var query, rows, rawResult;
56
+ return tslib_1.__generator(this, function (_a) {
57
+ switch (_a.label) {
58
+ case 0: return [4 /*yield*/, this.ready];
59
+ case 1:
60
+ _a.sent();
61
+ query = "\n SELECT * FROM ".concat(this.options.sessionTableName, "\n WHERE id = $1;\n ");
62
+ return [4 /*yield*/, this.query(query, [id])];
63
+ case 2:
64
+ rows = _a.sent();
65
+ if (!Array.isArray(rows) || (rows === null || rows === void 0 ? void 0 : rows.length) !== 1)
66
+ return [2 /*return*/, undefined];
67
+ rawResult = rows[0];
68
+ return [2 /*return*/, (0, session_utils_1.sessionFromEntries)(Object.entries(rawResult))];
69
+ }
70
+ });
71
+ });
72
+ };
73
+ PostgreSQLSessionStorage.prototype.deleteSession = function (id) {
74
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
75
+ var query;
76
+ return tslib_1.__generator(this, function (_a) {
77
+ switch (_a.label) {
78
+ case 0: return [4 /*yield*/, this.ready];
79
+ case 1:
80
+ _a.sent();
81
+ query = "\n DELETE FROM ".concat(this.options.sessionTableName, "\n WHERE id = $1;\n ");
82
+ return [4 /*yield*/, this.query(query, [id])];
83
+ case 2:
84
+ _a.sent();
85
+ return [2 /*return*/, true];
86
+ }
87
+ });
88
+ });
89
+ };
90
+ PostgreSQLSessionStorage.prototype.disconnect = function () {
91
+ return this.client.end();
92
+ };
93
+ PostgreSQLSessionStorage.prototype.init = function () {
94
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
95
+ return tslib_1.__generator(this, function (_a) {
96
+ switch (_a.label) {
97
+ case 0:
98
+ this.client = new pg_1.default.Client({ connectionString: this.dbUrl.toString() });
99
+ return [4 /*yield*/, this.connectClient()];
100
+ case 1:
101
+ _a.sent();
102
+ return [4 /*yield*/, this.createTable()];
103
+ case 2:
104
+ _a.sent();
105
+ return [2 /*return*/];
106
+ }
107
+ });
108
+ });
109
+ };
110
+ PostgreSQLSessionStorage.prototype.connectClient = function () {
111
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
112
+ return tslib_1.__generator(this, function (_a) {
113
+ switch (_a.label) {
114
+ case 0: return [4 /*yield*/, this.client.connect()];
115
+ case 1:
116
+ _a.sent();
117
+ return [2 /*return*/];
118
+ }
119
+ });
120
+ });
121
+ };
122
+ PostgreSQLSessionStorage.prototype.hasSessionTable = function () {
123
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
124
+ var query, _a, rows;
125
+ return tslib_1.__generator(this, function (_b) {
126
+ switch (_b.label) {
127
+ case 0:
128
+ query = "\n SELECT * FROM pg_catalog.pg_tables WHERE tablename = $1\n ";
129
+ return [4 /*yield*/, this.query(query, [this.options.sessionTableName])];
130
+ case 1:
131
+ _a = tslib_1.__read.apply(void 0, [_b.sent(), 1]), rows = _a[0];
132
+ return [2 /*return*/, Array.isArray(rows) && rows.length === 1];
133
+ }
134
+ });
135
+ });
136
+ };
137
+ PostgreSQLSessionStorage.prototype.createTable = function () {
138
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
139
+ var hasSessionTable, query;
140
+ return tslib_1.__generator(this, function (_a) {
141
+ switch (_a.label) {
142
+ case 0: return [4 /*yield*/, this.hasSessionTable()];
143
+ case 1:
144
+ hasSessionTable = _a.sent();
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 expires integer,\n onlineAccessInfo varchar(255),\n accessToken varchar(255)\n )\n ");
147
+ return [4 /*yield*/, this.query(query)];
148
+ case 2:
149
+ _a.sent();
150
+ _a.label = 3;
151
+ case 3: return [2 /*return*/];
152
+ }
153
+ });
154
+ });
155
+ };
156
+ PostgreSQLSessionStorage.prototype.query = function (sql, params) {
157
+ if (params === void 0) { params = []; }
158
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
159
+ var result;
160
+ return tslib_1.__generator(this, function (_a) {
161
+ switch (_a.label) {
162
+ case 0: return [4 /*yield*/, this.client.query(sql, params)];
163
+ case 1:
164
+ result = _a.sent();
165
+ return [2 /*return*/, result.rows];
166
+ }
167
+ });
168
+ });
169
+ };
170
+ return PostgreSQLSessionStorage;
171
+ }());
172
+ exports.PostgreSQLSessionStorage = PostgreSQLSessionStorage;
@@ -0,0 +1,20 @@
1
+ import { SessionInterface } from '../types';
2
+ import { SessionStorage } from '../session_storage';
3
+ export interface RedisSessionStorageOptions {
4
+ sessionKeyPrefix: string;
5
+ }
6
+ export declare class RedisSessionStorage implements SessionStorage {
7
+ private dbUrl;
8
+ static withCredentials(host: string, db: number, username: string, password: string, opts: Partial<RedisSessionStorageOptions>): RedisSessionStorage;
9
+ readonly ready: Promise<void>;
10
+ private options;
11
+ private client;
12
+ constructor(dbUrl: URL, opts?: Partial<RedisSessionStorageOptions>);
13
+ storeSession(session: SessionInterface): Promise<boolean>;
14
+ loadSession(id: string): Promise<SessionInterface | undefined>;
15
+ deleteSession(id: string): Promise<boolean>;
16
+ disconnect(): Promise<void>;
17
+ private fullKey;
18
+ private init;
19
+ }
20
+ //# sourceMappingURL=redis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../../src/auth/session/storage/redis.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,EAAE,EAAE,MAAM,EACV,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,MAAM,CAAkB;gBAGtB,KAAK,EAAE,GAAG,EAClB,IAAI,GAAE,OAAO,CAAC,0BAA0B,CAAM;IASnC,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAUzD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAW9D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC,OAAO,CAAC,OAAO;YAID,IAAI;CAMnB"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedisSessionStorage = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var redis_1 = require("redis");
6
+ var session_utils_1 = require("../session-utils");
7
+ var defaultRedisSessionStorageOptions = {
8
+ sessionKeyPrefix: 'shopify_sessions',
9
+ };
10
+ var RedisSessionStorage = /** @class */ (function () {
11
+ function RedisSessionStorage(dbUrl, opts) {
12
+ if (opts === void 0) { opts = {}; }
13
+ this.dbUrl = dbUrl;
14
+ if (typeof this.dbUrl === 'string') {
15
+ this.dbUrl = new URL(this.dbUrl);
16
+ }
17
+ this.options = tslib_1.__assign(tslib_1.__assign({}, defaultRedisSessionStorageOptions), opts);
18
+ this.ready = this.init();
19
+ }
20
+ RedisSessionStorage.withCredentials = function (host, db, username, password, opts) {
21
+ return new RedisSessionStorage(new URL("redis://".concat(encodeURIComponent(username), ":").concat(encodeURIComponent(password), "@").concat(host, "/").concat(db)), opts);
22
+ };
23
+ RedisSessionStorage.prototype.storeSession = function (session) {
24
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
25
+ return tslib_1.__generator(this, function (_a) {
26
+ switch (_a.label) {
27
+ case 0: return [4 /*yield*/, this.ready];
28
+ case 1:
29
+ _a.sent();
30
+ return [4 /*yield*/, this.client.set(this.fullKey(session.id), JSON.stringify((0, session_utils_1.sessionEntries)(session)))];
31
+ case 2:
32
+ _a.sent();
33
+ return [2 /*return*/, true];
34
+ }
35
+ });
36
+ });
37
+ };
38
+ RedisSessionStorage.prototype.loadSession = function (id) {
39
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
40
+ var rawResult;
41
+ return tslib_1.__generator(this, function (_a) {
42
+ switch (_a.label) {
43
+ case 0: return [4 /*yield*/, this.ready];
44
+ case 1:
45
+ _a.sent();
46
+ return [4 /*yield*/, this.client.get(this.fullKey(id))];
47
+ case 2:
48
+ rawResult = _a.sent();
49
+ if (!rawResult)
50
+ return [2 /*return*/, undefined];
51
+ rawResult = JSON.parse(rawResult);
52
+ return [2 /*return*/, (0, session_utils_1.sessionFromEntries)(rawResult)];
53
+ }
54
+ });
55
+ });
56
+ };
57
+ RedisSessionStorage.prototype.deleteSession = function (id) {
58
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
59
+ return tslib_1.__generator(this, function (_a) {
60
+ switch (_a.label) {
61
+ case 0: return [4 /*yield*/, this.ready];
62
+ case 1:
63
+ _a.sent();
64
+ return [4 /*yield*/, this.client.del(this.fullKey(id))];
65
+ case 2:
66
+ _a.sent();
67
+ return [2 /*return*/, true];
68
+ }
69
+ });
70
+ });
71
+ };
72
+ RedisSessionStorage.prototype.disconnect = function () {
73
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
74
+ return tslib_1.__generator(this, function (_a) {
75
+ switch (_a.label) {
76
+ case 0: return [4 /*yield*/, this.client.quit()];
77
+ case 1:
78
+ _a.sent();
79
+ return [2 /*return*/];
80
+ }
81
+ });
82
+ });
83
+ };
84
+ RedisSessionStorage.prototype.fullKey = function (name) {
85
+ return "".concat(this.options.sessionKeyPrefix, "_").concat(name);
86
+ };
87
+ RedisSessionStorage.prototype.init = function () {
88
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
89
+ return tslib_1.__generator(this, function (_a) {
90
+ switch (_a.label) {
91
+ case 0:
92
+ this.client = (0, redis_1.createClient)({
93
+ url: this.dbUrl.toString(),
94
+ });
95
+ return [4 /*yield*/, this.client.connect()];
96
+ case 1:
97
+ _a.sent();
98
+ return [2 /*return*/];
99
+ }
100
+ });
101
+ });
102
+ };
103
+ return RedisSessionStorage;
104
+ }());
105
+ exports.RedisSessionStorage = RedisSessionStorage;
@@ -0,0 +1,19 @@
1
+ import { SessionInterface } from '../types';
2
+ import { SessionStorage } from '../session_storage';
3
+ export interface SQLiteSessionStorageOptions {
4
+ sessionTableName: string;
5
+ }
6
+ export declare class SQLiteSessionStorage implements SessionStorage {
7
+ private filename;
8
+ private options;
9
+ private db;
10
+ private ready;
11
+ constructor(filename: string, opts?: Partial<SQLiteSessionStorageOptions>);
12
+ storeSession(session: SessionInterface): Promise<boolean>;
13
+ loadSession(id: string): Promise<SessionInterface | undefined>;
14
+ deleteSession(id: string): Promise<boolean>;
15
+ private hasSessionTable;
16
+ private init;
17
+ private query;
18
+ }
19
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +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;IAmBlB,OAAO,CAAC,KAAK;CAWd"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SQLiteSessionStorage = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var sqlite3_1 = tslib_1.__importDefault(require("sqlite3"));
6
+ var session_utils_1 = require("../session-utils");
7
+ var defaultSQLiteSessionStorageOptions = {
8
+ sessionTableName: 'shopify_sessions',
9
+ };
10
+ var SQLiteSessionStorage = /** @class */ (function () {
11
+ function SQLiteSessionStorage(filename, opts) {
12
+ if (opts === void 0) { opts = {}; }
13
+ this.filename = filename;
14
+ this.options = tslib_1.__assign(tslib_1.__assign({}, defaultSQLiteSessionStorageOptions), opts);
15
+ this.db = new sqlite3_1.default.Database(this.filename);
16
+ this.ready = this.init();
17
+ }
18
+ SQLiteSessionStorage.prototype.storeSession = function (session) {
19
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
20
+ var entries, query;
21
+ return tslib_1.__generator(this, function (_a) {
22
+ switch (_a.label) {
23
+ case 0: return [4 /*yield*/, this.ready];
24
+ case 1:
25
+ _a.sent();
26
+ entries = (0, session_utils_1.sessionEntries)(session);
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 ");
31
+ return [4 /*yield*/, this.query(query, entries.map(function (_a) {
32
+ var _b = tslib_1.__read(_a, 2), _key = _b[0], value = _b[1];
33
+ return value;
34
+ }))];
35
+ case 2:
36
+ _a.sent();
37
+ return [2 /*return*/, true];
38
+ }
39
+ });
40
+ });
41
+ };
42
+ SQLiteSessionStorage.prototype.loadSession = function (id) {
43
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
44
+ var query, rows, rawResult;
45
+ return tslib_1.__generator(this, function (_a) {
46
+ switch (_a.label) {
47
+ case 0: return [4 /*yield*/, this.ready];
48
+ case 1:
49
+ _a.sent();
50
+ query = "\n SELECT * FROM ".concat(this.options.sessionTableName, "\n WHERE id = ?;\n ");
51
+ return [4 /*yield*/, this.query(query, [id])];
52
+ case 2:
53
+ rows = _a.sent();
54
+ if (!Array.isArray(rows) || (rows === null || rows === void 0 ? void 0 : rows.length) !== 1)
55
+ return [2 /*return*/, undefined];
56
+ rawResult = rows[0];
57
+ return [2 /*return*/, (0, session_utils_1.sessionFromEntries)(Object.entries(rawResult))];
58
+ }
59
+ });
60
+ });
61
+ };
62
+ SQLiteSessionStorage.prototype.deleteSession = function (id) {
63
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
64
+ var query;
65
+ return tslib_1.__generator(this, function (_a) {
66
+ switch (_a.label) {
67
+ case 0: return [4 /*yield*/, this.ready];
68
+ case 1:
69
+ _a.sent();
70
+ query = "\n DELETE FROM ".concat(this.options.sessionTableName, "\n WHERE id = ?;\n ");
71
+ return [4 /*yield*/, this.query(query, [id])];
72
+ case 2:
73
+ _a.sent();
74
+ return [2 /*return*/, true];
75
+ }
76
+ });
77
+ });
78
+ };
79
+ SQLiteSessionStorage.prototype.hasSessionTable = function () {
80
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
81
+ var query, rows;
82
+ return tslib_1.__generator(this, function (_a) {
83
+ switch (_a.label) {
84
+ case 0:
85
+ query = "\n SELECT name FROM sqlite_schema\n WHERE\n type = 'table' AND\n name = ?;\n ";
86
+ return [4 /*yield*/, this.query(query, [this.options.sessionTableName])];
87
+ case 1:
88
+ rows = _a.sent();
89
+ return [2 /*return*/, rows.length === 1];
90
+ }
91
+ });
92
+ });
93
+ };
94
+ SQLiteSessionStorage.prototype.init = function () {
95
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
96
+ var hasSessionTable, query;
97
+ return tslib_1.__generator(this, function (_a) {
98
+ switch (_a.label) {
99
+ case 0: return [4 /*yield*/, this.hasSessionTable()];
100
+ case 1:
101
+ hasSessionTable = _a.sent();
102
+ if (!!hasSessionTable) return [3 /*break*/, 3];
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 ");
104
+ return [4 /*yield*/, this.query(query)];
105
+ case 2:
106
+ _a.sent();
107
+ _a.label = 3;
108
+ case 3: return [2 /*return*/];
109
+ }
110
+ });
111
+ });
112
+ };
113
+ SQLiteSessionStorage.prototype.query = function (sql, params) {
114
+ var _this = this;
115
+ if (params === void 0) { params = []; }
116
+ return new Promise(function (resolve, reject) {
117
+ _this.db.all(sql, params, function (err, result) {
118
+ if (err) {
119
+ reject(err);
120
+ return;
121
+ }
122
+ resolve(result);
123
+ });
124
+ });
125
+ };
126
+ return SQLiteSessionStorage;
127
+ }());
128
+ exports.SQLiteSessionStorage = SQLiteSessionStorage;
@@ -62,9 +62,10 @@ declare class Base {
62
62
  }): Promise<void>;
63
63
  saveAndUpdate(): Promise<void>;
64
64
  delete(): Promise<void>;
65
- serialize(): Body;
65
+ serialize(saving?: boolean): Body;
66
66
  protected setData(data: Body): void;
67
67
  private resource;
68
+ private serializeSubAttribute;
68
69
  }
69
70
  export default Base;
70
71
  //# sourceMappingURL=base-rest-resource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-rest-resource.d.ts","sourceRoot":"","sources":["../src/base-rest-resource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-rest-resource.d.ts","sourceRoot":"","sources":["../src/base-rest-resource.ts"],"names":[],"mappings":"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"}