@agnostack/next-shopify 1.15.0-beta.2 → 1.15.0-beta.21

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 (273) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/dist/lib/handlers/api/auth.js +15 -11
  3. package/dist/lib/handlers/api/auth.js.map +1 -1
  4. package/dist/lib/handlers/api/billing.js +13 -9
  5. package/dist/lib/handlers/api/billing.js.map +1 -1
  6. package/dist/lib/handlers/api/callback.js +37 -33
  7. package/dist/lib/handlers/api/callback.js.map +1 -1
  8. package/dist/lib/handlers/api/index.js +25 -7
  9. package/dist/lib/handlers/api/index.js.map +1 -1
  10. package/dist/lib/handlers/api/uninstall.js +12 -8
  11. package/dist/lib/handlers/api/uninstall.js.map +1 -1
  12. package/dist/lib/handlers/api/verifiable/appInstallation.js +11 -7
  13. package/dist/lib/handlers/api/verifiable/appInstallation.js.map +1 -1
  14. package/dist/lib/handlers/api/verifiable/graph.js +26 -22
  15. package/dist/lib/handlers/api/verifiable/graph.js.map +1 -1
  16. package/dist/lib/handlers/api/verifiable/index.js +21 -5
  17. package/dist/lib/handlers/api/verifiable/index.js.map +1 -1
  18. package/dist/lib/handlers/api/verifiable/proxy.js +39 -32
  19. package/dist/lib/handlers/api/verifiable/proxy.js.map +1 -1
  20. package/dist/lib/handlers/api/verifiable/rest.js +23 -19
  21. package/dist/lib/handlers/api/verifiable/rest.js.map +1 -1
  22. package/dist/lib/handlers/api/verifiable/token.js +27 -23
  23. package/dist/lib/handlers/api/verifiable/token.js.map +1 -1
  24. package/dist/lib/handlers/api/webhook.js +13 -9
  25. package/dist/lib/handlers/api/webhook.js.map +1 -1
  26. package/dist/lib/handlers/index.js +18 -2
  27. package/dist/lib/handlers/index.js.map +1 -1
  28. package/dist/lib/handlers/ssr/index.js +18 -2
  29. package/dist/lib/handlers/ssr/index.js.map +1 -1
  30. package/dist/lib/handlers/ssr/protect.js +24 -17
  31. package/dist/lib/handlers/ssr/protect.js.map +1 -1
  32. package/dist/lib/handlers/ssr/wrap.js +10 -6
  33. package/dist/lib/handlers/ssr/wrap.js.map +1 -1
  34. package/dist/lib/index.d.ts +1 -1
  35. package/dist/lib/index.d.ts.map +1 -1
  36. package/dist/lib/index.js +24 -5
  37. package/dist/lib/index.js.map +1 -1
  38. package/dist/lib/utils/billing.js +23 -18
  39. package/dist/lib/utils/billing.js.map +1 -1
  40. package/dist/lib/utils/crypto.d.ts +1 -1
  41. package/dist/lib/utils/crypto.d.ts.map +1 -1
  42. package/dist/lib/utils/crypto.js +25 -15
  43. package/dist/lib/utils/crypto.js.map +1 -1
  44. package/dist/lib/utils/firebase.js +29 -17
  45. package/dist/lib/utils/firebase.js.map +1 -1
  46. package/dist/lib/utils/headers.js +13 -6
  47. package/dist/lib/utils/headers.js.map +1 -1
  48. package/dist/lib/utils/index.js +24 -8
  49. package/dist/lib/utils/index.js.map +1 -1
  50. package/dist/lib/utils/session.js +64 -59
  51. package/dist/lib/utils/session.js.map +1 -1
  52. package/dist/lib/utils/shopify-api-js/oauth.js +23 -16
  53. package/dist/lib/utils/shopify-api-js/oauth.js.map +1 -1
  54. package/dist/lib/utils/shopify.js +37 -25
  55. package/dist/lib/utils/shopify.js.map +1 -1
  56. package/dist/lib/utils/token.js +15 -11
  57. package/dist/lib/utils/token.js.map +1 -1
  58. package/dist/plugins/index.d.ts +3 -0
  59. package/dist/plugins/index.d.ts.map +1 -0
  60. package/dist/plugins/index.js +19 -0
  61. package/dist/plugins/index.js.map +1 -0
  62. package/dist/plugins/types.d.ts +1 -0
  63. package/dist/plugins/types.d.ts.map +1 -0
  64. package/dist/plugins/types.js +1 -0
  65. package/dist/plugins/types.js.map +1 -0
  66. package/dist/plugins/withShopify.d.ts.map +1 -0
  67. package/dist/{lib → plugins}/withShopify.js +83 -77
  68. package/dist/plugins/withShopify.js.map +1 -0
  69. package/dist/react/hooks/index.js +17 -1
  70. package/dist/react/hooks/index.js.map +1 -1
  71. package/dist/react/hooks/useVerification.d.ts +1 -1
  72. package/dist/react/hooks/useVerification.js +23 -7
  73. package/dist/react/hooks/useVerification.js.map +1 -1
  74. package/dist/react/index.d.ts +1 -0
  75. package/dist/react/index.d.ts.map +1 -1
  76. package/dist/react/index.js +18 -1
  77. package/dist/react/index.js.map +1 -1
  78. package/dist/runtime/index.js +17 -1
  79. package/dist/runtime/index.js.map +1 -1
  80. package/dist/shared/WebCrypto.d.ts +55 -0
  81. package/dist/shared/WebCrypto.d.ts.map +1 -0
  82. package/dist/shared/WebCrypto.js +345 -0
  83. package/dist/shared/WebCrypto.js.map +1 -0
  84. package/dist/shared/constants.js +15 -11
  85. package/dist/shared/constants.js.map +1 -1
  86. package/dist/shared/datetime.js +110 -83
  87. package/dist/shared/datetime.js.map +1 -1
  88. package/dist/shared/display.d.ts +0 -2
  89. package/dist/shared/display.d.ts.map +1 -1
  90. package/dist/shared/display.js +231 -155
  91. package/dist/shared/display.js.map +1 -1
  92. package/dist/shared/errors.js +12 -5
  93. package/dist/shared/errors.js.map +1 -1
  94. package/dist/shared/graph.js +14 -11
  95. package/dist/shared/graph.js.map +1 -1
  96. package/dist/shared/index.d.ts +2 -1
  97. package/dist/shared/index.d.ts.map +1 -1
  98. package/dist/shared/index.js +32 -10
  99. package/dist/shared/index.js.map +1 -1
  100. package/dist/shared/match.js +25 -17
  101. package/dist/shared/match.js.map +1 -1
  102. package/dist/shared/request.d.ts.map +1 -1
  103. package/dist/shared/request.js +19 -13
  104. package/dist/shared/request.js.map +1 -1
  105. package/dist/shared/shopify.js +31 -21
  106. package/dist/shared/shopify.js.map +1 -1
  107. package/dist/shared/uuid.d.ts +3 -0
  108. package/dist/shared/uuid.d.ts.map +1 -0
  109. package/dist/shared/uuid.js +10 -0
  110. package/dist/shared/uuid.js.map +1 -0
  111. package/dist/shared/verification.d.ts +12 -5
  112. package/dist/shared/verification.d.ts.map +1 -1
  113. package/dist/shared/verification.js +34 -23
  114. package/dist/shared/verification.js.map +1 -1
  115. package/dist/umd/lib/index.d.ts +1 -1
  116. package/dist/umd/lib/index.d.ts.map +1 -1
  117. package/dist/umd/lib/utils/crypto.d.ts +1 -1
  118. package/dist/umd/lib/utils/crypto.d.ts.map +1 -1
  119. package/dist/umd/plugins/index.d.ts +3 -0
  120. package/dist/umd/plugins/index.d.ts.map +1 -0
  121. package/dist/umd/plugins/types.d.ts +1 -0
  122. package/dist/umd/plugins/types.d.ts.map +1 -0
  123. package/dist/umd/plugins/withShopify.d.ts.map +1 -0
  124. package/dist/umd/react/hooks/useVerification.d.ts +1 -1
  125. package/dist/umd/react/index.d.ts +1 -0
  126. package/dist/umd/react/index.d.ts.map +1 -1
  127. package/dist/umd/shared/WebCrypto.d.ts +55 -0
  128. package/dist/umd/shared/WebCrypto.d.ts.map +1 -0
  129. package/dist/umd/shared/display.d.ts +0 -2
  130. package/dist/umd/shared/display.d.ts.map +1 -1
  131. package/dist/umd/shared/index.d.ts +2 -1
  132. package/dist/umd/shared/index.d.ts.map +1 -1
  133. package/dist/umd/shared/request.d.ts.map +1 -1
  134. package/dist/umd/shared/uuid.d.ts +3 -0
  135. package/dist/umd/shared/uuid.d.ts.map +1 -0
  136. package/dist/umd/shared/verification.d.ts +12 -5
  137. package/dist/umd/shared/verification.d.ts.map +1 -1
  138. package/dist/umd/verification/index.d.ts +2 -0
  139. package/dist/umd/verification/index.d.ts.map +1 -1
  140. package/dist/umd/verification/utils/errors.d.ts.map +1 -0
  141. package/dist/umd/verification/utils/index.d.ts +3 -0
  142. package/dist/umd/verification/utils/index.d.ts.map +1 -0
  143. package/dist/umd/verification/utils/rawbody.d.ts.map +1 -0
  144. package/dist/umd/verification/verification.d.ts +3 -1
  145. package/dist/umd/verification/verification.d.ts.map +1 -1
  146. package/dist/umd/verification.js +901 -0
  147. package/dist/umd/verification.js.map +1 -0
  148. package/dist/verification/index.d.ts +2 -0
  149. package/dist/verification/index.d.ts.map +1 -1
  150. package/dist/verification/index.js +19 -1
  151. package/dist/verification/index.js.map +1 -1
  152. package/dist/verification/utils/errors.d.ts.map +1 -0
  153. package/dist/verification/{errors.js → utils/errors.js} +5 -1
  154. package/dist/verification/utils/errors.js.map +1 -0
  155. package/dist/verification/utils/index.d.ts +3 -0
  156. package/dist/verification/utils/index.d.ts.map +1 -0
  157. package/dist/verification/utils/index.js +19 -0
  158. package/dist/verification/utils/index.js.map +1 -0
  159. package/dist/verification/utils/rawbody.d.ts.map +1 -0
  160. package/dist/verification/utils/rawbody.js +57 -0
  161. package/dist/verification/utils/rawbody.js.map +1 -0
  162. package/dist/verification/verification.d.ts +3 -1
  163. package/dist/verification/verification.d.ts.map +1 -1
  164. package/dist/verification/verification.js +71 -62
  165. package/dist/verification/verification.js.map +1 -1
  166. package/package.json +12 -12
  167. package/dist/lib/withShopify.d.ts.map +0 -1
  168. package/dist/lib/withShopify.js.map +0 -1
  169. package/dist/shared/subtlecrypto.d.ts +0 -41
  170. package/dist/shared/subtlecrypto.d.ts.map +0 -1
  171. package/dist/shared/subtlecrypto.js +0 -256
  172. package/dist/shared/subtlecrypto.js.map +0 -1
  173. package/dist/umd/lib/withShopify.d.ts.map +0 -1
  174. package/dist/umd/shared/subtlecrypto.d.ts +0 -41
  175. package/dist/umd/shared/subtlecrypto.d.ts.map +0 -1
  176. package/dist/umd/umd-verification.js +0 -968
  177. package/dist/umd/umd-verification.js.map +0 -1
  178. package/dist/umd/verification/errors.d.ts.map +0 -1
  179. package/dist/umd/verification/rawbody.d.ts.map +0 -1
  180. package/dist/verification/errors.d.ts.map +0 -1
  181. package/dist/verification/errors.js.map +0 -1
  182. package/dist/verification/rawbody.d.ts.map +0 -1
  183. package/dist/verification/rawbody.js +0 -31
  184. package/dist/verification/rawbody.js.map +0 -1
  185. package/node_modules/bytes/History.md +0 -97
  186. package/node_modules/bytes/LICENSE +0 -23
  187. package/node_modules/bytes/Readme.md +0 -152
  188. package/node_modules/bytes/index.js +0 -170
  189. package/node_modules/bytes/package.json +0 -42
  190. package/node_modules/depd/History.md +0 -103
  191. package/node_modules/depd/LICENSE +0 -22
  192. package/node_modules/depd/Readme.md +0 -280
  193. package/node_modules/depd/index.js +0 -538
  194. package/node_modules/depd/lib/browser/index.js +0 -77
  195. package/node_modules/depd/package.json +0 -45
  196. package/node_modules/http-errors/HISTORY.md +0 -180
  197. package/node_modules/http-errors/LICENSE +0 -23
  198. package/node_modules/http-errors/README.md +0 -169
  199. package/node_modules/http-errors/index.js +0 -289
  200. package/node_modules/http-errors/package.json +0 -50
  201. package/node_modules/iconv-lite/Changelog.md +0 -162
  202. package/node_modules/iconv-lite/LICENSE +0 -21
  203. package/node_modules/iconv-lite/README.md +0 -156
  204. package/node_modules/iconv-lite/encodings/dbcs-codec.js +0 -555
  205. package/node_modules/iconv-lite/encodings/dbcs-data.js +0 -176
  206. package/node_modules/iconv-lite/encodings/index.js +0 -22
  207. package/node_modules/iconv-lite/encodings/internal.js +0 -188
  208. package/node_modules/iconv-lite/encodings/sbcs-codec.js +0 -72
  209. package/node_modules/iconv-lite/encodings/sbcs-data-generated.js +0 -451
  210. package/node_modules/iconv-lite/encodings/sbcs-data.js +0 -174
  211. package/node_modules/iconv-lite/encodings/tables/big5-added.json +0 -122
  212. package/node_modules/iconv-lite/encodings/tables/cp936.json +0 -264
  213. package/node_modules/iconv-lite/encodings/tables/cp949.json +0 -273
  214. package/node_modules/iconv-lite/encodings/tables/cp950.json +0 -177
  215. package/node_modules/iconv-lite/encodings/tables/eucjp.json +0 -182
  216. package/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +0 -1
  217. package/node_modules/iconv-lite/encodings/tables/gbk-added.json +0 -55
  218. package/node_modules/iconv-lite/encodings/tables/shiftjis.json +0 -125
  219. package/node_modules/iconv-lite/encodings/utf16.js +0 -177
  220. package/node_modules/iconv-lite/encodings/utf7.js +0 -290
  221. package/node_modules/iconv-lite/lib/bom-handling.js +0 -52
  222. package/node_modules/iconv-lite/lib/extend-node.js +0 -217
  223. package/node_modules/iconv-lite/lib/index.d.ts +0 -24
  224. package/node_modules/iconv-lite/lib/index.js +0 -153
  225. package/node_modules/iconv-lite/lib/streams.js +0 -121
  226. package/node_modules/iconv-lite/package.json +0 -46
  227. package/node_modules/inherits/LICENSE +0 -16
  228. package/node_modules/inherits/README.md +0 -42
  229. package/node_modules/inherits/inherits.js +0 -9
  230. package/node_modules/inherits/inherits_browser.js +0 -27
  231. package/node_modules/inherits/package.json +0 -29
  232. package/node_modules/raw-body/HISTORY.md +0 -308
  233. package/node_modules/raw-body/LICENSE +0 -22
  234. package/node_modules/raw-body/README.md +0 -223
  235. package/node_modules/raw-body/SECURITY.md +0 -24
  236. package/node_modules/raw-body/index.d.ts +0 -87
  237. package/node_modules/raw-body/index.js +0 -336
  238. package/node_modules/raw-body/package.json +0 -49
  239. package/node_modules/safer-buffer/LICENSE +0 -21
  240. package/node_modules/safer-buffer/Porting-Buffer.md +0 -268
  241. package/node_modules/safer-buffer/Readme.md +0 -156
  242. package/node_modules/safer-buffer/dangerous.js +0 -58
  243. package/node_modules/safer-buffer/package.json +0 -34
  244. package/node_modules/safer-buffer/safer.js +0 -77
  245. package/node_modules/safer-buffer/tests.js +0 -406
  246. package/node_modules/setprototypeof/LICENSE +0 -13
  247. package/node_modules/setprototypeof/README.md +0 -31
  248. package/node_modules/setprototypeof/index.d.ts +0 -2
  249. package/node_modules/setprototypeof/index.js +0 -17
  250. package/node_modules/setprototypeof/package.json +0 -38
  251. package/node_modules/setprototypeof/test/index.js +0 -24
  252. package/node_modules/statuses/HISTORY.md +0 -82
  253. package/node_modules/statuses/LICENSE +0 -23
  254. package/node_modules/statuses/README.md +0 -136
  255. package/node_modules/statuses/codes.json +0 -65
  256. package/node_modules/statuses/index.js +0 -146
  257. package/node_modules/statuses/package.json +0 -49
  258. package/node_modules/toidentifier/HISTORY.md +0 -9
  259. package/node_modules/toidentifier/LICENSE +0 -21
  260. package/node_modules/toidentifier/README.md +0 -61
  261. package/node_modules/toidentifier/index.js +0 -32
  262. package/node_modules/toidentifier/package.json +0 -38
  263. package/node_modules/unpipe/HISTORY.md +0 -4
  264. package/node_modules/unpipe/LICENSE +0 -22
  265. package/node_modules/unpipe/README.md +0 -43
  266. package/node_modules/unpipe/index.js +0 -69
  267. package/node_modules/unpipe/package.json +0 -27
  268. /package/dist/{lib → plugins}/withShopify.d.ts +0 -0
  269. /package/dist/umd/{lib → plugins}/withShopify.d.ts +0 -0
  270. /package/dist/umd/verification/{errors.d.ts → utils/errors.d.ts} +0 -0
  271. /package/dist/umd/verification/{rawbody.d.ts → utils/rawbody.d.ts} +0 -0
  272. /package/dist/verification/{errors.d.ts → utils/errors.d.ts} +0 -0
  273. /package/dist/verification/{rawbody.d.ts → utils/rawbody.d.ts} +0 -0
@@ -0,0 +1,901 @@
1
+ (function (global, factory) {
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
3
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@agnostack/next-shopify/umd-verification"] = {}));
5
+ })(this, (function (exports) { 'use strict';
6
+
7
+ const COLLECTION_ROOT = 'oauth-data';
8
+
9
+ const PAGE_ROUTE_NAMES = {
10
+ EXIT: 'pageRouteExit',
11
+ ERROR: 'pageRouteError',
12
+ SUCCESS: 'pageRouteSuccess',
13
+ };
14
+
15
+ const API_WEBHOOK_TOPICS = {
16
+ APP_UNINSTALLED: 'APP_UNINSTALLED',
17
+ APP_PURCHASES_ONE_TIME_UPDATE: 'APP_PURCHASES_ONE_TIME_UPDATE',
18
+ APP_SUBSCRIPTIONS_APPROACHING_CAPPED_AMOUNT: 'APP_SUBSCRIPTIONS_APPROACHING_CAPPED_AMOUNT',
19
+ APP_SUBSCRIPTIONS_UPDATE: 'APP_SUBSCRIPTIONS_UPDATE',
20
+ ATTRIBUTED_SESSIONS_FIRST: 'ATTRIBUTED_SESSIONS_FIRST',
21
+ ATTRIBUTED_SESSIONS_LAST: 'ATTRIBUTED_SESSIONS_LAST',
22
+ AUDIT_EVENTS_ADMIN_API_ACTIVITY: 'AUDIT_EVENTS_ADMIN_API_ACTIVITY',
23
+ BULK_OPERATIONS_FINISH: 'BULK_OPERATIONS_FINISH',
24
+ CARTS_CREATE: 'CARTS_CREATE',
25
+ CARTS_UPDATE: 'CARTS_UPDATE',
26
+ CHANNELS_DELETE: 'CHANNELS_DELETE',
27
+ CHECKOUTS_CREATE: 'CHECKOUTS_CREATE',
28
+ CHECKOUTS_DELETE: 'CHECKOUTS_DELETE',
29
+ CHECKOUTS_UPDATE: 'CHECKOUTS_UPDATE',
30
+ COLLECTIONS_CREATE: 'COLLECTIONS_CREATE',
31
+ COLLECTIONS_DELETE: 'COLLECTIONS_DELETE',
32
+ COLLECTIONS_UPDATE: 'COLLECTIONS_UPDATE',
33
+ COLLECTION_LISTINGS_ADD: 'COLLECTION_LISTINGS_ADD',
34
+ COLLECTION_LISTINGS_REMOVE: 'COLLECTION_LISTINGS_REMOVE',
35
+ COLLECTION_LISTINGS_UPDATE: 'COLLECTION_LISTINGS_UPDATE',
36
+ COLLECTION_PUBLICATIONS_CREATE: 'COLLECTION_PUBLICATIONS_CREATE',
37
+ COLLECTION_PUBLICATIONS_DELETE: 'COLLECTION_PUBLICATIONS_DELETE',
38
+ COLLECTION_PUBLICATIONS_UPDATE: 'COLLECTION_PUBLICATIONS_UPDATE',
39
+ COMPANIES_CREATE: 'COMPANIES_CREATE',
40
+ COMPANIES_DELETE: 'COMPANIES_DELETE',
41
+ COMPANIES_UPDATE: 'COMPANIES_UPDATE',
42
+ COMPANY_CONTACTS_CREATE: 'COMPANY_CONTACTS_CREATE',
43
+ COMPANY_CONTACTS_DELETE: 'COMPANY_CONTACTS_DELETE',
44
+ COMPANY_CONTACTS_UPDATE: 'COMPANY_CONTACTS_UPDATE',
45
+ COMPANY_LOCATIONS_CREATE: 'COMPANY_LOCATIONS_CREATE',
46
+ COMPANY_LOCATIONS_DELETE: 'COMPANY_LOCATIONS_DELETE',
47
+ COMPANY_LOCATIONS_UPDATE: 'COMPANY_LOCATIONS_UPDATE',
48
+ CUSTOMERS_CREATE: 'CUSTOMERS_CREATE',
49
+ CUSTOMERS_DELETE: 'CUSTOMERS_DELETE',
50
+ CUSTOMERS_DISABLE: 'CUSTOMERS_DISABLE',
51
+ CUSTOMERS_ENABLE: 'CUSTOMERS_ENABLE',
52
+ CUSTOMERS_MARKETING_CONSENT_UPDATE: 'CUSTOMERS_MARKETING_CONSENT_UPDATE',
53
+ CUSTOMERS_MERGE: 'CUSTOMERS_MERGE',
54
+ CUSTOMERS_UPDATE: 'CUSTOMERS_UPDATE',
55
+ CUSTOMER_GROUPS_CREATE: 'CUSTOMER_GROUPS_CREATE',
56
+ CUSTOMER_GROUPS_DELETE: 'CUSTOMER_GROUPS_DELETE',
57
+ CUSTOMER_GROUPS_UPDATE: 'CUSTOMER_GROUPS_UPDATE',
58
+ CUSTOMER_PAYMENT_METHODS_CREATE: 'CUSTOMER_PAYMENT_METHODS_CREATE',
59
+ CUSTOMER_PAYMENT_METHODS_REVOKE: 'CUSTOMER_PAYMENT_METHODS_REVOKE',
60
+ CUSTOMER_PAYMENT_METHODS_UPDATE: 'CUSTOMER_PAYMENT_METHODS_UPDATE',
61
+ DISPUTES_CREATE: 'DISPUTES_CREATE',
62
+ DISPUTES_UPDATE: 'DISPUTES_UPDATE',
63
+ DOMAINS_CREATE: 'DOMAINS_CREATE',
64
+ DOMAINS_DESTROY: 'DOMAINS_DESTROY',
65
+ DOMAINS_UPDATE: 'DOMAINS_UPDATE',
66
+ DRAFT_ORDERS_CREATE: 'DRAFT_ORDERS_CREATE',
67
+ DRAFT_ORDERS_DELETE: 'DRAFT_ORDERS_DELETE',
68
+ DRAFT_ORDERS_UPDATE: 'DRAFT_ORDERS_UPDATE',
69
+ FULFILLMENTS_CREATE: 'FULFILLMENTS_CREATE',
70
+ FULFILLMENTS_UPDATE: 'FULFILLMENTS_UPDATE',
71
+ FULFILLMENT_EVENTS_CREATE: 'FULFILLMENT_EVENTS_CREATE',
72
+ FULFILLMENT_EVENTS_DELETE: 'FULFILLMENT_EVENTS_DELETE',
73
+ FULFILLMENT_ORDERS_CANCELLATION_REQUEST_ACCEPTED: 'FULFILLMENT_ORDERS_CANCELLATION_REQUEST_ACCEPTED',
74
+ FULFILLMENT_ORDERS_CANCELLATION_REQUEST_REJECTED: 'FULFILLMENT_ORDERS_CANCELLATION_REQUEST_REJECTED',
75
+ FULFILLMENT_ORDERS_CANCELLATION_REQUEST_SUBMITTED: 'FULFILLMENT_ORDERS_CANCELLATION_REQUEST_SUBMITTED',
76
+ FULFILLMENT_ORDERS_CANCELLED: 'FULFILLMENT_ORDERS_CANCELLED',
77
+ FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_ACCEPTED: 'FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_ACCEPTED',
78
+ FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_REJECTED: 'FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_REJECTED',
79
+ FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_SUBMITTED: 'FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_SUBMITTED',
80
+ FULFILLMENT_ORDERS_FULFILLMENT_SERVICE_FAILED_TO_COMPLETE: 'FULFILLMENT_ORDERS_FULFILLMENT_SERVICE_FAILED_TO_COMPLETE',
81
+ FULFILLMENT_ORDERS_HOLD_RELEASED: 'FULFILLMENT_ORDERS_HOLD_RELEASED',
82
+ FULFILLMENT_ORDERS_LINE_ITEMS_PREPARED_FOR_LOCAL_DELIVERY: 'FULFILLMENT_ORDERS_LINE_ITEMS_PREPARED_FOR_LOCAL_DELIVERY',
83
+ FULFILLMENT_ORDERS_LINE_ITEMS_PREPARED_FOR_PICKUP: 'FULFILLMENT_ORDERS_LINE_ITEMS_PREPARED_FOR_PICKUP',
84
+ FULFILLMENT_ORDERS_MOVED: 'FULFILLMENT_ORDERS_MOVED',
85
+ FULFILLMENT_ORDERS_ORDER_ROUTING_COMPLETE: 'FULFILLMENT_ORDERS_ORDER_ROUTING_COMPLETE',
86
+ FULFILLMENT_ORDERS_PLACED_ON_HOLD: 'FULFILLMENT_ORDERS_PLACED_ON_HOLD',
87
+ FULFILLMENT_ORDERS_RESCHEDULED: 'FULFILLMENT_ORDERS_RESCHEDULED',
88
+ FULFILLMENT_ORDERS_SCHEDULED_FULFILLMENT_ORDER_READY: 'FULFILLMENT_ORDERS_SCHEDULED_FULFILLMENT_ORDER_READY',
89
+ INVENTORY_ITEMS_CREATE: 'INVENTORY_ITEMS_CREATE',
90
+ INVENTORY_ITEMS_DELETE: 'INVENTORY_ITEMS_DELETE',
91
+ INVENTORY_ITEMS_UPDATE: 'INVENTORY_ITEMS_UPDATE',
92
+ INVENTORY_LEVELS_CONNECT: 'INVENTORY_LEVELS_CONNECT',
93
+ INVENTORY_LEVELS_DISCONNECT: 'INVENTORY_LEVELS_DISCONNECT',
94
+ INVENTORY_LEVELS_UPDATE: 'INVENTORY_LEVELS_UPDATE',
95
+ LOCALES_CREATE: 'LOCALES_CREATE',
96
+ LOCALES_UPDATE: 'LOCALES_UPDATE',
97
+ LOCATIONS_ACTIVATE: 'LOCATIONS_ACTIVATE',
98
+ LOCATIONS_CREATE: 'LOCATIONS_CREATE',
99
+ LOCATIONS_DEACTIVATE: 'LOCATIONS_DEACTIVATE',
100
+ LOCATIONS_DELETE: 'LOCATIONS_DELETE',
101
+ LOCATIONS_UPDATE: 'LOCATIONS_UPDATE',
102
+ MARKETS_CREATE: 'MARKETS_CREATE',
103
+ MARKETS_DELETE: 'MARKETS_DELETE',
104
+ MARKETS_UPDATE: 'MARKETS_UPDATE',
105
+ ORDERS_CANCELLED: 'ORDERS_CANCELLED',
106
+ ORDERS_CREATE: 'ORDERS_CREATE',
107
+ ORDERS_DELETE: 'ORDERS_DELETE',
108
+ ORDERS_EDITED: 'ORDERS_EDITED',
109
+ ORDERS_FULFILLED: 'ORDERS_FULFILLED',
110
+ ORDERS_PAID: 'ORDERS_PAID',
111
+ ORDERS_PARTIALLY_FULFILLED: 'ORDERS_PARTIALLY_FULFILLED',
112
+ ORDERS_UPDATED: 'ORDERS_UPDATED',
113
+ ORDER_TRANSACTIONS_CREATE: 'ORDER_TRANSACTIONS_CREATE',
114
+ PAYMENT_SCHEDULES_DUE: 'PAYMENT_SCHEDULES_DUE',
115
+ PAYMENT_TERMS_CREATE: 'PAYMENT_TERMS_CREATE',
116
+ PAYMENT_TERMS_DELETE: 'PAYMENT_TERMS_DELETE',
117
+ PAYMENT_TERMS_UPDATE: 'PAYMENT_TERMS_UPDATE',
118
+ PRODUCTS_CREATE: 'PRODUCTS_CREATE',
119
+ PRODUCTS_DELETE: 'PRODUCTS_DELETE',
120
+ PRODUCTS_UPDATE: 'PRODUCTS_UPDATE',
121
+ PRODUCT_LISTINGS_ADD: 'PRODUCT_LISTINGS_ADD',
122
+ PRODUCT_LISTINGS_REMOVE: 'PRODUCT_LISTINGS_REMOVE',
123
+ PRODUCT_LISTINGS_UPDATE: 'PRODUCT_LISTINGS_UPDATE',
124
+ PRODUCT_PUBLICATIONS_CREATE: 'PRODUCT_PUBLICATIONS_CREATE',
125
+ PRODUCT_PUBLICATIONS_DELETE: 'PRODUCT_PUBLICATIONS_DELETE',
126
+ PRODUCT_PUBLICATIONS_UPDATE: 'PRODUCT_PUBLICATIONS_UPDATE',
127
+ PROFILES_CREATE: 'PROFILES_CREATE',
128
+ PROFILES_DELETE: 'PROFILES_DELETE',
129
+ PROFILES_UPDATE: 'PROFILES_UPDATE',
130
+ REFUNDS_CREATE: 'REFUNDS_CREATE',
131
+ RETURNS_APPROVE: 'RETURNS_APPROVE',
132
+ RETURNS_CANCEL: 'RETURNS_CANCEL',
133
+ RETURNS_CLOSE: 'RETURNS_CLOSE',
134
+ RETURNS_DECLINE: 'RETURNS_DECLINE',
135
+ RETURNS_REOPEN: 'RETURNS_REOPEN',
136
+ RETURNS_REQUEST: 'RETURNS_REQUEST',
137
+ REVERSE_DELIVERIES_ATTACH_DELIVERABLE: 'REVERSE_DELIVERIES_ATTACH_DELIVERABLE',
138
+ REVERSE_FULFILLMENT_ORDERS_DISPOSE: 'REVERSE_FULFILLMENT_ORDERS_DISPOSE',
139
+ SCHEDULED_PRODUCT_LISTINGS_ADD: 'SCHEDULED_PRODUCT_LISTINGS_ADD',
140
+ SCHEDULED_PRODUCT_LISTINGS_REMOVE: 'SCHEDULED_PRODUCT_LISTINGS_REMOVE',
141
+ SCHEDULED_PRODUCT_LISTINGS_UPDATE: 'SCHEDULED_PRODUCT_LISTINGS_UPDATE',
142
+ SEGMENTS_CREATE: 'SEGMENTS_CREATE',
143
+ SEGMENTS_DELETE: 'SEGMENTS_DELETE',
144
+ SEGMENTS_UPDATE: 'SEGMENTS_UPDATE',
145
+ SELLING_PLAN_GROUPS_CREATE: 'SELLING_PLAN_GROUPS_CREATE',
146
+ SELLING_PLAN_GROUPS_DELETE: 'SELLING_PLAN_GROUPS_DELETE',
147
+ SELLING_PLAN_GROUPS_UPDATE: 'SELLING_PLAN_GROUPS_UPDATE',
148
+ SHIPPING_ADDRESSES_CREATE: 'SHIPPING_ADDRESSES_CREATE',
149
+ SHIPPING_ADDRESSES_UPDATE: 'SHIPPING_ADDRESSES_UPDATE',
150
+ SHOP_UPDATE: 'SHOP_UPDATE',
151
+ SUBSCRIPTION_BILLING_ATTEMPTS_CHALLENGED: 'SUBSCRIPTION_BILLING_ATTEMPTS_CHALLENGED',
152
+ SUBSCRIPTION_BILLING_ATTEMPTS_FAILURE: 'SUBSCRIPTION_BILLING_ATTEMPTS_FAILURE',
153
+ SUBSCRIPTION_BILLING_ATTEMPTS_SUCCESS: 'SUBSCRIPTION_BILLING_ATTEMPTS_SUCCESS',
154
+ SUBSCRIPTION_BILLING_CYCLE_EDITS_CREATE: 'SUBSCRIPTION_BILLING_CYCLE_EDITS_CREATE',
155
+ SUBSCRIPTION_BILLING_CYCLE_EDITS_DELETE: 'SUBSCRIPTION_BILLING_CYCLE_EDITS_DELETE',
156
+ SUBSCRIPTION_BILLING_CYCLE_EDITS_UPDATE: 'SUBSCRIPTION_BILLING_CYCLE_EDITS_UPDATE',
157
+ SUBSCRIPTION_CONTRACTS_CREATE: 'SUBSCRIPTION_CONTRACTS_CREATE',
158
+ SUBSCRIPTION_CONTRACTS_UPDATE: 'SUBSCRIPTION_CONTRACTS_UPDATE',
159
+ TAX_SERVICES_CREATE: 'TAX_SERVICES_CREATE',
160
+ TAX_SERVICES_UPDATE: 'TAX_SERVICES_UPDATE',
161
+ TENDER_TRANSACTIONS_CREATE: 'TENDER_TRANSACTIONS_CREATE',
162
+ THEMES_CREATE: 'THEMES_CREATE',
163
+ THEMES_DELETE: 'THEMES_DELETE',
164
+ THEMES_PUBLISH: 'THEMES_PUBLISH',
165
+ THEMES_UPDATE: 'THEMES_UPDATE',
166
+ VARIANTS_IN_STOCK: 'VARIANTS_IN_STOCK',
167
+ VARIANTS_OUT_OF_STOCK: 'VARIANTS_OUT_OF_STOCK',
168
+ // NOTE: latest webhooks as of 6/3/23 UNSTABLE below (https://shopify.dev/docs/api/admin-graphql/unstable/enums/WebhookSubscriptionTopic)
169
+ CHECKOUTS_PAID: 'CHECKOUTS_PAID',
170
+ COMPANY_CONTACT_ROLES_ASSIGN: 'COMPANY_CONTACT_ROLES_ASSIGN',
171
+ COMPANY_CONTACT_ROLES_REVOKE: 'COMPANY_CONTACT_ROLES_REVOKE',
172
+ CUSTOMERS_EMAIL_MARKETING_CONSENT_UPDATE: 'CUSTOMERS_EMAIL_MARKETING_CONSENT_UPDATE',
173
+ FINANCE_KYC_INFORMATION_UPDATE: 'FINANCE_KYC_INFORMATION_UPDATE',
174
+ FULFILLMENT_ORDERS_HOLD_FULFILLMENT: 'FULFILLMENT_ORDERS_HOLD_FULFILLMENT',
175
+ FULFILLMENT_ORDERS_READY_FOR_PICKUP: 'FULFILLMENT_ORDERS_READY_FOR_PICKUP',
176
+ FULFILLMENT_ORDERS_READY_TO_FULFILL: 'FULFILLMENT_ORDERS_READY_TO_FULFILL',
177
+ INVENTORY_QUANTITIES_CHANGED: 'INVENTORY_QUANTITIES_CHANGED',
178
+ MARKETPLACE_PAYMENTS_CONFIGURATIONS_UPDATE: 'MARKETPLACE_PAYMENTS_CONFIGURATIONS_UPDATE',
179
+ PRODUCT_FEEDS_CREATE: 'PRODUCT_FEEDS_CREATE',
180
+ PRODUCT_FEEDS_FULL_SYNC: 'PRODUCT_FEEDS_FULL_SYNC',
181
+ PRODUCT_FEEDS_INCREMENTAL_SYNC: 'PRODUCT_FEEDS_INCREMENTAL_SYNC',
182
+ PRODUCT_FEEDS_UPDATE: 'PRODUCT_FEEDS_UPDATE',
183
+ PUBLICATIONS_DELETE: 'PUBLICATIONS_DELETE',
184
+ PURCHASE_ORDERS_CREATE: 'PURCHASE_ORDERS_CREATE',
185
+ PURCHASE_ORDERS_DELETE: 'PURCHASE_ORDERS_DELETE',
186
+ PURCHASE_ORDERS_MARK_AS_ORDERED: 'PURCHASE_ORDERS_MARK_AS_ORDERED',
187
+ PURCHASE_ORDERS_RECEIVE: 'PURCHASE_ORDERS_RECEIVE',
188
+ PURCHASE_ORDERS_UPDATE: 'PURCHASE_ORDERS_UPDATE',
189
+ SUPPLIERS_CREATE: 'SUPPLIERS_CREATE',
190
+ SUPPLIERS_DELETE: 'SUPPLIERS_DELETE',
191
+ SUPPLIERS_UPDATE: 'SUPPLIERS_UPDATE',
192
+ };
193
+
194
+ // NOTE: this is a duplicate of shopify-api-js/registry.topicForStorage
195
+ const convertEventTopic = (topic) => (
196
+ API_WEBHOOK_TOPICS[topic?.toUpperCase().replace(/\/|\./g, '_')]
197
+ );
198
+
199
+ const API_ROUTE_NAMES = {
200
+ APP_INSTALLATION: 'apiRouteAppInstallation',
201
+ SESSION_TOKEN: 'apiRouteSessionToken',
202
+ WEBHOOK_EVENT: 'apiRouteWebhook',
203
+ AUTH_ONLINE: 'apiRouteAuthOnline',
204
+ AUTH_OFFLINE: 'apiRouteAuthOffline',
205
+ AUTH_ONLINE_CALLBACK: 'apiRouteAuthOnlineCallback',
206
+ AUTH_OFFLINE_CALLBACK: 'apiRouteAuthOfflineCallback',
207
+ AUTH_ONLINE_CALLBACK_REAUTH: 'apiRouteAuthOnlineCallbackReauth',
208
+ AUTH_OFFLINE_CALLBACK_REAUTH: 'apiRouteAuthOfflineCallbackReauth',
209
+ [API_WEBHOOK_TOPICS.APP_UNINSTALLED]: 'apiRouteAppUninstalled',
210
+ [API_WEBHOOK_TOPICS.APP_PURCHASES_ONE_TIME_UPDATE]: 'apiRouteAppOneTimeBilling',
211
+ [API_WEBHOOK_TOPICS.APP_SUBSCRIPTIONS_UPDATE]: 'apiRouteAppSubscriptionBilling',
212
+ };
213
+
214
+ const BILLING_INTERVALS = {
215
+ ONE_TIME: 'ONE_TIME',
216
+ MONTHLY: 'EVERY_30_DAYS',
217
+ ANNUAL: 'ANNUAL',
218
+ };
219
+
220
+ const BILLING_EVENT_TYPES = {
221
+ ONE_TIME: 'app_purchase_one_time',
222
+ SUBSCRIPTION: 'app_subscription',
223
+ };
224
+
225
+ const AUTH_TYPES = {
226
+ OFFLINE: 'offline',
227
+ ONLINE: 'online',
228
+ };
229
+
230
+ class VerificationError extends Error {
231
+ constructor(message, _data) {
232
+ super(message);
233
+ const { code = 500, ...data } = _data ?? {};
234
+ this.code = code;
235
+ this.data = data;
236
+ this.name = 'VerificationError';
237
+ Object.setPrototypeOf(this, VerificationError.prototype);
238
+ }
239
+ }
240
+
241
+ // import getRawBody from 'raw-body'
242
+ // import * as getRawBody from 'raw-body'
243
+
244
+ const getChunkedRawBody = async (readable) => {
245
+ if (readable?.rawBody) {
246
+ return readable.rawBody
247
+ }
248
+
249
+ const chunks = [];
250
+ const chunkedBody = readable?.body ?? [];
251
+
252
+ for await (const chunk of chunkedBody) {
253
+ chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
254
+ }
255
+
256
+ return Buffer.concat(chunks)
257
+ };
258
+
259
+ // TODO: explore returning mutated request object adding on req.rawBody??
260
+ // TODO: move to req.text() after next 13.5: https://github.com/vercel/next.js/discussions/13405
261
+ const ensureRawBody = async (req) => (
262
+ getChunkedRawBody(req)
263
+ // getRawBody(req)
264
+ .then((_rawBody) => _rawBody.toString())
265
+ .catch((error) => {
266
+ console.error(`Error getting raw body for '${req?.url}'`, error);
267
+ throw error
268
+ })
269
+ );
270
+
271
+ /* eslint-disable no-use-before-define */
272
+
273
+ const isType = (value, type) => (
274
+ // eslint-disable-next-line eqeqeq, valid-typeof
275
+ (value != undefined) && (typeof value === type)
276
+ );
277
+
278
+ const safeTrim = (value) => {
279
+ if (isType(value, 'string')) {
280
+ // eslint-disable-next-line no-param-reassign
281
+ value = value.trim();
282
+ }
283
+
284
+ return value
285
+ };
286
+
287
+ const safeParse = (value, trim) => {
288
+ if (isType(value, 'string')) {
289
+ if (trim) {
290
+ // eslint-disable-next-line no-param-reassign
291
+ value = safeTrim(value);
292
+ }
293
+
294
+ if (value.startsWith('{') || value.startsWith('[') || value.startsWith('"')) {
295
+ // eslint-disable-next-line no-param-reassign
296
+ value = JSON.parse(value);
297
+ }
298
+ }
299
+
300
+ // TODO: should this be value ?? {}
301
+ return value
302
+ };
303
+
304
+ const ensureString = (string) => (
305
+ string ? `${string}` : ''
306
+ );
307
+
308
+ const ensureArray = (array = []) => (
309
+ // eslint-disable-next-line no-nested-ternary
310
+ !array ? [] : Array.isArray(array) ? array : [array]
311
+ );
312
+
313
+ const ensureObject = (object) => (
314
+ object ?? {}
315
+ );
316
+
317
+ // NOTE: this does not ensure !isType(string)
318
+ const objectEmpty = (object) => (
319
+ !object || !Object.keys(object).length
320
+ );
321
+
322
+ const stringNotEmpty = (stringable) => {
323
+ const string = ensureString(stringable);
324
+ return ((string.length > 0) && !['null', 'undefined'].includes(string))
325
+ };
326
+
327
+ const stringEmpty = (stringable) => (
328
+ !stringNotEmpty(stringable)
329
+ );
330
+
331
+ const compareString = (string1, string2) => {
332
+ if (stringEmpty(string1)) {
333
+ return 1
334
+ }
335
+
336
+ if (stringEmpty(string2)) {
337
+ return -1
338
+ }
339
+
340
+ return ensureString(string1).localeCompare(string2)
341
+ };
342
+
343
+ const compareEntryKeys = ([string1], [string2]) => (
344
+ compareString(string1, string2)
345
+ );
346
+
347
+ const objectToSortedString = (object, separator = '') => (
348
+ Object.entries(ensureObject(object))
349
+ .sort(compareEntryKeys)
350
+ .map(([key, value]) => `${key}=${value}`)
351
+ .join(separator)
352
+ );
353
+
354
+ const uppercase = (string) => (
355
+ ensureString(string).toUpperCase()
356
+ );
357
+
358
+ const removeLeadingSlash = (string) => (
359
+ ensureString(string).replace(/^\//, '')
360
+ );
361
+
362
+ const ensureLeadingSlash = (string) => (
363
+ `/${removeLeadingSlash(string)}`
364
+ );
365
+
366
+ const isTrue = (value, falsy) => {
367
+ const string = ensureString(value);
368
+ return ![...ensureArray(falsy), '', 'false'].includes(string)
369
+ };
370
+
371
+ const TEMP_HOSTNAME = 'xyz.com';
372
+ const REMOVABLE_KEYS = ['shop', 'host'];
373
+
374
+ const getRequestMethod = (body, _method) => {
375
+ const method = _method ?? (body ? 'POST' : 'GET');
376
+
377
+ return uppercase(method)
378
+ };
379
+
380
+ const convertToURL = (uri) => {
381
+ if (stringEmpty(uri)) {
382
+ return undefined
383
+ }
384
+
385
+ const protocolRegex = /^(https?:\/\/).+/i;
386
+
387
+ if (!protocolRegex.test(uri)) {
388
+ return new URL(`https://${TEMP_HOSTNAME}${ensureLeadingSlash(uri)}`)
389
+ }
390
+
391
+ return new URL(uri)
392
+ };
393
+
394
+ const normalizeURIParts = (uri) => {
395
+ const urlObject = convertToURL(uri);
396
+ if (!urlObject) {
397
+ return undefined
398
+ }
399
+
400
+ REMOVABLE_KEYS.forEach((key) => urlObject.searchParams.delete(key));
401
+
402
+ return {
403
+ ...(urlObject.hostname !== TEMP_HOSTNAME) && {
404
+ origin: urlObject.origin,
405
+ },
406
+ pathname: urlObject.pathname,
407
+ search: urlObject.search,
408
+ }
409
+ };
410
+
411
+ var n,r=((n=function(){return r}).toString=n.toLocaleString=n[Symbol.toPrimitive]=function(){return ""},n.valueOf=function(){return !1},new Proxy(Object.freeze(n),{get:function(n,t){return n.hasOwnProperty(t)?n[t]:r}})),u=function(n){return n===r};
412
+
413
+ let win = global.window;
414
+ let exists = (variable) => !u(variable);
415
+ let window = typeof win !== "undefined" ? win : r;
416
+
417
+ class WebCrypto {
418
+ constructor({ crypto: _crypto, util: _util } = {}) {
419
+ this._crypto = _crypto;
420
+ this._util = _util;
421
+ }
422
+
423
+ get subtle() {
424
+ return this._crypto?.subtle
425
+ }
426
+
427
+ async getWebCrypto() {
428
+ if (!this._crypto) {
429
+ try {
430
+ this._crypto = (await import('isomorphic-webcrypto')).default;
431
+ } catch (_ignore) {
432
+ console.info('Failed to import isomorphic-webcrypto, retrying w/ node crypto');
433
+ try {
434
+ this._crypto = (await import('crypto')).default;
435
+ } catch (error) {
436
+ console.error('Failed to import node crypto');
437
+ throw error
438
+ }
439
+ }
440
+ }
441
+
442
+ if (!this._crypto?.subtle) {
443
+ throw new Error('Invalid crypto, missing subtle')
444
+ }
445
+
446
+ return this._crypto
447
+ }
448
+
449
+ async getTextDecoder() {
450
+ if (this._util?.TextDecoder) {
451
+ console.info('Using this._util.TextDecoder');
452
+ return this._util.TextDecoder
453
+ }
454
+
455
+ if (exists(window) && typeof window?.TextDecoder === 'function') {
456
+ console.info('Using window.TextDecoder');
457
+ return window.TextDecoder
458
+ }
459
+
460
+ try {
461
+ const TextDecoder = (await import('util')).TextDecoder;
462
+ console.info('Using imported util.TextDecoder');
463
+ return TextDecoder
464
+ } catch (error) {
465
+ console.error('Failed to import utils.TextDecoder', error);
466
+ throw error
467
+ }
468
+ }
469
+
470
+ async getTextEncoder() {
471
+ if (this._util?.TextEncoder) {
472
+ console.info('Using this._util.TextEncoder');
473
+ return this._util.TextEncoder
474
+ }
475
+
476
+ if (exists(window) && typeof window?.TextEncoder === 'function') {
477
+ console.info('Using window.TextEncoder');
478
+ return window.TextEncoder
479
+ }
480
+
481
+ try {
482
+ const TextEncoder = (await import('util')).TextEncoder;
483
+ console.info('Using imported util.TextEncoder');
484
+ return TextEncoder
485
+ } catch (error) {
486
+ console.error('Failed to import utils.TextEncoder', error);
487
+ throw error
488
+ }
489
+ }
490
+
491
+ timingSafeEqual(value1, value2) {
492
+ if (
493
+ (value1 == undefined) ||
494
+ (value2 == undefined) ||
495
+ (value1.length !== value2.length)
496
+ ) {
497
+ return false
498
+ }
499
+
500
+ let result = 0;
501
+ // eslint-disable-next-line no-plusplus
502
+ for (let i = 0; i < value1.length; i++) {
503
+ // eslint-disable-next-line no-bitwise
504
+ result |= value1[i] ^ value2[i];
505
+ }
506
+
507
+ return (result === 0)
508
+ }
509
+
510
+ stringToHex(stringValue) {
511
+ return (
512
+ Array.from(ensureString(stringValue), (char) => (
513
+ char.charCodeAt(0).toString(16).padStart(2, '0')
514
+ )).join('')
515
+ )
516
+ }
517
+
518
+ hexToString(hexValue) {
519
+ return (
520
+ ensureArray(
521
+ ensureString(hexValue).match(/.{1,2}/g)
522
+ )
523
+ .map((byte) => String.fromCharCode(parseInt(byte, 16)))
524
+ .join('')
525
+ )
526
+ }
527
+
528
+ async arrayBufferToString(arrayBuffer) {
529
+ const uint8Array = new Uint8Array(arrayBuffer);
530
+ const Decoder = await this.getTextDecoder();
531
+ return new Decoder().decode(uint8Array)
532
+ }
533
+
534
+ arrayToArrayBuffer(array) {
535
+ return (
536
+ (ArrayBuffer.from != undefined)
537
+ ? ArrayBuffer.from(array)
538
+ : new Uint8Array(array).buffer
539
+ )
540
+ }
541
+
542
+ ensureArrayBuffer(arrayOrArrayBuffer) {
543
+ return (
544
+ (arrayOrArrayBuffer instanceof ArrayBuffer)
545
+ ? arrayOrArrayBuffer
546
+ : this.arrayToArrayBuffer(arrayOrArrayBuffer)
547
+ )
548
+ }
549
+
550
+ async generateKeyPair() {
551
+ const crypto = await this.getWebCrypto();
552
+ const keyPair = await crypto.subtle.generateKey(
553
+ {
554
+ name: 'ECDH',
555
+ namedCurve: 'P-256',
556
+ },
557
+ true,
558
+ ['deriveKey']
559
+ );
560
+
561
+ return keyPair
562
+ }
563
+
564
+ getKeyOperations(keyType) {
565
+ switch (keyType) {
566
+ case 'private':
567
+ case 'privateKey': {
568
+ return ['deriveKey']
569
+ }
570
+
571
+ case 'secret':
572
+ case 'secretKey':
573
+ case 'sharedSecret': {
574
+ return ['encrypt', 'decrypt']
575
+ }
576
+
577
+ default: {
578
+ return []
579
+ }
580
+ }
581
+ }
582
+
583
+ getKeyAlgorythm(keyType) {
584
+ switch (keyType) {
585
+ case 'derivedKey':
586
+ case 'derived':
587
+ case 'secret':
588
+ case 'secretKey':
589
+ case 'sharedSecret': {
590
+ return {
591
+ name: 'AES-GCM',
592
+ }
593
+ }
594
+
595
+ default: {
596
+ return {
597
+ name: 'ECDH',
598
+ namedCurve: 'P-256',
599
+ }
600
+ }
601
+ }
602
+ }
603
+
604
+ async generateHMAC(message, derivedKey) {
605
+ if (!message || !derivedKey) {
606
+ return undefined
607
+ }
608
+
609
+ const crypto = await this.getWebCrypto();
610
+ const Encoder = await this.getTextEncoder();
611
+
612
+ const signature = await crypto.subtle.sign(
613
+ 'HMAC',
614
+ derivedKey,
615
+ new Encoder().encode(message)
616
+ );
617
+
618
+ return this.stringToHex(
619
+ this.arrayBufferToString(signature)
620
+ )
621
+ }
622
+
623
+ async verifyHMAC(message, derivedKey, verifiableHMAC) {
624
+ const calculatedHMAC = await this.generateHMAC(message, derivedKey);
625
+
626
+ return this.timingSafeEqual(calculatedHMAC, verifiableHMAC)
627
+ }
628
+
629
+ async getStorableKey(key) {
630
+ const crypto = await this.getWebCrypto();
631
+
632
+ const exportedJWK = await crypto.subtle.exportKey('jwk', key);
633
+ return this.stringToHex(JSON.stringify(exportedJWK))
634
+ }
635
+
636
+ async restoreStorableKey(keyType, storableHex) {
637
+ if (!storableHex) {
638
+ return undefined
639
+ }
640
+ const crypto = await this.getWebCrypto();
641
+
642
+ const exportedJWK = JSON.parse(this.hexToString(storableHex) || '{}');
643
+ if (objectEmpty(exportedJWK)) {
644
+ return undefined
645
+ }
646
+
647
+ return crypto.subtle.importKey(
648
+ 'jwk',
649
+ exportedJWK,
650
+ this.getKeyAlgorythm(keyType),
651
+ true,
652
+ this.getKeyOperations(keyType)
653
+ )
654
+ }
655
+
656
+ async getStorableKeyPair(keyPair) {
657
+ const storableKeys = {};
658
+
659
+ // eslint-disable-next-line no-restricted-syntax
660
+ for (const [keyType, key] of Object.entries(keyPair)) {
661
+ // eslint-disable-next-line no-await-in-loop
662
+ storableKeys[keyType] = await this.getStorableKey(key);
663
+ }
664
+
665
+ return storableKeys
666
+ }
667
+
668
+ async restoreStorableKeyPair(keyPair) {
669
+ const restoredKeys = {};
670
+
671
+ // eslint-disable-next-line no-restricted-syntax
672
+ for (const [keyType, key] of Object.entries(keyPair)) {
673
+ // eslint-disable-next-line no-await-in-loop
674
+ restoredKeys[keyType] = await this.restoreStorableKey(keyType, key);
675
+ }
676
+
677
+ return restoredKeys
678
+ }
679
+
680
+ async deriveSharedKey({ publicKey, privateKey }) {
681
+ if (!publicKey || !privateKey) {
682
+ return undefined
683
+ }
684
+
685
+ const crypto = await this.getWebCrypto();
686
+ const derivedKey = await crypto.subtle.deriveKey(
687
+ {
688
+ name: 'ECDH',
689
+ public: publicKey,
690
+ },
691
+ privateKey,
692
+ {
693
+ name: 'AES-GCM',
694
+ length: 256,
695
+ },
696
+ true,
697
+ ['encrypt', 'decrypt']
698
+ );
699
+ return derivedKey
700
+ }
701
+
702
+ async deriveHMACKey({ publicKey, privateKey }) {
703
+ if (!publicKey || !privateKey) {
704
+ return undefined
705
+ }
706
+
707
+ const crypto = await this.getWebCrypto();
708
+ const derivedKey = await crypto.subtle.deriveKey(
709
+ {
710
+ name: 'ECDH',
711
+ public: publicKey,
712
+ },
713
+ privateKey,
714
+ {
715
+ name: 'HMAC',
716
+ hash: { name: 'SHA-256' },
717
+ length: 256, // Adjusted key length, e.g., 128 bits
718
+ },
719
+ true,
720
+ ['sign', 'verify']
721
+ );
722
+ return derivedKey
723
+ }
724
+
725
+ async getVerificationKeys({ publicKey, privateKey }) {
726
+ if (!publicKey || !privateKey) {
727
+ return {}
728
+ }
729
+
730
+ const sharedKeyPair = await this.restoreStorableKeyPair({ publicKey, privateKey });
731
+ const derivedHMACKey = await this.deriveHMACKey(sharedKeyPair);
732
+ const derivedSecretKey = await this.deriveSharedKey(sharedKeyPair);
733
+
734
+ return {
735
+ derivedSecretKey,
736
+ derivedHMACKey,
737
+ }
738
+ }
739
+
740
+ async encryptMessage(decryptedMessage, derivedKey) {
741
+ if (!decryptedMessage || !derivedKey) {
742
+ return undefined
743
+ }
744
+
745
+ const crypto = await this.getWebCrypto();
746
+ const iv = crypto.getRandomValues(new Uint8Array(12));
747
+ const Encoder = await this.getTextEncoder();
748
+ const encodedMessage = new Encoder().encode(decryptedMessage);
749
+ const ciphertext = await crypto.subtle.encrypt(
750
+ {
751
+ name: 'AES-GCM',
752
+ iv,
753
+ },
754
+ derivedKey,
755
+ encodedMessage
756
+ );
757
+
758
+ const encryptedMessage = new Uint8Array([
759
+ ...iv,
760
+ ...new Uint8Array(ciphertext)
761
+ ]);
762
+ return Array.from(encryptedMessage)
763
+ }
764
+
765
+ async decryptMessage(encryptedMessage, derivedKey) {
766
+ if (!encryptedMessage || !derivedKey) {
767
+ return undefined
768
+ }
769
+
770
+ const crypto = await this.getWebCrypto();
771
+ // NOTE: this presumed an array or arrayBuffer coming in as encryptedMessage (will fail w/ IV error if its a string)
772
+ const encryptedArrayBuffer = this.ensureArrayBuffer(encryptedMessage);
773
+ const iv = encryptedArrayBuffer.slice(0, 12);
774
+ const ciphertext = encryptedArrayBuffer.slice(12);
775
+
776
+ const decryptedArrayBuffer = await crypto.subtle.decrypt(
777
+ {
778
+ name: 'AES-GCM',
779
+ iv,
780
+ },
781
+ derivedKey,
782
+ ciphertext
783
+ );
784
+
785
+ const Decoder = await this.getTextDecoder();
786
+ const decryptedMessage = new Decoder().decode(decryptedArrayBuffer);
787
+ return decryptedMessage
788
+ }
789
+ }
790
+
791
+ const getVerificationHelpers = ({ keyPairs, crypto: _crypto, util: _util } = {}) => {
792
+ const webCrypto = new WebCrypto({ crypto: _crypto, util: _util });
793
+
794
+ return async (req, params) => {
795
+ const {
796
+ 'x-public-key': apiKey,
797
+ 'x-ephemeral-key': ephemeralPublicKey,
798
+ 'x-authorization-timestamp': customAuthTimestamp,
799
+ 'x-authorization': customAuth,
800
+ } = req.headers ?? {};
801
+
802
+ const { uri: _uri, disableRecryption: _disableRecryption } = params ?? {};
803
+ const uri = _uri ?? req.url;
804
+ const disableRecryption = isTrue(_disableRecryption);
805
+
806
+ let isVerifiable;
807
+ try {
808
+ const [authProtocol, authSignature] = ensureString(customAuth).split(' ');
809
+ isVerifiable = isTrue(
810
+ apiKey &&
811
+ ephemeralPublicKey &&
812
+ keyPairs?.shared &&
813
+ customAuthTimestamp &&
814
+ authSignature &&
815
+ (authProtocol === 'HMAC-SHA256')
816
+ );
817
+
818
+ let verificationKeys;
819
+ const rawBody = await ensureRawBody(req);
820
+
821
+ // NOTE: requestBody should be wind up decrypted when isVerifiable (unless disableRecryption, then will pass through)
822
+ let requestBody = safeParse(rawBody);
823
+
824
+ // TEMP!!! remove isVerifiable check once webwidget moved to react
825
+ if (isVerifiable) {
826
+ if (
827
+ !apiKey ||
828
+ !ephemeralPublicKey ||
829
+ !customAuthTimestamp ||
830
+ !authSignature ||
831
+ !keyPairs?.shared ||
832
+ (apiKey !== keyPairs.shared.publicKey) ||
833
+ (authProtocol !== 'HMAC-SHA256')
834
+ ) {
835
+ throw new VerificationError('Invalid or missing authorization', { code: 401 })
836
+ }
837
+
838
+ verificationKeys = await webCrypto.getVerificationKeys({
839
+ publicKey: ephemeralPublicKey,
840
+ privateKey: keyPairs.shared.privateKey,
841
+ });
842
+
843
+ if (!verificationKeys) {
844
+ throw new VerificationError('Invalid or missing verification', { code: 412 })
845
+ }
846
+
847
+ const verificationPayload = objectToSortedString({
848
+ method: getRequestMethod(rawBody, req.method),
849
+ timestamp: customAuthTimestamp,
850
+ body: requestBody, // NOTE: requestBody should be encrypted when isVerifiable
851
+ ...normalizeURIParts(uri),
852
+ });
853
+
854
+ const isValid = await webCrypto.verifyHMAC(
855
+ verificationPayload,
856
+ verificationKeys.derivedHMACKey,
857
+ authSignature
858
+ );
859
+
860
+ if (!isValid) {
861
+ throw new VerificationError('Invalid or missing verification', { code: 412 })
862
+ }
863
+
864
+ if (!disableRecryption && requestBody) {
865
+ const decryptedMessage = await webCrypto.decryptMessage(requestBody, verificationKeys.derivedSecretKey);
866
+ requestBody = safeParse(decryptedMessage);
867
+ }
868
+ }
869
+
870
+ const processResponse = async (response) => {
871
+ if (!response || disableRecryption || !isVerifiable || !verificationKeys?.derivedSecretKey) {
872
+ return response
873
+ }
874
+
875
+ return webCrypto.encryptMessage(JSON.stringify(response), verificationKeys.derivedSecretKey)
876
+ };
877
+
878
+ return { rawBody, requestBody, processResponse }
879
+ } catch (error) {
880
+ console.error(`Error handling request verification for '${uri}'`, { error, isVerifiable, disableRecryption });
881
+ throw error
882
+ }
883
+ }
884
+ };
885
+
886
+ exports.API_ROUTE_NAMES = API_ROUTE_NAMES;
887
+ exports.API_WEBHOOK_TOPICS = API_WEBHOOK_TOPICS;
888
+ exports.AUTH_TYPES = AUTH_TYPES;
889
+ exports.BILLING_EVENT_TYPES = BILLING_EVENT_TYPES;
890
+ exports.BILLING_INTERVALS = BILLING_INTERVALS;
891
+ exports.COLLECTION_ROOT = COLLECTION_ROOT;
892
+ exports.PAGE_ROUTE_NAMES = PAGE_ROUTE_NAMES;
893
+ exports.VerificationError = VerificationError;
894
+ exports.convertEventTopic = convertEventTopic;
895
+ exports.ensureRawBody = ensureRawBody;
896
+ exports.getVerificationHelpers = getVerificationHelpers;
897
+
898
+ Object.defineProperty(exports, '__esModule', { value: true });
899
+
900
+ }));
901
+ //# sourceMappingURL=verification.js.map