@metamask/snaps-jest 4.0.1 → 5.0.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 (217) hide show
  1. package/CHANGELOG.md +16 -1
  2. package/README.md +66 -179
  3. package/dist/cjs/environment.js +21 -82
  4. package/dist/cjs/environment.js.map +1 -1
  5. package/dist/cjs/helpers.js +118 -43
  6. package/dist/cjs/helpers.js.map +1 -1
  7. package/dist/cjs/internals/environment.js +1 -1
  8. package/dist/cjs/internals/environment.js.map +1 -1
  9. package/dist/cjs/internals/index.js +1 -4
  10. package/dist/cjs/internals/index.js.map +1 -1
  11. package/dist/cjs/internals/request.js +42 -94
  12. package/dist/cjs/internals/request.js.map +1 -1
  13. package/dist/cjs/internals/server.js +0 -4
  14. package/dist/cjs/internals/server.js.map +1 -1
  15. package/dist/cjs/internals/simulation/constants.js +29 -0
  16. package/dist/cjs/internals/simulation/constants.js.map +1 -0
  17. package/dist/cjs/internals/simulation/controllers.js +95 -0
  18. package/dist/cjs/internals/simulation/controllers.js.map +1 -0
  19. package/dist/cjs/internals/simulation/files.js +22 -0
  20. package/dist/cjs/internals/simulation/files.js.map +1 -0
  21. package/dist/cjs/internals/simulation/index.js +24 -0
  22. package/dist/cjs/internals/simulation/index.js.map +1 -0
  23. package/dist/cjs/internals/simulation/interface.js +98 -0
  24. package/dist/cjs/internals/simulation/interface.js.map +1 -0
  25. package/dist/cjs/internals/simulation/methods/constants.js +84 -0
  26. package/dist/cjs/internals/simulation/methods/constants.js.map +1 -0
  27. package/dist/cjs/internals/simulation/methods/hooks/encryption.js +33 -0
  28. package/dist/cjs/internals/simulation/methods/hooks/encryption.js.map +1 -0
  29. package/dist/cjs/internals/simulation/methods/hooks/get-locale.js +17 -0
  30. package/dist/cjs/internals/simulation/methods/hooks/get-locale.js.map +1 -0
  31. package/dist/cjs/internals/simulation/methods/hooks/index.js +25 -0
  32. package/dist/cjs/internals/simulation/methods/hooks/index.js.map +1 -0
  33. package/dist/cjs/internals/simulation/methods/hooks/interface.js +26 -0
  34. package/dist/cjs/internals/simulation/methods/hooks/interface.js.map +1 -0
  35. package/dist/cjs/internals/simulation/methods/hooks/notifications.js +66 -0
  36. package/dist/cjs/internals/simulation/methods/hooks/notifications.js.map +1 -0
  37. package/dist/cjs/internals/simulation/methods/hooks/show-dialog.js +43 -0
  38. package/dist/cjs/internals/simulation/methods/hooks/show-dialog.js.map +1 -0
  39. package/dist/cjs/internals/simulation/methods/hooks/state.js +80 -0
  40. package/dist/cjs/internals/simulation/methods/hooks/state.js.map +1 -0
  41. package/dist/cjs/internals/simulation/methods/index.js +20 -0
  42. package/dist/cjs/internals/simulation/methods/index.js.map +1 -0
  43. package/dist/cjs/internals/simulation/methods/specifications.js +81 -0
  44. package/dist/cjs/internals/simulation/methods/specifications.js.map +1 -0
  45. package/dist/cjs/internals/simulation/middleware/engine.js +31 -0
  46. package/dist/cjs/internals/simulation/middleware/engine.js.map +1 -0
  47. package/dist/cjs/internals/simulation/middleware/index.js +20 -0
  48. package/dist/cjs/internals/simulation/middleware/index.js.map +1 -0
  49. package/dist/cjs/internals/simulation/middleware/internal-methods/accounts.js +30 -0
  50. package/dist/cjs/internals/simulation/middleware/internal-methods/accounts.js.map +1 -0
  51. package/dist/cjs/internals/simulation/middleware/internal-methods/index.js +20 -0
  52. package/dist/cjs/internals/simulation/middleware/internal-methods/index.js.map +1 -0
  53. package/dist/cjs/internals/simulation/middleware/internal-methods/middleware.js +37 -0
  54. package/dist/cjs/internals/simulation/middleware/internal-methods/middleware.js.map +1 -0
  55. package/dist/cjs/internals/simulation/middleware/internal-methods/provider-state.js +23 -0
  56. package/dist/cjs/internals/simulation/middleware/internal-methods/provider-state.js.map +1 -0
  57. package/dist/cjs/internals/simulation/middleware/mock.js +23 -0
  58. package/dist/cjs/internals/simulation/middleware/mock.js.map +1 -0
  59. package/dist/cjs/internals/simulation/options.js +24 -0
  60. package/dist/cjs/internals/simulation/options.js.map +1 -0
  61. package/dist/cjs/internals/simulation/simulation.js +124 -0
  62. package/dist/cjs/internals/simulation/simulation.js.map +1 -0
  63. package/dist/cjs/internals/simulation/store/index.js +23 -0
  64. package/dist/cjs/internals/simulation/store/index.js.map +1 -0
  65. package/dist/cjs/internals/simulation/store/mocks.js +52 -0
  66. package/dist/cjs/internals/simulation/store/mocks.js.map +1 -0
  67. package/dist/cjs/internals/simulation/store/notifications.js +52 -0
  68. package/dist/cjs/internals/simulation/store/notifications.js.map +1 -0
  69. package/dist/cjs/internals/simulation/store/state.js +64 -0
  70. package/dist/cjs/internals/simulation/store/state.js.map +1 -0
  71. package/dist/cjs/internals/simulation/store/store.js +57 -0
  72. package/dist/cjs/internals/simulation/store/store.js.map +1 -0
  73. package/dist/cjs/internals/simulation/store/ui.js +48 -0
  74. package/dist/cjs/internals/simulation/store/ui.js.map +1 -0
  75. package/dist/cjs/internals/structs.js +43 -0
  76. package/dist/cjs/internals/structs.js.map +1 -1
  77. package/dist/cjs/matchers.js +5 -2
  78. package/dist/cjs/matchers.js.map +1 -1
  79. package/dist/cjs/options.js +0 -6
  80. package/dist/cjs/options.js.map +1 -1
  81. package/dist/esm/environment.js +22 -83
  82. package/dist/esm/environment.js.map +1 -1
  83. package/dist/esm/helpers.js +127 -46
  84. package/dist/esm/helpers.js.map +1 -1
  85. package/dist/esm/internals/environment.js +1 -1
  86. package/dist/esm/internals/environment.js.map +1 -1
  87. package/dist/esm/internals/index.js +1 -5
  88. package/dist/esm/internals/index.js.map +1 -1
  89. package/dist/esm/internals/request.js +61 -104
  90. package/dist/esm/internals/request.js.map +1 -1
  91. package/dist/esm/internals/server.js +1 -5
  92. package/dist/esm/internals/server.js.map +1 -1
  93. package/dist/esm/internals/simulation/constants.js +12 -0
  94. package/dist/esm/internals/simulation/constants.js.map +1 -0
  95. package/dist/esm/internals/simulation/controllers.js +90 -0
  96. package/dist/esm/internals/simulation/controllers.js.map +1 -0
  97. package/dist/esm/internals/simulation/files.js +19 -0
  98. package/dist/esm/internals/simulation/files.js.map +1 -0
  99. package/dist/esm/internals/simulation/index.js +7 -0
  100. package/dist/esm/internals/simulation/index.js.map +1 -0
  101. package/dist/esm/internals/simulation/interface.js +95 -0
  102. package/dist/esm/internals/simulation/interface.js.map +1 -0
  103. package/dist/esm/internals/simulation/methods/constants.js +69 -0
  104. package/dist/esm/internals/simulation/methods/constants.js.map +1 -0
  105. package/dist/esm/internals/simulation/methods/hooks/encryption.js +39 -0
  106. package/dist/esm/internals/simulation/methods/hooks/encryption.js.map +1 -0
  107. package/dist/esm/internals/simulation/methods/hooks/get-locale.js +13 -0
  108. package/dist/esm/internals/simulation/methods/hooks/get-locale.js.map +1 -0
  109. package/dist/esm/internals/simulation/methods/hooks/index.js +8 -0
  110. package/dist/esm/internals/simulation/methods/hooks/index.js.map +1 -0
  111. package/dist/esm/internals/simulation/methods/hooks/interface.js +18 -0
  112. package/dist/esm/internals/simulation/methods/hooks/interface.js.map +1 -0
  113. package/dist/esm/internals/simulation/methods/hooks/notifications.js +58 -0
  114. package/dist/esm/internals/simulation/methods/hooks/notifications.js.map +1 -0
  115. package/dist/esm/internals/simulation/methods/hooks/show-dialog.js +38 -0
  116. package/dist/esm/internals/simulation/methods/hooks/show-dialog.js.map +1 -0
  117. package/dist/esm/internals/simulation/methods/hooks/state.js +74 -0
  118. package/dist/esm/internals/simulation/methods/hooks/state.js.map +1 -0
  119. package/dist/esm/internals/simulation/methods/index.js +3 -0
  120. package/dist/esm/internals/simulation/methods/index.js.map +1 -0
  121. package/dist/esm/internals/simulation/methods/specifications.js +84 -0
  122. package/dist/esm/internals/simulation/methods/specifications.js.map +1 -0
  123. package/dist/esm/internals/simulation/middleware/engine.js +33 -0
  124. package/dist/esm/internals/simulation/middleware/engine.js.map +1 -0
  125. package/dist/esm/internals/simulation/middleware/index.js +3 -0
  126. package/dist/esm/internals/simulation/middleware/index.js.map +1 -0
  127. package/dist/esm/internals/simulation/middleware/internal-methods/accounts.js +31 -0
  128. package/dist/esm/internals/simulation/middleware/internal-methods/accounts.js.map +1 -0
  129. package/dist/esm/internals/simulation/middleware/internal-methods/index.js +3 -0
  130. package/dist/esm/internals/simulation/middleware/internal-methods/index.js.map +1 -0
  131. package/dist/esm/internals/simulation/middleware/internal-methods/middleware.js +37 -0
  132. package/dist/esm/internals/simulation/middleware/internal-methods/middleware.js.map +1 -0
  133. package/dist/esm/internals/simulation/middleware/internal-methods/provider-state.js +23 -0
  134. package/dist/esm/internals/simulation/middleware/internal-methods/provider-state.js.map +1 -0
  135. package/dist/esm/internals/simulation/middleware/mock.js +18 -0
  136. package/dist/esm/internals/simulation/middleware/mock.js.map +1 -0
  137. package/dist/esm/internals/simulation/options.js +20 -0
  138. package/dist/esm/internals/simulation/options.js.map +1 -0
  139. package/dist/esm/internals/simulation/simulation.js +128 -0
  140. package/dist/esm/internals/simulation/simulation.js.map +1 -0
  141. package/dist/esm/internals/simulation/store/index.js +6 -0
  142. package/dist/esm/internals/simulation/store/index.js.map +1 -0
  143. package/dist/esm/internals/simulation/store/mocks.js +32 -0
  144. package/dist/esm/internals/simulation/store/mocks.js.map +1 -0
  145. package/dist/esm/internals/simulation/store/notifications.js +30 -0
  146. package/dist/esm/internals/simulation/store/notifications.js.map +1 -0
  147. package/dist/esm/internals/simulation/store/state.js +47 -0
  148. package/dist/esm/internals/simulation/store/state.js.map +1 -0
  149. package/dist/esm/internals/simulation/store/store.js +50 -0
  150. package/dist/esm/internals/simulation/store/store.js.map +1 -0
  151. package/dist/esm/internals/simulation/store/ui.js +21 -0
  152. package/dist/esm/internals/simulation/store/ui.js.map +1 -0
  153. package/dist/esm/internals/structs.js +38 -1
  154. package/dist/esm/internals/structs.js.map +1 -1
  155. package/dist/esm/matchers.js +5 -2
  156. package/dist/esm/matchers.js.map +1 -1
  157. package/dist/esm/options.js +1 -7
  158. package/dist/esm/options.js.map +1 -1
  159. package/dist/esm/types.js.map +1 -1
  160. package/dist/types/environment.d.ts +14 -15
  161. package/dist/types/helpers.d.ts +64 -3
  162. package/dist/types/internals/index.d.ts +1 -4
  163. package/dist/types/internals/request.d.ts +38 -74
  164. package/dist/types/internals/simulation/constants.d.ts +13 -0
  165. package/dist/types/internals/simulation/controllers.d.ts +40 -0
  166. package/dist/types/internals/simulation/files.d.ts +11 -0
  167. package/dist/types/internals/simulation/index.d.ts +5 -0
  168. package/dist/types/internals/simulation/interface.d.ts +25 -0
  169. package/dist/types/internals/simulation/methods/constants.d.ts +10 -0
  170. package/dist/types/internals/simulation/methods/hooks/encryption.d.ts +29 -0
  171. package/dist/types/internals/simulation/methods/hooks/get-locale.d.ts +9 -0
  172. package/dist/types/internals/simulation/methods/hooks/index.d.ts +6 -0
  173. package/dist/types/internals/simulation/methods/hooks/interface.d.ts +16 -0
  174. package/dist/types/internals/simulation/methods/hooks/notifications.d.ts +16 -0
  175. package/dist/types/internals/simulation/methods/hooks/show-dialog.d.ts +9 -0
  176. package/dist/types/internals/simulation/methods/hooks/state.d.ts +22 -0
  177. package/dist/types/internals/simulation/methods/index.d.ts +1 -0
  178. package/dist/types/internals/simulation/methods/specifications.d.ts +56 -0
  179. package/dist/types/internals/simulation/middleware/engine.d.ts +26 -0
  180. package/dist/types/internals/simulation/middleware/index.d.ts +1 -0
  181. package/dist/types/internals/simulation/middleware/internal-methods/accounts.d.ts +18 -0
  182. package/dist/types/internals/simulation/middleware/internal-methods/index.d.ts +1 -0
  183. package/dist/types/internals/simulation/middleware/internal-methods/middleware.d.ts +22 -0
  184. package/dist/types/internals/simulation/middleware/internal-methods/provider-state.d.ts +14 -0
  185. package/dist/types/internals/simulation/middleware/mock.d.ts +10 -0
  186. package/dist/types/internals/simulation/options.d.ts +37 -0
  187. package/dist/types/internals/simulation/simulation.d.ts +98 -0
  188. package/dist/types/internals/simulation/store/index.d.ts +4 -0
  189. package/dist/types/internals/simulation/store/mocks.d.ts +35 -0
  190. package/dist/types/internals/simulation/store/notifications.d.ts +44 -0
  191. package/dist/types/internals/simulation/store/state.d.ts +55 -0
  192. package/dist/types/internals/simulation/store/store.d.ts +22 -0
  193. package/dist/types/internals/simulation/store/ui.d.ts +25 -0
  194. package/dist/types/internals/structs.d.ts +153 -0
  195. package/dist/types/options.d.ts +3 -35
  196. package/dist/types/types.d.ts +88 -41
  197. package/package.json +21 -12
  198. package/dist/cjs/internals/interface.js +0 -103
  199. package/dist/cjs/internals/interface.js.map +0 -1
  200. package/dist/cjs/internals/network.js +0 -148
  201. package/dist/cjs/internals/network.js.map +0 -1
  202. package/dist/cjs/internals/types.js +0 -6
  203. package/dist/cjs/internals/types.js.map +0 -1
  204. package/dist/cjs/internals/wait-for.js +0 -63
  205. package/dist/cjs/internals/wait-for.js.map +0 -1
  206. package/dist/esm/internals/interface.js +0 -100
  207. package/dist/esm/internals/interface.js.map +0 -1
  208. package/dist/esm/internals/network.js +0 -143
  209. package/dist/esm/internals/network.js.map +0 -1
  210. package/dist/esm/internals/types.js +0 -3
  211. package/dist/esm/internals/types.js.map +0 -1
  212. package/dist/esm/internals/wait-for.js +0 -63
  213. package/dist/esm/internals/wait-for.js.map +0 -1
  214. package/dist/types/internals/interface.d.ts +0 -25
  215. package/dist/types/internals/network.d.ts +0 -87
  216. package/dist/types/internals/types.d.ts +0 -18
  217. package/dist/types/internals/wait-for.d.ts +0 -38
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/matchers.ts"],"sourcesContent":["/* eslint-disable no-invalid-this */\n\n// Note: Because this file imports from `@jest/globals`, it can only be used in\n// a Jest environment. This is why it's not exported from the index file.\n\nimport type { MatcherFunction } from '@jest/expect';\nimport { expect } from '@jest/globals';\nimport type {\n NotificationType,\n EnumToUnion,\n Component,\n} from '@metamask/snaps-sdk';\nimport type { Json } from '@metamask/utils';\nimport { hasProperty } from '@metamask/utils';\nimport type { MatcherHintOptions } from 'jest-matcher-utils';\nimport {\n diff,\n matcherErrorMessage,\n matcherHint,\n printReceived,\n printWithType,\n RECEIVED_COLOR,\n} from 'jest-matcher-utils';\nimport { is } from 'superstruct';\n\nimport { InterfaceStruct, SnapResponseStruct } from './internals';\nimport type { SnapResponse } from './types';\n\n/**\n * Ensure that the actual value is a response from the `request` function.\n *\n * @param actual - The actual value.\n * @param matcherName - The name of the matcher.\n * @param options - The matcher options.\n */\nfunction assertActualIsSnapResponse(\n actual: unknown,\n matcherName: string,\n options?: MatcherHintOptions,\n): asserts actual is SnapResponse {\n if (!is(actual, SnapResponseStruct)) {\n throw new Error(\n matcherErrorMessage(\n matcherHint(matcherName, undefined, undefined, options),\n `${RECEIVED_COLOR(\n 'received',\n )} value must be a response from the \\`request\\` function`,\n printWithType('Received', actual, printReceived),\n ),\n );\n }\n}\n\n/**\n * Ensure that the actual value is a response from the `request` function, and\n * that it has a `ui` property.\n *\n * @param actual - The actual value.\n * @param matcherName - The name of the matcher.\n * @param options - The matcher options.\n */\nfunction assertHasInterface(\n actual: unknown,\n matcherName: string,\n options?: MatcherHintOptions,\n): asserts actual is { content: Component } {\n if (!is(actual, InterfaceStruct) || !actual.content) {\n throw new Error(\n matcherErrorMessage(\n matcherHint(matcherName, undefined, undefined, options),\n `${RECEIVED_COLOR('received')} value must have a \\`content\\` property`,\n printWithType('Received', actual, printReceived),\n ),\n );\n }\n}\n\n/**\n * Check if a JSON-RPC response matches the expected value. This matcher is\n * intended to be used with the `expect` global.\n *\n * @param actual - The actual response.\n * @param expected - The expected response.\n * @returns The status and message.\n */\nexport const toRespondWith: MatcherFunction<[expected: Json]> = function (\n actual,\n expected,\n) {\n assertActualIsSnapResponse(actual, 'toRespondWith');\n\n const { response } = actual;\n if (hasProperty(response, 'error')) {\n const message = () =>\n `${this.utils.matcherHint('.toRespondWith')}\\n\\n` +\n `Expected response: ${this.utils.printExpected(expected)}\\n` +\n `Received error: ${this.utils.printReceived(response.error)}`;\n\n return { message, pass: false };\n }\n\n const pass = this.equals(response.result, expected);\n const message = pass\n ? () =>\n `${this.utils.matcherHint('.not.toRespondWith')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Received: ${this.utils.printReceived(response.result)}`\n : () =>\n `${this.utils.matcherHint('.toRespondWith')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Received: ${this.utils.printReceived(response.result)}`;\n\n return { message, pass };\n};\n\nexport const toRespondWithError: MatcherFunction<[expected: Json]> = function (\n actual,\n expected,\n) {\n assertActualIsSnapResponse(actual, 'toRespondWithError');\n\n const { response } = actual;\n if (hasProperty(response, 'result')) {\n const message = () =>\n `${this.utils.matcherHint('.toRespondWithError')}\\n\\n` +\n `Expected error: ${this.utils.printExpected(expected)}\\n` +\n `Received result: ${this.utils.printReceived(response.result)}`;\n\n return { message, pass: false };\n }\n\n const pass = this.equals(response.error, expected);\n const message = pass\n ? () =>\n `${this.utils.matcherHint('.not.toRespondWithError')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Received: ${this.utils.printReceived(response.error)}`\n : () =>\n `${this.utils.matcherHint('.toRespondWithError')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Received: ${this.utils.printReceived(response.error)}`;\n\n return { message, pass };\n};\n\n/**\n * Check if the snap sent a notification with the expected message. This matcher\n * is intended to be used with the `expect` global.\n *\n * @param actual - The actual response.\n * @param expected - The expected notification message.\n * @param type - The expected notification type.\n * @returns The status and message.\n */\nexport const toSendNotification: MatcherFunction<\n [expected: string, type?: EnumToUnion<NotificationType> | undefined]\n> = async function (actual, expected, type) {\n assertActualIsSnapResponse(actual, 'toSendNotification');\n\n const { notifications } = actual;\n const pass = notifications.some(\n (notification) =>\n this.equals(notification.message, expected) &&\n (type === undefined || notification.type === type),\n );\n\n const message = pass\n ? () =>\n `${this.utils.matcherHint('.not.toSendNotification')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Expected type: ${this.utils.printExpected(type)}\\n` +\n `Received: ${this.utils.printReceived(notifications)}`\n : () =>\n `${this.utils.matcherHint('.toSendNotification')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Expected type: ${this.utils.printExpected(type)}\\n` +\n `Received: ${this.utils.printReceived(notifications)}`;\n\n return { message, pass };\n};\n\nexport const toRender: MatcherFunction<[expected: Component]> = function (\n actual,\n expected,\n) {\n assertHasInterface(actual, 'toRender');\n\n const { content } = actual;\n const pass = this.equals(content, expected);\n\n const difference = diff(expected, content);\n\n const message = pass\n ? () =>\n `${this.utils.matcherHint('.not.toShowInterface')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Received: ${this.utils.printReceived(content)}` +\n `${difference ? `\\n\\nDifference:\\n\\n${difference}` : ''}`\n : () =>\n `${this.utils.matcherHint('.toShowInterface')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Received: ${this.utils.printReceived(content)}` +\n `${difference ? `\\n\\nDifference:\\n\\n${difference}` : ''}`;\n\n return { message, pass };\n};\n\nexpect.extend({\n toRespondWith,\n toRespondWithError,\n toSendNotification,\n toRender,\n});\n"],"names":["expect","hasProperty","diff","matcherErrorMessage","matcherHint","printReceived","printWithType","RECEIVED_COLOR","is","InterfaceStruct","SnapResponseStruct","assertActualIsSnapResponse","actual","matcherName","options","Error","undefined","assertHasInterface","content","toRespondWith","expected","response","message","utils","printExpected","error","pass","equals","result","toRespondWithError","toSendNotification","type","notifications","some","notification","toRender","difference","extend"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/matchers.ts"],"sourcesContent":["/* eslint-disable no-invalid-this */\n\n// Note: Because this file imports from `@jest/globals`, it can only be used in\n// a Jest environment. This is why it's not exported from the index file.\n\nimport type { MatcherFunction } from '@jest/expect';\nimport { expect } from '@jest/globals';\nimport type {\n NotificationType,\n EnumToUnion,\n Component,\n} from '@metamask/snaps-sdk';\nimport type { Json } from '@metamask/utils';\nimport { hasProperty } from '@metamask/utils';\nimport type { MatcherHintOptions } from 'jest-matcher-utils';\nimport {\n diff,\n matcherErrorMessage,\n matcherHint,\n printReceived,\n printWithType,\n RECEIVED_COLOR,\n} from 'jest-matcher-utils';\nimport { is } from 'superstruct';\n\nimport { InterfaceStruct, SnapResponseStruct } from './internals';\nimport type { SnapResponse } from './types';\n\n/**\n * Ensure that the actual value is a response from the `request` function.\n *\n * @param actual - The actual value.\n * @param matcherName - The name of the matcher.\n * @param options - The matcher options.\n */\nfunction assertActualIsSnapResponse(\n actual: unknown,\n matcherName: string,\n options?: MatcherHintOptions,\n): asserts actual is SnapResponse {\n if (!is(actual, SnapResponseStruct)) {\n throw new Error(\n matcherErrorMessage(\n matcherHint(matcherName, undefined, undefined, options),\n `${RECEIVED_COLOR(\n 'received',\n )} value must be a response from the \\`request\\` function`,\n printWithType('Received', actual, printReceived),\n ),\n );\n }\n}\n\n/**\n * Ensure that the actual value is a response from the `request` function, and\n * that it has a `ui` property.\n *\n * @param actual - The actual value.\n * @param matcherName - The name of the matcher.\n * @param options - The matcher options.\n */\nfunction assertHasInterface(\n actual: unknown,\n matcherName: string,\n options?: MatcherHintOptions,\n): asserts actual is { content: Component } {\n if (!is(actual, InterfaceStruct) || !actual.content) {\n throw new Error(\n matcherErrorMessage(\n matcherHint(matcherName, undefined, undefined, options),\n `${RECEIVED_COLOR('received')} value must have a \\`content\\` property`,\n printWithType('Received', actual, printReceived),\n ),\n );\n }\n}\n\n/**\n * Check if a JSON-RPC response matches the expected value. This matcher is\n * intended to be used with the `expect` global.\n *\n * @param actual - The actual response.\n * @param expected - The expected response.\n * @returns The status and message.\n */\nexport const toRespondWith: MatcherFunction<[expected: Json]> = function (\n actual,\n expected,\n) {\n assertActualIsSnapResponse(actual, 'toRespondWith');\n\n const { response } = actual;\n if (hasProperty(response, 'error')) {\n const message = () =>\n `${this.utils.matcherHint('.toRespondWith')}\\n\\n` +\n `Expected response: ${this.utils.printExpected(expected)}\\n` +\n `Received error: ${this.utils.printReceived(response.error)}`;\n\n return { message, pass: false };\n }\n\n const pass = this.equals(response.result, expected);\n const message = pass\n ? () =>\n `${this.utils.matcherHint('.not.toRespondWith')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Received: ${this.utils.printReceived(response.result)}`\n : () =>\n `${this.utils.matcherHint('.toRespondWith')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Received: ${this.utils.printReceived(response.result)}`;\n\n return { message, pass };\n};\n\nexport const toRespondWithError: MatcherFunction<[expected: Json]> = function (\n actual,\n expected,\n) {\n assertActualIsSnapResponse(actual, 'toRespondWithError');\n\n const { response } = actual;\n if (hasProperty(response, 'result')) {\n const message = () =>\n `${this.utils.matcherHint('.toRespondWithError')}\\n\\n` +\n `Expected error: ${this.utils.printExpected(expected)}\\n` +\n `Received result: ${this.utils.printReceived(response.result)}`;\n\n return { message, pass: false };\n }\n\n const pass = this.equals(response.error, expected);\n const message = pass\n ? () =>\n `${this.utils.matcherHint('.not.toRespondWithError')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Received: ${this.utils.printReceived(response.error)}`\n : () =>\n `${this.utils.matcherHint('.toRespondWithError')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Received: ${this.utils.printReceived(response.error)}`;\n\n return { message, pass };\n};\n\n/**\n * Check if the snap sent a notification with the expected message. This matcher\n * is intended to be used with the `expect` global.\n *\n * @param actual - The actual response.\n * @param expected - The expected notification message.\n * @param type - The expected notification type.\n * @returns The status and message.\n */\nexport const toSendNotification: MatcherFunction<\n [expected: string, type?: EnumToUnion<NotificationType> | undefined]\n> = function (actual, expected, type) {\n assertActualIsSnapResponse(actual, 'toSendNotification');\n\n const { notifications } = actual;\n const pass = notifications.some(\n (notification) =>\n this.equals(notification.message, expected) &&\n (type === undefined || notification.type === type),\n );\n\n const message = pass\n ? () =>\n `${this.utils.matcherHint('.not.toSendNotification')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Expected type: ${this.utils.printExpected(type)}\\n` +\n `Received: ${this.utils.printReceived(notifications)}`\n : () =>\n `${this.utils.matcherHint('.toSendNotification')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Expected type: ${this.utils.printExpected(type)}\\n` +\n `Received: ${this.utils.printReceived(notifications)}`;\n\n return { message, pass };\n};\n\nexport const toRender: MatcherFunction<[expected: Component]> = function (\n actual,\n expected,\n) {\n assertHasInterface(actual, 'toRender');\n\n const { content } = actual;\n const pass = this.equals(content, expected);\n\n // This is typed as `string | null`, but in practice it's always a string. The\n // function only returns `null` if both the expected and actual values are\n // numbers, bigints, or booleans, which is never the case here.\n const difference = diff(expected, content);\n\n const message = pass\n ? () =>\n `${this.utils.matcherHint('.not.toRender')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Received: ${this.utils.printReceived(content)}` +\n `\\n\\nDifference:\\n\\n${difference as string}`\n : () =>\n `${this.utils.matcherHint('.toRender')}\\n\\n` +\n `Expected: ${this.utils.printExpected(expected)}\\n` +\n `Received: ${this.utils.printReceived(content)}` +\n `\\n\\nDifference:\\n\\n${difference as string}`;\n\n return { message, pass };\n};\n\nexpect.extend({\n toRespondWith,\n toRespondWithError,\n toSendNotification,\n toRender,\n});\n"],"names":["expect","hasProperty","diff","matcherErrorMessage","matcherHint","printReceived","printWithType","RECEIVED_COLOR","is","InterfaceStruct","SnapResponseStruct","assertActualIsSnapResponse","actual","matcherName","options","Error","undefined","assertHasInterface","content","toRespondWith","expected","response","message","utils","printExpected","error","pass","equals","result","toRespondWithError","toSendNotification","type","notifications","some","notification","toRender","difference","extend"],"mappings":"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"}
@@ -1,15 +1,9 @@
1
- import { boolean, create, defaulted, number, object, optional, string, type } from 'superstruct';
1
+ import { boolean, create, defaulted, number, object, string, type } from 'superstruct';
2
2
  const SnapsEnvironmentOptionsStruct = type({
3
- executionEnvironmentUrl: optional(string()),
4
- simulatorUrl: optional(string()),
5
- keepAlive: defaulted(boolean(), false),
6
3
  server: defaulted(object({
7
4
  enabled: defaulted(boolean(), true),
8
5
  port: defaulted(number(), 0),
9
6
  root: defaulted(string(), process.cwd())
10
- }), {}),
11
- browser: defaulted(object({
12
- headless: defaulted(boolean(), true)
13
7
  }), {})
14
8
  });
15
9
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/options.ts"],"sourcesContent":["import type { Infer } from 'superstruct';\nimport {\n boolean,\n create,\n defaulted,\n number,\n object,\n optional,\n string,\n type,\n} from 'superstruct';\n\nconst SnapsEnvironmentOptionsStruct = type({\n executionEnvironmentUrl: optional(string()),\n simulatorUrl: optional(string()),\n keepAlive: defaulted(boolean(), false),\n\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 browser: defaulted(\n object({\n headless: defaulted(boolean(), true),\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 * ```json\n * {\n * \"testEnvironment\": \"@metamask/snaps-jest\",\n * \"testEnvironmentOptions\": {\n * \"executionEnvironmentUrl\": \"http://localhost:8080\",\n * \"server\": {\n * \"port\": 8080,\n * /* ... *\\/\n * }\n * }\n * }\n * ```\n * @property executionEnvironmentUrl - The URL of the execution environment. If\n * this is not provided, the execution environment will be served from the\n * built-in HTTP server.\n * @property simulatorUrl - The URL of the simulator. If this is not provided,\n * the simulator will be served from the built-in HTTP server.\n * @property keepAlive - Whether to keep the browser open after the tests have\n * finished. This is useful for debugging. Defaults to `false`.\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 * @property browser - The options for the browser.\n * @property browser.headless - Whether to run the browser in headless mode.\n * Defaults to `true`.\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"],"names":["boolean","create","defaulted","number","object","optional","string","type","SnapsEnvironmentOptionsStruct","executionEnvironmentUrl","simulatorUrl","keepAlive","server","enabled","port","root","process","cwd","browser","headless","getOptions","testEnvironmentOptions"],"mappings":"AACA,SACEA,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,MAAM,EACNC,MAAM,EACNC,QAAQ,EACRC,MAAM,EACNC,IAAI,QACC,cAAc;AAErB,MAAMC,gCAAgCD,KAAK;IACzCE,yBAAyBJ,SAASC;IAClCI,cAAcL,SAASC;IACvBK,WAAWT,UAAUF,WAAW;IAEhCY,QAAQV,UACNE,OAAO;QACLS,SAASX,UAAUF,WAAW;QAC9Bc,MAAMZ,UAAUC,UAAU;QAC1BY,MAAMb,UAAUI,UAAUU,QAAQC,GAAG;IACvC,IACA,CAAC;IAGHC,SAAShB,UACPE,OAAO;QACLe,UAAUjB,UAAUF,WAAW;IACjC,IACA,CAAC;AAEL;AA2CA;;;;;;;CAOC,GACD,OAAO,SAASoB,WAAWC,sBAA+C;IACxE,OAAOpB,OAAOoB,wBAAwBb;AACxC"}
1
+ {"version":3,"sources":["../../src/options.ts"],"sourcesContent":["import type { Infer } from 'superstruct';\nimport {\n boolean,\n create,\n defaulted,\n number,\n object,\n string,\n type,\n} from '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"],"names":["boolean","create","defaulted","number","object","string","type","SnapsEnvironmentOptionsStruct","server","enabled","port","root","process","cwd","getOptions","testEnvironmentOptions"],"mappings":"AACA,SACEA,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,MAAM,EACNC,MAAM,EACNC,MAAM,EACNC,IAAI,QACC,cAAc;AAErB,MAAMC,gCAAgCD,KAAK;IACzCE,QAAQN,UACNE,OAAO;QACLK,SAASP,UAAUF,WAAW;QAC9BU,MAAMR,UAAUC,UAAU;QAC1BQ,MAAMT,UAAUG,UAAUO,QAAQC,GAAG;IACvC,IACA,CAAC;AAEL;AA+BA;;;;;;;CAOC,GACD,OAAO,SAASC,WAAWC,sBAA+C;IACxE,OAAOd,OAAOc,wBAAwBR;AACxC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types.ts"],"sourcesContent":["import type {\n NotificationType,\n EnumToUnion,\n Component,\n} from '@metamask/snaps-sdk';\nimport type { JsonRpcId, JsonRpcParams } from '@metamask/utils';\nimport type { Infer } from 'superstruct';\n\nimport type {\n Mock,\n MockJsonRpcOptions,\n MockOptions,\n SnapOptionsStruct,\n SnapResponseStruct,\n TransactionOptionsStruct,\n} from './internals';\n\n/* eslint-disable @typescript-eslint/consistent-type-definitions */\ndeclare module 'expect' {\n interface AsymmetricMatchers {\n toRespondWith(response: unknown): void;\n toRespondWithError(error: unknown): void;\n toSendNotification(\n message: string,\n type?: EnumToUnion<NotificationType>,\n ): void;\n toRender(component: Component): void;\n }\n\n // Ideally we would use `Matchers<Result>` instead of `Matchers<R>`, but\n // TypeScript doesn't allow this:\n // TS2428: All declarations of 'Matchers' must have identical type parameters.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n interface Matchers<R> {\n toRespondWith(response: unknown): R;\n toRespondWithError(error: unknown): R;\n toSendNotification(\n message: string,\n type?: EnumToUnion<NotificationType>,\n ): R;\n toRender(component: Component): R;\n }\n}\n/* eslint-enable @typescript-eslint/consistent-type-definitions */\n\n/**\n * Deeply partialize a type.\n *\n * @template Type - The type to partialize.\n * @returns The deeply partialized type.\n * @example\n * ```ts\n * type Foo = {\n * bar: {\n * baz: string;\n * };\n * qux: number;\n * };\n *\n * type PartialFoo = DeepPartial<Foo>;\n * // { bar?: { baz?: string; }; qux?: number; }\n * ```\n */\nexport type DeepPartial<Type> = {\n [Key in keyof Type]?: Type[Key] extends Record<string, unknown>\n ? DeepPartial<Type[Key]>\n : Type[Key];\n};\n\nexport type RequestOptions = {\n /**\n * The JSON-RPC request ID.\n */\n id?: JsonRpcId;\n\n /**\n * The JSON-RPC method.\n */\n method: string;\n\n /**\n * The JSON-RPC params.\n */\n params?: JsonRpcParams;\n\n /**\n * The origin to send the request from.\n */\n origin?: string;\n};\n\n/**\n * The `runCronjob` options. This is the same as {@link RequestOptions}, except\n * that it does not have an `origin` property.\n */\nexport type CronjobOptions = Omit<RequestOptions, 'origin'>;\n\n/**\n * The options to use for transaction requests.\n *\n * @property chainId - The CAIP-2 chain ID to send the transaction on. Defaults\n * to `eip155:1`.\n * @property origin - The origin to send the transaction from. Defaults to\n * `metamask.io`.\n * @property from - The address to send the transaction from. Defaults to a\n * randomly generated address.\n * @property to - The address to send the transaction to. Defaults to a randomly\n * generated address.\n * @property value - The value to send with the transaction. Defaults to `0`.\n * @property data - The data to send with the transaction. Defaults to `0x`.\n * @property gasLimit - The gas limit to use for the transaction. Defaults to\n * `21_000`.\n * @property maxFeePerGas - The maximum fee per gas to use for the transaction.\n * Defaults to `1`.\n * @property maxPriorityFeePerGas - The maximum priority fee per gas to use for\n * the transaction. Defaults to `1`.\n * @property nonce - The nonce to use for the transaction. Defaults to `0`.\n */\nexport type TransactionOptions = Infer<typeof TransactionOptionsStruct>;\n\n/**\n * The options to use for requests to the snap.\n *\n * @property timeout - The timeout in milliseconds to use. Defaults to `1000`.\n */\nexport type SnapOptions = Infer<typeof SnapOptionsStruct>;\n\n/**\n * A `snap_dialog` alert interface.\n */\nexport type SnapAlertInterface = {\n /**\n * The type of the interface. This is always `alert`.\n */\n type: 'alert';\n\n /**\n * The content to show in the alert.\n */\n content: Component;\n\n /**\n * Close the alert.\n */\n ok(): Promise<void>;\n};\n\n/**\n * A `snap_dialog` confirmation interface.\n */\nexport type SnapConfirmationInterface = {\n /**\n * The type of the interface. This is always `confirmation`.\n */\n type: 'confirmation';\n\n /**\n * The content to show in the confirmation.\n */\n content: Component;\n\n /**\n * Close the confirmation.\n */\n ok(): Promise<void>;\n\n /**\n * Cancel the confirmation.\n */\n cancel(): Promise<void>;\n};\n\n/**\n * A `snap_dialog` prompt interface.\n */\nexport type SnapPromptInterface = {\n /**\n * The type of the interface. This is always `prompt`.\n */\n type: 'prompt';\n\n /**\n * The content to show in the prompt.\n */\n content: Component;\n\n /**\n * Close the prompt.\n *\n * @param value - The value to close the prompt with.\n */\n ok(value?: string): Promise<void>;\n\n /**\n * Cancel the prompt.\n */\n cancel(): Promise<void>;\n};\n\nexport type SnapInterface =\n | SnapAlertInterface\n | SnapConfirmationInterface\n | SnapPromptInterface;\n\nexport type SnapRequestObject = {\n /**\n * Get a user interface object from a snap. This will throw an error if the\n * snap does not show a user interface within the timeout.\n *\n * @param options - The options to use.\n * @param options.timeout - The timeout in milliseconds to use. Defaults to\n * `1000`.\n * @returns The user interface object.\n */\n getInterface(options?: SnapOptions): Promise<SnapInterface>;\n};\n\n/**\n * A pending request object. This is a promise with extra\n * {@link SnapRequestObject} fields.\n */\nexport type SnapRequest = Promise<SnapResponse> & SnapRequestObject;\n\n/**\n * This is the main entry point to interact with the snap. It is returned by\n * {@link installSnap}, and has methods to send requests to the snap.\n *\n * @example\n * ```ts\n * import { installSnap } from '@metamask/snaps-jest';\n *\n * const snap = await installSnap();\n * const response = await snap.request({ method: 'hello' });\n *\n * expect(response).toRespondWith('Hello, world!');\n * ```\n */\nexport type Snap = {\n /**\n * Send a JSON-RPC request to the snap.\n *\n * @param request - The request. This is similar to a JSON-RPC request, but\n * has an extra `origin` field.\n * @returns The response promise, with extra {@link SnapRequestObject} fields.\n */\n request(request: RequestOptions): SnapRequest;\n\n /**\n * Send a transaction to the snap.\n *\n * @param transaction - The transaction. This is similar to an Ethereum\n * transaction object, but has an extra `origin` field. Any missing fields\n * will be filled in with default values.\n * @returns The response.\n */\n sendTransaction(\n transaction?: Partial<TransactionOptions>,\n ): Promise<SnapResponse>;\n\n /**\n * Run a cronjob in the snap. This is similar to {@link request}, but the\n * request will be sent to the `onCronjob` method of the snap.\n *\n * @param cronjob - The cronjob request. This is similar to a JSON-RPC\n * request, and is normally specified in the snap manifest, under the\n * `endowment:cronjob` permission.\n * @returns The response promise, with extra {@link SnapRequestObject} fields.\n */\n runCronjob(cronjob: CronjobOptions): SnapRequest;\n\n /**\n * Close the page running the snap. This is mainly useful for cleaning up\n * the test environment, and calling it is not strictly necessary.\n *\n * @returns A promise that resolves when the page is closed.\n */\n // TODO: Find a way to do this automatically.\n close(): Promise<void>;\n\n /**\n * Enable network mocking for the snap.\n *\n * @param options - The options for the network mocking.\n * @returns A {@link Mock} object, with an `unmock` function.\n */\n mock(options: DeepPartial<MockOptions>): Promise<Mock>;\n\n /**\n * Enable JSON-RPC provider mocking for the snap. This will mock any requests\n * sent through the `ethereum` global, with the specified `method`.\n *\n * @param options - The options for the JSON-RPC mocking.\n * @param options.method - The JSON-RPC method to mock, e.g.,\n * `eth_blockNumber`.\n * @param options.result - The JSON value to return.\n * @returns A {@link Mock} object, with an `unmock` function.\n */\n mockJsonRpc(options: MockJsonRpcOptions): Promise<Mock>;\n};\n\nexport type SnapResponse = Infer<typeof SnapResponseStruct>;\n"],"names":[],"mappings":"AAAA,WA4S4D"}
1
+ {"version":3,"sources":["../../src/types.ts"],"sourcesContent":["import type {\n NotificationType,\n EnumToUnion,\n Component,\n} from '@metamask/snaps-sdk';\nimport type { Json, JsonRpcId, JsonRpcParams } from '@metamask/utils';\nimport type { Infer } from 'superstruct';\n\nimport type {\n SignatureOptionsStruct,\n SnapOptionsStruct,\n SnapResponseStruct,\n TransactionOptionsStruct,\n} from './internals';\n\n/* eslint-disable @typescript-eslint/consistent-type-definitions */\ndeclare module 'expect' {\n interface AsymmetricMatchers {\n toRespondWith(response: unknown): void;\n toRespondWithError(error: unknown): void;\n toSendNotification(\n message: string,\n type?: EnumToUnion<NotificationType>,\n ): void;\n toRender(component: Component): void;\n }\n\n // Ideally we would use `Matchers<Result>` instead of `Matchers<R>`, but\n // TypeScript doesn't allow this:\n // TS2428: All declarations of 'Matchers' must have identical type parameters.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n interface Matchers<R> {\n toRespondWith(response: unknown): R;\n toRespondWithError(error: unknown): R;\n toSendNotification(\n message: string,\n type?: EnumToUnion<NotificationType>,\n ): R;\n toRender(component: Component): R;\n }\n}\n/* eslint-enable @typescript-eslint/consistent-type-definitions */\n\nexport type RequestOptions = {\n /**\n * The JSON-RPC request ID.\n */\n id?: JsonRpcId;\n\n /**\n * The JSON-RPC method.\n */\n method: string;\n\n /**\n * The JSON-RPC params.\n */\n params?: JsonRpcParams;\n\n /**\n * The origin to send the request from.\n */\n origin?: string;\n};\n\n/**\n * The `runCronjob` options. This is the same as {@link RequestOptions}, except\n * that it does not have an `origin` property.\n */\nexport type CronjobOptions = Omit<RequestOptions, 'origin'>;\n\n/**\n * The options to use for transaction requests.\n *\n * @property chainId - The CAIP-2 chain ID to send the transaction on. Defaults\n * to `eip155:1`.\n * @property origin - The origin to send the transaction from. Defaults to\n * `metamask.io`.\n * @property from - The address to send the transaction from. Defaults to a\n * randomly generated address.\n * @property to - The address to send the transaction to. Defaults to a randomly\n * generated address.\n * @property value - The value to send with the transaction. Defaults to `0`.\n * @property data - The data to send with the transaction. Defaults to `0x`.\n * @property gasLimit - The gas limit to use for the transaction. Defaults to\n * `21_000`.\n * @property maxFeePerGas - The maximum fee per gas to use for the transaction.\n * Defaults to `1`.\n * @property maxPriorityFeePerGas - The maximum priority fee per gas to use for\n * the transaction. Defaults to `1`.\n * @property nonce - The nonce to use for the transaction. Defaults to `0`.\n */\nexport type TransactionOptions = Infer<typeof TransactionOptionsStruct>;\n\n/**\n * The options to use for signature requests.\n *\n * @property origin - The origin to send the signature request from. Defaults to\n * `metamask.io`.\n * @property from - The address to send the signature from. Defaults to a\n * randomly generated address.\n * @property data - The data to sign. Defaults to `0x`.\n * @property signatureMethod - The signature method.\n */\nexport type SignatureOptions = Infer<typeof SignatureOptionsStruct>;\n\n/**\n * The options to use for requests to the snap.\n *\n * @property timeout - The timeout in milliseconds to use. Defaults to `1000`.\n */\nexport type SnapOptions = Infer<typeof SnapOptionsStruct>;\n\n/**\n * A `snap_dialog` alert interface.\n */\nexport type SnapAlertInterface = {\n /**\n * The type of the interface. This is always `alert`.\n */\n type: 'alert';\n\n /**\n * The content to show in the alert.\n */\n content: Component;\n\n /**\n * Close the alert.\n */\n ok(): Promise<void>;\n};\n\n/**\n * A `snap_dialog` confirmation interface.\n */\nexport type SnapConfirmationInterface = {\n /**\n * The type of the interface. This is always `confirmation`.\n */\n type: 'confirmation';\n\n /**\n * The content to show in the confirmation.\n */\n content: Component;\n\n /**\n * Close the confirmation.\n */\n ok(): Promise<void>;\n\n /**\n * Cancel the confirmation.\n */\n cancel(): Promise<void>;\n};\n\n/**\n * A `snap_dialog` prompt interface.\n */\nexport type SnapPromptInterface = {\n /**\n * The type of the interface. This is always `prompt`.\n */\n type: 'prompt';\n\n /**\n * The content to show in the prompt.\n */\n content: Component;\n\n /**\n * Close the prompt.\n *\n * @param value - The value to close the prompt with.\n */\n ok(value?: string): Promise<void>;\n\n /**\n * Cancel the prompt.\n */\n cancel(): Promise<void>;\n};\n\nexport type SnapInterface =\n | SnapAlertInterface\n | SnapConfirmationInterface\n | SnapPromptInterface;\n\nexport type SnapRequestObject = {\n /**\n * Get a user interface object from a snap. This will throw an error if the\n * snap does not show a user interface within the timeout.\n *\n * @param options - The options to use.\n * @param options.timeout - The timeout in milliseconds to use. Defaults to\n * `1000`.\n * @returns The user interface object.\n */\n getInterface(options?: SnapOptions): Promise<SnapInterface>;\n};\n\n/**\n * A pending request object. This is a promise with extra\n * {@link SnapRequestObject} fields.\n */\nexport type SnapRequest = Promise<SnapResponse> & SnapRequestObject;\n\n/**\n * The options to use for mocking a JSON-RPC request.\n */\nexport type JsonRpcMockOptions = {\n /**\n * The JSON-RPC request method.\n */\n method: string;\n\n /**\n * The JSON-RPC response, which will be returned when a request with the\n * specified method is sent.\n */\n result: Json;\n};\n\n/**\n * This is the main entry point to interact with the snap. It is returned by\n * {@link installSnap}, and has methods to send requests to the snap.\n *\n * @example\n * import { installSnap } from '@metamask/snaps-jest';\n *\n * const snap = await installSnap();\n * const response = await snap.request({ method: 'hello' });\n *\n * expect(response).toRespondWith('Hello, world!');\n */\nexport type Snap = {\n /**\n * Send a JSON-RPC request to the snap.\n *\n * @param request - The request. This is similar to a JSON-RPC request, but\n * has an extra `origin` field.\n * @returns The response promise, with extra {@link SnapRequestObject} fields.\n */\n request(request: RequestOptions): SnapRequest;\n\n /**\n * Send a transaction to the snap.\n *\n * @param transaction - The transaction. This is similar to an Ethereum\n * transaction object, but has an extra `origin` field. Any missing fields\n * will be filled in with default values.\n * @returns The response.\n */\n onTransaction(\n transaction?: Partial<TransactionOptions>,\n ): Promise<SnapResponse>;\n\n /**\n * Send a transaction to the snap.\n *\n * @param transaction - The transaction. This is similar to an Ethereum\n * transaction object, but has an extra `origin` field. Any missing fields\n * will be filled in with default values.\n * @returns The response.\n * @deprecated Use {@link onTransaction} instead.\n */\n sendTransaction(\n transaction?: Partial<TransactionOptions>,\n ): Promise<SnapResponse>;\n\n /**\n * Send a signature request to the snap.\n *\n * @param signature - The signature request object. Contains the params from\n * the various signature methods, but has an extra `origin` and `signatureMethod` field.\n * Any missing fields will be filled in with default values.\n * @returns The response.\n */\n onSignature(signature?: Partial<SignatureOptions>): Promise<SnapResponse>;\n\n /**\n * Run a cronjob in the snap. This is similar to {@link request}, but the\n * request will be sent to the `onCronjob` method of the snap.\n *\n * @param cronjob - The cronjob request. This is similar to a JSON-RPC\n * request, and is normally specified in the snap manifest, under the\n * `endowment:cronjob` permission.\n * @returns The response promise, with extra {@link SnapRequestObject} fields.\n */\n onCronjob(cronjob?: Partial<CronjobOptions>): SnapRequest;\n\n /**\n * Run a cronjob in the snap. This is similar to {@link request}, but the\n * request will be sent to the `onCronjob` method of the snap.\n *\n * @param cronjob - The cronjob request. This is similar to a JSON-RPC\n * request, and is normally specified in the snap manifest, under the\n * `endowment:cronjob` permission.\n * @returns The response promise, with extra {@link SnapRequestObject} fields.\n * @deprecated Use {@link onCronjob} instead.\n */\n runCronjob(cronjob: CronjobOptions): SnapRequest;\n\n /**\n * Get the response from the snap's `onHomePage` method.\n *\n * @returns The response.\n */\n onHomePage(): Promise<SnapResponse>;\n\n /**\n * Mock a JSON-RPC request. This will cause the snap to respond with the\n * specified response when a request with the specified method is sent.\n *\n * @param mock - The mock options.\n * @param mock.method - The JSON-RPC request method.\n * @param mock.result - The JSON-RPC response, which will be returned when a\n * request with the specified method is sent.\n * @example\n * import { installSnap } from '@metamask/snaps-jest';\n *\n * // In the test\n * const snap = await installSnap();\n * snap.mockJsonRpc({ method: 'eth_accounts', result: ['0x1234'] });\n *\n * // In the Snap\n * const response =\n * await ethereum.request({ method: 'eth_accounts' }); // ['0x1234']\n */\n mockJsonRpc(mock: JsonRpcMockOptions): {\n /**\n * Remove the mock.\n */\n unmock(): void;\n };\n\n /**\n * Close the page running the snap. This is mainly useful for cleaning up\n * the test environment, and calling it is not strictly necessary.\n *\n * @returns A promise that resolves when the page is closed.\n * @deprecated Snaps are now automatically closed when the test ends. This\n * method will be removed in a future release.\n */\n close(): Promise<void>;\n};\n\nexport type SnapResponse = Infer<typeof SnapResponseStruct>;\n"],"names":[],"mappings":"AAAA,WA6V4D"}
@@ -1,12 +1,12 @@
1
1
  import type { EnvironmentContext, JestEnvironmentConfig } from '@jest/environment';
2
+ import type { AbstractExecutionService } from '@metamask/snaps-controllers';
2
3
  import NodeEnvironment from 'jest-environment-node';
4
+ import type { InstalledSnap, InstallSnapOptions } from './internals';
3
5
  declare global {
4
- const browser: WebdriverIO.Browser;
5
6
  const snapsEnvironment: SnapsEnvironment;
6
7
  }
7
8
  export declare class SnapsEnvironment extends NodeEnvironment {
8
9
  #private;
9
- browser: WebdriverIO.Browser;
10
10
  /**
11
11
  * Constructor.
12
12
  *
@@ -25,12 +25,20 @@ export declare class SnapsEnvironment extends NodeEnvironment {
25
25
  */
26
26
  teardown(): Promise<void>;
27
27
  /**
28
- * Get the URL to the simulator, including the environment URL.
28
+ * Install a Snap in the environment. This will terminate any previously
29
+ * installed Snaps, and run the Snap code in a new execution service.
29
30
  *
30
- * @returns The simulator URL.
31
- * @throws If the server is not running.
31
+ * @param snapId - The ID of the Snap to install.
32
+ * @param options - The options to use when installing the Snap.
33
+ * @param options.executionService - The execution service to use.
34
+ * @param options.executionServiceOptions - The options to use when creating the
35
+ * execution service, if any. This should only include options specific to the
36
+ * provided execution service.
37
+ * @param options.options - The simulation options.
38
+ * @template Service - The type of the execution service.
39
+ * @returns The installed Snap.
32
40
  */
33
- get url(): string;
41
+ installSnap<Service extends new (...args: any[]) => InstanceType<typeof AbstractExecutionService>>(snapId?: string, options?: Partial<InstallSnapOptions<Service>>): Promise<InstalledSnap>;
34
42
  /**
35
43
  * Get the snap ID for the current environment, which is used if no snap ID is
36
44
  * passed to {@link installSnap}. This assumes that the built-in server is
@@ -40,14 +48,5 @@ export declare class SnapsEnvironment extends NodeEnvironment {
40
48
  * @throws If the server is not running.
41
49
  */
42
50
  get snapId(): string;
43
- /**
44
- * Create a new page, and attach logging handlers.
45
- *
46
- * @param url - The page URL. Defaults to the specified Snaps Simulator URL,
47
- * or the default simulator URL if none is specified.
48
- * @param timeout - The page timeout, in milliseconds.
49
- * @returns The new page.
50
- */
51
- createPage(url?: string, timeout?: number): Promise<import("puppeteer").Page>;
52
51
  }
53
52
  export default SnapsEnvironment;
@@ -1,3 +1,6 @@
1
+ import type { AbstractExecutionService } from '@metamask/snaps-controllers';
2
+ import type { SnapId } from '@metamask/snaps-sdk';
3
+ import type { InstallSnapOptions } from './internals';
1
4
  import type { Snap } from './types';
2
5
  /**
3
6
  * Load a snap into the environment. This is the main entry point for testing
@@ -5,7 +8,6 @@ import type { Snap } from './types';
5
8
  * snap.
6
9
  *
7
10
  * @example
8
- * ```ts
9
11
  * import { installSnap } from '@metamask/snaps-jest';
10
12
  *
11
13
  * describe('My Snap', () => {
@@ -18,11 +20,70 @@ import type { Snap } from './types';
18
20
  * expect(response).toRespondWith('bar');
19
21
  * });
20
22
  * });
21
- * ```
23
+ * @returns The snap.
24
+ * @throws If the built-in server is not running, and no snap ID is provided.
25
+ */
26
+ export declare function installSnap(): Promise<Snap>;
27
+ /**
28
+ * Load a snap into the environment. This is the main entry point for testing
29
+ * snaps: It returns a {@link Snap} object that can be used to interact with the
30
+ * snap.
31
+ *
32
+ * @example
33
+ * import { installSnap } from '@metamask/snaps-jest';
34
+ *
35
+ * describe('My Snap', () => {
36
+ * it('should do something', async () => {
37
+ * const { request } = await installSnap('local:my-snap');
38
+ * const response = await request({
39
+ * method: 'foo',
40
+ * params: ['bar'],
41
+ * });
42
+ * expect(response).toRespondWith('bar');
43
+ * });
44
+ * });
45
+ * @param options - The options to use.
46
+ * @param options.executionService - The execution service to use. Defaults to
47
+ * {@link NodeThreadExecutionService}. You do not need to provide this unless
48
+ * you are testing a custom execution service.
49
+ * @param options.executionServiceOptions - The options to use when creating the
50
+ * execution service, if any. This should only include options specific to the
51
+ * provided execution service.
52
+ * @param options.options - The simulation options.
53
+ * @returns The snap.
54
+ * @throws If the built-in server is not running, and no snap ID is provided.
55
+ */
56
+ export declare function installSnap<Service extends new (...args: any[]) => InstanceType<typeof AbstractExecutionService>>(options: Partial<InstallSnapOptions<Service>>): Promise<Snap>;
57
+ /**
58
+ * Load a snap into the environment. This is the main entry point for testing
59
+ * snaps: It returns a {@link Snap} object that can be used to interact with the
60
+ * snap.
61
+ *
62
+ * @example
63
+ * import { installSnap } from '@metamask/snaps-jest';
64
+ *
65
+ * describe('My Snap', () => {
66
+ * it('should do something', async () => {
67
+ * const { request } = await installSnap('local:my-snap');
68
+ * const response = await request({
69
+ * method: 'foo',
70
+ * params: ['bar'],
71
+ * });
72
+ * expect(response).toRespondWith('bar');
73
+ * });
74
+ * });
22
75
  * @param snapId - The ID of the snap, including the prefix (`local:`). Defaults
23
76
  * to the URL of the built-in server, if it is running. This supports both
24
77
  * local snap IDs and NPM snap IDs.
78
+ * @param options - The options to use.
79
+ * @param options.executionService - The execution service to use. Defaults to
80
+ * {@link NodeThreadExecutionService}. You do not need to provide this unless
81
+ * you are testing a custom execution service.
82
+ * @param options.executionServiceOptions - The options to use when creating the
83
+ * execution service, if any. This should only include options specific to the
84
+ * provided execution service.
85
+ * @param options.options - The simulation options.
25
86
  * @returns The snap.
26
87
  * @throws If the built-in server is not running, and no snap ID is provided.
27
88
  */
28
- export declare function installSnap(snapId?: string): Promise<Snap>;
89
+ export declare function installSnap<Service extends new (...args: any[]) => InstanceType<typeof AbstractExecutionService>>(snapId: SnapId, options?: Partial<InstallSnapOptions<Service>>): Promise<Snap>;
@@ -1,9 +1,6 @@
1
1
  export * from './environment';
2
- export * from './interface';
3
2
  export * from './logger';
4
- export * from './network';
5
3
  export * from './request';
6
4
  export * from './server';
5
+ export * from './simulation';
7
6
  export * from './structs';
8
- export * from './types';
9
- export * from './wait-for';
@@ -1,81 +1,45 @@
1
- import { HandlerType } from '@metamask/snaps-utils';
2
- import type { Page } from 'puppeteer';
3
- import type { CronjobOptions, RequestOptions, SnapRequest, TransactionOptions } from '../types';
1
+ import type { AbstractExecutionService } from '@metamask/snaps-controllers';
2
+ import type { SnapId, Component } from '@metamask/snaps-sdk';
3
+ import type { HandlerType } from '@metamask/snaps-utils';
4
+ import type { RequestOptions, SnapRequest } from '../types';
5
+ import type { RunSagaFunction, Store } from './simulation';
6
+ import type { RootControllerMessenger } from './simulation/controllers';
7
+ export declare type HandleRequestOptions = {
8
+ snapId: SnapId;
9
+ store: Store;
10
+ executionService: AbstractExecutionService<unknown>;
11
+ handler: HandlerType;
12
+ controllerMessenger: RootControllerMessenger;
13
+ runSaga: RunSagaFunction;
14
+ request: RequestOptions;
15
+ };
4
16
  /**
5
- * Send a request to the snap.
17
+ * Send a JSON-RPC request to the Snap, and wrap the response in a
18
+ * {@link SnapResponse} object.
6
19
  *
7
- * @param page - The page to send the request from.
8
20
  * @param options - The request options.
9
- * @param options.origin - The origin of the request. Defaults to `metamask.io`.
10
- * @param handler - The handler to use. Defaults to `onRpcRequest`.
11
- * @returns The response.
21
+ * @param options.snapId - The ID of the Snap to send the request to.
22
+ * @param options.store - The Redux store.
23
+ * @param options.executionService - The execution service to use to send the
24
+ * request.
25
+ * @param options.handler - The handler to use to send the request.
26
+ * @param options.controllerMessenger - The controller messenger used to call actions.
27
+ * @param options.runSaga - A function to run a saga outside the usual Redux
28
+ * flow.
29
+ * @param options.request - The request to send.
30
+ * @param options.request.id - The ID of the request. If not provided, a random
31
+ * ID will be generated.
32
+ * @param options.request.origin - The origin of the request. Defaults to
33
+ * `https://metamask.io`.
34
+ * @returns The response, wrapped in a {@link SnapResponse} object.
12
35
  */
13
- export declare function request(page: Page, { origin, ...options }: RequestOptions, handler?: HandlerType.OnRpcRequest | HandlerType.OnCronjob): SnapRequest;
36
+ export declare function handleRequest({ snapId, store, executionService, handler, controllerMessenger, runSaga, request: { id, origin, ...options }, }: HandleRequestOptions): SnapRequest;
14
37
  /**
15
- * Send a transaction to the snap.
38
+ * Get the response content either from the SnapInterfaceController or the response object if there is one.
16
39
  *
17
- * @param page - The page to send the transaction from.
18
- * @param options - The transaction options.
19
- * @returns The response.
40
+ * @param result - The handler result object.
41
+ * @param snapId - The Snap ID.
42
+ * @param controllerMessenger - The controller messenger.
43
+ * @returns The content components if any.
20
44
  */
21
- export declare function sendTransaction(page: Page, options: Partial<TransactionOptions>): Promise<{
22
- id: string;
23
- response: ({
24
- result: import("@metamask/snaps-sdk").Json;
25
- } | {
26
- error: import("@metamask/snaps-sdk").Json;
27
- }) & Record<"error", unknown>;
28
- notifications: never[];
29
- content?: undefined;
30
- } | {
31
- id: string;
32
- response: {
33
- result: import("@metamask/snaps-sdk").Json;
34
- };
35
- notifications: never[];
36
- content: import("@metamask/snaps-sdk").Panel | {
37
- value: string;
38
- type: import("@metamask/snaps-sdk").NodeType.Copyable;
39
- sensitive?: boolean | undefined;
40
- } | {
41
- type: import("@metamask/snaps-sdk").NodeType.Divider;
42
- } | {
43
- value: string;
44
- type: import("@metamask/snaps-sdk").NodeType.Heading;
45
- } | {
46
- value: string;
47
- type: import("@metamask/snaps-sdk").NodeType.Image;
48
- } | {
49
- type: import("@metamask/snaps-sdk").NodeType.Spinner;
50
- } | {
51
- value: string;
52
- type: import("@metamask/snaps-sdk").NodeType.Text;
53
- markdown?: boolean | undefined;
54
- } | {
55
- value: string;
56
- type: import("@metamask/snaps-sdk").NodeType.Address;
57
- } | {
58
- value: {
59
- value: string;
60
- type: import("@metamask/snaps-sdk").NodeType.Image;
61
- } | {
62
- value: string;
63
- type: import("@metamask/snaps-sdk").NodeType.Text;
64
- markdown?: boolean | undefined;
65
- } | {
66
- value: string;
67
- type: import("@metamask/snaps-sdk").NodeType.Address;
68
- };
69
- type: import("@metamask/snaps-sdk").NodeType.Row;
70
- label: string;
71
- variant?: "default" | "warning" | "critical" | undefined;
72
- };
73
- }>;
74
- /**
75
- * Run a cronjob.
76
- *
77
- * @param page - The page to run the cronjob from.
78
- * @param options - The request options.
79
- * @returns The response.
80
- */
81
- export declare function runCronjob(page: Page, options: CronjobOptions): SnapRequest;
45
+ export declare function getContentFromResult(result: unknown, snapId: SnapId, controllerMessenger: RootControllerMessenger): Component | undefined;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * A secret recovery phrase that is used for testing purposes. Do not use this
3
+ * to store any real funds!
4
+ */
5
+ export declare const DEFAULT_SRP = "test test test test test test test test test test test ball";
6
+ /**
7
+ * The default locale.
8
+ */
9
+ export declare const DEFAULT_LOCALE = "en";
10
+ /**
11
+ * The default JSON-RPC endpoint for Ethereum requests.
12
+ */
13
+ export declare const DEFAULT_JSON_RPC_ENDPOINT = "https://cloudflare-eth.com/";
@@ -0,0 +1,40 @@
1
+ import type { ControllerMessenger } from '@metamask/base-controller';
2
+ import type { CaveatSpecificationConstraint, PermissionSpecificationConstraint, PermissionControllerActions, SubjectMetadataControllerActions } from '@metamask/permission-controller';
3
+ import { PermissionController, SubjectMetadataController } from '@metamask/permission-controller';
4
+ import { SnapInterfaceController } from '@metamask/snaps-controllers';
5
+ import type { ExecutionServiceActions, SnapInterfaceControllerActions, SnapInterfaceControllerAllowedActions } from '@metamask/snaps-controllers';
6
+ import type { SnapId } from '@metamask/snaps-sdk';
7
+ import type { SnapManifest } from '@metamask/snaps-utils';
8
+ import type { SimulationOptions } from './options';
9
+ import type { MiddlewareHooks } from './simulation';
10
+ import type { RunSagaFunction } from './store';
11
+ export declare type RootControllerAllowedActions = SnapInterfaceControllerActions | SnapInterfaceControllerAllowedActions | PermissionControllerActions | ExecutionServiceActions | SubjectMetadataControllerActions;
12
+ export declare type RootControllerMessenger = ControllerMessenger<RootControllerAllowedActions, any>;
13
+ export declare type GetControllersOptions = {
14
+ controllerMessenger: ControllerMessenger<any, any>;
15
+ hooks: MiddlewareHooks;
16
+ runSaga: RunSagaFunction;
17
+ options: SimulationOptions;
18
+ };
19
+ export declare type Controllers = {
20
+ permissionController: PermissionController<PermissionSpecificationConstraint, CaveatSpecificationConstraint>;
21
+ subjectMetadataController: SubjectMetadataController;
22
+ interfaceController: SnapInterfaceController;
23
+ };
24
+ /**
25
+ * Get the controllers for the Snap.
26
+ *
27
+ * @param options - The options.
28
+ * @returns The controllers for the Snap.
29
+ */
30
+ export declare function getControllers(options: GetControllersOptions): Controllers;
31
+ /**
32
+ * Register the Snap. This sets up the Snap's permissions and subject metadata.
33
+ *
34
+ * @param snapId - The ID of the Snap to install.
35
+ * @param manifest - The parsed manifest.
36
+ * @param controllers - The controllers for the Snap.
37
+ * @param controllers.permissionController - The permission controller.
38
+ * @param controllers.subjectMetadataController - The subject metadata controller.
39
+ */
40
+ export declare function registerSnap(snapId: SnapId, manifest: SnapManifest, { permissionController, subjectMetadataController, }: Omit<Controllers, 'interfaceController'>): Promise<void>;
@@ -0,0 +1,11 @@
1
+ import { AuxiliaryFileEncoding } from '@metamask/snaps-sdk';
2
+ import type { VirtualFile } from '@metamask/snaps-utils';
3
+ /**
4
+ * Get a statically defined Snap file from an array of files.
5
+ *
6
+ * @param files - The Snap files.
7
+ * @param path - The file path.
8
+ * @param encoding - The requested file encoding.
9
+ * @returns The file in the requested encoding if found, otherwise null.
10
+ */
11
+ export declare function getSnapFile(files: VirtualFile[], path: string, encoding?: AuxiliaryFileEncoding): Promise<string | null>;
@@ -0,0 +1,5 @@
1
+ export * from './constants';
2
+ export * from './interface';
3
+ export * from './simulation';
4
+ export * from './options';
5
+ export * from './store';
@@ -0,0 +1,25 @@
1
+ import type { Component, SnapId } from '@metamask/snaps-sdk';
2
+ import { DialogType } from '@metamask/snaps-sdk';
3
+ import type { SagaIterator } from 'redux-saga';
4
+ import type { SnapInterface } from '../../types';
5
+ import type { RootControllerMessenger } from './controllers';
6
+ import type { RunSagaFunction } from './store';
7
+ /**
8
+ * Get a user interface object from a type and content object.
9
+ *
10
+ * @param runSaga - A function to run a saga outside the usual Redux flow.
11
+ * @param type - The type of the interface.
12
+ * @param content - The content to show in the interface.
13
+ * @returns The user interface object.
14
+ */
15
+ export declare function getInterfaceResponse(runSaga: RunSagaFunction, type: DialogType, content: Component): SnapInterface;
16
+ /**
17
+ * Get a user interface object from a Snap.
18
+ *
19
+ * @param runSaga - A function to run a saga outside the usual Redux flow.
20
+ * @param snapId - The Snap ID.
21
+ * @param controllerMessenger - The controller messenger used to call actions.
22
+ * @yields Takes the set interface action.
23
+ * @returns The user interface object.
24
+ */
25
+ export declare function getInterface(runSaga: RunSagaFunction, snapId: SnapId, controllerMessenger: RootControllerMessenger): SagaIterator<SnapInterface>;
@@ -0,0 +1,10 @@
1
+ export declare const EXCLUDED_SNAP_ENDOWMENTS: never[];
2
+ export declare const EXCLUDED_SNAP_PERMISSIONS: never[];
3
+ /**
4
+ * All unrestricted methods recognized by the `PermissionController`.
5
+ * Unrestricted methods are ignored by the permission system, but every
6
+ * JSON-RPC request seen by the permission system must correspond to a
7
+ * restricted or unrestricted method, or the request will be rejected with a
8
+ * "method not found" error.
9
+ */
10
+ export declare const UNRESTRICTED_METHODS: readonly string[];
@@ -0,0 +1,29 @@
1
+ import type { Json } from '@metamask/utils';
2
+ /**
3
+ * Mocks encrypting a value using a password. This is not a real encryption
4
+ * method, but rather is used to simulate encryption in the tests.
5
+ *
6
+ * Ideally we would use a real encryption method, such as
7
+ * `@metamask/browser-passworder`, but it doesn't seem to work with Node.js 18
8
+ * without some mocking. We can switch to a real encryption method once we
9
+ * drop support for Node.js 18.
10
+ *
11
+ * @param password - The password to use.
12
+ * @param value - The value to encrypt.
13
+ * @returns The "encrypted" value.
14
+ */
15
+ export declare function encryptImplementation(password: string, value: Json): string;
16
+ /**
17
+ * Mocks decrypting a value using a password. This is not a real encryption
18
+ * method, but rather is used to simulate encryption in the tests.
19
+ *
20
+ * Ideally we would use a real decryption method, such as
21
+ * `@metamask/browser-passworder`, but it doesn't seem to work with Node.js 18
22
+ * without some mocking. We can switch to a real encryption method once we
23
+ * drop support for Node.js 18.
24
+ *
25
+ * @param password - The password to use.
26
+ * @param value - The value to decrypt.
27
+ * @returns The "decrypted" value.
28
+ */
29
+ export declare function decryptImplementation(password: string, value: string): any;
@@ -0,0 +1,9 @@
1
+ import type { SimulationOptions } from '../../options';
2
+ /**
3
+ * Get the implementation of the `getLocale` hook.
4
+ *
5
+ * @param options - The simulation options.
6
+ * @param options.locale - The locale to use.
7
+ * @returns The implementation of the `getLocale` hook.
8
+ */
9
+ export declare function getGetLocaleMethodImplementation({ locale, }: SimulationOptions): () => Promise<string>;
@@ -0,0 +1,6 @@
1
+ export * from './encryption';
2
+ export * from './get-locale';
3
+ export * from './notifications';
4
+ export * from './show-dialog';
5
+ export * from './state';
6
+ export * from './interface';
@@ -0,0 +1,16 @@
1
+ import type { Component, SnapId } from '@metamask/snaps-sdk';
2
+ import type { RootControllerMessenger } from '../../controllers';
3
+ /**
4
+ * Get the implementation of the `createInterface` hook.
5
+ *
6
+ * @param controllerMessenger - The controller messenger used to call actions.
7
+ * @returns The implementation of the `createInterface` hook.
8
+ */
9
+ export declare function getCreateInterfaceImplementation(controllerMessenger: RootControllerMessenger): (snapId: SnapId, content: Component) => Promise<string>;
10
+ /**
11
+ * Get the implementation of the `getInterface` hook.
12
+ *
13
+ * @param controllerMessenger - The controller messenger used to call actions.
14
+ * @returns The implementation of the `getInterface` hook.
15
+ */
16
+ export declare function getGetInterfaceImplementation(controllerMessenger: RootControllerMessenger): (snapId: SnapId, id: string) => import("@metamask/snaps-controllers").StoredInterface;
@@ -0,0 +1,16 @@
1
+ import type { NotifyParams } from '@metamask/snaps-sdk';
2
+ import type { RunSagaFunction } from '../../store';
3
+ /**
4
+ * Get a method that can be used to show a native notification.
5
+ *
6
+ * @param runSaga - A function to run a saga outside the usual Redux flow.
7
+ * @returns A method that can be used to show a native notification.
8
+ */
9
+ export declare function getShowNativeNotificationImplementation(runSaga: RunSagaFunction): (args_0: string, args_1: NotifyParams) => Promise<any>;
10
+ /**
11
+ * Get a method that can be used to show an in-app notification.
12
+ *
13
+ * @param runSaga - A function to run a saga outside the usual Redux flow.
14
+ * @returns A method that can be used to show an in-app notification.
15
+ */
16
+ export declare function getShowInAppNotificationImplementation(runSaga: RunSagaFunction): (args_0: string, args_1: NotifyParams) => Promise<any>;
@@ -0,0 +1,9 @@
1
+ import type { DialogType } from '@metamask/snaps-sdk';
2
+ import type { RunSagaFunction } from '../../store';
3
+ /**
4
+ * Get the implementation of the `showDialog` hook.
5
+ *
6
+ * @param runSaga - The function to run a saga outside the usual Redux flow.
7
+ * @returns The implementation of the `showDialog` hook.
8
+ */
9
+ export declare function getShowDialogImplementation(runSaga: RunSagaFunction): (_snapId: string, type: DialogType, id: string, _placeholder?: string | undefined) => Promise<any>;