@metamask/snaps-jest 8.2.0 → 8.3.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 (191) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/README.md +2 -2
  3. package/dist/chunk-24CGIQLL.mjs +30 -0
  4. package/dist/chunk-24CGIQLL.mjs.map +1 -0
  5. package/dist/{chunk-T2PHS5FY.js → chunk-2RJYSYUB.js} +2 -2
  6. package/dist/chunk-2RJYSYUB.js.map +1 -0
  7. package/dist/{chunk-KNJNL723.mjs → chunk-3J2IBWXV.mjs} +2 -2
  8. package/dist/{chunk-DVDAOXO7.js → chunk-3NP6BDGK.js} +48 -15
  9. package/dist/chunk-3NP6BDGK.js.map +1 -0
  10. package/dist/{chunk-43HRTFLS.mjs → chunk-6JPBXAHM.mjs} +103 -15
  11. package/dist/chunk-6JPBXAHM.mjs.map +1 -0
  12. package/dist/{chunk-VXPCUDBI.js → chunk-6V6MFT67.js} +8 -6
  13. package/dist/chunk-6V6MFT67.js.map +1 -0
  14. package/dist/{chunk-MAT5SBM7.mjs → chunk-7PCHIR6O.mjs} +7 -37
  15. package/dist/chunk-7PCHIR6O.mjs.map +1 -0
  16. package/dist/{chunk-4MAA7WGJ.js → chunk-AMAL4SJH.js} +7 -7
  17. package/dist/chunk-AMAL4SJH.js.map +1 -0
  18. package/dist/{chunk-HOI6FPLR.mjs → chunk-C26TYXXD.mjs} +9 -9
  19. package/dist/chunk-C26TYXXD.mjs.map +1 -0
  20. package/dist/{chunk-NSMTFK33.mjs → chunk-CACRY3TX.mjs} +3 -3
  21. package/dist/{chunk-PZDTZGSI.js → chunk-D653LBAY.js} +1 -1
  22. package/dist/chunk-D653LBAY.js.map +1 -0
  23. package/dist/{chunk-GVTDUKXK.js → chunk-DUVKGPX5.js} +106 -18
  24. package/dist/chunk-DUVKGPX5.js.map +1 -0
  25. package/dist/{chunk-IH7UNS5A.mjs → chunk-G333FBBL.mjs} +6 -4
  26. package/dist/chunk-G333FBBL.mjs.map +1 -0
  27. package/dist/{chunk-YNUVT3HC.js → chunk-GLPGOEVE.js} +4 -4
  28. package/dist/chunk-GLPGOEVE.js.map +1 -0
  29. package/dist/{chunk-WMLSD6B5.js → chunk-K7MK6LQU.js} +3 -3
  30. package/dist/{chunk-B73P64TE.mjs → chunk-KOPPL55J.mjs} +2 -2
  31. package/dist/chunk-KOPPL55J.mjs.map +1 -0
  32. package/dist/{chunk-XKJHFUHE.js → chunk-KPRLFCKD.js} +4 -2
  33. package/dist/chunk-KPRLFCKD.js.map +1 -0
  34. package/dist/{chunk-IVFVB4VR.js → chunk-LPMHPAZK.js} +54 -14
  35. package/dist/chunk-LPMHPAZK.js.map +1 -0
  36. package/dist/{chunk-GG2BCPQH.mjs → chunk-LSKT2AUS.mjs} +5 -3
  37. package/dist/chunk-LSKT2AUS.mjs.map +1 -0
  38. package/dist/{chunk-6KXCBUNZ.mjs → chunk-LVNNGMJ2.mjs} +3 -1
  39. package/dist/{chunk-6KXCBUNZ.mjs.map → chunk-LVNNGMJ2.mjs.map} +1 -1
  40. package/dist/{chunk-TMAWGVZP.mjs → chunk-OHRFO2BL.mjs} +7 -7
  41. package/dist/chunk-OHRFO2BL.mjs.map +1 -0
  42. package/dist/{chunk-WRKY2DLV.js → chunk-OO6IVUCV.js} +5 -5
  43. package/dist/{chunk-3M4GRUMH.mjs → chunk-ORR7AE5X.mjs} +2 -2
  44. package/dist/{chunk-5SGLRSWR.mjs → chunk-PDOVVC74.mjs} +4 -4
  45. package/dist/chunk-PDOVVC74.mjs.map +1 -0
  46. package/dist/{chunk-O24GTINW.mjs → chunk-Q3I6P2ZF.mjs} +42 -9
  47. package/dist/chunk-Q3I6P2ZF.mjs.map +1 -0
  48. package/dist/chunk-QRVFWATH.mjs +14 -0
  49. package/dist/chunk-QRVFWATH.mjs.map +1 -0
  50. package/dist/{chunk-MBQHVBLA.js → chunk-QYHQ2WWX.js} +5 -5
  51. package/dist/chunk-QYHQ2WWX.js.map +1 -0
  52. package/dist/{chunk-XWGECIXI.js → chunk-RJNNNCZJ.js} +3 -3
  53. package/dist/{chunk-CYPP66I7.mjs → chunk-ROCGQYSK.mjs} +46 -6
  54. package/dist/chunk-ROCGQYSK.mjs.map +1 -0
  55. package/dist/chunk-SNXRXX2O.js +30 -0
  56. package/dist/chunk-SNXRXX2O.js.map +1 -0
  57. package/dist/{chunk-44ARQBXS.js → chunk-WZ57PU2K.js} +6 -4
  58. package/dist/chunk-WZ57PU2K.js.map +1 -0
  59. package/dist/chunk-XP4YGQJA.js +14 -0
  60. package/dist/chunk-XP4YGQJA.js.map +1 -0
  61. package/dist/{chunk-7Y27L2EV.js → chunk-Y2U3ZPCK.js} +15 -45
  62. package/dist/chunk-Y2U3ZPCK.js.map +1 -0
  63. package/dist/{chunk-74TIKA2T.mjs → chunk-ZJQSGRNK.mjs} +1 -1
  64. package/dist/chunk-ZJQSGRNK.mjs.map +1 -0
  65. package/dist/environment.js +16 -16
  66. package/dist/environment.mjs +15 -15
  67. package/dist/helpers.js +29 -15
  68. package/dist/helpers.mjs +28 -14
  69. package/dist/index.js +31 -17
  70. package/dist/index.mjs +30 -16
  71. package/dist/internals/index.js +28 -20
  72. package/dist/internals/index.mjs +31 -23
  73. package/dist/internals/request.js +14 -14
  74. package/dist/internals/request.mjs +13 -13
  75. package/dist/internals/simulation/constants.js +4 -2
  76. package/dist/internals/simulation/constants.mjs +3 -1
  77. package/dist/internals/simulation/controllers.js +7 -7
  78. package/dist/internals/simulation/controllers.mjs +6 -6
  79. package/dist/internals/simulation/index.js +26 -18
  80. package/dist/internals/simulation/index.mjs +29 -21
  81. package/dist/internals/simulation/interface.js +10 -4
  82. package/dist/internals/simulation/interface.mjs +9 -3
  83. package/dist/internals/simulation/methods/hooks/get-preferences.js +8 -0
  84. package/dist/internals/simulation/methods/hooks/get-preferences.mjs +8 -0
  85. package/dist/internals/simulation/methods/hooks/index.js +5 -5
  86. package/dist/internals/simulation/methods/hooks/index.mjs +8 -8
  87. package/dist/internals/simulation/methods/hooks/notifications.js +2 -2
  88. package/dist/internals/simulation/methods/hooks/notifications.mjs +2 -2
  89. package/dist/internals/simulation/methods/hooks/request-user-approval.js +14 -0
  90. package/dist/internals/simulation/methods/hooks/request-user-approval.mjs +14 -0
  91. package/dist/internals/simulation/methods/hooks/state.js +2 -2
  92. package/dist/internals/simulation/methods/hooks/state.mjs +2 -2
  93. package/dist/internals/simulation/methods/index.js +6 -6
  94. package/dist/internals/simulation/methods/index.mjs +5 -5
  95. package/dist/internals/simulation/methods/specifications.js +6 -6
  96. package/dist/internals/simulation/methods/specifications.mjs +5 -5
  97. package/dist/internals/simulation/middleware/engine.js +3 -3
  98. package/dist/internals/simulation/middleware/engine.mjs +2 -2
  99. package/dist/internals/simulation/middleware/index.js +3 -3
  100. package/dist/internals/simulation/middleware/index.mjs +2 -2
  101. package/dist/internals/simulation/options.js +3 -3
  102. package/dist/internals/simulation/options.mjs +2 -2
  103. package/dist/internals/simulation/simulation.js +12 -11
  104. package/dist/internals/simulation/simulation.mjs +11 -10
  105. package/dist/internals/simulation/store/index.js +3 -3
  106. package/dist/internals/simulation/store/index.mjs +2 -2
  107. package/dist/internals/simulation/store/store.js +3 -3
  108. package/dist/internals/simulation/store/store.mjs +2 -2
  109. package/dist/internals/simulation/store/ui.js +2 -2
  110. package/dist/internals/simulation/store/ui.mjs +1 -1
  111. package/dist/internals/structs.js +2 -2
  112. package/dist/internals/structs.mjs +1 -1
  113. package/dist/matchers.js +15 -17
  114. package/dist/matchers.mjs +14 -16
  115. package/dist/options.js +2 -2
  116. package/dist/options.mjs +1 -1
  117. package/dist/setup.js +14 -14
  118. package/dist/setup.mjs +14 -14
  119. package/dist/tsconfig.build.tsbuildinfo +1 -1
  120. package/dist/types/helpers.d.ts +43 -1
  121. package/dist/types/internals/request.d.ts +1 -1
  122. package/dist/types/internals/server.d.ts +1 -1
  123. package/dist/types/internals/simulation/constants.d.ts +4 -0
  124. package/dist/types/internals/simulation/controllers.d.ts +4 -4
  125. package/dist/types/internals/simulation/interface.d.ts +31 -4
  126. package/dist/types/internals/simulation/methods/hooks/get-preferences.d.ts +13 -0
  127. package/dist/types/internals/simulation/methods/hooks/index.d.ts +2 -2
  128. package/dist/types/internals/simulation/methods/hooks/request-user-approval.d.ts +15 -0
  129. package/dist/types/internals/simulation/methods/specifications.d.ts +2 -2
  130. package/dist/types/internals/simulation/middleware/engine.d.ts +1 -1
  131. package/dist/types/internals/simulation/middleware/internal-methods/accounts.d.ts +1 -1
  132. package/dist/types/internals/simulation/middleware/internal-methods/middleware.d.ts +1 -1
  133. package/dist/types/internals/simulation/options.d.ts +10 -8
  134. package/dist/types/internals/simulation/simulation.d.ts +8 -5
  135. package/dist/types/internals/simulation/store/mocks.d.ts +2 -2
  136. package/dist/types/internals/simulation/store/notifications.d.ts +2 -2
  137. package/dist/types/internals/simulation/store/state.d.ts +1 -1
  138. package/dist/types/internals/simulation/store/store.d.ts +4 -4
  139. package/dist/types/internals/simulation/store/ui.d.ts +4 -3
  140. package/dist/types/internals/structs.d.ts +41 -41
  141. package/dist/types/matchers.d.ts +0 -10
  142. package/dist/types/options.d.ts +7 -7
  143. package/dist/types/types.d.ts +60 -21
  144. package/package.json +16 -16
  145. package/dist/chunk-265BMFM5.js +0 -13
  146. package/dist/chunk-265BMFM5.js.map +0 -1
  147. package/dist/chunk-43HRTFLS.mjs.map +0 -1
  148. package/dist/chunk-44ARQBXS.js.map +0 -1
  149. package/dist/chunk-4MAA7WGJ.js.map +0 -1
  150. package/dist/chunk-5SGLRSWR.mjs.map +0 -1
  151. package/dist/chunk-74TIKA2T.mjs.map +0 -1
  152. package/dist/chunk-7Y27L2EV.js.map +0 -1
  153. package/dist/chunk-B73P64TE.mjs.map +0 -1
  154. package/dist/chunk-CYPP66I7.mjs.map +0 -1
  155. package/dist/chunk-DVDAOXO7.js.map +0 -1
  156. package/dist/chunk-GG2BCPQH.mjs.map +0 -1
  157. package/dist/chunk-GVTDUKXK.js.map +0 -1
  158. package/dist/chunk-HOI6FPLR.mjs.map +0 -1
  159. package/dist/chunk-IH7UNS5A.mjs.map +0 -1
  160. package/dist/chunk-IVFVB4VR.js.map +0 -1
  161. package/dist/chunk-KSIBNOB2.mjs +0 -13
  162. package/dist/chunk-KSIBNOB2.mjs.map +0 -1
  163. package/dist/chunk-MAT5SBM7.mjs.map +0 -1
  164. package/dist/chunk-MBQHVBLA.js.map +0 -1
  165. package/dist/chunk-O24GTINW.mjs.map +0 -1
  166. package/dist/chunk-ORO3T6BU.mjs +0 -24
  167. package/dist/chunk-ORO3T6BU.mjs.map +0 -1
  168. package/dist/chunk-PZDTZGSI.js.map +0 -1
  169. package/dist/chunk-RAMAN5RM.js +0 -24
  170. package/dist/chunk-RAMAN5RM.js.map +0 -1
  171. package/dist/chunk-T2PHS5FY.js.map +0 -1
  172. package/dist/chunk-TMAWGVZP.mjs.map +0 -1
  173. package/dist/chunk-VXPCUDBI.js.map +0 -1
  174. package/dist/chunk-XKJHFUHE.js.map +0 -1
  175. package/dist/chunk-YNUVT3HC.js.map +0 -1
  176. package/dist/internals/simulation/methods/hooks/get-locale.js +0 -8
  177. package/dist/internals/simulation/methods/hooks/get-locale.mjs +0 -8
  178. package/dist/internals/simulation/methods/hooks/show-dialog.js +0 -14
  179. package/dist/internals/simulation/methods/hooks/show-dialog.mjs +0 -14
  180. package/dist/types/internals/simulation/methods/hooks/get-locale.d.ts +0 -9
  181. package/dist/types/internals/simulation/methods/hooks/show-dialog.d.ts +0 -9
  182. /package/dist/{chunk-KNJNL723.mjs.map → chunk-3J2IBWXV.mjs.map} +0 -0
  183. /package/dist/{chunk-NSMTFK33.mjs.map → chunk-CACRY3TX.mjs.map} +0 -0
  184. /package/dist/{chunk-WMLSD6B5.js.map → chunk-K7MK6LQU.js.map} +0 -0
  185. /package/dist/{chunk-WRKY2DLV.js.map → chunk-OO6IVUCV.js.map} +0 -0
  186. /package/dist/{chunk-3M4GRUMH.mjs.map → chunk-ORR7AE5X.mjs.map} +0 -0
  187. /package/dist/{chunk-XWGECIXI.js.map → chunk-RJNNNCZJ.js.map} +0 -0
  188. /package/dist/internals/simulation/methods/hooks/{get-locale.js.map → get-preferences.js.map} +0 -0
  189. /package/dist/internals/simulation/methods/hooks/{get-locale.mjs.map → get-preferences.mjs.map} +0 -0
  190. /package/dist/internals/simulation/methods/hooks/{show-dialog.js.map → request-user-approval.js.map} +0 -0
  191. /package/dist/internals/simulation/methods/hooks/{show-dialog.mjs.map → request-user-approval.mjs.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [8.3.0]
10
+ ### Added
11
+ - Add support for `snap_getPreferences` ([#2607](https://github.com/MetaMask/snaps/pull/2607))
12
+ - Add `RadioButton` component ([#2592](https://github.com/MetaMask/snaps/pull/2592))
13
+ - Add support for custom dialogs in `snaps-jest` ([#2526](https://github.com/MetaMask/snaps/pull/2526), [#2509](https://github.com/MetaMask/snaps/pull/2509))
14
+
15
+ ### Changed
16
+ - Replace `superstruct` with ESM-compatible fork `@metamask/superstruct` ([#2445](https://github.com/MetaMask/snaps/pull/2445))
17
+
9
18
  ## [8.2.0]
10
19
  ### Added
11
20
  - Add support for `Checkbox` to `snaps-jest` ([#2515](https://github.com/MetaMask/snaps/pull/2515))
@@ -172,7 +181,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
172
181
  - The version of the package no longer needs to match the version of all other
173
182
  MetaMask Snaps packages.
174
183
 
175
- [Unreleased]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-jest@8.2.0...HEAD
184
+ [Unreleased]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-jest@8.3.0...HEAD
185
+ [8.3.0]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-jest@8.2.0...@metamask/snaps-jest@8.3.0
176
186
  [8.2.0]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-jest@8.1.3...@metamask/snaps-jest@8.2.0
177
187
  [8.1.3]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-jest@8.1.2...@metamask/snaps-jest@8.1.3
178
188
  [8.1.2]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-jest@8.1.1...@metamask/snaps-jest@8.1.2
package/README.md CHANGED
@@ -362,7 +362,7 @@ functions that can be used to interact with the user interface.
362
362
  ##### Example
363
363
 
364
364
  ```js
365
- import { installSnap } from '@metamask/snaps-jest';
365
+ import { installSnap, assertIsAlertDialog } from '@metamask/snaps-jest';
366
366
  import { text } from '@metamask/snaps-sdk';
367
367
  import { assert } from '@metamask/utils';
368
368
 
@@ -379,7 +379,7 @@ describe('MySnap', () => {
379
379
 
380
380
  // This is useful if you're using TypeScript, since it will infer the type
381
381
  // of the user interface.
382
- assert(ui.type === 'alert');
382
+ assertIsAlertDialog(ui);
383
383
  expect(ui).toRender(text('Hello, world!'));
384
384
 
385
385
  // "Click" the OK button.
@@ -0,0 +1,30 @@
1
+ import {
2
+ closeInterface,
3
+ resolveInterface,
4
+ setInterface
5
+ } from "./chunk-ZJQSGRNK.mjs";
6
+
7
+ // src/internals/simulation/methods/hooks/request-user-approval.ts
8
+ import { put, take } from "redux-saga/effects";
9
+ function* requestUserApprovalImplementation({
10
+ type,
11
+ requestData: { id }
12
+ }) {
13
+ yield put(setInterface({ type, id }));
14
+ const { payload } = yield take(resolveInterface.type);
15
+ yield put(closeInterface());
16
+ return payload;
17
+ }
18
+ function getRequestUserApprovalImplementation(runSaga) {
19
+ return async (...args) => {
20
+ return await runSaga(
21
+ requestUserApprovalImplementation,
22
+ ...args
23
+ ).toPromise();
24
+ };
25
+ }
26
+
27
+ export {
28
+ getRequestUserApprovalImplementation
29
+ };
30
+ //# sourceMappingURL=chunk-24CGIQLL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internals/simulation/methods/hooks/request-user-approval.ts"],"sourcesContent":["import type { SagaIterator } from 'redux-saga';\nimport { put, take } from 'redux-saga/effects';\n\nimport type { RunSagaFunction } from '../../store';\nimport { resolveInterface, setInterface, closeInterface } from '../../store';\n\ntype RequestUserApprovalParams = {\n type: string;\n requestData: {\n id: string;\n };\n};\n\n/**\n * Show a dialog to the user. This will wait for `resolveUserInterface` to be\n * dispatched before returning.\n *\n * @param opts - The options for the request.\n * @param opts.type - The type of dialog to show.\n * @param opts.requestData - The data to display in the dialog.\n * @param opts.requestData.id - The ID of the interface.\n * @yields Sets the dialog in the store, waits for the user to resolve the\n * dialog, and closes the dialog.\n * @returns The result of the dialog.\n */\nfunction* requestUserApprovalImplementation({\n type,\n requestData: { id },\n}: RequestUserApprovalParams): SagaIterator<unknown> {\n yield put(setInterface({ type, id }));\n\n // We use `take` to wait for `resolveUserInterface` to be dispatched, which\n // indicates that the user has resolved the dialog.\n const { payload } = yield take(resolveInterface.type);\n yield put(closeInterface());\n\n return payload;\n}\n\n/**\n * Get the implementation of the `requestUserApproval` hook.\n *\n * @param runSaga - The function to run a saga outside the usual Redux flow.\n * @returns The implementation of the `requestUserApproval` hook.\n */\nexport function getRequestUserApprovalImplementation(runSaga: RunSagaFunction) {\n return async (\n ...args: Parameters<typeof requestUserApprovalImplementation>\n ) => {\n return await runSaga(\n requestUserApprovalImplementation,\n ...args,\n ).toPromise();\n };\n}\n"],"mappings":";;;;;;;AACA,SAAS,KAAK,YAAY;AAwB1B,UAAU,kCAAkC;AAAA,EAC1C;AAAA,EACA,aAAa,EAAE,GAAG;AACpB,GAAqD;AACnD,QAAM,IAAI,aAAa,EAAE,MAAM,GAAG,CAAC,CAAC;AAIpC,QAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,iBAAiB,IAAI;AACpD,QAAM,IAAI,eAAe,CAAC;AAE1B,SAAO;AACT;AAQO,SAAS,qCAAqC,SAA0B;AAC7E,SAAO,UACF,SACA;AACH,WAAO,MAAM;AAAA,MACX;AAAA,MACA,GAAG;AAAA,IACL,EAAE,UAAU;AAAA,EACd;AACF;","names":[]}
@@ -7,7 +7,7 @@
7
7
 
8
8
 
9
9
 
10
- var _superstruct = require('superstruct');
10
+ var _superstruct = require('@metamask/superstruct');
11
11
  var SnapsEnvironmentOptionsStruct = _superstruct.type.call(void 0, {
12
12
  server: _superstruct.defaulted.call(void 0,
13
13
  _superstruct.object.call(void 0, {
@@ -25,4 +25,4 @@ function getOptions(testEnvironmentOptions) {
25
25
 
26
26
 
27
27
  exports.getOptions = getOptions;
28
- //# sourceMappingURL=chunk-T2PHS5FY.js.map
28
+ //# sourceMappingURL=chunk-2RJYSYUB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/options.ts"],"names":[],"mappings":";AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,IAAM,gCAAgC,KAAK;AAAA,EACzC,QAAQ;AAAA,IACN,OAAO;AAAA,MACL,SAAS,UAAU,QAAQ,GAAG,IAAI;AAAA,MAClC,MAAM,UAAU,OAAO,GAAG,CAAC;AAAA,MAC3B,MAAM,UAAU,OAAO,GAAG,QAAQ,IAAI,CAAC;AAAA,IACzC,CAAC;AAAA,IACD,CAAC;AAAA,EACH;AACF,CAAC;AAuCM,SAAS,WAAW,wBAAiD;AAC1E,SAAO,OAAO,wBAAwB,6BAA6B;AACrE","sourcesContent":["import type { Infer } from '@metamask/superstruct';\nimport {\n boolean,\n create,\n defaulted,\n number,\n object,\n string,\n type,\n} from '@metamask/superstruct';\n\nconst SnapsEnvironmentOptionsStruct = type({\n server: defaulted(\n object({\n enabled: defaulted(boolean(), true),\n port: defaulted(number(), 0),\n root: defaulted(string(), process.cwd()),\n }),\n {},\n ),\n});\n\n/**\n * The options for the environment. These can be specified in the Jest\n * configuration under `testEnvironmentOptions`.\n *\n * @example\n * {\n * \"testEnvironment\": \"@metamask/snaps-jest\",\n * \"testEnvironmentOptions\": {\n * \"executionEnvironmentUrl\": \"http://localhost:8080\",\n * \"server\": {\n * \"port\": 8080,\n * /* ... *\\/\n * }\n * }\n * }\n * @property server - The options for the built-in HTTP server.\n * @property server.enabled - Whether to run the built-in HTTP server. Defaults\n * to `true`.\n * @property server.port - The port to use for the built-in HTTP server. If this\n * is not provided, a random available port will be used.\n * @property server.root - The root directory to serve from the built-in HTTP\n * server. Defaults to the current working directory. This is assumed to be the\n * directory containing the snap manifest and `dist` files. If this is a\n * relative path, it will be resolved relative to the current working directory.\n */\nexport type SnapsEnvironmentOptions = Infer<\n typeof SnapsEnvironmentOptionsStruct\n>;\n\n/**\n * Get the environment options. This validates the options, and returns the\n * default options if none are provided.\n *\n * @param testEnvironmentOptions - The test environment options as defined in\n * the Jest configuration.\n * @returns The environment options.\n */\nexport function getOptions(testEnvironmentOptions: Record<string, unknown>) {\n return create(testEnvironmentOptions, SnapsEnvironmentOptionsStruct);\n}\n"]}
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-FP4H3ADT.mjs";
7
7
  import {
8
8
  DEFAULT_JSON_RPC_ENDPOINT
9
- } from "./chunk-6KXCBUNZ.mjs";
9
+ } from "./chunk-LVNNGMJ2.mjs";
10
10
 
11
11
  // src/internals/simulation/middleware/engine.ts
12
12
  import { createFetchMiddleware } from "@metamask/eth-json-rpc-middleware";
@@ -36,4 +36,4 @@ function createJsonRpcEngine({
36
36
  export {
37
37
  createJsonRpcEngine
38
38
  };
39
- //# sourceMappingURL=chunk-KNJNL723.mjs.map
39
+ //# sourceMappingURL=chunk-3J2IBWXV.mjs.map
@@ -1,22 +1,28 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkXWGECIXIjs = require('./chunk-XWGECIXI.js');
3
+ var _chunkRJNNNCZJjs = require('./chunk-RJNNNCZJ.js');
4
+
5
+
6
+ var _chunkDUVKGPX5js = require('./chunk-DUVKGPX5.js');
4
7
 
5
8
 
6
9
  var _chunkSW65QYFVjs = require('./chunk-SW65QYFV.js');
7
10
 
8
11
 
9
- var _chunkVXPCUDBIjs = require('./chunk-VXPCUDBI.js');
12
+ var _chunk6V6MFT67js = require('./chunk-6V6MFT67.js');
13
+
10
14
 
11
15
 
16
+ var _chunkWZ57PU2Kjs = require('./chunk-WZ57PU2K.js');
12
17
 
13
- var _chunk44ARQBXSjs = require('./chunk-44ARQBXS.js');
14
18
 
19
+ var _chunkQYHQ2WWXjs = require('./chunk-QYHQ2WWX.js');
15
20
 
16
- var _chunkMBQHVBLAjs = require('./chunk-MBQHVBLA.js');
17
21
 
22
+ var _chunkK7MK6LQUjs = require('./chunk-K7MK6LQU.js');
18
23
 
19
- var _chunkWMLSD6B5js = require('./chunk-WMLSD6B5.js');
24
+
25
+ var _chunkD653LBAYjs = require('./chunk-D653LBAY.js');
20
26
 
21
27
  // src/internals/simulation/simulation.ts
22
28
  var _basecontroller = require('@metamask/base-controller');
@@ -28,29 +34,31 @@ var _keytree = require('@metamask/key-tree');
28
34
 
29
35
 
30
36
  var _node = require('@metamask/snaps-controllers/node');
37
+ var _snapsrpcmethods = require('@metamask/snaps-rpc-methods');
31
38
  var _snapsutils = require('@metamask/snaps-utils');
32
39
  var _readablestream = require('readable-stream');
40
+ var _effects = require('redux-saga/effects');
33
41
  async function handleInstallSnap(snapId, {
34
42
  executionService,
35
43
  executionServiceOptions,
36
44
  options: rawOptions = {}
37
45
  } = {}) {
38
- const options = _chunkVXPCUDBIjs.getOptions.call(void 0, rawOptions);
46
+ const options = _chunk6V6MFT67js.getOptions.call(void 0, rawOptions);
39
47
  const location = _node.detectSnapLocation.call(void 0, snapId, {
40
48
  allowLocal: true
41
49
  });
42
50
  const snapFiles = await _node.fetchSnap.call(void 0, snapId, location);
43
- const { store, runSaga } = _chunkWMLSD6B5js.createStore.call(void 0, options);
51
+ const { store, runSaga } = _chunkK7MK6LQUjs.createStore.call(void 0, options);
44
52
  const controllerMessenger = new (0, _basecontroller.ControllerMessenger)();
45
- registerActions(controllerMessenger);
53
+ registerActions(controllerMessenger, runSaga);
46
54
  const hooks = getHooks(options, snapFiles, snapId, controllerMessenger);
47
- const { subjectMetadataController, permissionController } = _chunk44ARQBXSjs.getControllers.call(void 0, {
55
+ const { subjectMetadataController, permissionController } = _chunkWZ57PU2Kjs.getControllers.call(void 0, {
48
56
  controllerMessenger,
49
57
  hooks,
50
58
  runSaga,
51
59
  options
52
60
  });
53
- const engine = _chunkXWGECIXIjs.createJsonRpcEngine.call(void 0, {
61
+ const engine = _chunkRJNNNCZJjs.createJsonRpcEngine.call(void 0, {
54
62
  store,
55
63
  hooks,
56
64
  permissionMiddleware: permissionController.createPermissionMiddleware({
@@ -76,14 +84,14 @@ async function handleInstallSnap(snapId, {
76
84
  });
77
85
  }
78
86
  });
79
- await _chunk44ARQBXSjs.registerSnap.call(void 0, snapId, snapFiles.manifest.result, {
87
+ await _chunkWZ57PU2Kjs.registerSnap.call(void 0, snapId, snapFiles.manifest.result, {
80
88
  permissionController,
81
89
  subjectMetadataController
82
90
  });
83
91
  await service.executeSnap({
84
92
  snapId,
85
93
  sourceCode: snapFiles.sourceCode.toString("utf8"),
86
- endowments: await _chunkMBQHVBLAjs.getEndowments.call(void 0, permissionController, snapId)
94
+ endowments: await _chunkQYHQ2WWXjs.getEndowments.call(void 0, permissionController, snapId)
87
95
  });
88
96
  return {
89
97
  snapId,
@@ -112,10 +120,15 @@ function getHooks(options, snapFiles, snapId, controllerMessenger) {
112
120
  "SnapInterfaceController:getInterface",
113
121
  snapId,
114
122
  ...args
115
- ).state
123
+ ).state,
124
+ resolveInterface: async (...args) => controllerMessenger.call(
125
+ "SnapInterfaceController:resolveInterface",
126
+ snapId,
127
+ ...args
128
+ )
116
129
  };
117
130
  }
118
- function registerActions(controllerMessenger) {
131
+ function registerActions(controllerMessenger, runSaga) {
119
132
  controllerMessenger.registerActionHandler(
120
133
  "PhishingController:maybeUpdateState",
121
134
  async () => Promise.resolve()
@@ -124,6 +137,26 @@ function registerActions(controllerMessenger) {
124
137
  "PhishingController:testOrigin",
125
138
  () => ({ result: false, type: "all" })
126
139
  );
140
+ controllerMessenger.registerActionHandler(
141
+ "ApprovalController:hasRequest",
142
+ (opts) => {
143
+ function* getCurrentInterfaceSaga() {
144
+ const currentInterface2 = yield _effects.select.call(void 0, _chunkD653LBAYjs.getCurrentInterface);
145
+ return currentInterface2;
146
+ }
147
+ const currentInterface = runSaga(
148
+ getCurrentInterfaceSaga
149
+ ).result();
150
+ return currentInterface?.type === _snapsrpcmethods.DIALOG_APPROVAL_TYPES.default && currentInterface?.id === opts?.id;
151
+ }
152
+ );
153
+ controllerMessenger.registerActionHandler(
154
+ "ApprovalController:acceptRequest",
155
+ async (_id, value) => {
156
+ await runSaga(_chunkDUVKGPX5js.resolveWithSaga, value).toPromise();
157
+ return { value };
158
+ }
159
+ );
127
160
  }
128
161
 
129
162
 
@@ -131,4 +164,4 @@ function registerActions(controllerMessenger) {
131
164
 
132
165
 
133
166
  exports.handleInstallSnap = handleInstallSnap; exports.getHooks = getHooks; exports.registerActions = registerActions;
134
- //# sourceMappingURL=chunk-DVDAOXO7.js.map
167
+ //# sourceMappingURL=chunk-3NP6BDGK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internals/simulation/simulation.ts"],"names":["currentInterface"],"mappings":"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","sourcesContent":["import type {\n ActionConstraint,\n EventConstraint,\n} from '@metamask/base-controller';\nimport { ControllerMessenger } from '@metamask/base-controller';\nimport { createEngineStream } from '@metamask/json-rpc-middleware-stream';\nimport { mnemonicPhraseToBytes } from '@metamask/key-tree';\nimport type { AbstractExecutionService } from '@metamask/snaps-controllers';\nimport {\n fetchSnap,\n detectSnapLocation,\n NodeThreadExecutionService,\n setupMultiplex,\n} from '@metamask/snaps-controllers/node';\nimport { DIALOG_APPROVAL_TYPES } from '@metamask/snaps-rpc-methods';\nimport type {\n SnapId,\n AuxiliaryFileEncoding,\n Component,\n InterfaceState,\n} from '@metamask/snaps-sdk';\nimport type { FetchedSnapFiles } from '@metamask/snaps-utils';\nimport { logError } from '@metamask/snaps-utils';\nimport type { Json } from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\nimport { pipeline } from 'readable-stream';\nimport type { SagaIterator } from 'redux-saga';\nimport { select } from 'redux-saga/effects';\n\nimport type { RootControllerMessenger } from './controllers';\nimport { getControllers, registerSnap } from './controllers';\nimport { getSnapFile } from './files';\nimport { resolveWithSaga } from './interface';\nimport { getEndowments } from './methods';\nimport { createJsonRpcEngine } from './middleware';\nimport type { SimulationOptions, SimulationUserOptions } from './options';\nimport { getOptions } from './options';\nimport type { Interface, RunSagaFunction, Store } from './store';\nimport { createStore, getCurrentInterface } from './store';\n\n/**\n * Options for the execution service, without the options that are shared\n * between all execution services.\n *\n * @template Service - The type of the execution service, i.e., the class that\n * creates the execution service.\n */\nexport type ExecutionServiceOptions<\n Service extends new (...args: any[]) => any,\n> = Omit<\n ConstructorParameters<Service>[0],\n keyof ConstructorParameters<typeof AbstractExecutionService<unknown>>[0]\n>;\n\n/**\n * The options for running a Snap in a simulated environment.\n *\n * @property executionService - The execution service to use.\n * @property executionServiceOptions - The options to use when creating the\n * execution service, if any. This should only include options specific to the\n * provided execution service.\n * @property options - The simulation options.\n * @template Service - The type of the execution service.\n */\nexport type InstallSnapOptions<\n Service extends new (...args: any[]) => InstanceType<\n typeof AbstractExecutionService<unknown>\n >,\n> = ExecutionServiceOptions<Service> extends Record<string, never>\n ? {\n executionService: Service;\n executionServiceOptions?: ExecutionServiceOptions<Service>;\n options?: SimulationUserOptions;\n }\n : {\n executionService: Service;\n executionServiceOptions: ExecutionServiceOptions<Service>;\n options?: SimulationUserOptions;\n };\n\nexport type InstalledSnap = {\n snapId: SnapId;\n store: Store;\n executionService: InstanceType<typeof AbstractExecutionService>;\n controllerMessenger: ControllerMessenger<ActionConstraint, EventConstraint>;\n runSaga: RunSagaFunction;\n};\n\nexport type MiddlewareHooks = {\n /**\n * A hook that returns the user's secret recovery phrase.\n *\n * @returns The user's secret recovery phrase.\n */\n getMnemonic: () => Promise<Uint8Array>;\n\n /**\n * A hook that returns the Snap's auxiliary file for the given path.\n *\n * @param path - The path of the auxiliary file to get.\n * @param encoding - The encoding to use when returning the file.\n * @returns The Snap's auxiliary file for the given path.\n */\n getSnapFile: (\n path: string,\n encoding: AuxiliaryFileEncoding,\n ) => Promise<string | null>;\n\n /**\n * A hook that returns whether the client is locked or not.\n *\n * @returns A boolean flag signaling whether the client is locked.\n */\n getIsLocked: () => boolean;\n createInterface: (content: Component) => Promise<string>;\n updateInterface: (id: string, content: Component) => Promise<void>;\n getInterfaceState: (id: string) => InterfaceState;\n resolveInterface: (id: string, value: Json) => Promise<void>;\n};\n\n/**\n * Install a Snap in a simulated environment. This will fetch the Snap files,\n * create a Redux store, set up the controllers and JSON-RPC stack, register the\n * Snap, and run the Snap code in the execution service.\n *\n * @param snapId - The ID of the Snap to install.\n * @param options - The options to use when installing the Snap.\n * @param options.executionService - The execution service to use.\n * @param options.executionServiceOptions - The options to use when creating the\n * execution service, if any. This should only include options specific to the\n * provided execution service.\n * @param options.options - The simulation options.\n * @template Service - The type of the execution service.\n */\nexport async function handleInstallSnap<\n Service extends new (...args: any[]) => InstanceType<\n typeof AbstractExecutionService\n >,\n>(\n snapId: SnapId,\n {\n executionService,\n executionServiceOptions,\n options: rawOptions = {},\n }: Partial<InstallSnapOptions<Service>> = {},\n): Promise<InstalledSnap> {\n const options = getOptions(rawOptions);\n\n // Fetch Snap files.\n const location = detectSnapLocation(snapId, {\n allowLocal: true,\n });\n\n const snapFiles = await fetchSnap(snapId, location);\n\n // Create Redux store.\n const { store, runSaga } = createStore(options);\n\n const controllerMessenger = new ControllerMessenger<any, any>();\n\n registerActions(controllerMessenger, runSaga);\n\n // Set up controllers and JSON-RPC stack.\n const hooks = getHooks(options, snapFiles, snapId, controllerMessenger);\n\n const { subjectMetadataController, permissionController } = getControllers({\n controllerMessenger,\n hooks,\n runSaga,\n options,\n });\n\n const engine = createJsonRpcEngine({\n store,\n hooks,\n permissionMiddleware: permissionController.createPermissionMiddleware({\n origin: snapId,\n }),\n });\n\n // Create execution service.\n const ExecutionService = executionService ?? NodeThreadExecutionService;\n const service = new ExecutionService({\n ...executionServiceOptions,\n messenger: controllerMessenger.getRestricted({\n name: 'ExecutionService',\n allowedActions: [],\n allowedEvents: [],\n }),\n setupSnapProvider: (_snapId: string, rpcStream: Duplex) => {\n const mux = setupMultiplex(rpcStream, 'snapStream');\n const stream = mux.createStream('metamask-provider');\n const providerStream = createEngineStream({ engine });\n\n // Error function is difficult to test, so we ignore it.\n /* istanbul ignore next 2 */\n pipeline(stream, providerStream, stream, (error: unknown) => {\n if (error) {\n logError(`Provider stream failure.`, error);\n }\n });\n },\n });\n\n // Register the Snap. This sets up the Snap's permissions and subject\n // metadata.\n await registerSnap(snapId, snapFiles.manifest.result, {\n permissionController,\n subjectMetadataController,\n });\n\n // Run the Snap code in the execution service.\n await service.executeSnap({\n snapId,\n sourceCode: snapFiles.sourceCode.toString('utf8'),\n endowments: await getEndowments(permissionController, snapId),\n });\n\n return {\n snapId,\n store,\n executionService: service,\n controllerMessenger,\n runSaga,\n };\n}\n\n/**\n * Get the hooks for the simulation.\n *\n * @param options - The simulation options.\n * @param snapFiles - The Snap files.\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger.\n * @returns The hooks for the simulation.\n */\nexport function getHooks(\n options: SimulationOptions,\n snapFiles: FetchedSnapFiles,\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n): MiddlewareHooks {\n return {\n getMnemonic: async () =>\n Promise.resolve(mnemonicPhraseToBytes(options.secretRecoveryPhrase)),\n getSnapFile: async (path: string, encoding: AuxiliaryFileEncoding) =>\n await getSnapFile(snapFiles.auxiliaryFiles, path, encoding),\n getIsLocked: () => false,\n createInterface: async (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n ...args,\n ),\n updateInterface: async (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterface',\n snapId,\n ...args,\n ),\n getInterfaceState: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n ...args,\n ).state,\n resolveInterface: async (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:resolveInterface',\n snapId,\n ...args,\n ),\n };\n}\n\n/**\n * Register mocked action handlers.\n *\n * @param controllerMessenger - The controller messenger.\n * @param runSaga - The run saga function.\n */\nexport function registerActions(\n controllerMessenger: RootControllerMessenger,\n runSaga: RunSagaFunction,\n) {\n controllerMessenger.registerActionHandler(\n 'PhishingController:maybeUpdateState',\n async () => Promise.resolve(),\n );\n\n controllerMessenger.registerActionHandler(\n 'PhishingController:testOrigin',\n () => ({ result: false, type: 'all' }),\n );\n\n controllerMessenger.registerActionHandler(\n 'ApprovalController:hasRequest',\n (opts) => {\n /**\n * Get the current interface from the store.\n *\n * @yields Selects the current interface from the store.\n * @returns The current interface.\n */\n function* getCurrentInterfaceSaga(): SagaIterator {\n const currentInterface: Interface = yield select(getCurrentInterface);\n return currentInterface;\n }\n\n const currentInterface: Interface | undefined = runSaga(\n getCurrentInterfaceSaga,\n ).result();\n return (\n currentInterface?.type === DIALOG_APPROVAL_TYPES.default &&\n currentInterface?.id === opts?.id\n );\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'ApprovalController:acceptRequest',\n async (_id: string, value: unknown) => {\n await runSaga(resolveWithSaga, value).toPromise();\n\n return { value };\n },\n );\n}\n"]}
@@ -6,9 +6,10 @@ import {
6
6
  getCurrentInterface,
7
7
  resolveInterface,
8
8
  setInterface
9
- } from "./chunk-74TIKA2T.mjs";
9
+ } from "./chunk-ZJQSGRNK.mjs";
10
10
 
11
11
  // src/internals/simulation/interface.ts
12
+ import { DIALOG_APPROVAL_TYPES } from "@metamask/snaps-rpc-methods";
12
13
  import { DialogType, UserInputEventType, assert } from "@metamask/snaps-sdk";
13
14
  import {
14
15
  HandlerType,
@@ -21,45 +22,64 @@ import { call, put, select, take } from "redux-saga/effects";
21
22
  var MAX_FILE_SIZE = 1e7;
22
23
  function getInterfaceResponse(runSaga, type, content, interfaceActions) {
23
24
  switch (type) {
24
- case DialogType.Alert:
25
+ case DIALOG_APPROVAL_TYPES[DialogType.Alert]:
25
26
  return {
26
27
  ...interfaceActions,
27
- type,
28
+ type: DialogType.Alert,
28
29
  content,
29
30
  ok: resolveWith(runSaga, null)
30
31
  };
31
- case DialogType.Confirmation:
32
+ case DIALOG_APPROVAL_TYPES[DialogType.Confirmation]:
32
33
  return {
33
34
  ...interfaceActions,
34
- type,
35
+ type: DialogType.Confirmation,
35
36
  content,
36
37
  ok: resolveWith(runSaga, true),
37
38
  cancel: resolveWith(runSaga, false)
38
39
  };
39
- case DialogType.Prompt:
40
+ case DIALOG_APPROVAL_TYPES[DialogType.Prompt]:
40
41
  return {
41
42
  ...interfaceActions,
42
- type,
43
+ type: DialogType.Prompt,
43
44
  content,
44
45
  ok: resolveWithInput(runSaga),
45
46
  cancel: resolveWith(runSaga, null)
46
47
  };
48
+ case DIALOG_APPROVAL_TYPES.default: {
49
+ const footer = getElementByType(content, "Footer");
50
+ if (!footer) {
51
+ return {
52
+ ...interfaceActions,
53
+ content,
54
+ ok: resolveWith(runSaga, null),
55
+ cancel: resolveWith(runSaga, null)
56
+ };
57
+ }
58
+ if (getJsxChildren(footer).length === 1) {
59
+ return {
60
+ ...interfaceActions,
61
+ content,
62
+ cancel: resolveWith(runSaga, null)
63
+ };
64
+ }
65
+ return {
66
+ ...interfaceActions,
67
+ content
68
+ };
69
+ }
47
70
  default:
48
71
  throw new Error(`Unknown or unsupported dialog type: "${String(type)}".`);
49
72
  }
50
73
  }
74
+ function* resolveWithSaga(value) {
75
+ yield put(resolveInterface(value));
76
+ }
51
77
  function resolveWith(runSaga, value) {
52
- function* resolveWithSaga() {
53
- yield put(resolveInterface(value));
54
- }
55
78
  return async () => {
56
- await runSaga(resolveWithSaga).toPromise();
79
+ await runSaga(resolveWithSaga, value).toPromise();
57
80
  };
58
81
  }
59
82
  function resolveWithInput(runSaga) {
60
- function* resolveWithSaga(value) {
61
- yield put(resolveInterface(value));
62
- }
63
83
  return async (value = "") => {
64
84
  await runSaga(resolveWithSaga, value).toPromise();
65
85
  };
@@ -111,6 +131,14 @@ function getElement(content, name) {
111
131
  return void 0;
112
132
  });
113
133
  }
134
+ function getElementByType(content, type) {
135
+ return walkJsx(content, (element) => {
136
+ if (element.type === type) {
137
+ return element;
138
+ }
139
+ return void 0;
140
+ });
141
+ }
114
142
  async function handleEvent(controllerMessenger, snapId, id, event, context) {
115
143
  try {
116
144
  await controllerMessenger.call(
@@ -304,6 +332,53 @@ async function selectInDropdown(controllerMessenger, id, content, snapId, name,
304
332
  }
305
333
  });
306
334
  }
335
+ async function selectFromRadioGroup(controllerMessenger, id, content, snapId, name, value) {
336
+ const result = getElement(content, name);
337
+ assert(
338
+ result !== void 0,
339
+ `Could not find an element in the interface with the name "${name}".`
340
+ );
341
+ assert(
342
+ result.element.type === "RadioGroup",
343
+ `Expected an element of type "RadioGroup", but found "${result.element.type}".`
344
+ );
345
+ const options = getJsxChildren(result.element);
346
+ const selectedOption = options.find(
347
+ (option) => hasProperty(option.props, "value") && option.props.value === value
348
+ );
349
+ assert(
350
+ selectedOption !== void 0,
351
+ `The RadioGroup with the name "${name}" does not contain "${value}".`
352
+ );
353
+ const { state, context } = controllerMessenger.call(
354
+ "SnapInterfaceController:getInterface",
355
+ snapId,
356
+ id
357
+ );
358
+ const newState = mergeValue(state, name, value, result.form);
359
+ controllerMessenger.call(
360
+ "SnapInterfaceController:updateInterfaceState",
361
+ id,
362
+ newState
363
+ );
364
+ await controllerMessenger.call("ExecutionService:handleRpcRequest", snapId, {
365
+ origin: "",
366
+ handler: HandlerType.OnUserInput,
367
+ request: {
368
+ jsonrpc: "2.0",
369
+ method: " ",
370
+ params: {
371
+ event: {
372
+ type: UserInputEventType.InputChangeEvent,
373
+ name: result.element.props.name,
374
+ value
375
+ },
376
+ id,
377
+ context
378
+ }
379
+ }
380
+ });
381
+ }
307
382
  function getFormattedFileSize(size) {
308
383
  return `${(size / 1e6).toFixed(2)} MB`;
309
384
  }
@@ -375,6 +450,16 @@ function getInterfaceActions(snapId, controllerMessenger, { content, id }) {
375
450
  value
376
451
  );
377
452
  },
453
+ selectFromRadioGroup: async (name, value) => {
454
+ await selectFromRadioGroup(
455
+ controllerMessenger,
456
+ id,
457
+ content,
458
+ snapId,
459
+ name,
460
+ value
461
+ );
462
+ },
378
463
  uploadFile: async (name, file, options) => {
379
464
  await uploadFile(
380
465
  controllerMessenger,
@@ -409,13 +494,16 @@ function* getInterface(runSaga, snapId, controllerMessenger) {
409
494
 
410
495
  export {
411
496
  getInterfaceResponse,
497
+ resolveWithSaga,
412
498
  getElement,
499
+ getElementByType,
413
500
  clickElement,
414
501
  mergeValue,
415
502
  typeInField,
416
503
  selectInDropdown,
504
+ selectFromRadioGroup,
417
505
  uploadFile,
418
506
  getInterfaceActions,
419
507
  getInterface
420
508
  };
421
- //# sourceMappingURL=chunk-43HRTFLS.mjs.map
509
+ //# sourceMappingURL=chunk-6JPBXAHM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internals/simulation/interface.ts"],"sourcesContent":["import type { DialogApprovalTypes } from '@metamask/snaps-rpc-methods';\nimport { DIALOG_APPROVAL_TYPES } from '@metamask/snaps-rpc-methods';\nimport type {\n FormState,\n InterfaceContext,\n InterfaceState,\n SnapId,\n UserInputEvent,\n File,\n} from '@metamask/snaps-sdk';\nimport { DialogType, UserInputEventType, assert } from '@metamask/snaps-sdk';\nimport type { FooterElement } from '@metamask/snaps-sdk/jsx';\nimport { type FormElement, type JSXElement } from '@metamask/snaps-sdk/jsx';\nimport {\n HandlerType,\n getJsxChildren,\n unwrapError,\n walkJsx,\n} from '@metamask/snaps-utils';\nimport { assertExhaustive, hasProperty } from '@metamask/utils';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { type SagaIterator } from 'redux-saga';\nimport { call, put, select, take } from 'redux-saga/effects';\n\nimport type {\n FileOptions,\n SnapInterface,\n SnapInterfaceActions,\n} from '../../types';\nimport type { RootControllerMessenger } from './controllers';\nimport { getFileSize, getFileToUpload } from './files';\nimport type { Interface, RunSagaFunction } from './store';\nimport { getCurrentInterface, resolveInterface, setInterface } from './store';\n\n/**\n * The maximum file size that can be uploaded.\n */\nconst MAX_FILE_SIZE = 10_000_000; // 10 MB\n\n/**\n * Get a user interface object from a type and content object.\n *\n * @param runSaga - A function to run a saga outside the usual Redux flow.\n * @param type - The type of the interface.\n * @param content - The content to show in the interface.\n * @param interfaceActions - The actions to interact with the interface.\n * @returns The user interface object.\n */\nexport function getInterfaceResponse(\n runSaga: RunSagaFunction,\n type: DialogApprovalTypes[DialogType | 'default'],\n content: JSXElement,\n interfaceActions: SnapInterfaceActions,\n): SnapInterface {\n switch (type) {\n case DIALOG_APPROVAL_TYPES[DialogType.Alert]:\n return {\n ...interfaceActions,\n type: DialogType.Alert,\n content,\n ok: resolveWith(runSaga, null),\n };\n\n case DIALOG_APPROVAL_TYPES[DialogType.Confirmation]:\n return {\n ...interfaceActions,\n type: DialogType.Confirmation,\n content,\n\n ok: resolveWith(runSaga, true),\n cancel: resolveWith(runSaga, false),\n };\n\n case DIALOG_APPROVAL_TYPES[DialogType.Prompt]:\n return {\n ...interfaceActions,\n type: DialogType.Prompt,\n content,\n\n ok: resolveWithInput(runSaga),\n cancel: resolveWith(runSaga, null),\n };\n\n case DIALOG_APPROVAL_TYPES.default: {\n const footer = getElementByType<FooterElement>(content, 'Footer');\n\n // No Footer defined so we apply a default footer.\n if (!footer) {\n return {\n ...interfaceActions,\n content,\n\n ok: resolveWith(runSaga, null),\n cancel: resolveWith(runSaga, null),\n };\n }\n\n // Only one button in footer so we apply a default cancel button.\n if (getJsxChildren(footer).length === 1) {\n return {\n ...interfaceActions,\n content,\n\n cancel: resolveWith(runSaga, null),\n };\n }\n\n // We have two buttons in the footer so we assume the snap handles the approval of the interface.\n return {\n ...interfaceActions,\n content,\n };\n }\n\n default:\n throw new Error(`Unknown or unsupported dialog type: \"${String(type)}\".`);\n }\n}\n\n/**\n * Resolve the current user interface with the given value.\n *\n * @param value - The value to resolve the user interface with.\n * @yields Puts the resolve user interface action.\n */\nexport function* resolveWithSaga(value: unknown): SagaIterator {\n yield put(resolveInterface(value));\n}\n\n/**\n * Resolve the current user interface with the given value. This returns a\n * function that can be used to resolve the user interface.\n *\n * @param runSaga - A function to run a saga outside the usual Redux flow.\n * @param value - The value to resolve the user interface with.\n * @returns A function that can be used to resolve the user interface.\n */\nfunction resolveWith(runSaga: RunSagaFunction, value: unknown) {\n return async () => {\n await runSaga(resolveWithSaga, value).toPromise();\n };\n}\n\n/**\n * Resolve the current user interface with the provided input. This returns a\n * function that can be used to resolve the user interface.\n *\n * @param runSaga - A function to run a saga outside the usual Redux flow.\n * @returns A function that can be used to resolve the user interface.\n */\nfunction resolveWithInput(runSaga: RunSagaFunction) {\n return async (value = '') => {\n await runSaga(resolveWithSaga, value).toPromise();\n };\n}\n\n/**\n * Get the stored user interface from the store.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param snapId - The Snap ID.\n * @yields Takes the set interface action.\n * @returns The user interface object.\n */\nfunction* getStoredInterface(\n controllerMessenger: RootControllerMessenger,\n snapId: SnapId,\n): SagaIterator<Interface & { content: JSXElement }> {\n const currentInterface: Interface | null = yield select(getCurrentInterface);\n\n if (currentInterface) {\n const { content } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n currentInterface.id,\n );\n\n return { ...currentInterface, content };\n }\n\n const { payload }: PayloadAction<Interface> = yield take(setInterface.type);\n const { content } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n payload.id,\n );\n\n return { ...payload, content };\n}\n\n/**\n * A JSX element with a name.\n */\nexport type NamedJSXElement = JSXElement & { props: { name: string } };\n\n/**\n * Check if a JSX element is a JSX element with a given name.\n *\n * @param element - The JSX element.\n * @param name - The element name.\n * @returns True if the element is a JSX element with the given name, otherwise\n * false.\n */\nfunction isJSXElementWithName<Element extends JSXElement, Name extends string>(\n element: Element,\n name: Name,\n): element is Element & { props: { name: Name } } {\n return hasProperty(element.props, 'name') && element.props.name === name;\n}\n\n/**\n * Find an element inside a form element in a JSX tree.\n *\n * @param form - The form element.\n * @param name - The element name.\n * @returns An object containing the element and the form name if it's contained\n * in a form, otherwise undefined.\n */\nfunction getFormElement(form: FormElement, name: string) {\n const element = walkJsx<NamedJSXElement>(form, (childElement) => {\n if (isJSXElementWithName(childElement, name)) {\n return childElement;\n }\n\n return undefined;\n });\n\n if (element === undefined) {\n return undefined;\n }\n\n return { element, form: form.props.name };\n}\n\n/**\n * Get an element from a JSX tree with the given name.\n *\n * @param content - The interface content.\n * @param name - The element name.\n * @returns An object containing the element and the form name if it's contained\n * in a form, otherwise undefined.\n */\nexport function getElement(\n content: JSXElement,\n name: string,\n):\n | {\n element: NamedJSXElement;\n form?: string;\n }\n | undefined {\n if (isJSXElementWithName(content, name)) {\n return { element: content };\n }\n\n return walkJsx(content, (element) => {\n if (element.type === 'Form') {\n return getFormElement(element, name);\n }\n\n if (isJSXElementWithName(element, name)) {\n return { element };\n }\n\n return undefined;\n });\n}\n\n/**\n * Get an element from a JSX tree with the given type.\n *\n * @param content - The interface content.\n * @param type - The element type.\n * @returns The element with the given type.\n */\nexport function getElementByType<Element extends JSXElement>(\n content: JSXElement,\n type: string,\n) {\n return walkJsx(content, (element) => {\n if (element.type === type) {\n return element as Element;\n }\n\n return undefined;\n });\n}\n\n/**\n * Handle submitting event requests to OnUserInput including unwrapping potential errors.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param snapId - The Snap ID.\n * @param id - The interface ID.\n * @param event - The event to submit.\n * @param context - The interface context.\n */\nasync function handleEvent(\n controllerMessenger: RootControllerMessenger,\n snapId: SnapId,\n id: string,\n event: UserInputEvent,\n context: InterfaceContext | null,\n) {\n try {\n await controllerMessenger.call(\n 'ExecutionService:handleRpcRequest',\n snapId,\n {\n origin: '',\n handler: HandlerType.OnUserInput,\n request: {\n jsonrpc: '2.0',\n method: ' ',\n params: {\n event,\n id,\n context,\n },\n },\n },\n );\n } catch (error) {\n const [unwrapped] = unwrapError(error);\n throw unwrapped;\n }\n}\n\n/**\n * Click on an element of the Snap interface.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface content.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n */\nexport async function clickElement(\n controllerMessenger: RootControllerMessenger,\n id: string,\n content: JSXElement,\n snapId: SnapId,\n name: string,\n): Promise<void> {\n const result = getElement(content, name);\n assert(\n result !== undefined,\n `Could not find an element in the interface with the name \"${name}\".`,\n );\n\n assert(\n result.element.type === 'Button' || result.element.type === 'Checkbox',\n `Expected an element of type \"Button\" or \"Checkbox\", but found \"${result.element.type}\".`,\n );\n\n const { state, context } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const { type } = result.element;\n const elementName = result.element.props.name;\n\n const formState = (result.form ? state[result.form] : state) as FormState;\n const currentValue = formState[elementName];\n\n switch (type) {\n case 'Button': {\n // Button click events are always triggered.\n await handleEvent(\n controllerMessenger,\n snapId,\n id,\n {\n type: UserInputEventType.ButtonClickEvent,\n name: elementName,\n },\n context,\n );\n\n if (result.form && result.element.props.type === 'submit') {\n await handleEvent(\n controllerMessenger,\n snapId,\n id,\n {\n type: UserInputEventType.FormSubmitEvent,\n name: result.form,\n value: state[result.form] as FormState,\n },\n context,\n );\n }\n break;\n }\n\n case 'Checkbox': {\n const newValue = !currentValue;\n const newState = mergeValue(state, name, newValue, result.form);\n\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterfaceState',\n id,\n newState,\n );\n\n await handleEvent(\n controllerMessenger,\n snapId,\n id,\n {\n type: UserInputEventType.InputChangeEvent,\n name: elementName,\n value: newValue,\n },\n context,\n );\n break;\n }\n\n /* istanbul ignore next */\n default:\n assertExhaustive(type);\n }\n}\n\n/**\n * Merge a value in the interface state.\n *\n * @param state - The actual interface state.\n * @param name - The component name that changed value.\n * @param value - The new value.\n * @param form - The form name if the element is in one.\n * @returns The state with the merged value.\n */\nexport function mergeValue(\n state: InterfaceState,\n name: string,\n value: string | File | boolean | null,\n form?: string,\n): InterfaceState {\n if (form) {\n return {\n ...state,\n [form]: {\n ...(state[form] as FormState),\n [name]: value,\n },\n };\n }\n\n return { ...state, [name]: value };\n}\n\n/**\n * Type a value in an interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param value - The value to type in the element.\n */\nexport async function typeInField(\n controllerMessenger: RootControllerMessenger,\n id: string,\n content: JSXElement,\n snapId: SnapId,\n name: string,\n value: string,\n) {\n const result = getElement(content, name);\n\n assert(\n result !== undefined,\n `Could not find an element in the interface with the name \"${name}\".`,\n );\n\n assert(\n result.element.type === 'Input',\n `Expected an element of type \"Input\", but found \"${result.element.type}\".`,\n );\n\n const { state, context } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const newState = mergeValue(state, name, value, result.form);\n\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterfaceState',\n id,\n newState,\n );\n\n await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n origin: '',\n handler: HandlerType.OnUserInput,\n request: {\n jsonrpc: '2.0',\n method: ' ',\n params: {\n event: {\n type: UserInputEventType.InputChangeEvent,\n name: result.element.props.name,\n value,\n },\n id,\n context,\n },\n },\n });\n}\n\n/**\n * Type a value in an interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param value - The value to type in the element.\n */\nexport async function selectInDropdown(\n controllerMessenger: RootControllerMessenger,\n id: string,\n content: JSXElement,\n snapId: SnapId,\n name: string,\n value: string,\n) {\n const result = getElement(content, name);\n\n assert(\n result !== undefined,\n `Could not find an element in the interface with the name \"${name}\".`,\n );\n\n assert(\n result.element.type === 'Dropdown',\n `Expected an element of type \"Dropdown\", but found \"${result.element.type}\".`,\n );\n\n const options = getJsxChildren(result.element) as JSXElement[];\n const selectedOption = options.find(\n (option) =>\n hasProperty(option.props, 'value') && option.props.value === value,\n );\n\n assert(\n selectedOption !== undefined,\n `The dropdown with the name \"${name}\" does not contain \"${value}\".`,\n );\n\n const { state, context } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const newState = mergeValue(state, name, value, result.form);\n\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterfaceState',\n id,\n newState,\n );\n\n await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n origin: '',\n handler: HandlerType.OnUserInput,\n request: {\n jsonrpc: '2.0',\n method: ' ',\n params: {\n event: {\n type: UserInputEventType.InputChangeEvent,\n name: result.element.props.name,\n value,\n },\n id,\n context,\n },\n },\n });\n}\n\n/**\n * Choose an option with value from radio group interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param value - The value to type in the element.\n */\nexport async function selectFromRadioGroup(\n controllerMessenger: RootControllerMessenger,\n id: string,\n content: JSXElement,\n snapId: SnapId,\n name: string,\n value: string,\n) {\n const result = getElement(content, name);\n\n assert(\n result !== undefined,\n `Could not find an element in the interface with the name \"${name}\".`,\n );\n\n assert(\n result.element.type === 'RadioGroup',\n `Expected an element of type \"RadioGroup\", but found \"${result.element.type}\".`,\n );\n\n const options = getJsxChildren(result.element) as JSXElement[];\n const selectedOption = options.find(\n (option) =>\n hasProperty(option.props, 'value') && option.props.value === value,\n );\n\n assert(\n selectedOption !== undefined,\n `The RadioGroup with the name \"${name}\" does not contain \"${value}\".`,\n );\n\n const { state, context } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const newState = mergeValue(state, name, value, result.form);\n\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterfaceState',\n id,\n newState,\n );\n\n await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n origin: '',\n handler: HandlerType.OnUserInput,\n request: {\n jsonrpc: '2.0',\n method: ' ',\n params: {\n event: {\n type: UserInputEventType.InputChangeEvent,\n name: result.element.props.name,\n value,\n },\n id,\n context,\n },\n },\n });\n}\n\n/**\n * Get a formatted file size.\n *\n * @param size - The file size in bytes.\n * @returns The formatted file size in MB, with two decimal places.\n * @example\n * getFormattedFileSize(1_000_000); // '1.00 MB'\n */\nfunction getFormattedFileSize(size: number) {\n return `${(size / 1_000_000).toFixed(2)} MB`;\n}\n\n/**\n * Upload a file to an interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param file - The file to upload. This can be a path to a file or a\n * `Uint8Array` containing the file contents. If this is a path, the file is\n * resolved relative to the current working directory.\n * @param options - The file options.\n * @param options.fileName - The name of the file. By default, this is\n * inferred from the file path if it's a path, and defaults to an empty string\n * if it's a `Uint8Array`.\n * @param options.contentType - The content type of the file. By default, this\n * is inferred from the file name if it's a path, and defaults to\n * `application/octet-stream` if it's a `Uint8Array` or the content type\n * cannot be inferred from the file name.\n */\nexport async function uploadFile(\n controllerMessenger: RootControllerMessenger,\n id: string,\n content: JSXElement,\n snapId: SnapId,\n name: string,\n file: string | Uint8Array,\n options?: FileOptions,\n) {\n const result = getElement(content, name);\n\n assert(\n result !== undefined,\n `Could not find an element in the interface with the name \"${name}\".`,\n );\n\n assert(\n result.element.type === 'FileInput',\n `Expected an element of type \"FileInput\", but found \"${result.element.type}\".`,\n );\n\n const { state, context } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const fileSize = await getFileSize(file);\n if (fileSize > MAX_FILE_SIZE) {\n throw new Error(\n `The file size (${getFormattedFileSize(\n fileSize,\n )}) exceeds the maximum allowed size of ${getFormattedFileSize(\n MAX_FILE_SIZE,\n )}.`,\n );\n }\n\n const fileObject = await getFileToUpload(file, options);\n const newState = mergeValue(state, name, fileObject, result.form);\n\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterfaceState',\n id,\n newState,\n );\n\n await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n origin: '',\n handler: HandlerType.OnUserInput,\n request: {\n jsonrpc: '2.0',\n method: ' ',\n params: {\n event: {\n type: UserInputEventType.FileUploadEvent,\n name: result.element.props.name,\n file: fileObject,\n },\n id,\n context,\n },\n },\n });\n}\n\n/**\n * Get the user interface actions for a Snap interface. These actions can be\n * used to interact with the interface.\n *\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param interface - The interface object.\n * @param interface.content - The interface content.\n * @param interface.id - The interface ID.\n * @returns The user interface actions.\n */\nexport function getInterfaceActions(\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n { content, id }: Omit<Interface, 'type'> & { content: JSXElement },\n): SnapInterfaceActions {\n return {\n clickElement: async (name: string) => {\n await clickElement(controllerMessenger, id, content, snapId, name);\n },\n\n typeInField: async (name: string, value: string) => {\n await typeInField(controllerMessenger, id, content, snapId, name, value);\n },\n\n selectInDropdown: async (name: string, value: string) => {\n await selectInDropdown(\n controllerMessenger,\n id,\n content,\n snapId,\n name,\n value,\n );\n },\n\n selectFromRadioGroup: async (name: string, value: string) => {\n await selectFromRadioGroup(\n controllerMessenger,\n id,\n content,\n snapId,\n name,\n value,\n );\n },\n\n uploadFile: async (\n name: string,\n file: string | Uint8Array,\n options?: FileOptions,\n ) => {\n await uploadFile(\n controllerMessenger,\n id,\n content,\n snapId,\n name,\n file,\n options,\n );\n },\n };\n}\n\n/**\n * Get a user interface object from a Snap.\n *\n * @param runSaga - A function to run a saga outside the usual Redux flow.\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger used to call actions.\n * @yields Takes the set interface action.\n * @returns The user interface object.\n */\nexport function* getInterface(\n runSaga: RunSagaFunction,\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n): SagaIterator {\n const storedInterface = yield call(\n getStoredInterface,\n controllerMessenger,\n snapId,\n );\n\n const interfaceActions = getInterfaceActions(\n snapId,\n controllerMessenger,\n storedInterface,\n );\n\n return getInterfaceResponse(\n runSaga,\n storedInterface.type,\n storedInterface.content,\n interfaceActions,\n );\n}\n"],"mappings":";;;;;;;;;;;AACA,SAAS,6BAA6B;AAStC,SAAS,YAAY,oBAAoB,cAAc;AAGvD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB,mBAAmB;AAG9C,SAAS,MAAM,KAAK,QAAQ,YAAY;AAexC,IAAM,gBAAgB;AAWf,SAAS,qBACd,SACA,MACA,SACA,kBACe;AACf,UAAQ,MAAM;AAAA,IACZ,KAAK,sBAAsB,WAAW,KAAK;AACzC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,WAAW;AAAA,QACjB;AAAA,QACA,IAAI,YAAY,SAAS,IAAI;AAAA,MAC/B;AAAA,IAEF,KAAK,sBAAsB,WAAW,YAAY;AAChD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,WAAW;AAAA,QACjB;AAAA,QAEA,IAAI,YAAY,SAAS,IAAI;AAAA,QAC7B,QAAQ,YAAY,SAAS,KAAK;AAAA,MACpC;AAAA,IAEF,KAAK,sBAAsB,WAAW,MAAM;AAC1C,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,WAAW;AAAA,QACjB;AAAA,QAEA,IAAI,iBAAiB,OAAO;AAAA,QAC5B,QAAQ,YAAY,SAAS,IAAI;AAAA,MACnC;AAAA,IAEF,KAAK,sBAAsB,SAAS;AAClC,YAAM,SAAS,iBAAgC,SAAS,QAAQ;AAGhE,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UAEA,IAAI,YAAY,SAAS,IAAI;AAAA,UAC7B,QAAQ,YAAY,SAAS,IAAI;AAAA,QACnC;AAAA,MACF;AAGA,UAAI,eAAe,MAAM,EAAE,WAAW,GAAG;AACvC,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UAEA,QAAQ,YAAY,SAAS,IAAI;AAAA,QACnC;AAAA,MACF;AAGA,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IAEA;AACE,YAAM,IAAI,MAAM,wCAAwC,OAAO,IAAI,CAAC,IAAI;AAAA,EAC5E;AACF;AAQO,UAAU,gBAAgB,OAA8B;AAC7D,QAAM,IAAI,iBAAiB,KAAK,CAAC;AACnC;AAUA,SAAS,YAAY,SAA0B,OAAgB;AAC7D,SAAO,YAAY;AACjB,UAAM,QAAQ,iBAAiB,KAAK,EAAE,UAAU;AAAA,EAClD;AACF;AASA,SAAS,iBAAiB,SAA0B;AAClD,SAAO,OAAO,QAAQ,OAAO;AAC3B,UAAM,QAAQ,iBAAiB,KAAK,EAAE,UAAU;AAAA,EAClD;AACF;AAUA,UAAU,mBACR,qBACA,QACmD;AACnD,QAAM,mBAAqC,MAAM,OAAO,mBAAmB;AAE3E,MAAI,kBAAkB;AACpB,UAAM,EAAE,SAAAA,SAAQ,IAAI,oBAAoB;AAAA,MACtC;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,IACnB;AAEA,WAAO,EAAE,GAAG,kBAAkB,SAAAA,SAAQ;AAAA,EACxC;AAEA,QAAM,EAAE,QAAQ,IAA8B,MAAM,KAAK,aAAa,IAAI;AAC1E,QAAM,EAAE,QAAQ,IAAI,oBAAoB;AAAA,IACtC;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,SAAO,EAAE,GAAG,SAAS,QAAQ;AAC/B;AAeA,SAAS,qBACP,SACA,MACgD;AAChD,SAAO,YAAY,QAAQ,OAAO,MAAM,KAAK,QAAQ,MAAM,SAAS;AACtE;AAUA,SAAS,eAAe,MAAmB,MAAc;AACvD,QAAM,UAAU,QAAyB,MAAM,CAAC,iBAAiB;AAC/D,QAAI,qBAAqB,cAAc,IAAI,GAAG;AAC5C,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,CAAC;AAED,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,SAAS,MAAM,KAAK,MAAM,KAAK;AAC1C;AAUO,SAAS,WACd,SACA,MAMY;AACZ,MAAI,qBAAqB,SAAS,IAAI,GAAG;AACvC,WAAO,EAAE,SAAS,QAAQ;AAAA,EAC5B;AAEA,SAAO,QAAQ,SAAS,CAAC,YAAY;AACnC,QAAI,QAAQ,SAAS,QAAQ;AAC3B,aAAO,eAAe,SAAS,IAAI;AAAA,IACrC;AAEA,QAAI,qBAAqB,SAAS,IAAI,GAAG;AACvC,aAAO,EAAE,QAAQ;AAAA,IACnB;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AASO,SAAS,iBACd,SACA,MACA;AACA,SAAO,QAAQ,SAAS,CAAC,YAAY;AACnC,QAAI,QAAQ,SAAS,MAAM;AACzB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAWA,eAAe,YACb,qBACA,QACA,IACA,OACA,SACA;AACA,MAAI;AACF,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,YAAY;AAAA,QACrB,SAAS;AAAA,UACP,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,CAAC,SAAS,IAAI,YAAY,KAAK;AACrC,UAAM;AAAA,EACR;AACF;AAWA,eAAsB,aACpB,qBACA,IACA,SACA,QACA,MACe;AACf,QAAM,SAAS,WAAW,SAAS,IAAI;AACvC;AAAA,IACE,WAAW;AAAA,IACX,6DAA6D,IAAI;AAAA,EACnE;AAEA;AAAA,IACE,OAAO,QAAQ,SAAS,YAAY,OAAO,QAAQ,SAAS;AAAA,IAC5D,kEAAkE,OAAO,QAAQ,IAAI;AAAA,EACvF;AAEA,QAAM,EAAE,OAAO,QAAQ,IAAI,oBAAoB;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,cAAc,OAAO,QAAQ,MAAM;AAEzC,QAAM,YAAa,OAAO,OAAO,MAAM,OAAO,IAAI,IAAI;AACtD,QAAM,eAAe,UAAU,WAAW;AAE1C,UAAQ,MAAM;AAAA,IACZ,KAAK,UAAU;AAEb,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,MAAM,mBAAmB;AAAA,UACzB,MAAM;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAEA,UAAI,OAAO,QAAQ,OAAO,QAAQ,MAAM,SAAS,UAAU;AACzD,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,YACE,MAAM,mBAAmB;AAAA,YACzB,MAAM,OAAO;AAAA,YACb,OAAO,MAAM,OAAO,IAAI;AAAA,UAC1B;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,IAEA,KAAK,YAAY;AACf,YAAM,WAAW,CAAC;AAClB,YAAM,WAAW,WAAW,OAAO,MAAM,UAAU,OAAO,IAAI;AAE9D,0BAAoB;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,MAAM,mBAAmB;AAAA,UACzB,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AACA;AAAA,IACF;AAAA,IAGA;AACE,uBAAiB,IAAI;AAAA,EACzB;AACF;AAWO,SAAS,WACd,OACA,MACA,OACA,MACgB;AAChB,MAAI,MAAM;AACR,WAAO;AAAA,MACL,GAAG;AAAA,MACH,CAAC,IAAI,GAAG;AAAA,QACN,GAAI,MAAM,IAAI;AAAA,QACd,CAAC,IAAI,GAAG;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM;AACnC;AAYA,eAAsB,YACpB,qBACA,IACA,SACA,QACA,MACA,OACA;AACA,QAAM,SAAS,WAAW,SAAS,IAAI;AAEvC;AAAA,IACE,WAAW;AAAA,IACX,6DAA6D,IAAI;AAAA,EACnE;AAEA;AAAA,IACE,OAAO,QAAQ,SAAS;AAAA,IACxB,mDAAmD,OAAO,QAAQ,IAAI;AAAA,EACxE;AAEA,QAAM,EAAE,OAAO,QAAQ,IAAI,oBAAoB;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW,WAAW,OAAO,MAAM,OAAO,OAAO,IAAI;AAE3D,sBAAoB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,oBAAoB,KAAK,qCAAqC,QAAQ;AAAA,IAC1E,QAAQ;AAAA,IACR,SAAS,YAAY;AAAA,IACrB,SAAS;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,OAAO;AAAA,UACL,MAAM,mBAAmB;AAAA,UACzB,MAAM,OAAO,QAAQ,MAAM;AAAA,UAC3B;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAYA,eAAsB,iBACpB,qBACA,IACA,SACA,QACA,MACA,OACA;AACA,QAAM,SAAS,WAAW,SAAS,IAAI;AAEvC;AAAA,IACE,WAAW;AAAA,IACX,6DAA6D,IAAI;AAAA,EACnE;AAEA;AAAA,IACE,OAAO,QAAQ,SAAS;AAAA,IACxB,sDAAsD,OAAO,QAAQ,IAAI;AAAA,EAC3E;AAEA,QAAM,UAAU,eAAe,OAAO,OAAO;AAC7C,QAAM,iBAAiB,QAAQ;AAAA,IAC7B,CAAC,WACC,YAAY,OAAO,OAAO,OAAO,KAAK,OAAO,MAAM,UAAU;AAAA,EACjE;AAEA;AAAA,IACE,mBAAmB;AAAA,IACnB,+BAA+B,IAAI,uBAAuB,KAAK;AAAA,EACjE;AAEA,QAAM,EAAE,OAAO,QAAQ,IAAI,oBAAoB;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW,WAAW,OAAO,MAAM,OAAO,OAAO,IAAI;AAE3D,sBAAoB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,oBAAoB,KAAK,qCAAqC,QAAQ;AAAA,IAC1E,QAAQ;AAAA,IACR,SAAS,YAAY;AAAA,IACrB,SAAS;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,OAAO;AAAA,UACL,MAAM,mBAAmB;AAAA,UACzB,MAAM,OAAO,QAAQ,MAAM;AAAA,UAC3B;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAYA,eAAsB,qBACpB,qBACA,IACA,SACA,QACA,MACA,OACA;AACA,QAAM,SAAS,WAAW,SAAS,IAAI;AAEvC;AAAA,IACE,WAAW;AAAA,IACX,6DAA6D,IAAI;AAAA,EACnE;AAEA;AAAA,IACE,OAAO,QAAQ,SAAS;AAAA,IACxB,wDAAwD,OAAO,QAAQ,IAAI;AAAA,EAC7E;AAEA,QAAM,UAAU,eAAe,OAAO,OAAO;AAC7C,QAAM,iBAAiB,QAAQ;AAAA,IAC7B,CAAC,WACC,YAAY,OAAO,OAAO,OAAO,KAAK,OAAO,MAAM,UAAU;AAAA,EACjE;AAEA;AAAA,IACE,mBAAmB;AAAA,IACnB,iCAAiC,IAAI,uBAAuB,KAAK;AAAA,EACnE;AAEA,QAAM,EAAE,OAAO,QAAQ,IAAI,oBAAoB;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW,WAAW,OAAO,MAAM,OAAO,OAAO,IAAI;AAE3D,sBAAoB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,oBAAoB,KAAK,qCAAqC,QAAQ;AAAA,IAC1E,QAAQ;AAAA,IACR,SAAS,YAAY;AAAA,IACrB,SAAS;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,OAAO;AAAA,UACL,MAAM,mBAAmB;AAAA,UACzB,MAAM,OAAO,QAAQ,MAAM;AAAA,UAC3B;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAUA,SAAS,qBAAqB,MAAc;AAC1C,SAAO,IAAI,OAAO,KAAW,QAAQ,CAAC,CAAC;AACzC;AAsBA,eAAsB,WACpB,qBACA,IACA,SACA,QACA,MACA,MACA,SACA;AACA,QAAM,SAAS,WAAW,SAAS,IAAI;AAEvC;AAAA,IACE,WAAW;AAAA,IACX,6DAA6D,IAAI;AAAA,EACnE;AAEA;AAAA,IACE,OAAO,QAAQ,SAAS;AAAA,IACxB,uDAAuD,OAAO,QAAQ,IAAI;AAAA,EAC5E;AAEA,QAAM,EAAE,OAAO,QAAQ,IAAI,oBAAoB;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,YAAY,IAAI;AACvC,MAAI,WAAW,eAAe;AAC5B,UAAM,IAAI;AAAA,MACR,kBAAkB;AAAA,QAChB;AAAA,MACF,CAAC,yCAAyC;AAAA,QACxC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,gBAAgB,MAAM,OAAO;AACtD,QAAM,WAAW,WAAW,OAAO,MAAM,YAAY,OAAO,IAAI;AAEhE,sBAAoB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,oBAAoB,KAAK,qCAAqC,QAAQ;AAAA,IAC1E,QAAQ;AAAA,IACR,SAAS,YAAY;AAAA,IACrB,SAAS;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,OAAO;AAAA,UACL,MAAM,mBAAmB;AAAA,UACzB,MAAM,OAAO,QAAQ,MAAM;AAAA,UAC3B,MAAM;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAaO,SAAS,oBACd,QACA,qBACA,EAAE,SAAS,GAAG,GACQ;AACtB,SAAO;AAAA,IACL,cAAc,OAAO,SAAiB;AACpC,YAAM,aAAa,qBAAqB,IAAI,SAAS,QAAQ,IAAI;AAAA,IACnE;AAAA,IAEA,aAAa,OAAO,MAAc,UAAkB;AAClD,YAAM,YAAY,qBAAqB,IAAI,SAAS,QAAQ,MAAM,KAAK;AAAA,IACzE;AAAA,IAEA,kBAAkB,OAAO,MAAc,UAAkB;AACvD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IAEA,sBAAsB,OAAO,MAAc,UAAkB;AAC3D,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IAEA,YAAY,OACV,MACA,MACA,YACG;AACH,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAWO,UAAU,aACf,SACA,QACA,qBACc;AACd,QAAM,kBAAkB,MAAM;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB;AAAA,EACF;AACF;","names":["content"]}
@@ -1,10 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
3
 
4
- var _chunkXKJHFUHEjs = require('./chunk-XKJHFUHE.js');
4
+
5
+ var _chunkKPRLFCKDjs = require('./chunk-KPRLFCKD.js');
5
6
 
6
7
  // src/internals/simulation/options.ts
7
- var _utils = require('@metamask/utils');
8
8
 
9
9
 
10
10
 
@@ -13,10 +13,12 @@ var _utils = require('@metamask/utils');
13
13
 
14
14
 
15
15
 
16
- var _superstruct = require('superstruct');
16
+ var _superstruct = require('@metamask/superstruct');
17
+ var _utils = require('@metamask/utils');
17
18
  var SimulationOptionsStruct = _superstruct.object.call(void 0, {
18
- secretRecoveryPhrase: _superstruct.defaulted.call(void 0, _superstruct.optional.call(void 0, _superstruct.string.call(void 0, )), _chunkXKJHFUHEjs.DEFAULT_SRP),
19
- locale: _superstruct.defaulted.call(void 0, _superstruct.optional.call(void 0, _superstruct.string.call(void 0, )), _chunkXKJHFUHEjs.DEFAULT_LOCALE),
19
+ currency: _superstruct.defaulted.call(void 0, _superstruct.optional.call(void 0, _superstruct.string.call(void 0, )), _chunkKPRLFCKDjs.DEFAULT_CURRENCY),
20
+ secretRecoveryPhrase: _superstruct.defaulted.call(void 0, _superstruct.optional.call(void 0, _superstruct.string.call(void 0, )), _chunkKPRLFCKDjs.DEFAULT_SRP),
21
+ locale: _superstruct.defaulted.call(void 0, _superstruct.optional.call(void 0, _superstruct.string.call(void 0, )), _chunkKPRLFCKDjs.DEFAULT_LOCALE),
20
22
  state: _superstruct.defaulted.call(void 0, _superstruct.optional.call(void 0, _superstruct.nullable.call(void 0, _superstruct.record.call(void 0, _superstruct.string.call(void 0, ), _utils.JsonStruct))), null),
21
23
  unencryptedState: _superstruct.defaulted.call(void 0,
22
24
  _superstruct.optional.call(void 0, _superstruct.nullable.call(void 0, _superstruct.record.call(void 0, _superstruct.string.call(void 0, ), _utils.JsonStruct))),
@@ -33,4 +35,4 @@ function getOptions(options) {
33
35
 
34
36
 
35
37
  exports.getOptions = getOptions;
36
- //# sourceMappingURL=chunk-VXPCUDBI.js.map
38
+ //# sourceMappingURL=chunk-6V6MFT67.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internals/simulation/options.ts"],"names":[],"mappings":";;;;;;;AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAI3B,IAAM,0BAA0B,OAAO;AAAA,EACrC,UAAU,UAAU,SAAS,OAAO,CAAC,GAAG,gBAAgB;AAAA,EACxD,sBAAsB,UAAU,SAAS,OAAO,CAAC,GAAG,WAAW;AAAA,EAC/D,QAAQ,UAAU,SAAS,OAAO,CAAC,GAAG,cAAc;AAAA,EACpD,OAAO,UAAU,SAAS,SAAS,OAAO,OAAO,GAAG,UAAU,CAAC,CAAC,GAAG,IAAI;AAAA,EACvE,kBAAkB;AAAA,IAChB,SAAS,SAAS,OAAO,OAAO,GAAG,UAAU,CAAC,CAAC;AAAA,IAC/C;AAAA,EACF;AACF,CAAC;AA2BM,SAAS,WAAW,SAAmD;AAC5E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF","sourcesContent":["import type { Infer } from '@metamask/superstruct';\nimport {\n create,\n defaulted,\n nullable,\n object,\n optional,\n record,\n string,\n} from '@metamask/superstruct';\nimport { JsonStruct } from '@metamask/utils';\n\nimport { DEFAULT_CURRENCY, DEFAULT_LOCALE, DEFAULT_SRP } from './constants';\n\nconst SimulationOptionsStruct = object({\n currency: defaulted(optional(string()), DEFAULT_CURRENCY),\n secretRecoveryPhrase: defaulted(optional(string()), DEFAULT_SRP),\n locale: defaulted(optional(string()), DEFAULT_LOCALE),\n state: defaulted(optional(nullable(record(string(), JsonStruct))), null),\n unencryptedState: defaulted(\n optional(nullable(record(string(), JsonStruct))),\n null,\n ),\n});\n\n/**\n * Options for the simulation.\n *\n * @property secretRecoveryPhrase - The secret recovery phrase to use. This is\n * used to derive addresses and private keys. Defaults to a test recovery\n * phrase.\n * @property locale - The locale to use. Defaults to `en`.\n * @property state - The initial state of the Snap, if any. Defaults to `null`.\n */\nexport type SimulationUserOptions = Infer<typeof SimulationOptionsStruct>;\n\n/**\n * Options for the simulation, with defaults filled in.\n *\n * See {@link SimulationUserOptions} for documentation.\n */\nexport type SimulationOptions = Required<SimulationUserOptions>;\n\n/**\n * Get the options for the simulation.\n *\n * @param options - The user options. Any options not specified will be filled\n * in with default values.\n * @returns The simulation options.\n */\nexport function getOptions(options: SimulationUserOptions): SimulationOptions {\n return create(\n options,\n SimulationOptionsStruct,\n ) as Required<SimulationUserOptions>;\n}\n"]}