@shopify/shopify-api 11.2.0 → 11.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +2 -1
  3. package/dist/cjs/lib/billing/check.js +2 -0
  4. package/dist/cjs/lib/billing/check.js.map +1 -1
  5. package/dist/cjs/lib/billing/create-usage-record.js +135 -0
  6. package/dist/cjs/lib/billing/create-usage-record.js.map +1 -0
  7. package/dist/cjs/lib/billing/index.js +2 -0
  8. package/dist/cjs/lib/billing/index.js.map +1 -1
  9. package/dist/cjs/lib/billing/request.js.map +1 -1
  10. package/dist/cjs/lib/clients/admin/graphql/client.js +1 -0
  11. package/dist/cjs/lib/clients/admin/graphql/client.js.map +1 -1
  12. package/dist/cjs/lib/clients/admin/rest/client.js +1 -0
  13. package/dist/cjs/lib/clients/admin/rest/client.js.map +1 -1
  14. package/dist/cjs/lib/version.js +1 -1
  15. package/dist/cjs/lib/webhooks/register.js.map +1 -1
  16. package/dist/cjs/lib/webhooks/types.js.map +1 -1
  17. package/dist/cjs/runtime/http/headers.js +73 -9
  18. package/dist/cjs/runtime/http/headers.js.map +1 -1
  19. package/dist/cjs/test-helpers/const.js +20 -0
  20. package/dist/cjs/test-helpers/const.js.map +1 -0
  21. package/dist/cjs/test-helpers/get-hmac.js +13 -0
  22. package/dist/cjs/test-helpers/get-hmac.js.map +1 -0
  23. package/dist/cjs/test-helpers/get-host-value.js +14 -0
  24. package/dist/cjs/test-helpers/get-host-value.js.map +1 -0
  25. package/dist/cjs/test-helpers/get-jwt.js +38 -0
  26. package/dist/cjs/test-helpers/get-jwt.js.map +1 -0
  27. package/dist/cjs/test-helpers/get-shop-value.js +14 -0
  28. package/dist/cjs/test-helpers/get-shop-value.js.map +1 -0
  29. package/dist/cjs/test-helpers/index.js +29 -0
  30. package/dist/cjs/test-helpers/index.js.map +1 -0
  31. package/dist/cjs/test-helpers/setup-valid-request.js +88 -0
  32. package/dist/cjs/test-helpers/setup-valid-request.js.map +1 -0
  33. package/dist/cjs/test-helpers/setup-valid-session.js +55 -0
  34. package/dist/cjs/test-helpers/setup-valid-session.js.map +1 -0
  35. package/dist/cjs/tsconfig.build.tsbuildinfo +1 -1
  36. package/dist/esm/lib/billing/check.mjs +2 -1
  37. package/dist/esm/lib/billing/check.mjs.map +1 -1
  38. package/dist/esm/lib/billing/create-usage-record.mjs +133 -0
  39. package/dist/esm/lib/billing/create-usage-record.mjs.map +1 -0
  40. package/dist/esm/lib/billing/index.mjs +2 -0
  41. package/dist/esm/lib/billing/index.mjs.map +1 -1
  42. package/dist/esm/lib/billing/request.mjs.map +1 -1
  43. package/dist/esm/lib/clients/admin/graphql/client.mjs +1 -0
  44. package/dist/esm/lib/clients/admin/graphql/client.mjs.map +1 -1
  45. package/dist/esm/lib/clients/admin/rest/client.mjs +1 -0
  46. package/dist/esm/lib/clients/admin/rest/client.mjs.map +1 -1
  47. package/dist/esm/lib/version.mjs +1 -1
  48. package/dist/esm/lib/webhooks/register.mjs.map +1 -1
  49. package/dist/esm/lib/webhooks/types.mjs.map +1 -1
  50. package/dist/esm/runtime/http/headers.mjs +73 -9
  51. package/dist/esm/runtime/http/headers.mjs.map +1 -1
  52. package/dist/esm/test-helpers/const.mjs +11 -0
  53. package/dist/esm/test-helpers/const.mjs.map +1 -0
  54. package/dist/esm/test-helpers/get-hmac.mjs +11 -0
  55. package/dist/esm/test-helpers/get-hmac.mjs.map +1 -0
  56. package/dist/esm/test-helpers/get-host-value.mjs +12 -0
  57. package/dist/esm/test-helpers/get-host-value.mjs.map +1 -0
  58. package/dist/esm/test-helpers/get-jwt.mjs +36 -0
  59. package/dist/esm/test-helpers/get-jwt.mjs.map +1 -0
  60. package/dist/esm/test-helpers/get-shop-value.mjs +12 -0
  61. package/dist/esm/test-helpers/get-shop-value.mjs.map +1 -0
  62. package/dist/esm/test-helpers/index.mjs +7 -0
  63. package/dist/esm/test-helpers/index.mjs.map +1 -0
  64. package/dist/esm/test-helpers/setup-valid-request.mjs +86 -0
  65. package/dist/esm/test-helpers/setup-valid-request.mjs.map +1 -0
  66. package/dist/esm/test-helpers/setup-valid-session.mjs +53 -0
  67. package/dist/esm/test-helpers/setup-valid-session.mjs.map +1 -0
  68. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  69. package/dist/ts/lib/base-types.d.ts +5 -0
  70. package/dist/ts/lib/base-types.d.ts.map +1 -1
  71. package/dist/ts/lib/billing/check.d.ts +9 -1
  72. package/dist/ts/lib/billing/check.d.ts.map +1 -1
  73. package/dist/ts/lib/billing/create-usage-record.d.ts +4 -0
  74. package/dist/ts/lib/billing/create-usage-record.d.ts.map +1 -0
  75. package/dist/ts/lib/billing/index.d.ts +1 -1
  76. package/dist/ts/lib/billing/index.d.ts.map +1 -1
  77. package/dist/ts/lib/billing/types.d.ts +83 -4
  78. package/dist/ts/lib/billing/types.d.ts.map +1 -1
  79. package/dist/ts/lib/clients/admin/graphql/client.d.ts.map +1 -1
  80. package/dist/ts/lib/clients/admin/rest/client.d.ts.map +1 -1
  81. package/dist/ts/lib/clients/index.d.ts +1 -1
  82. package/dist/ts/lib/clients/index.d.ts.map +1 -1
  83. package/dist/ts/lib/version.d.ts +1 -1
  84. package/dist/ts/lib/webhooks/register.d.ts.map +1 -1
  85. package/dist/ts/lib/webhooks/types.d.ts +15 -11
  86. package/dist/ts/lib/webhooks/types.d.ts.map +1 -1
  87. package/dist/ts/runtime/http/headers.d.ts +67 -0
  88. package/dist/ts/runtime/http/headers.d.ts.map +1 -1
  89. package/dist/ts/test-helpers/const.d.ts +9 -0
  90. package/dist/ts/test-helpers/const.d.ts.map +1 -0
  91. package/dist/ts/test-helpers/get-hmac.d.ts +2 -0
  92. package/dist/ts/test-helpers/get-hmac.d.ts.map +1 -0
  93. package/dist/ts/test-helpers/get-host-value.d.ts +8 -0
  94. package/dist/ts/test-helpers/get-host-value.d.ts.map +1 -0
  95. package/dist/ts/test-helpers/get-jwt.d.ts +17 -0
  96. package/dist/ts/test-helpers/get-jwt.d.ts.map +1 -0
  97. package/dist/ts/test-helpers/get-shop-value.d.ts +8 -0
  98. package/dist/ts/test-helpers/get-shop-value.d.ts.map +1 -0
  99. package/dist/ts/test-helpers/index.d.ts +9 -0
  100. package/dist/ts/test-helpers/index.d.ts.map +1 -0
  101. package/dist/ts/test-helpers/setup-valid-request.d.ts +35 -0
  102. package/dist/ts/test-helpers/setup-valid-request.d.ts.map +1 -0
  103. package/dist/ts/test-helpers/setup-valid-session.d.ts +14 -0
  104. package/dist/ts/test-helpers/setup-valid-session.d.ts.map +1 -0
  105. package/dist/ts/tsconfig.build.tsbuildinfo +1 -1
  106. package/package.json +36 -28
@@ -0,0 +1,7 @@
1
+ export { setUpValidSession } from './setup-valid-session.mjs';
2
+ export { RequestType, setUpValidRequest } from './setup-valid-request.mjs';
3
+ export { getJwt } from './get-jwt.mjs';
4
+ export { getHmac } from './get-hmac.mjs';
5
+ export { getShopValue } from './get-shop-value.mjs';
6
+ export { API_KEY, API_SECRET_KEY, APP_URL, BASE64_HOST, SHOPIFY_HOST, TEST_SHOP, TEST_SHOP_NAME, USER_ID } from './const.mjs';
7
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -0,0 +1,86 @@
1
+ import { HashFormat } from '../runtime/crypto/types.mjs';
2
+ import '../runtime/crypto/crypto.mjs';
3
+ import { createSHA256HMAC } from '../runtime/crypto/utils.mjs';
4
+ import { getShopValue } from './get-shop-value.mjs';
5
+ import { getHostValue } from './get-host-value.mjs';
6
+ import { getJwt } from './get-jwt.mjs';
7
+ import { getHmac } from './get-hmac.mjs';
8
+
9
+ var RequestType;
10
+ (function (RequestType) {
11
+ RequestType[RequestType["Admin"] = 0] = "Admin";
12
+ RequestType[RequestType["Bearer"] = 1] = "Bearer";
13
+ RequestType[RequestType["Extension"] = 2] = "Extension";
14
+ RequestType[RequestType["Public"] = 3] = "Public";
15
+ })(RequestType || (RequestType = {}));
16
+ /**
17
+ * Duplicates a Request object and decorates the duplicated object with fake authorization headers or query string parameters.
18
+ *
19
+ * @param {ValidRequestOptions} options Provides the type of authorization method to fake for the provided Request, and the inputs required to fake the authorization.
20
+ * @param {Request} request The Request object to be decorated with fake authorization headers or query string parameters.
21
+ * @returns {Request} A duplicate of the provided Request object with faked authorization headers or query string parameters.
22
+ */
23
+ async function setUpValidRequest(options, request) {
24
+ let authenticatedRequest;
25
+ switch (options.type) {
26
+ case RequestType.Admin:
27
+ authenticatedRequest = adminRequest(request, options.store, options.apiKey, options.apiSecretKey);
28
+ break;
29
+ case RequestType.Bearer:
30
+ authenticatedRequest = bearerRequest(request, options.store, options.apiKey, options.apiSecretKey);
31
+ break;
32
+ case RequestType.Extension:
33
+ authenticatedRequest = extensionRequest(request, options.store, options.apiSecretKey, options.body, options.headers);
34
+ break;
35
+ case RequestType.Public:
36
+ authenticatedRequest = await publicRequest(request, options.store, options.apiSecretKey);
37
+ break;
38
+ }
39
+ return authenticatedRequest;
40
+ }
41
+ function adminRequest(request, store, apiKey, apiSecretKey) {
42
+ const { token } = getJwt(store, apiKey, apiSecretKey);
43
+ const url = new URL(request.url);
44
+ url.searchParams.set('embedded', '1');
45
+ url.searchParams.set('shop', getShopValue(store));
46
+ url.searchParams.set('host', getHostValue(store));
47
+ url.searchParams.set('id_token', token);
48
+ return new Request(url.href, request);
49
+ }
50
+ function bearerRequest(request, store, apiKey, apiSecretKey) {
51
+ const { token } = getJwt(store, apiKey, apiSecretKey);
52
+ const authenticatedRequest = new Request(request);
53
+ authenticatedRequest.headers.set('authorization', `Bearer ${token}`);
54
+ return authenticatedRequest;
55
+ }
56
+ function extensionRequest(request, store, apiSecretKey, body, headers) {
57
+ const bodyString = JSON.stringify(body);
58
+ const authenticatedRequest = new Request(request, {
59
+ method: 'POST',
60
+ body: bodyString,
61
+ });
62
+ authenticatedRequest.headers.set('X-Shopify-Hmac-Sha256', getHmac(bodyString, apiSecretKey));
63
+ authenticatedRequest.headers.set('X-Shopify-Shop-Domain', getShopValue(store));
64
+ if (headers) {
65
+ for (const [key, value] of Object.entries(headers)) {
66
+ authenticatedRequest.headers.set(key, value);
67
+ }
68
+ }
69
+ return authenticatedRequest;
70
+ }
71
+ async function publicRequest(request, store, apiSecretKey) {
72
+ const url = new URL(request.url);
73
+ url.searchParams.set('shop', getShopValue(store));
74
+ url.searchParams.set('timestamp', String(Math.trunc(Date.now() / 1000) - 1));
75
+ const params = Object.fromEntries(url.searchParams.entries());
76
+ const string = Object.entries(params)
77
+ .sort(([val1], [val2]) => val1.localeCompare(val2))
78
+ .reduce((acc, [key, value]) => {
79
+ return `${acc}${key}=${value}`;
80
+ }, '');
81
+ url.searchParams.set('signature', await createSHA256HMAC(apiSecretKey, string, HashFormat.Hex));
82
+ return new Request(url.href, request);
83
+ }
84
+
85
+ export { RequestType, setUpValidRequest };
86
+ //# sourceMappingURL=setup-valid-request.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-valid-request.mjs","sources":["../../../../../test-helpers/setup-valid-request.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { Session } from '../lib/session/session.mjs';
2
+ import { USER_ID } from './const.mjs';
3
+
4
+ /**
5
+ * Creates and returns a fake Session for the shop defined in sessionParams.
6
+ *
7
+ * @param sessionParams The Session parameters to use when creating the fake Session.
8
+ * @returns {Session} The fake Session created.
9
+ */
10
+ function setUpValidSession(sessionParams) {
11
+ const overrides = { ...sessionParams };
12
+ const shop = sessionParams.shop;
13
+ let id = `offline_${shop}`;
14
+ if (sessionParams.isOnline) {
15
+ const onlineAccessInfo = sessionParams.onlineAccessInfo;
16
+ const associated_user = onlineAccessInfo?.associated_user;
17
+ delete sessionParams.onlineAccessInfo?.associated_user;
18
+ delete sessionParams.onlineAccessInfo;
19
+ id = `${shop}_${USER_ID}`;
20
+ // Expires one day from now
21
+ overrides.expires =
22
+ sessionParams.expires || new Date(Date.now() + 1000 * 3600 * 24);
23
+ overrides.onlineAccessInfo = {
24
+ associated_user_scope: 'testScope',
25
+ expires_in: 3600 * 24,
26
+ associated_user: {
27
+ id: USER_ID,
28
+ account_owner: true,
29
+ collaborator: true,
30
+ email: 'test@test.test',
31
+ email_verified: true,
32
+ first_name: 'Test',
33
+ last_name: 'User',
34
+ locale: 'en-US',
35
+ ...associated_user,
36
+ },
37
+ ...onlineAccessInfo,
38
+ };
39
+ }
40
+ const session = new Session({
41
+ id,
42
+ shop,
43
+ isOnline: Boolean(sessionParams.isOnline),
44
+ state: 'test',
45
+ accessToken: 'totally_real_token',
46
+ scope: 'testScope',
47
+ ...overrides,
48
+ });
49
+ return session;
50
+ }
51
+
52
+ export { setUpValidSession };
53
+ //# sourceMappingURL=setup-valid-session.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-valid-session.mjs","sources":["../../../../../test-helpers/setup-valid-session.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAUA;;;;;AAKG;AACG,SAAU,iBAAiB,CAC/B,aACyC,EAAA;AAEzC,IAAA,MAAM,SAAS,GAA2B,EAAC,GAAG,aAAa,EAAkB,CAAC;AAC9E,IAAA,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;AAChC,IAAA,IAAI,EAAE,GAAG,CAAW,QAAA,EAAA,IAAI,EAAE,CAAC;AAC3B,IAAA,IAAI,aAAa,CAAC,QAAQ,EAAE;AAC1B,QAAA,MAAM,gBAAgB,GAAG,aAAa,CAAC,gBAAgB,CAAC;AACxD,QAAA,MAAM,eAAe,GAAG,gBAAgB,EAAE,eAAe,CAAC;AAC1D,QAAA,OAAO,aAAa,CAAC,gBAAgB,EAAE,eAAe,CAAC;QACvD,OAAO,aAAa,CAAC,gBAAgB,CAAC;AAEtC,QAAA,EAAE,GAAG,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,OAAO,EAAE,CAAC;;AAE1B,QAAA,SAAS,CAAC,OAAO;AACf,YAAA,aAAa,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;QACnE,SAAS,CAAC,gBAAgB,GAAG;AAC3B,YAAA,qBAAqB,EAAE,WAAW;YAClC,UAAU,EAAE,IAAI,GAAG,EAAE;AACrB,YAAA,eAAe,EAAE;AACf,gBAAA,EAAE,EAAE,OAAO;AACX,gBAAA,aAAa,EAAE,IAAI;AACnB,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,KAAK,EAAE,gBAAgB;AACvB,gBAAA,cAAc,EAAE,IAAI;AACpB,gBAAA,UAAU,EAAE,MAAM;AAClB,gBAAA,SAAS,EAAE,MAAM;AACjB,gBAAA,MAAM,EAAE,OAAO;AACf,gBAAA,GAAG,eAAe;AACnB,aAAA;AACD,YAAA,GAAG,gBAAgB;SACpB,CAAC;KACH;AAED,IAAA,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;QAC1B,EAAE;QACF,IAAI;AACJ,QAAA,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC;AACzC,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,WAAW,EAAE,oBAAoB;AACjC,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,GAAG,SAAS;AACb,KAAA,CAAC,CAAC;AAEH,IAAA,OAAO,OAAO,CAAC;AACjB;;;;"}