@metamask/snaps-sdk 2.1.0 → 3.0.1

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 (263) hide show
  1. package/CHANGELOG.md +13 -2
  2. package/dist/index.js +805 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/index.mjs +810 -0
  5. package/dist/index.mjs.map +1 -0
  6. package/dist/tsconfig.build.tsbuildinfo +1 -0
  7. package/package.json +17 -14
  8. package/dist/cjs/error-wrappers.js +0 -80
  9. package/dist/cjs/error-wrappers.js.map +0 -1
  10. package/dist/cjs/errors.js +0 -162
  11. package/dist/cjs/errors.js.map +0 -1
  12. package/dist/cjs/images.js +0 -54
  13. package/dist/cjs/images.js.map +0 -1
  14. package/dist/cjs/index.js +0 -68
  15. package/dist/cjs/index.js.map +0 -1
  16. package/dist/cjs/internals/error-wrappers.js +0 -39
  17. package/dist/cjs/internals/error-wrappers.js.map +0 -1
  18. package/dist/cjs/internals/errors.js +0 -59
  19. package/dist/cjs/internals/errors.js.map +0 -1
  20. package/dist/cjs/internals/helpers.js +0 -6
  21. package/dist/cjs/internals/helpers.js.map +0 -1
  22. package/dist/cjs/internals/index.js +0 -24
  23. package/dist/cjs/internals/index.js.map +0 -1
  24. package/dist/cjs/internals/structs.js +0 -43
  25. package/dist/cjs/internals/structs.js.map +0 -1
  26. package/dist/cjs/internals/svg.js +0 -49
  27. package/dist/cjs/internals/svg.js.map +0 -1
  28. package/dist/cjs/types/caip.js +0 -10
  29. package/dist/cjs/types/caip.js.map +0 -1
  30. package/dist/cjs/types/global.js +0 -6
  31. package/dist/cjs/types/global.js.map +0 -1
  32. package/dist/cjs/types/handlers/cronjob.js +0 -6
  33. package/dist/cjs/types/handlers/cronjob.js.map +0 -1
  34. package/dist/cjs/types/handlers/home-page.js +0 -6
  35. package/dist/cjs/types/handlers/home-page.js.map +0 -1
  36. package/dist/cjs/types/handlers/index.js +0 -28
  37. package/dist/cjs/types/handlers/index.js.map +0 -1
  38. package/dist/cjs/types/handlers/keyring.js +0 -6
  39. package/dist/cjs/types/handlers/keyring.js.map +0 -1
  40. package/dist/cjs/types/handlers/lifecycle.js +0 -6
  41. package/dist/cjs/types/handlers/lifecycle.js.map +0 -1
  42. package/dist/cjs/types/handlers/name-lookup.js +0 -6
  43. package/dist/cjs/types/handlers/name-lookup.js.map +0 -1
  44. package/dist/cjs/types/handlers/rpc-request.js +0 -6
  45. package/dist/cjs/types/handlers/rpc-request.js.map +0 -1
  46. package/dist/cjs/types/handlers/signature.js +0 -6
  47. package/dist/cjs/types/handlers/signature.js.map +0 -1
  48. package/dist/cjs/types/handlers/transaction.js +0 -16
  49. package/dist/cjs/types/handlers/transaction.js.map +0 -1
  50. package/dist/cjs/types/handlers/user-input.js +0 -51
  51. package/dist/cjs/types/handlers/user-input.js.map +0 -1
  52. package/dist/cjs/types/index.js +0 -29
  53. package/dist/cjs/types/index.js.map +0 -1
  54. package/dist/cjs/types/interface.js +0 -26
  55. package/dist/cjs/types/interface.js.map +0 -1
  56. package/dist/cjs/types/methods/create-interface.js +0 -6
  57. package/dist/cjs/types/methods/create-interface.js.map +0 -1
  58. package/dist/cjs/types/methods/dialog.js +0 -18
  59. package/dist/cjs/types/methods/dialog.js.map +0 -1
  60. package/dist/cjs/types/methods/get-bip32-entropy.js +0 -6
  61. package/dist/cjs/types/methods/get-bip32-entropy.js.map +0 -1
  62. package/dist/cjs/types/methods/get-bip32-public-key.js +0 -6
  63. package/dist/cjs/types/methods/get-bip32-public-key.js.map +0 -1
  64. package/dist/cjs/types/methods/get-bip44-entropy.js +0 -6
  65. package/dist/cjs/types/methods/get-bip44-entropy.js.map +0 -1
  66. package/dist/cjs/types/methods/get-client-status.js +0 -10
  67. package/dist/cjs/types/methods/get-client-status.js.map +0 -1
  68. package/dist/cjs/types/methods/get-entropy.js +0 -6
  69. package/dist/cjs/types/methods/get-entropy.js.map +0 -1
  70. package/dist/cjs/types/methods/get-file.js +0 -18
  71. package/dist/cjs/types/methods/get-file.js.map +0 -1
  72. package/dist/cjs/types/methods/get-interface-state.js +0 -6
  73. package/dist/cjs/types/methods/get-interface-state.js.map +0 -1
  74. package/dist/cjs/types/methods/get-locale.js +0 -10
  75. package/dist/cjs/types/methods/get-locale.js.map +0 -1
  76. package/dist/cjs/types/methods/get-snaps.js +0 -6
  77. package/dist/cjs/types/methods/get-snaps.js.map +0 -1
  78. package/dist/cjs/types/methods/index.js +0 -38
  79. package/dist/cjs/types/methods/index.js.map +0 -1
  80. package/dist/cjs/types/methods/invoke-keyring.js +0 -6
  81. package/dist/cjs/types/methods/invoke-keyring.js.map +0 -1
  82. package/dist/cjs/types/methods/invoke-snap.js +0 -6
  83. package/dist/cjs/types/methods/invoke-snap.js.map +0 -1
  84. package/dist/cjs/types/methods/manage-accounts.js +0 -6
  85. package/dist/cjs/types/methods/manage-accounts.js.map +0 -1
  86. package/dist/cjs/types/methods/manage-state.js +0 -18
  87. package/dist/cjs/types/methods/manage-state.js.map +0 -1
  88. package/dist/cjs/types/methods/methods.js +0 -6
  89. package/dist/cjs/types/methods/methods.js.map +0 -1
  90. package/dist/cjs/types/methods/notify.js +0 -17
  91. package/dist/cjs/types/methods/notify.js.map +0 -1
  92. package/dist/cjs/types/methods/request-snaps.js +0 -6
  93. package/dist/cjs/types/methods/request-snaps.js.map +0 -1
  94. package/dist/cjs/types/methods/update-interface.js +0 -6
  95. package/dist/cjs/types/methods/update-interface.js.map +0 -1
  96. package/dist/cjs/types/permissions.js +0 -6
  97. package/dist/cjs/types/permissions.js.map +0 -1
  98. package/dist/cjs/types/provider.js +0 -6
  99. package/dist/cjs/types/provider.js.map +0 -1
  100. package/dist/cjs/types/snap.js +0 -6
  101. package/dist/cjs/types/snap.js.map +0 -1
  102. package/dist/cjs/ui/builder.js +0 -44
  103. package/dist/cjs/ui/builder.js.map +0 -1
  104. package/dist/cjs/ui/component.js +0 -29
  105. package/dist/cjs/ui/component.js.map +0 -1
  106. package/dist/cjs/ui/components/address.js +0 -30
  107. package/dist/cjs/ui/components/address.js.map +0 -1
  108. package/dist/cjs/ui/components/button.js +0 -59
  109. package/dist/cjs/ui/components/button.js.map +0 -1
  110. package/dist/cjs/ui/components/copyable.js +0 -32
  111. package/dist/cjs/ui/components/copyable.js.map +0 -1
  112. package/dist/cjs/ui/components/divider.js +0 -27
  113. package/dist/cjs/ui/components/divider.js.map +0 -1
  114. package/dist/cjs/ui/components/form.js +0 -41
  115. package/dist/cjs/ui/components/form.js.map +0 -1
  116. package/dist/cjs/ui/components/heading.js +0 -30
  117. package/dist/cjs/ui/components/heading.js.map +0 -1
  118. package/dist/cjs/ui/components/image.js +0 -42
  119. package/dist/cjs/ui/components/image.js.map +0 -1
  120. package/dist/cjs/ui/components/index.js +0 -54
  121. package/dist/cjs/ui/components/index.js.map +0 -1
  122. package/dist/cjs/ui/components/input.js +0 -52
  123. package/dist/cjs/ui/components/input.js.map +0 -1
  124. package/dist/cjs/ui/components/panel.js +0 -65
  125. package/dist/cjs/ui/components/panel.js.map +0 -1
  126. package/dist/cjs/ui/components/row.js +0 -57
  127. package/dist/cjs/ui/components/row.js.map +0 -1
  128. package/dist/cjs/ui/components/spinner.js +0 -27
  129. package/dist/cjs/ui/components/spinner.js.map +0 -1
  130. package/dist/cjs/ui/components/text.js +0 -32
  131. package/dist/cjs/ui/components/text.js.map +0 -1
  132. package/dist/cjs/ui/index.js +0 -28
  133. package/dist/cjs/ui/index.js.map +0 -1
  134. package/dist/cjs/ui/nodes.js +0 -46
  135. package/dist/cjs/ui/nodes.js.map +0 -1
  136. package/dist/esm/error-wrappers.js +0 -128
  137. package/dist/esm/error-wrappers.js.map +0 -1
  138. package/dist/esm/errors.js +0 -155
  139. package/dist/esm/errors.js.map +0 -1
  140. package/dist/esm/images.js +0 -84
  141. package/dist/esm/images.js.map +0 -1
  142. package/dist/esm/index.js +0 -10
  143. package/dist/esm/index.js.map +0 -1
  144. package/dist/esm/internals/error-wrappers.js +0 -39
  145. package/dist/esm/internals/error-wrappers.js.map +0 -1
  146. package/dist/esm/internals/errors.js +0 -58
  147. package/dist/esm/internals/errors.js.map +0 -1
  148. package/dist/esm/internals/helpers.js +0 -3
  149. package/dist/esm/internals/helpers.js.map +0 -1
  150. package/dist/esm/internals/index.js +0 -7
  151. package/dist/esm/internals/index.js.map +0 -1
  152. package/dist/esm/internals/structs.js +0 -59
  153. package/dist/esm/internals/structs.js.map +0 -1
  154. package/dist/esm/internals/svg.js +0 -41
  155. package/dist/esm/internals/svg.js.map +0 -1
  156. package/dist/esm/types/caip.js +0 -7
  157. package/dist/esm/types/caip.js.map +0 -1
  158. package/dist/esm/types/global.js +0 -3
  159. package/dist/esm/types/global.js.map +0 -1
  160. package/dist/esm/types/handlers/cronjob.js +0 -3
  161. package/dist/esm/types/handlers/cronjob.js.map +0 -1
  162. package/dist/esm/types/handlers/home-page.js +0 -3
  163. package/dist/esm/types/handlers/home-page.js.map +0 -1
  164. package/dist/esm/types/handlers/index.js +0 -11
  165. package/dist/esm/types/handlers/index.js.map +0 -1
  166. package/dist/esm/types/handlers/keyring.js +0 -3
  167. package/dist/esm/types/handlers/keyring.js.map +0 -1
  168. package/dist/esm/types/handlers/lifecycle.js +0 -3
  169. package/dist/esm/types/handlers/lifecycle.js.map +0 -1
  170. package/dist/esm/types/handlers/name-lookup.js +0 -3
  171. package/dist/esm/types/handlers/name-lookup.js.map +0 -1
  172. package/dist/esm/types/handlers/rpc-request.js +0 -3
  173. package/dist/esm/types/handlers/rpc-request.js.map +0 -1
  174. package/dist/esm/types/handlers/signature.js +0 -3
  175. package/dist/esm/types/handlers/signature.js.map +0 -1
  176. package/dist/esm/types/handlers/transaction.js +0 -6
  177. package/dist/esm/types/handlers/transaction.js.map +0 -1
  178. package/dist/esm/types/handlers/user-input.js +0 -24
  179. package/dist/esm/types/handlers/user-input.js.map +0 -1
  180. package/dist/esm/types/index.js +0 -12
  181. package/dist/esm/types/index.js.map +0 -1
  182. package/dist/esm/types/interface.js +0 -12
  183. package/dist/esm/types/interface.js.map +0 -1
  184. package/dist/esm/types/methods/create-interface.js +0 -3
  185. package/dist/esm/types/methods/create-interface.js.map +0 -1
  186. package/dist/esm/types/methods/dialog.js +0 -8
  187. package/dist/esm/types/methods/dialog.js.map +0 -1
  188. package/dist/esm/types/methods/get-bip32-entropy.js +0 -3
  189. package/dist/esm/types/methods/get-bip32-entropy.js.map +0 -1
  190. package/dist/esm/types/methods/get-bip32-public-key.js +0 -3
  191. package/dist/esm/types/methods/get-bip32-public-key.js.map +0 -1
  192. package/dist/esm/types/methods/get-bip44-entropy.js +0 -3
  193. package/dist/esm/types/methods/get-bip44-entropy.js.map +0 -1
  194. package/dist/esm/types/methods/get-client-status.js +0 -7
  195. package/dist/esm/types/methods/get-client-status.js.map +0 -1
  196. package/dist/esm/types/methods/get-entropy.js +0 -3
  197. package/dist/esm/types/methods/get-entropy.js.map +0 -1
  198. package/dist/esm/types/methods/get-file.js +0 -8
  199. package/dist/esm/types/methods/get-file.js.map +0 -1
  200. package/dist/esm/types/methods/get-interface-state.js +0 -3
  201. package/dist/esm/types/methods/get-interface-state.js.map +0 -1
  202. package/dist/esm/types/methods/get-locale.js +0 -7
  203. package/dist/esm/types/methods/get-locale.js.map +0 -1
  204. package/dist/esm/types/methods/get-snaps.js +0 -3
  205. package/dist/esm/types/methods/get-snaps.js.map +0 -1
  206. package/dist/esm/types/methods/index.js +0 -21
  207. package/dist/esm/types/methods/index.js.map +0 -1
  208. package/dist/esm/types/methods/invoke-keyring.js +0 -3
  209. package/dist/esm/types/methods/invoke-keyring.js.map +0 -1
  210. package/dist/esm/types/methods/invoke-snap.js +0 -3
  211. package/dist/esm/types/methods/invoke-snap.js.map +0 -1
  212. package/dist/esm/types/methods/manage-accounts.js +0 -3
  213. package/dist/esm/types/methods/manage-accounts.js.map +0 -1
  214. package/dist/esm/types/methods/manage-state.js +0 -8
  215. package/dist/esm/types/methods/manage-state.js.map +0 -1
  216. package/dist/esm/types/methods/methods.js +0 -3
  217. package/dist/esm/types/methods/methods.js.map +0 -1
  218. package/dist/esm/types/methods/notify.js +0 -7
  219. package/dist/esm/types/methods/notify.js.map +0 -1
  220. package/dist/esm/types/methods/request-snaps.js +0 -3
  221. package/dist/esm/types/methods/request-snaps.js.map +0 -1
  222. package/dist/esm/types/methods/update-interface.js +0 -3
  223. package/dist/esm/types/methods/update-interface.js.map +0 -1
  224. package/dist/esm/types/permissions.js +0 -3
  225. package/dist/esm/types/permissions.js.map +0 -1
  226. package/dist/esm/types/provider.js +0 -3
  227. package/dist/esm/types/provider.js.map +0 -1
  228. package/dist/esm/types/snap.js +0 -3
  229. package/dist/esm/types/snap.js.map +0 -1
  230. package/dist/esm/ui/builder.js +0 -50
  231. package/dist/esm/ui/builder.js.map +0 -1
  232. package/dist/esm/ui/component.js +0 -23
  233. package/dist/esm/ui/component.js.map +0 -1
  234. package/dist/esm/ui/components/address.js +0 -22
  235. package/dist/esm/ui/components/address.js.map +0 -1
  236. package/dist/esm/ui/components/button.js +0 -50
  237. package/dist/esm/ui/components/button.js.map +0 -1
  238. package/dist/esm/ui/components/copyable.js +0 -27
  239. package/dist/esm/ui/components/copyable.js.map +0 -1
  240. package/dist/esm/ui/components/divider.js +0 -15
  241. package/dist/esm/ui/components/divider.js.map +0 -1
  242. package/dist/esm/ui/components/form.js +0 -39
  243. package/dist/esm/ui/components/form.js.map +0 -1
  244. package/dist/esm/ui/components/heading.js +0 -22
  245. package/dist/esm/ui/components/heading.js.map +0 -1
  246. package/dist/esm/ui/components/image.js +0 -37
  247. package/dist/esm/ui/components/image.js.map +0 -1
  248. package/dist/esm/ui/components/index.js +0 -14
  249. package/dist/esm/ui/components/index.js.map +0 -1
  250. package/dist/esm/ui/components/input.js +0 -47
  251. package/dist/esm/ui/components/input.js.map +0 -1
  252. package/dist/esm/ui/components/panel.js +0 -66
  253. package/dist/esm/ui/components/panel.js.map +0 -1
  254. package/dist/esm/ui/components/row.js +0 -50
  255. package/dist/esm/ui/components/row.js.map +0 -1
  256. package/dist/esm/ui/components/spinner.js +0 -15
  257. package/dist/esm/ui/components/spinner.js.map +0 -1
  258. package/dist/esm/ui/components/text.js +0 -29
  259. package/dist/esm/ui/components/text.js.map +0 -1
  260. package/dist/esm/ui/index.js +0 -5
  261. package/dist/esm/ui/index.js.map +0 -1
  262. package/dist/esm/ui/nodes.js +0 -29
  263. package/dist/esm/ui/nodes.js.map +0 -1
package/dist/index.mjs ADDED
@@ -0,0 +1,810 @@
1
+ var __accessCheck = (obj, member, msg) => {
2
+ if (!member.has(obj))
3
+ throw TypeError("Cannot " + msg);
4
+ };
5
+ var __privateGet = (obj, member, getter) => {
6
+ __accessCheck(obj, member, "read from private field");
7
+ return getter ? getter.call(obj) : member.get(obj);
8
+ };
9
+ var __privateAdd = (obj, member, value) => {
10
+ if (member.has(obj))
11
+ throw TypeError("Cannot add the same private member more than once");
12
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
13
+ };
14
+ var __privateSet = (obj, member, value, setter) => {
15
+ __accessCheck(obj, member, "write to private field");
16
+ setter ? setter.call(obj, value) : member.set(obj, value);
17
+ return value;
18
+ };
19
+
20
+ // src/errors.ts
21
+ var _code, _message, _data, _stack;
22
+ var SnapError = class extends Error {
23
+ /**
24
+ * Create a new `SnapError`.
25
+ *
26
+ * @param error - The error to create the `SnapError` from. If this is a
27
+ * `string`, it will be used as the error message. If this is an `Error`, its
28
+ * `message` property will be used as the error message. If this is a
29
+ * `JsonRpcError`, its `message` property will be used as the error message
30
+ * and its `code` property will be used as the error code. Otherwise, the
31
+ * error will be converted to a string and used as the error message.
32
+ * @param data - Additional data to include in the error. This will be merged
33
+ * with the error data, if any.
34
+ */
35
+ constructor(error, data = {}) {
36
+ const message = getErrorMessage(error);
37
+ super(message);
38
+ __privateAdd(this, _code, void 0);
39
+ __privateAdd(this, _message, void 0);
40
+ __privateAdd(this, _data, void 0);
41
+ __privateAdd(this, _stack, void 0);
42
+ __privateSet(this, _message, message);
43
+ __privateSet(this, _code, getErrorCode(error));
44
+ const mergedData = { ...getErrorData(error), ...data };
45
+ if (Object.keys(mergedData).length > 0) {
46
+ __privateSet(this, _data, mergedData);
47
+ }
48
+ __privateSet(this, _stack, super.stack);
49
+ }
50
+ /**
51
+ * The error name.
52
+ *
53
+ * @returns The error name.
54
+ */
55
+ get name() {
56
+ return "SnapError";
57
+ }
58
+ /**
59
+ * The error code.
60
+ *
61
+ * @returns The error code.
62
+ */
63
+ get code() {
64
+ return __privateGet(this, _code);
65
+ }
66
+ /**
67
+ * The error message.
68
+ *
69
+ * @returns The error message.
70
+ */
71
+ // This line is covered, but Jest doesn't pick it up for some reason.
72
+ /* istanbul ignore next */
73
+ get message() {
74
+ return __privateGet(this, _message);
75
+ }
76
+ /**
77
+ * Additional data for the error.
78
+ *
79
+ * @returns Additional data for the error.
80
+ */
81
+ get data() {
82
+ return __privateGet(this, _data);
83
+ }
84
+ /**
85
+ * The error stack.
86
+ *
87
+ * @returns The error stack.
88
+ */
89
+ // This line is covered, but Jest doesn't pick it up for some reason.
90
+ /* istanbul ignore next */
91
+ get stack() {
92
+ return __privateGet(this, _stack);
93
+ }
94
+ /**
95
+ * Convert the error to a JSON object.
96
+ *
97
+ * @returns The JSON object.
98
+ */
99
+ toJSON() {
100
+ return {
101
+ code: SNAP_ERROR_CODE,
102
+ message: SNAP_ERROR_MESSAGE,
103
+ data: {
104
+ cause: {
105
+ code: this.code,
106
+ message: this.message,
107
+ stack: this.stack,
108
+ ...this.data ? { data: this.data } : {}
109
+ }
110
+ }
111
+ };
112
+ }
113
+ /**
114
+ * Serialize the error to a JSON object. This is called by
115
+ * `@metamask/rpc-errors` when serializing the error.
116
+ *
117
+ * @returns The JSON object.
118
+ */
119
+ serialize() {
120
+ return this.toJSON();
121
+ }
122
+ };
123
+ _code = new WeakMap();
124
+ _message = new WeakMap();
125
+ _data = new WeakMap();
126
+ _stack = new WeakMap();
127
+
128
+ // src/internals/error-wrappers.ts
129
+ function createSnapError(fn) {
130
+ return class SnapJsonRpcError extends SnapError {
131
+ /**
132
+ * Create a new `SnapJsonRpcError` from a message and data.
133
+ *
134
+ * @param message - The message to create the error from.
135
+ * @param data - The data to create the error from.
136
+ */
137
+ constructor(message, data) {
138
+ if (typeof message === "object") {
139
+ const error2 = fn();
140
+ super({
141
+ code: error2.code,
142
+ message: error2.message,
143
+ data: message
144
+ });
145
+ return;
146
+ }
147
+ const error = fn(message);
148
+ super({
149
+ code: error.code,
150
+ message: error.message,
151
+ data
152
+ });
153
+ }
154
+ };
155
+ }
156
+
157
+ // src/internals/errors.ts
158
+ import { hasProperty, isObject, isValidJson } from "@metamask/utils";
159
+ var SNAP_ERROR_CODE = -31002;
160
+ var SNAP_ERROR_MESSAGE = "Snap Error";
161
+ function getErrorMessage(error) {
162
+ if (isObject(error) && hasProperty(error, "message") && typeof error.message === "string") {
163
+ return error.message;
164
+ }
165
+ return String(error);
166
+ }
167
+ function getErrorStack(error) {
168
+ if (isObject(error) && hasProperty(error, "stack") && typeof error.stack === "string") {
169
+ return error.stack;
170
+ }
171
+ return void 0;
172
+ }
173
+ function getErrorCode(error) {
174
+ if (isObject(error) && hasProperty(error, "code") && typeof error.code === "number" && Number.isInteger(error.code)) {
175
+ return error.code;
176
+ }
177
+ return -32603;
178
+ }
179
+ function getErrorData(error) {
180
+ if (isObject(error) && hasProperty(error, "data") && typeof error.data === "object" && error.data !== null && isValidJson(error.data) && !Array.isArray(error.data)) {
181
+ return error.data;
182
+ }
183
+ return {};
184
+ }
185
+
186
+ // src/internals/structs.ts
187
+ import {
188
+ Struct,
189
+ define,
190
+ literal as superstructLiteral,
191
+ union as superstructUnion
192
+ } from "superstruct";
193
+ function literal(value) {
194
+ return define(
195
+ JSON.stringify(value),
196
+ superstructLiteral(value).validator
197
+ );
198
+ }
199
+ function union([
200
+ head,
201
+ ...tail
202
+ ]) {
203
+ const struct = superstructUnion([head, ...tail]);
204
+ return new Struct({
205
+ ...struct,
206
+ schema: [head, ...tail]
207
+ });
208
+ }
209
+ function enumValue(constant) {
210
+ return literal(constant);
211
+ }
212
+
213
+ // src/internals/svg.ts
214
+ import { assert, hasProperty as hasProperty2, isObject as isObject2 } from "@metamask/utils";
215
+ import { XMLParser } from "fast-xml-parser";
216
+ function parseSvg(svg2) {
217
+ try {
218
+ const trimmed = svg2.trim();
219
+ assert(trimmed.length > 0);
220
+ const parser = new XMLParser({
221
+ ignoreAttributes: false,
222
+ parseAttributeValue: true
223
+ });
224
+ const parsed = parser.parse(trimmed, true);
225
+ assert(hasProperty2(parsed, "svg"));
226
+ if (!isObject2(parsed.svg)) {
227
+ return {};
228
+ }
229
+ return parsed.svg;
230
+ } catch {
231
+ throw new Error("Snap icon must be a valid SVG.");
232
+ }
233
+ }
234
+ function isSvg(svg2) {
235
+ try {
236
+ parseSvg(svg2);
237
+ return true;
238
+ } catch {
239
+ return false;
240
+ }
241
+ }
242
+
243
+ // src/index.ts
244
+ import { assert as assert3 } from "@metamask/utils";
245
+
246
+ // src/error-wrappers.ts
247
+ import { providerErrors, rpcErrors } from "@metamask/rpc-errors";
248
+ var InternalError = createSnapError(rpcErrors.internal);
249
+ var InvalidInputError = createSnapError(rpcErrors.invalidInput);
250
+ var InvalidParamsError = createSnapError(rpcErrors.invalidParams);
251
+ var InvalidRequestError = createSnapError(rpcErrors.invalidRequest);
252
+ var LimitExceededError = createSnapError(rpcErrors.limitExceeded);
253
+ var MethodNotFoundError = createSnapError(rpcErrors.methodNotFound);
254
+ var MethodNotSupportedError = createSnapError(
255
+ rpcErrors.methodNotSupported
256
+ );
257
+ var ParseError = createSnapError(rpcErrors.parse);
258
+ var ResourceNotFoundError = createSnapError(
259
+ rpcErrors.resourceNotFound
260
+ );
261
+ var ResourceUnavailableError = createSnapError(
262
+ rpcErrors.resourceUnavailable
263
+ );
264
+ var TransactionRejected = createSnapError(
265
+ rpcErrors.transactionRejected
266
+ );
267
+ var ChainDisconnectedError = createSnapError(
268
+ providerErrors.chainDisconnected
269
+ );
270
+ var DisconnectedError = createSnapError(providerErrors.disconnected);
271
+ var UnauthorizedError = createSnapError(providerErrors.unauthorized);
272
+ var UnsupportedMethodError = createSnapError(
273
+ providerErrors.unsupportedMethod
274
+ );
275
+ var UserRejectedRequestError = createSnapError(
276
+ providerErrors.userRejectedRequest
277
+ );
278
+
279
+ // src/images.ts
280
+ import { assert as assert2, bytesToBase64 } from "@metamask/utils";
281
+
282
+ // src/ui/components/address.ts
283
+ import { assign as assign2, literal as literal2, object as object2, pattern, string as string2 } from "superstruct";
284
+
285
+ // src/ui/builder.ts
286
+ import { assertStruct, isPlainObject } from "@metamask/utils";
287
+ function createBuilder(type, struct, keys = []) {
288
+ return (...args) => {
289
+ if (args.length === 1 && isPlainObject(args[0])) {
290
+ const node2 = { ...args[0], type };
291
+ assertStruct(node2, struct, `Invalid ${type} component`);
292
+ return node2;
293
+ }
294
+ const node = keys.reduce(
295
+ (partialNode, key, index) => {
296
+ if (args[index] !== void 0) {
297
+ return {
298
+ ...partialNode,
299
+ [key]: args[index]
300
+ };
301
+ }
302
+ return partialNode;
303
+ },
304
+ { type }
305
+ );
306
+ assertStruct(node, struct, `Invalid ${type} component`);
307
+ return node;
308
+ };
309
+ }
310
+
311
+ // src/ui/nodes.ts
312
+ import { assign, object, string, unknown } from "superstruct";
313
+ var NodeType = /* @__PURE__ */ ((NodeType2) => {
314
+ NodeType2["Copyable"] = "copyable";
315
+ NodeType2["Divider"] = "divider";
316
+ NodeType2["Heading"] = "heading";
317
+ NodeType2["Panel"] = "panel";
318
+ NodeType2["Spinner"] = "spinner";
319
+ NodeType2["Text"] = "text";
320
+ NodeType2["Image"] = "image";
321
+ NodeType2["Row"] = "row";
322
+ NodeType2["Address"] = "address";
323
+ NodeType2["Button"] = "button";
324
+ NodeType2["Input"] = "input";
325
+ NodeType2["Form"] = "form";
326
+ return NodeType2;
327
+ })(NodeType || {});
328
+ var NodeStruct = object({
329
+ type: string()
330
+ });
331
+ var LiteralStruct = assign(
332
+ NodeStruct,
333
+ object({
334
+ value: unknown()
335
+ })
336
+ );
337
+
338
+ // src/ui/components/address.ts
339
+ var AddressStruct = assign2(
340
+ LiteralStruct,
341
+ object2({
342
+ type: literal2("address" /* Address */),
343
+ value: pattern(string2(), /0x[a-fA-F0-9]{40}/u)
344
+ })
345
+ );
346
+ var address = createBuilder("address" /* Address */, AddressStruct, [
347
+ "value"
348
+ ]);
349
+
350
+ // src/ui/components/copyable.ts
351
+ import {
352
+ assign as assign3,
353
+ boolean,
354
+ literal as literal3,
355
+ object as object3,
356
+ optional,
357
+ string as string3
358
+ } from "superstruct";
359
+ var CopyableStruct = assign3(
360
+ LiteralStruct,
361
+ object3({
362
+ type: literal3("copyable" /* Copyable */),
363
+ value: string3(),
364
+ sensitive: optional(boolean())
365
+ })
366
+ );
367
+ var copyable = createBuilder("copyable" /* Copyable */, CopyableStruct, [
368
+ "value",
369
+ "sensitive"
370
+ ]);
371
+
372
+ // src/ui/components/divider.ts
373
+ import { assign as assign4, literal as literal4, object as object4 } from "superstruct";
374
+ var DividerStruct = assign4(
375
+ NodeStruct,
376
+ object4({
377
+ type: literal4("divider" /* Divider */)
378
+ })
379
+ );
380
+ var divider = createBuilder("divider" /* Divider */, DividerStruct);
381
+
382
+ // src/ui/components/heading.ts
383
+ import { assign as assign5, literal as literal5, object as object5, string as string4 } from "superstruct";
384
+ var HeadingStruct = assign5(
385
+ LiteralStruct,
386
+ object5({
387
+ type: literal5("heading" /* Heading */),
388
+ value: string4()
389
+ })
390
+ );
391
+ var heading = createBuilder("heading" /* Heading */, HeadingStruct, [
392
+ "value"
393
+ ]);
394
+
395
+ // src/ui/components/image.ts
396
+ import { assign as assign6, literal as literal6, object as object6, refine, string as string5 } from "superstruct";
397
+ function svg() {
398
+ return refine(string5(), "SVG", (value) => {
399
+ if (!isSvg(value)) {
400
+ return "Value is not a valid SVG.";
401
+ }
402
+ return true;
403
+ });
404
+ }
405
+ var ImageStruct = assign6(
406
+ NodeStruct,
407
+ object6({
408
+ type: literal6("image" /* Image */),
409
+ value: svg()
410
+ })
411
+ );
412
+ var image = createBuilder("image" /* Image */, ImageStruct, ["value"]);
413
+
414
+ // src/ui/components/panel.ts
415
+ import { array as array2, assign as assign13, lazy, literal as literal13, object as object13, union as union6 } from "superstruct";
416
+
417
+ // src/ui/components/button.ts
418
+ import { assign as assign7, literal as literal7, object as object7, optional as optional2, string as string6, union as union2 } from "superstruct";
419
+ var ButtonVariant = /* @__PURE__ */ ((ButtonVariant2) => {
420
+ ButtonVariant2["Primary"] = "primary";
421
+ ButtonVariant2["Secondary"] = "secondary";
422
+ return ButtonVariant2;
423
+ })(ButtonVariant || {});
424
+ var ButtonType = /* @__PURE__ */ ((ButtonType2) => {
425
+ ButtonType2["Button"] = "button";
426
+ ButtonType2["Submit"] = "submit";
427
+ return ButtonType2;
428
+ })(ButtonType || {});
429
+ var ButtonStruct = assign7(
430
+ LiteralStruct,
431
+ object7({
432
+ type: literal7("button" /* Button */),
433
+ value: string6(),
434
+ variant: optional2(
435
+ union2([
436
+ enumValue("primary" /* Primary */),
437
+ enumValue("secondary" /* Secondary */)
438
+ ])
439
+ ),
440
+ buttonType: optional2(
441
+ union2([enumValue("button" /* Button */), enumValue("submit" /* Submit */)])
442
+ ),
443
+ name: optional2(string6())
444
+ })
445
+ );
446
+ var button = createBuilder("button" /* Button */, ButtonStruct, [
447
+ "value",
448
+ "buttonType",
449
+ "name",
450
+ "variant"
451
+ ]);
452
+
453
+ // src/ui/components/form.ts
454
+ import { array, assign as assign9, literal as literal9, object as object9, string as string8, union as union4 } from "superstruct";
455
+
456
+ // src/ui/components/input.ts
457
+ import { assign as assign8, literal as literal8, object as object8, optional as optional3, string as string7, union as union3 } from "superstruct";
458
+ var InputType = /* @__PURE__ */ ((InputType2) => {
459
+ InputType2["Text"] = "text";
460
+ InputType2["Number"] = "number";
461
+ InputType2["Password"] = "password";
462
+ return InputType2;
463
+ })(InputType || {});
464
+ var InputStruct = assign8(
465
+ LiteralStruct,
466
+ object8({
467
+ type: literal8("input" /* Input */),
468
+ value: optional3(string7()),
469
+ name: string7(),
470
+ inputType: optional3(
471
+ union3([
472
+ enumValue("text" /* Text */),
473
+ enumValue("password" /* Password */),
474
+ enumValue("number" /* Number */)
475
+ ])
476
+ ),
477
+ placeholder: optional3(string7()),
478
+ label: optional3(string7())
479
+ })
480
+ );
481
+ var input = createBuilder("input" /* Input */, InputStruct, [
482
+ "name",
483
+ "inputType",
484
+ "placeholder",
485
+ "value",
486
+ "label"
487
+ ]);
488
+
489
+ // src/ui/components/form.ts
490
+ var FormComponentStruct = union4([InputStruct, ButtonStruct]);
491
+ var FormStruct = assign9(
492
+ NodeStruct,
493
+ object9({
494
+ type: literal9("form" /* Form */),
495
+ children: array(FormComponentStruct),
496
+ name: string8()
497
+ })
498
+ );
499
+ var form = createBuilder("form" /* Form */, FormStruct, [
500
+ "name",
501
+ "children"
502
+ ]);
503
+
504
+ // src/ui/components/row.ts
505
+ import { assign as assign11, literal as literal11, object as object11, string as string10, optional as optional5, union as union5 } from "superstruct";
506
+
507
+ // src/ui/components/text.ts
508
+ import {
509
+ assign as assign10,
510
+ boolean as boolean2,
511
+ literal as literal10,
512
+ object as object10,
513
+ optional as optional4,
514
+ string as string9
515
+ } from "superstruct";
516
+ var TextStruct = assign10(
517
+ LiteralStruct,
518
+ object10({
519
+ type: literal10("text" /* Text */),
520
+ value: string9(),
521
+ markdown: optional4(boolean2())
522
+ })
523
+ );
524
+ var text = createBuilder("text" /* Text */, TextStruct, [
525
+ "value",
526
+ "markdown"
527
+ ]);
528
+
529
+ // src/ui/components/row.ts
530
+ var RowVariant = /* @__PURE__ */ ((RowVariant2) => {
531
+ RowVariant2["Default"] = "default";
532
+ RowVariant2["Critical"] = "critical";
533
+ RowVariant2["Warning"] = "warning";
534
+ return RowVariant2;
535
+ })(RowVariant || {});
536
+ var RowComponentStruct = union5([ImageStruct, TextStruct, AddressStruct]);
537
+ var RowStruct = assign11(
538
+ LiteralStruct,
539
+ object11({
540
+ type: literal11("row" /* Row */),
541
+ variant: optional5(
542
+ union5([
543
+ enumValue("default" /* Default */),
544
+ enumValue("critical" /* Critical */),
545
+ enumValue("warning" /* Warning */)
546
+ ])
547
+ ),
548
+ label: string10(),
549
+ value: RowComponentStruct
550
+ })
551
+ );
552
+ var row = createBuilder("row" /* Row */, RowStruct, [
553
+ "label",
554
+ "value",
555
+ "variant"
556
+ ]);
557
+
558
+ // src/ui/components/spinner.ts
559
+ import { assign as assign12, literal as literal12, object as object12 } from "superstruct";
560
+ var SpinnerStruct = assign12(
561
+ NodeStruct,
562
+ object12({
563
+ type: literal12("spinner" /* Spinner */)
564
+ })
565
+ );
566
+ var spinner = createBuilder("spinner" /* Spinner */, SpinnerStruct);
567
+
568
+ // src/ui/components/panel.ts
569
+ var ParentStruct = assign13(
570
+ NodeStruct,
571
+ object13({
572
+ // This node references itself indirectly, so we need to use `lazy()`.
573
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
574
+ children: array2(lazy(() => ComponentStruct))
575
+ })
576
+ );
577
+ var PanelStruct = assign13(
578
+ ParentStruct,
579
+ object13({
580
+ type: literal13("panel" /* Panel */)
581
+ })
582
+ );
583
+ var panel = createBuilder("panel" /* Panel */, PanelStruct, ["children"]);
584
+ var ComponentStruct = union6([
585
+ CopyableStruct,
586
+ DividerStruct,
587
+ HeadingStruct,
588
+ ImageStruct,
589
+ PanelStruct,
590
+ SpinnerStruct,
591
+ TextStruct,
592
+ RowStruct,
593
+ AddressStruct,
594
+ InputStruct,
595
+ FormStruct,
596
+ ButtonStruct
597
+ ]);
598
+
599
+ // src/ui/component.ts
600
+ import { assertStruct as assertStruct2 } from "@metamask/utils";
601
+ import { is } from "superstruct";
602
+ function isComponent(value) {
603
+ return is(value, ComponentStruct);
604
+ }
605
+ function assertIsComponent(value) {
606
+ assertStruct2(value, ComponentStruct, "Invalid component");
607
+ }
608
+
609
+ // src/images.ts
610
+ async function getRawImageData(url, options) {
611
+ if (typeof fetch !== "function") {
612
+ throw new Error(
613
+ `Failed to fetch image data from "${url}": Using this function requires the "endowment:network-access" permission.`
614
+ );
615
+ }
616
+ return fetch(url, options).then(async (response) => {
617
+ if (!response.ok) {
618
+ throw new Error(
619
+ `Failed to fetch image data from "${url}": ${response.status} ${response.statusText}`
620
+ );
621
+ }
622
+ const blob = await response.blob();
623
+ assert2(
624
+ blob.type === "image/jpeg" || blob.type === "image/png",
625
+ "Expected image data to be a JPEG or PNG image."
626
+ );
627
+ return blob;
628
+ });
629
+ }
630
+ async function getImageData(url, options) {
631
+ const blob = await getRawImageData(url, options);
632
+ const bytes = new Uint8Array(await blob.arrayBuffer());
633
+ return `data:${blob.type};base64,${bytesToBase64(bytes)}`;
634
+ }
635
+ async function getImageComponent(url, { width, height = width, request }) {
636
+ assert2(
637
+ typeof width === "number" && width > 0,
638
+ "Expected width to be a number greater than 0."
639
+ );
640
+ assert2(
641
+ typeof height === "number" && height > 0,
642
+ "Expected height to be a number greater than 0."
643
+ );
644
+ const imageData = await getImageData(url, request);
645
+ const size = `width="${width}" height="${height}"`;
646
+ return image(
647
+ `<svg ${size.trim()} xmlns="http://www.w3.org/2000/svg"><image ${size.trim()} href="${imageData}" /></svg>`
648
+ );
649
+ }
650
+
651
+ // src/types/handlers/transaction.ts
652
+ var SeverityLevel = /* @__PURE__ */ ((SeverityLevel2) => {
653
+ SeverityLevel2["Critical"] = "critical";
654
+ return SeverityLevel2;
655
+ })(SeverityLevel || {});
656
+
657
+ // src/types/handlers/user-input.ts
658
+ import {
659
+ assign as assign14,
660
+ literal as literal14,
661
+ object as object14,
662
+ optional as optional6,
663
+ record,
664
+ string as string11,
665
+ union as union7
666
+ } from "superstruct";
667
+ var UserInputEventType = /* @__PURE__ */ ((UserInputEventType2) => {
668
+ UserInputEventType2["ButtonClickEvent"] = "ButtonClickEvent";
669
+ UserInputEventType2["FormSubmitEvent"] = "FormSubmitEvent";
670
+ return UserInputEventType2;
671
+ })(UserInputEventType || {});
672
+ var GenericEventStruct = object14({
673
+ type: string11(),
674
+ name: optional6(string11())
675
+ });
676
+ var ButtonClickEventStruct = assign14(
677
+ GenericEventStruct,
678
+ object14({
679
+ type: literal14("ButtonClickEvent" /* ButtonClickEvent */)
680
+ })
681
+ );
682
+ var FormSubmitEventStruct = assign14(
683
+ GenericEventStruct,
684
+ object14({
685
+ type: literal14("FormSubmitEvent" /* FormSubmitEvent */),
686
+ value: record(string11(), string11()),
687
+ name: string11()
688
+ })
689
+ );
690
+ var UserInputEventStruct = union7([
691
+ ButtonClickEventStruct,
692
+ FormSubmitEventStruct
693
+ ]);
694
+
695
+ // src/types/methods/dialog.ts
696
+ var DialogType = /* @__PURE__ */ ((DialogType2) => {
697
+ DialogType2["Alert"] = "alert";
698
+ DialogType2["Confirmation"] = "confirmation";
699
+ DialogType2["Prompt"] = "prompt";
700
+ return DialogType2;
701
+ })(DialogType || {});
702
+
703
+ // src/types/methods/get-file.ts
704
+ var AuxiliaryFileEncoding = /* @__PURE__ */ ((AuxiliaryFileEncoding2) => {
705
+ AuxiliaryFileEncoding2["Base64"] = "base64";
706
+ AuxiliaryFileEncoding2["Hex"] = "hex";
707
+ AuxiliaryFileEncoding2["Utf8"] = "utf8";
708
+ return AuxiliaryFileEncoding2;
709
+ })(AuxiliaryFileEncoding || {});
710
+
711
+ // src/types/methods/manage-state.ts
712
+ var ManageStateOperation = /* @__PURE__ */ ((ManageStateOperation2) => {
713
+ ManageStateOperation2["ClearState"] = "clear";
714
+ ManageStateOperation2["GetState"] = "get";
715
+ ManageStateOperation2["UpdateState"] = "update";
716
+ return ManageStateOperation2;
717
+ })(ManageStateOperation || {});
718
+
719
+ // src/types/methods/notify.ts
720
+ var NotificationType = /* @__PURE__ */ ((NotificationType2) => {
721
+ NotificationType2["InApp"] = "inApp";
722
+ NotificationType2["Native"] = "native";
723
+ return NotificationType2;
724
+ })(NotificationType || {});
725
+
726
+ // src/types/interface.ts
727
+ import { nullable, record as record2, string as string12, union as union8 } from "superstruct";
728
+ var FormStateStruct = record2(string12(), nullable(string12()));
729
+ var InterfaceStateStruct = record2(
730
+ string12(),
731
+ union8([FormStateStruct, nullable(string12())])
732
+ );
733
+ export {
734
+ AddressStruct,
735
+ AuxiliaryFileEncoding,
736
+ ButtonClickEventStruct,
737
+ ButtonStruct,
738
+ ButtonType,
739
+ ButtonVariant,
740
+ ChainDisconnectedError,
741
+ ComponentStruct,
742
+ CopyableStruct,
743
+ DialogType,
744
+ DisconnectedError,
745
+ DividerStruct,
746
+ FormComponentStruct,
747
+ FormStateStruct,
748
+ FormStruct,
749
+ FormSubmitEventStruct,
750
+ GenericEventStruct,
751
+ HeadingStruct,
752
+ ImageStruct,
753
+ InputStruct,
754
+ InputType,
755
+ InterfaceStateStruct,
756
+ InternalError,
757
+ InvalidInputError,
758
+ InvalidParamsError,
759
+ InvalidRequestError,
760
+ LimitExceededError,
761
+ ManageStateOperation,
762
+ MethodNotFoundError,
763
+ MethodNotSupportedError,
764
+ NodeType,
765
+ NotificationType,
766
+ PanelStruct,
767
+ ParseError,
768
+ ResourceNotFoundError,
769
+ ResourceUnavailableError,
770
+ RowStruct,
771
+ RowVariant,
772
+ SNAP_ERROR_CODE,
773
+ SNAP_ERROR_MESSAGE,
774
+ SeverityLevel,
775
+ SnapError,
776
+ SpinnerStruct,
777
+ TextStruct,
778
+ TransactionRejected,
779
+ UnauthorizedError,
780
+ UnsupportedMethodError,
781
+ UserInputEventStruct,
782
+ UserInputEventType,
783
+ UserRejectedRequestError,
784
+ address,
785
+ assert3 as assert,
786
+ assertIsComponent,
787
+ button,
788
+ copyable,
789
+ divider,
790
+ enumValue,
791
+ form,
792
+ getErrorData,
793
+ getErrorMessage,
794
+ getErrorStack,
795
+ getImageComponent,
796
+ getImageData,
797
+ heading,
798
+ image,
799
+ input,
800
+ isComponent,
801
+ isSvg,
802
+ literal,
803
+ panel,
804
+ parseSvg,
805
+ row,
806
+ spinner,
807
+ text,
808
+ union
809
+ };
810
+ //# sourceMappingURL=index.mjs.map